대학원 박사과정을 시작하기 전까지는 블로그 글을 많이 올렸던 것 같은데, 박사과정이 시작되고는 글 올리는게 쉽지 않네요 ㅜ
요즘에는 블로그 보다는 Notion을 이용하여 글을 작성하고 있는데, 많은 분들께 공유가 안된다는 점이 조금 아쉽네요ㅜ . .
그래서, 이번 글에서는 간단하게 한 해 동안 무엇을 했는지 정리하고, 남은 기간에 무엇을 할지에 대해서 말씀드리려고합니다! (물론 궁금하진 않으시겠지만..ㅎㅎ)
[2022년 경험한 것들]
1. MRI, CT 데이터 공부!
올해는 MRI, CT 관련 딥러닝 연구를 진행했습니다!
처음 다루는 데이터다 보니 데이터의 배경지식 및 여러 전처리 방식들을 정리할 수 있어서 좋았어요ㅎ
예를 들면, 딥러닝 학습을 위해 (brain) MRI nifti 파일을 어떻게 전처리 하면 좋은지, CT DICOM 파일에서 특정 병변을 더 잘 보이게 하기 위해 어떤 작업이 선행돼야하는지, 2D DICOM 데이터를 3D nifti 데이터로 변환시킬 때 어떤 부분을 주의해야하는지 등을 정리할 수 있었습니다!
의료 영상 이미지는 일반 이미지와는 달리 여러 특성들이 meta 정보로 주어지기 때문에 이를 이용해 적절한 전처리 작업을 거쳐야 해요. 그래야, 딥러닝이 학습하기 좋은 데이터셋이 됩니다!
이렇게 잘 정리한 자료를 토대로 내년 부터는 본격적인 의료 딥러닝 리서치 및 연구를 진행할 예정이에요!! (물론, 전처리 관련 자료는 지속적으로 피드백 받으면서 업데이트 해나갈 예정입니다 ㅎ)
2. 대회는 또 달라!
올해부터는 처음으로 의료 인공지능 대회를 참가하기 시작했어요.
대회를 참가하면서 좋았던 것은 실제 의료 현장에서 시급하게 다루어지는 문제들을 쉽게 접해 볼 수 있었어요.
또한, 검증받은 public dataset으로 MRI, CT, 3D, 2D, segmentation, object detection, classification 과 같이 다양한 딥러닝 task를 빠른 시간내에 배우고 습득할 수 있었다는 점입니다.
제 경우에는 대회 참가 시 팀을 구성하는데, 이번에 팀 단위의 작업을 하면서 어떠한 협업 시스템이 마련되면 좋은지를 느낄 수 있었습니다.
그래서, 관련 협업 개발도구를 사용할 수 있어서 개발능력도 향상 됐던것 같아요ㅎ
팀 단위의 협업 시스템을 통해 짧은 시간안에 다양한 실험을 할 수 있었고, 운 좋게도 MICCAI라는 국제 학회의 ISLES라는 challenge에서 2등을 수상할 수 있었습니다!!
해외학회에 참석하여 대회에 참석했던 많은 경쟁자들과 서로의 방법에 대해 논의 할 수 있었고, 새로운 동기부여들도 얻을 수 있어 좋았습니다. (해당 대회는 따로 글을 작성하도록 하겠습니다 ^^)
3. 자료화와 협업은 필수!
대학원에서 성과를 내지 못하고 있을 때, "연구 능력이 없는것 같다", "이런 기초지식도 없으면서 뭘 하겠다는건지" 와 같은 생각을 하면 굉장히 힘들거에요 ㅜ
하지만, 자신이 처한 문제를 오로지 개인의 탓으로 돌리는건 효과적인 문제 해결방식은 아닌것 같습니다.
현재 겪고 있는 문제가 개인의 문제가 아닌 시스템의 문제일 수 도 있기 때문이죠.
물론 개인의 노력이 문제를 해결하는 근본적인 방법이겠지만, 좋은 시스템이 갖춰져 있다면 문제 해결은 좀 더 빨라질거라 생각합니다!
제가 축구를 좋아해서 가끔씩 생각 했던 부분이기도 한데, 예전에만해도 잘 나가는 팀의 기준은 얼마나 좋은 스타플레이어들을 보유하고 있느냐였던 것 같아요.
하지만, 현대 축구로 넘어오면서 얼마나 좋은 감독을 보유하고 있는지가 중요해지기 시작했는데, 그 이유는 그 감독이 팀에 좋은 시스템을 심어 놓기 때문이라고 생각해요.
저는 제가 연구하는 곳이 개인에 의존하기 보다는, 누가 들어와도 잘 성장할 수 있는 좋은 시스템을 보유한 곳이었으면 좋겠어요.
그래서, 올해 저 또한 좋은 시스템을 구축하기 위해서 모두가 이해할 수 있는 자료를 만들고 협업을 위한 다양한 시도를 한 것 같습니다!
내년에는 좀 더 갖춰진 시스템으로 연구성과에 속도를 가해볼까해요ㅎ
[11월, 12월 계획]
이제 올해도 2달 정도가 남은 것 같습니다.
11월, 12월 계획은 지금까지 진행했던 의료 영상 관련 자료를 업데이트 하며, 의료 영상 전처리를 위한 모듈을 정리하려고 해요.
앞서 언급했던대로 내부 github을 만들어 의료 영상 처리의 기본 전처리 모듈을 만들 예정입니다.
또한 대회에 참가했던 methodology를 논문화시키려고 하고 있습니다!
추가적으로 이 분야를 모르지만 관심있는 분들을 초대해 정리한 내용들의 퀄리티 체크를 진행할 예정이에요. 이해가 잘 안되는 부분들은 보완하여 교육자료의 질을 향상시킬 예정입니다.
[개인적인 홍보]
내년에도 역시 연구와 병행하면서 큰 국제 대회를 2개정도 나가려고 합니다!
그 대회를 수행하려면 어느정도 의료 인공지능 연구 경험이 있어야 해요ㅜ
저는 지금까지 팀원 구성을 특정 소속인원들만으로 구성해본적이 없습니다.
그래서 지금도 서울, 포항, 울산 등에서 대학원 및 스타트업 소속인원들과 작업을 하고 있습니다ㅎ (물론 의료 도메인을 전혀 모르시는 분들도 많으셨구요!)
내년 대회 또는 앞으로 의료 인공지능 연구 또한 다양한 인원들과 스터디하여 진행하려고 합니다!
그래서 의료 인공지능을 위한 스터디원(팀원)을 모집하려고 해요!
개인적으로는 협업할 수 있는 자세를 갖고, 지속적으로 시간을 투자해 같이 공부할 수 있는 분들이 지원해주셨으면 좋겠어요ㅜ
사실 고등학생이나 대학교 학부생 분들이 지원하셔도 크게 상관없습니다. 제가 팀을 구성하려는 기준은 다양성이라서요!
[앞으로의 바램]
물론 많은 시간이 소요되는 작업들이지만, 이것이 모두를 성장 시킬 수 있는 가장 빠른 방법이고 시간이 지날 수록 연구속도를 가속화 시키고 좋은 성과를 뱉어내는데 필수적인 역할을 할 것으로 기대하고 있어요.
스타트업이나 회사에서만 배울 수 있는것이 많은게 아니라, 대학원에서도 배울 수 있는게 많았으면 좋겠다는 마음가짐으로 스터디원을 꾸려나갈 생각입니다!
이러한 협업 연구시스템을 구성하는게 또 하나의 좋은 연구 방법이다라는 생각이 들겠금 많은 연구성과로 보여줄 수 있도록 노력하겠습니다!
[공지]
그리고 앞으로는 이 블로그에서 기술관련 내용 보다는 이렇게 개인적인 소식을 전달해 드리는 글을 작성할 것 같습니다!
[하고 싶은 말]
공부를 잘 하고 좋은 성과를 내는 것도 중요하지만, 연구하는 그 과정이 즐거웠으면 좋겠어요.
모른다고 해서 무시받을게 걱정되는게 아니라, 모른다고 말할 수 있는 연구 문화가 됐으면 좋겠어요.
개인의 성장은 누군가의 도움으로 이루어진 것이라고 생각했으면 좋겠어요.
그리고 이러한 이야기들이 듣기 좋은 이상적인 이야기가 아니라 현실적으로 공감하는 이야기가 됐으면 좋겠어요.
단순히 어떠한 큰 포부를 갖고 있거나 신념이 있어서 하는 말이 아니라 그냥 그랬으면 좋겠어요.
P.S. 같이 의료 인공지능관련하여 연구하고 스터디 하시고 싶으신 분이 있으시면 아래 메일로 연락주세요!
지난 글에서는 representation learning에 대해서 알아보았다면, 이번 글에서는 unsupervised learning으로 학습시킨 representation model을 어떻게 pretraining model로써 사용했는지 알아보도록 하겠습니다.
우리는 보통 supervised learning 기반의 Deep Neural Network (DNN) 모델을 deep supervised network라고 합니다. 이러한 deep supervised network는 이미지 분야, 시계열 분야 등 다양한 task 도메인에 따라 CNN, RNN 같은 모델로 확장되어 왔죠. (기존 DNN이 naive한 모델이라고 한다면, CNN과 RNN 같은 모델은 convolution, recurrence 와 같은 DNN에 비해 architecturalspecializations 한 모델이라고 일컫습니다)
하지만, 이러한 CNN, RNN이 아닌 오로지 fully connected layer로 구성된 DNN 방식으로 supervised task에 잘 동작하게 만든 학습 방법이 등장합니다.
"이 학습방법은 unsupervised learning 방식으로 pretraining 모델을 만들고, 해당 pretraining model을 supervised task에 적용하는 것이었습니다."
위에서 설명한 학습 방법론들은 현재 굉장히 많은 분야에서 연구되고 있는데, 이번 글에서는 그 중 최초의 방식인 'Greedy Layer-Wise Unsupervised Pretrainig'에 대해서 알아보려고 합니다.
※Greedy Layer-wise unsupervised training 관련 논문은 아래 논문을 참고해주세요!
Yoshua Bengio, Pascal Lamblin, Dan Popovici, and Hugo Larochelle. Greedy layer-wise training of deep networks. In Bernhard Sch¨olkopf, John Platt, and Thomas Hoffman, editors, Advances in Neural Information Processing Systems 19 (NIPS'06), pages 153–160. MIT Press, 2007.
1. Greedy Layer-Wise Unsupervised Pretraining
Greedy Layer-Wise Unsupervised Pretraining 방식은 각 layer를 순차적으로 unsupervised learning 시키는 학습 방법론이라고 볼 수 있습니다. 어떤 특정 layer를 B layer라고 했을 때, B layer의 이전 layer output 값을 취하여 B layer가 new representation (or feature)를 출력할 수 있도록 도와주는 방식입니다.
예를 들어, 20×20 이미지 data (=400차원)가 최초의 정보(information)로 주어졌다고 가정해보겠습니다. 그리고, 첫 번째 layer를 거쳐서 나오는 neuron(=indepent vector)이 300개(=300차원)라고 해보겠습니다. 최초의 정보인 400차원 데이터는 첫 번째 layer를 거쳐 가공된 300차원 feature(or representation)가 됩니다. 그리고, 첫 번째 layer를 거친 300차원 feature는 두 번째 layer 입장에서 보면 가공해야 할 또 다른 정보(=information)가 되는 것이죠. 어찌됐든, 첫 번째 layer의 최초의 정보(=400차원)와 두 번째 layer의 정보(=300차원)는 성격이 다르기 때문에, 이들을 가공해서 얻게 되는 output인 feature(or representation)도 layer 마다 성격이 다르다고 할 수 있습니다. 이러한 방식을 통해 각 layer 마다 고유의 representation을 갖게 되는 것이죠.
Greedy Layer-Wise Unsupervised Pretraining 알고리즘은 아래와 같습니다.
L: Unsupervised learning algorithm → for 문에서 k가 하나씩 증가할 때, L 알고리즘을 통해 만들어진 \(f^{(k)}\)은 학습이 완료되었음을 가정 → L을 통해 학습한 각 layer는 고유의 representation을 갖고 있음
참고로 이 책에서는 unsupervised learning algorithm에 대한 구체적인 description은 없고, 여러 논문들을 reference 해놓기만 했습니다.
Identity function: f(x) = x → 입력값=출력값
Function composition: \(g\)∘\(f\) = \(g(f(x))\) → \(f^{(k)}\)∘\(f\) = \(f^{(k)}(f(x))\)
Y: target(labeled) data
X: input data
※ f: fine-tuning if문에서의 f는 이전 for문에 의해 \(f^{k=m}(f(f....(f^{1}(X))....))\)를 의미한다.
앞서 이야기 했듯, 이전에는 FC layer 기반 (=jointly)의 DNN 모델을 처음부터 supervised task에 적용하는 것이 매우 힘들었지만, 위와 같은 학습 방법론 (=Greedy layer-wise Unsuperivsed pretraining)을 통해 DNN 모델을 supervised task에 적용할 수 있게 됐습니다.
Greedy layer-wise training procedures based on unsupervised criteria have long been used to sidestep the difficulty of jointly training the layers of a deep neural net for a supervised task.
1-1. "Greedy layer-wise unsupervised"
위의 알고리즘을 greedy layer-wise라고 부르는 이유를 간단히 설명해보겠습니다.
우리는 어떤 문제(=task)를 해결하기 위해 알고리즘(=solution)을 고안합니다. 그런데, 세상에는 완벽한 해결책이라는게 존재하지 않죠. 그렇기 때문에 어떤 경우에는 굉장히 복잡한 task를 작은 문제들로 나누고, 이러한 작은 문제들을 해결해 나가면서 최종 task의 해를 구하기도 합니다. 보통 이러한 알고리즘 해결법을 Dynamic programming이라고 하죠. 반면, 복잡한 task를 작은 문제들로 나누지 못하는 경우에는 그때 그때 직면한 문제를 해결함으로써 최종 task의 해를 구해나가는데, 이 경우를 greedy algorithm이라고 합니다.
즉, Greedy algorithm은 각각에 직면 하는 단계들에서 solution을 구하는 (=each piece of the solution independently) 방법론이라고 할 수 있습니다. 'Greedy layer-wise unsupervised pretrining' 관점에서 보면 indepent pieces를 각각의 layer라고 볼 수 있겠네요. 여기서 indepent라고 표현한 이유는 두 번째 layer를 unsupervised 방식시켜도, 첫 번째 layer가 학습되지 않기 때문에 '학습의 관점'에서는 layer들이 indepent하다고 할 수 있습니다.
학습 시킬 때는 첫 번째 layer가 별로(=layer-wise) unsupervised learning 방식으로 학습을 시킵니다. 입력 값이 마주하는 layer 마다 독립적으로 unsupervised task를 진행합니다. 즉, 각 layer 마다의 독립적인 solution을 구하는 것인데, 바꿔말하면 각 layer에 해당하는 최소 loss값을 구할 수 있도록 학습시키는 것이 목적입니다.
1-2. "Pretraining"
앞서 학습했던 "Greedy layer-wise Unsupervised" 방식으로 학습한 DNN은 결국 supervised task에 (fine-tuning 되어) 사용됩니다. 이러한 관점으로 봤을 때, 이전 Unsupervised 방식으로 학습된 DNN은 pretraining model이라고 볼 수 있죠.
즉, "Greedy layer-wise unsupervised pretraining model"은 supervised task 관점에서 보면, weight initialization 또는 regularizer (to prevent overfitting) 역할을 하게 되는 겁니다.
2. Greedy Layer-Wise Unsupervised Pretraining for Unsupervised learning
앞선 글에서는 "Greedy layer-wise unsupervised pretraining 모델"이 supervised task에 fine-tuning하기 위해 사용된다고 언급했지만, 사실 unsupervised task를 해결하기 위한 pretraining 모델로써도 사용이 됩니다. 정확히 어떻게 사용했는지는 아래 세 논문을 살펴보는 것을 추천합니다. 참고로 아래 세 가지 모델에 대한 자세한 설명은 Deeplearning book "Chapter 20. Deep Generative model"에서 다루는데,추후에 Chapter20에 대한 내용도 포스팅 하도록 하겠습니다.
Reducing the Dimensionality of Data with Neural Networks → deep autoencoder(by G. E. HINTON AND R. R. SALAKHUTDINOV; 2006)
A Fast Learning Algorithm For Deep Belief Nets → deep belief nets (by G. E. HINTON; 2006)
Deep Boltzmann Machines (by SalakhutdinovandHinton, 2009a)
지금까지 Unsupervised learning 방식으로 pretraining 모델을 만드는 최초의 학습 방법론에 대해서 설명해보았습니다.
그럼 다음 글에서는 "Unsupervised learning 방식의 pretraining 모델을 언제 써야 하는지?"에 대한 내용을 다루어보도록 하겠습니다.
이번글에서는 representation learning이라는 개념에 대해서 설명하려고 합니다.
개인적으로 2021년 동안 논문을 살펴보면서 가장 눈에 많이 띄었던 용어가 representation learning 이었습니다. 예를들어, GAN, self-supervised learning, transfer learning, domain adaptation 관련 논문들에서 자주 봤던 것 같네요.
이렇듯, 최근 deep learning 모델들을 representation learning 관점에서 설명하고 해석하려는 경향이 많은 것 같아 이번글에서 representation learning과 deep learning 간의 관계를 살펴보려고 합니다.
※Representation learning에 대한 개념을 사전적으로 정의하기 전에 우선 몇 가지 예시들을 통해 representation에 대한 개념을 직관적으로 이해해보도록 해보겠습니다.
1-1. 일반적인 관점에서의 representation
먼저, representation이란 개념을 일반적인 관점에서 살펴보겠습니다.
"잠시 아래 이미지를 보고 5초 동안 생각해보세요!"
여러분은 위의 이미지를 보고 다음과 같은 생각을 하셨을 겁니다.
"음.. 나누기가 있네? "나누기"하란 뜻이구나!"
그런데, 여기서 문제가 발생합니다. '나누기'를 하려고 하는데 로마(숫)자 표기가 되어있죠. 로마자를 이용하여 나누기를 하는건 생각보다 어려운 문제입니다. 그래서 여러분은 무의식적으로 위의 로마자를 "0, 1, 2, ..., 9"와 같은 아라비아 숫자로 바꾸어 나누기를 하려고 할 것 입니다.
"즉, 나누기를 하기 위해서는 아리비아 숫자로 표기하는 것이 좀 더 수월한 것이죠."
그럼, 지금까지 이야기 한 내용을 좀 더 자세히 설명해보겠습니다.
우리는 보통 어떤 task를 해결하기 위해서 task와 관련된 정보들을 이용합니다. 예를 들어, 나누기(=task)를 하려고 하면 "수(=numeric)"라는 정보를 이용하죠. 하지만, 이러한 "수(=numeric)"라는 정보들은 다양하게 표현(=representation)될 수 있습니다. 수를 표현하는 방법에는 '로마숫자표기(=Roman numerical representation)', '아라비아숫자표기(Arabic numerial representation)' 등이 있죠.
보통 task들의 난이도는 정보들을 어떻게 표현(=representation)해주느냐에 따라서 결정이 됩니다. 즉, 정보들을 특정 task에 맞게 잘 표현(=representation)해주면 해당 task를 풀 수 있는 확률이 높아지는 것이죠.
예를들어, 우리가 수를 나눈다고 가정해보겠습니다. 이 때, 수(=numeric)라는 정보를 로마숫자(=Roman numerical representation)로 표현하면 어떻게 될까요? 다시 말해, "CCX÷VI"라는 문제(=task)가 주어주면 풀기가(=해결하기가) 매우 힘들 것 입니다. 하지만, 나누기라는 task를 "210÷6"과 같이 아라비아 숫자(=Arabic numerial representation)로 표현하면 금방 해결하실 수 있으실 겁니다. 왜냐하면 아라비아 숫자를 이용하면 'place-value system'을 이용할 수 있기 때문입니다.
“The Roman numeral system (I, II, III, IV,...) lacks an efficient way to represent place, and it makes simple arithmetic functions (<- ex: division) very difficult to perform for most people. So, we need a place-value system. A place-value system assigns a certain value to the spatial location of a number in a series.”
(위에서 한 이야기를 아래와 같이 정리해볼 수 있겠네요!)
이렇듯, 우리가 나누기를 할 때, 수(=numeric)라는 정보를 보통 아라비아 숫자로 가공(=processing)하여 표현(=representation)하게 됩니다.
또 다른 예시로는 알고리즘이 있습니다. (이 부분은 자료구조의 개념이 필요하기 때문에 구체적으로 이해가 안되시는 분들은"linked list, binary tree search, 시간복잡도"와 관련된 개념들을 찾아 보시길 권유합니다. 시간이나면 이 개념들에 대한 글을 따로 리포팅 하도록 하겠습니다.)
우리에게 어떤 수들이 주어져있고, 이 수들은 이미 오름차순으로 정렬이 되어 있다고 가정해보겠습니다. 이 때, 우리에게 새로운 수 하나가 주어졌다고 했을 때, 그 수를 올바른 위치에 삽입하는데 필요한 시간 복잡도가 어떻게 될까요? 이에 대한 답은 아래와 같습니다.
"정렬된 수 들을 어떻게 표현(=representation)해주느냐에 따라 다릅니다!"
자료구조에서는 정렬된 수 들을 아래와 같이 두 가지 형태 (=linked list, binary tree) 형태로 표현할 수 있습니다.
(참고로 교재에서 설명하는 red-black tree는 binary search tree의 일종인 self-balancing binary search tree라고 하는데, 이에 대한 자세한 설명은 생략하고 red-black tree를 binary search tree로만 표현하여 설명하도록 하겠습니다.)
결국 우리에게 주어진 수를 어떠한 자료구조 형태 (ex: linked list or binary search tree) 로 표현(=representation)하느냐에 따라서 "정렬된 수에 특정 수를 삽입(=insert)"하는 task의 시간복잡도(=난이도)가 결정됩니다.
지금까지 이야기한 내용들을 함축적으로 정리하면 아래와 같습니다.
"결국 우리는 어떤 task를 해결할 때, 정보(=information)를 어떻게 가공(processing)하여 표현(=representation)해줄지에 따라서 task의 난이도가 결정이 된다."
(↓↓↓ Deep learning book 본문 내용↓↓↓)
"Many information processing tasks can be very easy or very difficult depending on how the information is represented."
그렇다면 어떻게딥러닝 모델에서 representation이란 개념은 어떻게 이해해야 할까요?
여기서의 task는 linear classifier를 이용한 classification task입니다. 그리고, 최초의 정보(information)라고 할 수 있는 DNN의 input 값들(=다양한 독립변수들: x1, x2, ..., xn)을 neural network로 가공(=processing)하여 'learned h space'로 표현(=representation)해 줍니다.
즉", 최초의 input 값들을 linear classifier가 올바르게 classification 할 수 있도록 'learned h space'로 표현(=representation)해준 것이죠."
2-2.What is representation in supervised training of feedforward networks?
이미지를 CNN으로 분류하는 문제도 동일하게 생각해 볼 수 있습니다. Supervised learning 기반의 이미지 분류에서도 흔히 softmax (linear classifier)를 이용해 최종 분류를 하게 됩니다. (Softmax가 왜 linear classifier인지는 뒤에서 설명하도록 하겠습니다)
"즉, 이미지를 linear classifier로 classification 하려는 task인 셈이죠."
그런데, 일반적으로 DNN(=Deep Neural Network) 구조는 이미지 분류 성능이 좋지 않다고 알려져 있습니다 (자세한 설명은 아래 글을 참고해주세요!)
앞서 "DNN 구조는 이미지 분류 성능이 좋지 않다"고 언급한 부분은 아래와 같이 다르게 해석해 볼 수 있습니다.
"DNN 구조는 (linear classifier를 이용한) 이미지 분류 task를 하기 위해 최초의 정보들을 부적절하게 표현(=representation) 해준다"
그래서, DNN과 다르게 visual feature들을 잘 뽑아(or 표현해) 낼 수 있는 Convolutional Neural Network (CNN)가 도입이 되게 됩니다. CNN은 convolutional filter를 이용한 feature extractor를 갖는데, 이러한 feature extractor 덕분에 softmax linear classifier가 이미지를 잘 classification 해줄 수 있도록 최초 정보(=input 이미지)를 가공(=processing)하여 표현(=representation) 해주게 되는 것이죠.
"CNN achieves good representation for image classification using softmax linear classifier"
Input feature(=원본 이미지)가 CNN에 입력되면 다양한 conv layer에 의해 hierarchical feature map들이 얻어집니다. Task에 따라 feature extractor를 거쳐 얻은 최종 feature(=feature classifier에 입력되기 직전)의 표현(=representation)들이 달라질 것입니다. 예를 들어, classification task이면 classification에 맞는 최종 feature가 representation 될 것이고, segmentation task이면 segmentation에 맞는 최종 feature가 representation이 될 것 입니다.
책에서는 subsequent learning task라고 언급하는 부분이 있는데, 이것이 최종 task의 종류들(=ex: classification task, segmentation task, linear clasifier task, etc...) 을 의미하는 듯 합니다.
"Generally speaking, a good representation is one that makes a subsequent learning task easier. The choice of representation will usually depend on the choice of the subsequent learning task."
결국 DNN, CNN 모두 최종 task의 유형에 따라 'new representation'에 해당하는 new feature(<--> input feature)를 출력하게 됩니다. 이러한 'new representation'을 뽑게 학습하는 것을 representation learning이라고 부르는 것이죠.
좀 더 구체적인 예시를 들어보겠습니다.
먼저, 우리가 24×24 이미지를 갖고 네 가지 클래스를 분류한다고 해보겠습니다.
Blue Square
Blue Circle
Red Square
Red Circle
이 때, 576(=24×24)개의 입력 feature로 부터 뽑을 수 있는 가장 이상적인 (hidden) feature vector (=indepent vectors)를 뽑으라고 한다면, 아래와 같이 'color', 'shape' 2차원 (hidden) feature vector가 될 것 입니다. 그리고 이러한 feature vector를 'new representation'으로 볼 수 있겠네요.
"하지만, 'new representation'을 추출하는 network(=모델)가 무엇이냐에 따라서 달라집니다."
아래 왼쪽 이미지에서 'entangled space'를 DNN을 이용하여 얻은 (hidden) feature vector들이라고 가정한다면, DNN으로는 'blue circles'를 linear classifier로 구분하기 힘듭니다. 반대로, 오른쪽 'disentangled space'를 CNN을 통해 얻은 (hiddent) feature vector들이라고 한다면, 4가지 클래스 모두 linear classifier로 충분히 분류할 수 있게 됩니다.
"즉, CNN은 이미지를 linear clasifier로 잘 분류할 수 있도록 (hidden) feature vector를 잘 representation 해주는 것이죠."
지금까지 설명한 내용을 종합하자면 결국 아래와 같이 정리해 볼 수 있겠네요.
결국 딥러닝 모델 성능은 "특정 task에 해당하는 최종 feature(=원본 데이터(=information)에서 가공된 데이터)들을 얼마나 잘 representation 해주느냐"에 따라 달려있다.
보통, feature learning, feature representation learning, representation learning 이라는 단어들이 자주 혼용되서 사용되는데, 위에서 언급한 바를 생각해보시면 어떠한 이유로 해당 용어를 혼용해서 사용했는지 조금은 파악하실 수 있으실 거라 생각됩니다.
[Q. Softmax가 왜 linear classifier인가요?]
위의 질문에 답을 하기전에 먼저 아래의 질문에 답을 해보도록 하겠습니다.
'Q. logistic regression'이 어떻게 linear classifier가 될 수 있는가?'
우리는 logistic regression을 아래 그림으로 나타낼 수 있습니다.
우리에게 X라는 input 데이터가 주어 졌을 때, Y가 0 또는 1을 구분 짓는 binary classification을 한다고 가정해보겠습니다. X가 주어졌을 때 Y가 0이 될 확률을 "P(Y=0|X)"와 같이 표현할 수 있고, 이것을 sigmoid function을 이용해 구체적인 (확률) 값으로 표현한다면 아래 이미지의 수식을 이용하게 됩니다. 또한, 'binary clasfication'이기 때문에 P(Y=1|X)인 경우의 확률 값을 "1-P(Y=0|X)"라고 표현 할 수 있게 되죠.
Binary classification 문제는 P(Y=1|X), P(Y=0|X) 둘 중 어느 확률이 더 큰지에 따라서 최종 output 값(=Y)을 1로 classification 할 것인지, 0으로 classification 할 것인지 결정합니다. 그리고 이것을 아래와 같이 정리해볼 수 있죠.
위의 수식을 통해 우리는 아래와 같이 정리해볼 수 있습니다.
"logistic regression이 linear method라고 불리는 이유는 linear한 계산을 통해 풀 수 있는 문제여서가 아니라, logistic regression을 결정짓는 decision boundary가 여전히 linear하기 때문인 것이다."
(↓↓↓ logistic classifier가 linear classfier라는 설명을 참고한 링크 ↓↓↓)
3. Unsupervised learning 관점에서 representation (learning) 이란?
앞서 설명한 supervised learning 기반의 representation (learning)에 대한 연구도 이루어지고 있지만, 오늘날 주로 연구되는 분야는 unsupervied learning 방식으로 하는 representation learning입니다. Deeplearning book의 " Chapter 15. Representation Learning" 역시 대부분 unsupervised learning 방식의 representation learning에 대해서 이야기하고 있습니다. 이에 대한 자세한 설명은 다음 포스팅에서 하도록 하겠고, 여기에서는 추상적인 이유에 대해서만 말씀드리도록 하겠습니다.
앞서 supervised learning 관점에서 representation을 해석해 봤다면, 이번에는 unsupervised learning 관점에서 representation이 (supervised learning 관점에서의 representation과) 어떻게 다르게 설명될 수 있는지 살펴보겠습니다.
Unsupervised learning은 쉽게 말해 unlabelded dataset을 이용한 학습 방식입니다. 물론, unsupervised learning도 objective(=loss) function이 있기 때문에 그 나름대로의 representation을 학습하게 됩니다.
Unsupervised learning에서도 new representation에 해당하는 hidden feature vector를 구할 수 있습니다. 그런데, 우리는 이러한 representation을 명시적(explicit)으로 설정(=design)할 수 있습니다. 즉, hidden feature vector들이 어떠한 density function(→ 뒤에서 더 자세히 설명)을 따를거라고 명시적으로 표현(=representation)해 줄 수 있죠 (물론 이론이 아닌 '현실세계'에서는 굉장히 어려운 문제이지만요!).
예를 들어, VAE (=Variational Auto-Encoder) 같은 경우에도 hidden feature vector (= latent vector)가 normal distribution을 따를 것이라고 명시적으로 가정합니다. 이러한 내용을 Deeplearning book에서는 일반화하여 아래와 같이 표현합니다.
"Other kinds of representation learning algorithms are often explicitly designed to shape the representation in some particular way. (->VAE같은 representation learning 알고리즘은 representation에 해당하는 feature vector가 명시적(=explicit)으로 normal distribution을 따르겠금(=shape) 고안된다)"
앞서 설명한 개념들 중에 density estimation과 explicit 이란 단어를 좀 더 설명해보도록 하겠습니다.
Q. Density estimation이 뭔가요?
여행을 하다가 지역 주민에게 아래와 같은 질문을 했다고 가정해보겠습니다.
"여기 육교 아래로 지나가는 차는 하루에 몇 대나 인가요?"
위의 질문에 대한 지역 주민들의 답은 아래와 같이 굉장히 다양할 것입니다.
주민1: 어제 봤더니 300대 인거 같던데?
주민2: 일주일 전에 봤더니 500대 인거 같던데?
위의 답을 통해 우리는 아래와 같은 사실들을 알 수 있습니다.
차가 하루에 몇 대가 지나갈지는 정해지지 않음
즉, 차가 하루에 100 대 지나간다는 건 매일 어김없이 100대가 지나간다는 '절대진리'와 같음
어떤 질문에 대해 상수로 답변하는 것은 절대 진리 이야기 하는 것과 같음
그러므로, '하루(일일) 교통량'을 상수 개념이 아닌변수개념으로 봐야 함
‘(사회 or 자연)현상’과 관련된 개념들은 '변수' 개념들로 봐야하는 경우가 대부분
위와 같은 '변수' 성격을 띄는 '(사회 or 자연)현상'과 같은 질문들에 대해, 그럴듯한 답을 하기 위해선 ‘확률’이 필요
즉, 다수의 관측 결과를 기반으로 어떠한 현상을 확률적으로 설명해야 함
이 때, 필요한 개념이 'Probability (Density) Distribution'
(↓↓↓ 스마트폰 수명과 exponential probability distribution 간의 관계↓↓↓)
위와 같이 다양한 현상들을 확률적으로 표현해주는 probability distribution이 존재합니다.
앞에 설명한 내용을 다시 정리해보겠습니다.
관측 데이터가 한달, 두 달, 1년 넘게 쌓이게 되면 우리는 '일일 교통량'이란 변수가 어떤 (확률분포) 특성을 갖는지 좀더 정확히 파악할 수 있게 됩니다.
우리는 여기서 '변수'와 '데이터(=관측 값)'에 대한 관계를 정의해볼 수 있습니다.
어떤 변수가 가질 수 있는 다양한 가능성 중의 하나가 현실 세계에 구체화된값을 데이터라고 부릅니다. 즉, 데이터는 변수의 일면에 불과한 것이죠.
“우리는 이렇게 관측된 데이터들을 통해 그 변수(random variable)가 가지고 있는 본질적인 특성을 probability density distribution으로 설명 또는 추정(estimate)하려고 하는데, 이를 'density estimation (밀도추정)' 이라고 합니다”
CS231 수업에서도 generative model을 아래와 같이 구분하고 있는데, VAE와 같은 모델을 explicit density estimation으로 보고 있고, 이것을 통해 'parametric=explicit' 관계로 해석했습니다 (이와 같은 해석은 저의 주관적 해석이니 다른 의견이 있으신 분들은 댓글 달아주시면 감사하겠습니다!).
Deeplearning book에서는 "Supervised training of feedforward networks does not involve explicitly imposing any condition on the learned intermediate features."와 같은 표현을 합니다. 이 문장을 개인적으로 해석하면 아래와 같다고 생각합니다.
does not involve explicitly imposing any condition on the learned intermediate features. ← Supervised learning으로 이미 학습된 feature들은 어떤 PDF를 따를거라고 명시적(=explicit)으로 지정되지 않음
앞서 언급한 latent vector들이 (dependent vector들을 포함하기 보다) independent vector들을 더 많이 포함할 수 록 좀 더 고차원 데이터를 쉽게 표현해 줄 수 있습니다. 예를 들어, 사람 얼굴을 4개의 latent vector들로 표현한다고 했을 때, "x1=얼굴색, x2=인종, x3=머리색, x4=수염" 이렇게 표현하면 x1과 x2는 어느 정도 종속관계 (dependent) 이기 때문에 (상대적으로) 표현력이 떨어지게 되지만, 반대로 "x1=인종, x2=수염, x3=머리색, x4=안경여부" 이렇게 표현한다면 더 많은 사람들의 얼굴을 잘 표현할 수 있을 것입니다.
"그래서, latent vector들이 최대한 independent 하도록 objective(=loss) function을 설계하는 것이 핵심 포인트가 됩니다."
4. Multi-task learning 그리고 shared internal representation
우리에게 굉장히 적은 데이터들이 주어졌을 때, supervised learning을 적용한다면 흔히 overfitting 문제가 발생할 것입니다. 예를 들어, 우리에게 아래와 같은 Chest X-Ray 폐렴 데이터만 갖고 있다고 해보겠습니다.
의사들이 보는 폐렴 증상은 분명 폐주위의 섬유화에 주목하겠지만, 딥러닝의 경우는 CAM(=Class Activation Map)을 통해 살펴보면 엉뚱한데를 주목하는 경향이 있습니다. 아래와 같이 엉뚱한 곳을 보는 이유는 폐렴 관련 데이터는 저런 부분들만 살펴봐도 분류가 가능했기 때문일 수 있습니다. 즉, 정답의 이유는 상관없이 "학습 데이터의 정답만 맞추면 된다"는 식인 것이죠.
하지만, 저런 artifacts와 같은 요소들이 없는 폐렴 데이터가 들어오면 곧 바로 틀려버립니다. 즉, supervsied learning 방식을 사용한 CNN이 적은 수 의 폐렴 데이터로 학습하게 되면, 폐렴 CXR 이미지를 제대로 representation 해줄 수 없게 된다고 이야기 할 수 있습니다.
또 다른 예시로는 한 병원의 의료 이미지 데이터만 사용하여 학습시킨 딥러닝 모델을 다른 병원의 의료 이미지 데이터로 테스트 하려고 하면 잘 안되는 경우가 있습니다. 여기서 생각해 볼 수 있는 부분은 해당 딥러닝이 특정 병원에서 생산되는 기기의 noise를 학습해버렸다거나, 기기의 contrast를 고유하게 학습했을 경우 다른 병원의 noise, contrast가 들어오면 기존 예측방식에 큰 혼란을 줄 수 있겠죠 (물론 data augmentation을 이용하여 이러한 문제를 조금 해결할 수 있겠으나, 우리가 모르는 해당 병원의 고유의 변수들을 모두 커버할 순 없겠죠).
결과적으로, 적은 수의 데이터를 이용하여 supervised learning을 적용하면 unseen data (=training data에 포함되지 않은 데이터) 를 잘 예측하지 못하게 됩니다. 이를 보통 sensitive 하게 반응한다고 하죠. 그렇다면, 우리는 unseen data에도 robust하게 작동할 수 있는 딥러닝 모델을 만들어야 합니다.
만약 우리가 방대한 unlabeled data를 이용하여 이미지를 잘 representation 해 줄 수 있는 딥러닝 모델을 만든다면, 이러한 딥러닝 모델을 pretrained model로써 활용할 수 있을 겁니다. 즉, 최종 supervised task에 unlabeled data으로 학습시킨 pretrained model을 적용해도 좋은 '일반화 성능'을 얻을 수 있게 되는 것이죠.
"Training with supervised learning techniques on the labeled subset often results in severe overfitting. Semi-supervised learning offers the chance to resolve this overfitting problem by also learning from the unlabeled data. Specifically, we can learn good representations for the unlabeled data, and then use these representations to solve the supervised learning task."
또한 우리는 unlabeled data를 이용한 unsupervised learning 방식과 supervised learning 방식을 섞은 semi-supervised learning 방식을 이용할 수도 있습니다.
"즉, unsupervised learning 방식의 internal representation와 supervised learning 방식의 internal representation을 공유(share)할 수도 있는 것이죠."
(↓↓↓internal representation 에 대한 개념 이해 시 참고한 사이트 ↓↓↓)
이번 글에서는 Machine Learning Operations 의 약자인 MLOps라는 개념에 대해 다루어보려고 합니다.
글의 전개 순서는 아래와 같습니다.
MLOps란?
Design
Model development
Operations
머신러닝 or 딥러닝 연구자들이 MLOps에 관심 갖어야 하는 이유 (Feat. Model development)
AutoML
[Note]
보통 MLOps라고 표현은 하긴 하지만, 딥러닝 역시 ML에 포함되기 때문에 DLOps라는 개념으로도 이해하셔도 좋을 것 같습니다.
1. MLOps란?
Machine Learning (or Deep learning) 기반의 프로젝트를 시작한다고 하면 크게 세 가지 단계로 나눌 수 있습니다.
Design
산업에서 요구하는 바를 기준으로 문제를 정의합니다.
예를 들어, 어떠한 데이터가 필요한지, 어떠한 딥러닝 기술이 중요하게 적용되면 좋은지 등을 의논합니다.
Model Development
우리가 design한 실험을 수행하기 위한 개발단계입니다.
산업에서 사용할 수 있도록 제품의 안정성을 충분히 검증(verifying) 해야 합니다.
그러기 위해서는 굉장히 다양한 실험을 수행해야 하죠.
Operations
이렇게 개발한 모델을 최종 사용자에게 서비스 하기 위한 단계입니다.
우리가 만든 모델을 어느 곳에 배포할 지 (ex: 웹, 핸드폰, 컴퓨터 등) 에 따라서 배포방식이 달라집니다.
제공된 제품을 지속적으로 모니터링(관리)해야 합니다.
보통 business라는 영역에 제한하여 MLOps라는 개념을 사용하고는 있지만, 제 개인적인 생각으로는 대학원 연구자들 또한 MLOps에 주목해야 한다고 생각합니다. 지금부터 그 이유에 대해 간단히 설명해보겠습니다.
1-1. Design (Feat. 계획)
병원에서 의료인공지능을 하시는 분들의 가장 큰 장점은 design 단계가 훌륭하다는 점입니다. 아무리 IT 업계에서 의료인공지능을 한다고 해도, 의사분들이 "그건 의학적으로 의미가 없습니다"라고 말한다면 모든 프로젝트가 물거품이 될 가능성이 높지요.
Model development, Operations 단계에서 실패하는 것 보다 Design 단계에서 실패할 때 더 많은 시간과 비용을 손해보게 되기 때문에, Design 설계는 ML 프로젝트에서 매우 중요한 일입니다.
병원에서 딥러닝을 연구하시는 분들이 높은 IF를 갖는 저널에 논문을 내는 이유는 그만큼 design이 훌륭하기 때문입니다. 개인적으로 "딥러닝이 사용되면 의사들의 역할이 없어 질 것이다"라는 말에 동의하지 못하는 이유가 여기에 있기도 합니다. 오히려, design이 잘 되지 않는 딥러닝 연구가 많아 질 수 록 딥러닝 or 기계학습 버블이 생겨날 것인데, 이러한 버블을 걷어내는 역할을 의사분들이 하실 수 도 있겠죠.
사실 이렇게 design을 하는 영역은 학계의 역할이라고 할 수 있습니다. 보통 학계는 오랫동안 domain knowledge를 쌓았기 때문에 어떠한 연구가 유의미한 것인지 판단할 수 있죠. 그리고, 매일 현재 기술들이 갖는 문제를 제기하고 이를 해결하기 위해 연구하기 때문에 최신 기법 솔루션들은 대부분 학계로부터 나온다고 볼 수 있습니다. 또한, 어떤 데이터를 이용하면 좋은지 알고 있으며, 특히 병원 같은 곳에서는 자체 의료 데이터를 갖고 있기 때문에 design 측면에서 제약사항이 상대적으로 작다고 할 수 있죠.
구글, 페이스북, 애플, 마이크로소프트, 엔비디아 등 같은 회사들이 딥러닝에서 좋은 결과를 도출할 수 있었던 것도 모두 학계로부터 도움을 받았기 때문입니다.
1-2. Model development
앞서 실험을 design 했으면 이를 실제로 실현(실험)해야 하는 단계를 거쳐야 합니다.
우리가 흔히 머리속에 그리는 실험은 관찰하는 방법입니다. 실험군 대조군을 설정하고 실험장비를 이용하여 지속관찰하면서 상태를 기록하죠.
하지만, machine learning (or deep learning)은 대부분 컴퓨터(Turing machine)에 기반하여 연구를 진행합니다. 그래서, 실험을 design 하기 위해 필요한 이론적 지식 외에도 컴퓨터를 잘 다룰 수 있는 능력이 필요하죠.
예를 들어보겠습니다. Design 한대로 실험을 하기 위해서는 우선 데이터부터 모아야 할 것입니다. 딥러닝에서는 레이블이 되어있는 데이터를 사용해야하는 경우가 많기 때문에 labelling 프로그램 tool을 잘 사용할 줄 아는 것이 중요합니다. 만약 데이터가 방대하면 분산처리 시스템 (ex: Hadoop, Spark 등) 등을 지원해주는 tool도 잘 활용할 줄 알아야 합니다.
"하지만, 보통 model development 단계에서는 Data를 수집하고 관리하는 단계보다는 아래 그림처럼 model dvelopment, training, devaluation을 하기 위한 별도의 tool들을 사용합니다."
Model development 단계에서 가장 볼 수 있는 것은 frameworks 입니다. 딥러닝 모델을 개발하기 위해서는 딥러닝 라이브러리를 지원해주는 framework를 선택해야 합니다. 예전에는 caffe, theano, keras 등이 사용되었지만, 현재는 pytorch, tensorflow로 통합되고 있습니다. (물론 최근에 keras가 tensorflow로부터 독립하긴했지만....) 최근에는 Fast.ai, pytorch lighting 등 좀 더 간편하게 사용하기 위해 제공되는 framework들이 각광을 받고 있습니다.
또한, 딥러닝은 혼자서 개발하는 것보다 협업하여 개발하는 것이 훨씬 효율적입니다. 그렇기 때문에 최대한 이러한 협업을 지원해주는 software를 잘 사용할 줄 아는 것이 중요합니다. 예를 들어, Github과 같은 software는 여러 사람이 같이 협업할 때 필요한 기능들(ex: 버전관리 기능)을 다수 제공하고 있습니다. 또한, VScode 같이 좋은 기능이 많이 담긴 IDE를 사용하게 되면 github 연동, interactive mode 기능 등을 잘 사용할 수 있기 때문에 개발이 빨라질 수 있습니다.
딥러닝 연구에서 구글, 페이스북, 엔비디아 같은 회사의 리서쳐들이 좋은 성과를 낼 수 있는 이유는 자원을 최대한 잘 활용할 수 있기 때문입니다. Docker, Kubeflow 같은 resource management tool을 이용하면서 자원 관리를 하고, horovod 분산처리 시스템 또는 Mixed precision과 같은 기술 등을 이용하여 자원을 최대한 활용할 수 있도록 하기 때문에 실험을 빠르고 효율적으로 진행할 수 있었죠.
또한 딥러닝 실험들을 관리해주는 weight&biases 와 같은 tool을 이용할 수 있으면 다양한 hyper-parameter들을 automatic하게 search 해줄 수 있으며, 실험 결과들을 매우 용이하게 비교 분석할 수 있게 되죠 (Experiment Management).
"이론적인 design을 하는 것도 매우 중요하지만 이를 구현하고 실험할 수 있는 능력은 또 다른 문제일 수 있습니다. 머리속으로 상상하는 것과 그것을 실현시키는 것이 다른 문제인것 처럼요."
1-3. Operations
MLOps의 마지막 단계라고 할 수 있는 것은 해당 모델을 배포하고 운영하는 단계입니다.
자신의 딥러닝 또는 머신러닝 모델을 웹에 배포할지, 핸드폰 같은 곳에 배포할 지에 따라서 배포 방식도 다양합니다.
보통 배포 및 운영과 관련된 이슈들은 딥러닝 학계에서 주로 신경쓰고 있는 분야는 아닙니다. 주로 computer engineering 분야에서 다루어지는 문제들이죠.
하지만, 최근에는 학계에서도 조차 자신들이 만든 모델을 상용화시키기 위한 노력들을 하고 있습니다. 즉, 딥러닝이 단순히 학문적인 연구에 머무르는 것이 아니라, 자신들이 연구하고 개발한 딥러닝 모델이 어떻게 실세계에 영향을 미치는지 보고 싶은 것이죠. 결국 이를 위해서는 deployment와 관련된 지식들도 습득할 필요가 있습니다. 예를 들어, microsoft의 onnx를 다룰 줄 안다면 배포를 좀 더 쉬운 방법으로 할 수 있겠죠.
본래 MLOps라는 개념은 아래 논문에서 처음 출현했다고 합니다. 딥러닝을 연구하다보면 딥러닝 학계의 연구들이 굉장히 많은 기여를 하고 있다고 생각합니다. 물론, 딥러닝 기술을 리딩하는 건 학계에서 출발하는게 대부분이죠. 하지만, ML(or DL) system 관점에서 봤을 때, 딥러닝 모델을 연구를 하고 coding을 하여 구현하는 행위가 기여하는 바가 실세계에서 얼마나 많은 부분을 차지하고 있는지 모를 가능성이 큽니다.
"사실 최근에는 연구분야 조차 MLOps를 이용하지 않으면 연구성과를 빠르게 낼 수 없다는 이야기를 합니다. 그럼 지금부터 연구자들이 MLOps에 관심을 갖어야할 이유에 대해서 살펴보도록 하겠습니다."
2. 머신러닝 or 딥러닝 연구자들이 MLOps에 관심 갖어야 하는 이유
결국 machine learning (or deep learning) 제품을 만든다는 것은 위에서 언급한 3가지 단계 과정을 모두 포함합니다.
학계에서는 design, model development, deployment와 같은 단계에 대해 크게 신경쓰진 않았습니다. 보통은 수학, 물리학, 생물학 등의 개념들을 잘 이용하여 새로운 딥러닝 이론을 제시하여 좋은 논문을 내는 것이 목적이었죠. 이러한 연구들이 local 환경에서도 잘 수행되면 복잡한 tool들이 필요가 없습니다. 그냥 데이터를 다운 받고, 딥러닝 모델을 구현하고 학습하고 evaluation하면 그만이죠.
하지만, 산업계에서는 현실적용 가능한 연구를 요구합니다. 그래서, 좋은 논문을 냈더라도 그것이 현실에 잘 적용이 되지 않는다면, 딥러닝 기술들이 거품이라는 이야기를 듣게되죠. 결국, 딥러닝 연구 역시 상용화를 목적에 두어야 더 환영받는 연구분야가 될 것 입니다.
대학원생 역시 졸업을 하고 산업계로 뛰어들 때, 이론만 아는 바보박사 또는 바보석사가 되지 않기 위해 딥러닝과 관련한 다양한 tool에 대해서 알고 있어야 합니다.
2-1. 석사시절 경험 (2017~2018)
2017년 대학원 석사 초기(1학기)에 연구를 하면서 아래와 같은 생각을 했던 적이 있었습니다.
딥러닝 이론을 공부하는데도 시간 없는데 MLOps 같은 것 까지 신경쓸 순 없다.
학계는 학계가 할 일이 따로 있다. 예를 들어, 학계는 창조적인 이론을 만들고 기존 이론들을 잘 정립하는게 주 된 역할이다.
위와 같은 생각은 석사를 졸업하면서 아래와 같이 바뀌게 됐습니다.
구글, 페이스북, 엔비디아, 마이크로 소프트에서 제출한 논문 결과들이 과연 한 번만 테스트 해본 것일까?
좋은 결과를 얻기 위해서는 수 많은 실험을 실행할 수 있는 능력을 키워야 하는 것이 아닌가?
내가 자원을 더 잘 활용할 수 있었더라면 더 많은 실험을 할 수 있지 않았을까?
내가 공부한 내용을 산업계가 관심있어할까?
결국 이러한 질문을 통해서 내린 결론을 다음과 같았습니다.
"실험을 설계(design)할 이론 공부와 실험을 빠르게 실행할 개발(development) 공부를 병행해야겠다"
"당시 의료인공지능 관련 연구를 하면서 들었던 생각은 기존의 딥러닝 모델을 실험하고 연구하는 방식에 모순이 많이 있다는 점이었습니다."
특히, 충분한 ablation study를 하지 않고도 논문이 accept이 되는 등 개인적으로 이해가 안가는 부분들이 많이 있었죠.
예를 들어, learning rate, batch size, random seed 등의 hyper-parameter 값에 따라서 실험 결과가 바뀌기도 하는데, 논문에서 단 한번의 실험으로 1%의 성능이 향상되었다, 2%의 성능이 향상되었다는 결론이 받아드려진다는게 이해가되질 않았습니다.
그래서, 종종 "딥러닝 실험을 할 때 필수적으로 해야할 ablation study을 왜 하지 않는것이냐?"라는 질문을 던졌을 때 돌아온 답은 아래와 같았습니다.
"실험할 자원도 없고, 시간도 없으니까요"
이때부터 딥러닝 연구를 위해서 MLOps 지식들이 필요할 수 있겠다라는 생각을 하게 됐습니다. 특히, Model development와 관련된 다양한 toolkit들에 관심을 갖게 되었고, 동시에 아래와 같은 기대를 하게 되었습니다.
"이러한 toolkit들을 잘 이용한다면 탄탄한 실험을 빠른 시간내에 할 수 있지 않을까?"
그래서, MLOps에 기반이 되는 GPU 공부를 시작으로 다양한 toolkit (ex: Github, Mixed precision, Horovod, Weight&Biases, Docker 등) 을 알게 됐습니다.
2-3. 현재 연구실 (2021)
현재는 2020년에 배웠던 몇 가지 MLOps 기법들을 적용해 보면서 연구에 많은 도움을 받고 있습니다.
Docker: 연구실 내 고사양 GPU 서버를 효율적으로 사용함
Github: 개별적으로 개발한 후 통합(integration)하여 버전 관리를 진행
Weigth&Biases: Hyper-parameter tuning, Experiment management를 자동화 하여 실험 및 결과를 빠르고 탄탄하게 분석 (Efficient ablation study)
Horovod: 다양한 GPU를 이용하여 효율적인 분산처리 시스템을 구축한 후, 학습 속도를 증가시킴
Mixed precision: 배웠던 GPU 지식을 활용해 문제없이 mixed precision을 적용하여 inference 속도를 증가시킴
(시간이 되는대로 배운 개념들을 잘 글로 정리하고, 비교한 실험 결과들을 설명할 예정입니다.)
3. 내가 생각하는 (연구자들이 특히 관심갖어야 할) MLOps
3-1. GPU 성능의 발전
Samsung, TSMC 의 나노공정경쟁이 지속되면서 GPU의 성능은 계속해서 증가할 것입니다. 현재(2021.10월 기준)최신 GPU RTX 30 series의 나노공정 기술이 8nm인데, 최근(2021.10월 기준)에는 NVIDIA가 TSMC의 5nm 공정을 이용해 새로운 GPU 모델을 생산할 것이다라는 이야기가 돌고 있죠.
만약, 개인 연구자들이 몇 개의 GPU를 살 수 있게 가격이 조정되고, 더 좋은 GPU가 나온다면 GPU, TPU를 극대화 하는 기술들(ex: 분산처리 시스템, Tensor core 이용 기술)을 잘만 이용하면 누구나 좋은 실험을 할 수 있을 것입니다. 예를 들어, 앞으로 horovod와 같이 좀 더 발전된 분산시스템을 잘 이용할 수 있다면 발전된 GPU 자원을 극대화 하여 연구성과를 내는데 큰 일조를 할 수 있을 것입니다.
즉, 우리가 감히 상상도 해보지 못했던 실험들을 할 수 있을 것이고, 방대한 양의 실험들을 통해 좀 더 근거있는 연구 결과를 선보일 수 있을 것입니다. 그런데 지금부터 준비하지 않는다면 결국 나중에 다가오는 기회를 놓칠 가능성이 많아지겠죠.
3-2. Auto ML (Feat. Feature Engineering, HPO, NAS)
[3-2-1. NAS (Neural Architecture Search)]
보통 ML (or DL) 연구자들이 하는 많은 일들 중 하나는 새로운 ML(or DL) 모델을 고안하고 구현하는 것입니다. 하지만, 모델을 고안하고 연구하는 것은 쉬운일이 아닙니다. 왜냐하면 특정 모델을 구현하는데 고려해야할 요소도 굉장히 많으며, 해당 모델이 커질 수록 사용해야할 자원도 많아지고 시간도 오래 걸리기 때문입니다. 그래서, 딥러닝이 풀어야할 문제에 최적화 된 모델을 자동으로 만들어주는 NAS라는 기술이 계속 연구되고 있습니다.
[3-2-2. Feature Engineering]
보통 산업계에서는 새로운 ML(or DL) 모델을 고안하지 않는 것 보다, 기존 모델의 성능을 유지보수 하고 빠른 시간내에 향상시키는 방법을 선호합니다. 최근에는 모델링을 중점적으로 하는 model-centric view 연구보다 데이터의 퀄리티를 향상 시키는 data-centric view 연구가 더 많은 관심을 받고 있습니다.
(↓↓↓ Data Centric AI를 강조하는 Andrew ng↓↓↓)
해당내용을 요약하면 아래와 같습니다.
Model-centric view
모델이 좋으면 조금 품질이 떨어지는 데이터로 학습해도 잘 동작한다는 관점
Good model → Robust for various dataset
Data-centric view
모델링을 하더라도 데이터를 기반으로 만들어야 하는 것이 맞는 방향
좋은 모델을 만드는 것보다 좋은 데이터를 만드는 것이 딥러닝 모델 성능에 더 크게 기여
대부분의 작업은 데이터를 수집하고 가공하는 일
[생산된 철 제품 중 불량을 검출하는 프로젝트]
첫 시도(=baseline)에서는 76.2% 검출율을 보임
90%accuracy까지 올리는 것이 목표
두 그룹으로 나눠서 프로젝트를 진행함
Model centric 그룹: 딥러닝 모델 연구
Data-centric 그룹: data전처리(cleansing), 질 좋은 데이터 선별
Data-centric 그룹에서 성능향상이 뚜렷하게 나타남
앤드류 응은 아래와 같이 딥러닝 연구 트렌드가 변해야 산업의 요구에 빠르게 답할 수 있다고 주장한듯한 느낌을 받았습니다.
ML에서 data-centric 연구는 feature engineering 분야와 많은 관계가 있습니다.
아래 강의를 보면 raw data에서 어떻게 good data를 선별하는지에 대해 이해하실 수 있으니 참고하시길 바랍니다.
(↓↓↓ 아래에서 4강 수업이 feature engineering, 5강이 Art and Science of ML ↓↓↓)
보통 딥러닝에서는 유의미한 feature를 뽑아주는 feature engineering 역할을 DNN이 수행합니다. 아마 이 부분이 MLOps와 DLOps 를 구분짓게 하는 요소가 될 수 있을 것 같네요.
[3-2-3. Hyper-Parameter Optimization (HPO)]
앞서 언급했듯 딥러닝에서는 결과에 영향을 미치는 다양한 hyperparameter들 (ex: batch size, learning rate, random seed 등)이 존재합니다. 그래서 보통 hyper-parameter들에 대한 ablation study가 따로 진행되기도 하죠. 만약에 다양한 hyper-parameter 조합을 학습이 끝날 때 마다 manually 설정해주면 굉장한 시간이 소요될 것 입니다. 예를 들어, 'batch=16, learning=0.1'이라고 설정한 학습이 끝났으면, 'batch=32, learning=0.01'로 설정하고 다시 학습시켜야 하는데, 언제 학습이 끝났는지도 모르고 (물론 요즘은 알람기능이 있긴 합니다만..), 이걸 하나씩 manually 바꿔주는 것도 여간 귀찮은 일이 아닙니다.
또한, hyper-parameter search 방식도 random search, grid search, Bayesian optimization, Tree-structured Parzen Estimators algorithm 등 너무나도 많기 때문에 manually 설정하여 학습한다면 많은 시간이 소요되죠. 그래서, 보통 weight&biases 를 통해 자동으로 hyper-parameter 값을 setting 해주어 테스트하고 결과를 visualization 해주는 tool을 이용하기도 합니다.
지금까지 설명한 내용들을 보통 AutoML이라는 영역안에 포함시키기도 합니다. 즉, AutoML이 잘 작동하면 할 수록 지금처럼 manually 모델링, manually hyper-parameter search 등을 할 필요가 없어지겠죠. 결국, Auto ML에 필요한 software가 MLOps tool로써 나오게 된다면 지금까지 딥러닝을 연구해왔던 방향이 매우 달라질 수 있을 겁니다.
4. MLOps 관련 유용한 자료
UCBerkely 대학은 boot campus를 통해 MLOps를 잘 다루는 것이 ML practioners에게 왜 중요한지 설명하고 있습니다.
몇 가지 예를 들면, 웨어러블 디바이스 또는 실시간 감지를 통해 사람의 생처정보 및 행동패턴을 분석하여 환자들을 지속 관찰할 수 도 있고, 성능 좋은 의료인공지능 모델로 인해 정확성 높고 더 빠른 진료를 가능하게 할 수도 있습니다. 또한 원격의료 시스템을 지원할 수 도 있고, 불필요한 중간체계를 줄여주어 의료비용을 감소시킬 수 도 있습니다.
결국 의료분야에서 인공지능 모델을 이용하려는 연구자들은 위에서 언급한 '데이터 댐', '스마트 의료인프라'와 모두 관련있는 일을 하고 있으시다고 보셔도 될 것 같습니다.
4. AI hub는 무엇인가요?
만약 본인이 의료 인공지능을 연구하고 있다고 하신다면 연구를 어떻게 하고 있으신가요?
딥러닝 모델, 그 외 인공지능 학습방법론 등과 관련된 분야들 (ex: unsupervised learning, domain adaptation, CNN, GNN, etc ...) 을 연구하시고 있으실텐데, 이러한 연구를 하기 위해서는 데이터가 필요하실 겁니다.
보통 의료 분야에서 인공지능 모델을 연구하기 위한 방법은 두 가지 입니다.
사설 병원 (ex: 서울아산병원, 삼성서울병원, 서울대병원, 연세대병원, 고려대 병원 등..)의 private dataset을 이용한 연구 진행 방식
Kaggle, MICCAI 에서 개최하는 challenge에서 제공해주는 public dataset을 이용한 연구 진행 방식
Private dataset은 양질의 데이터이지만 일반 연구자들이 접근하기가 쉽지 않고, public dataset의 경우에는 접근성은 좋지만 품질이 떨어지는 경우가 종종 있습니다.
그래서 정부는 양질의 데이터를 공공 개방할 수 있도록 '데이터 댐'을 만들기로 했는데, 이를 대표하는 곳이 AI-hub라는 곳입니다. (미리 말씀 드리면 의료 데이터는 다른 데이터들에 비해 데이터를 신청하는 것이 까다롭습니다. 아무래도 사람과 관련된 데이터라 엄격할 수 밖에 없겠죠? 하지만, private dataset은 보통 해당 기관 사람 아니면 접근이 거의 불가능 한 점을 보면 상대적으로 이용하기 수월하다고도 할 수 있을 것 같습니다)
하지만, dicom 파일을 구성하고 있는 pixel은 0~255의 범위만 갖고 있는 것이 아니라, "-x ~ +x" 와 같이 범위가 마이너스부터 시작 되는 경우도 있고, bit depth가 12bit, 16bit로 구성되어 있는 것도 많습니다.
예를 들어, CT에는 hounsfield unit (HU)이라는 것이 있습니다. X-ray 또는 CT 촬영 원리는사람에게 방사선을 쏴서 방사능 투과율에 따라 detector 부분이 다르게 보이는 것입니다.
결국 투과율에 따라 detector에 입력되는 값들이 다를 텐데, hounsfield라는 사람은 HU라는 단위를 통해 물체를 구분했습니다. HU 단위는 물을 기준으로 하고 뼈는 400~1000 HU 사이의 값을 갖고, 공기는 -1000의 값을 갖는다고 정의했습니다. 값이 작을 수록 검은색을 띄며, 값이 클 수록 흰색을 띕니다 (gray scale과 비슷하죠)
실제로 dicom 파일 하나를 가져와서 max, min 값을 뿌려보면 아래와 같이 나옵니다.
(Note. DICOM 파일에서 추출한 pixel 값들이 완전히 HU 값을 표현한다고 볼 순 없습니다. 그 이유에 대해서는 다음 글의 "CT 전처리 관련 글"에서 'slope intercept equation' 부분에서 설명하도록 하겠습니다)
2. DICOM 파일 전처리
앞서 DICOM 파일의 bit depth (color depth)와 실제 이미지 bit depth는 다르다고 언급했습니다.
딥러닝 모델에 들어가는 값은 보통 bit depth를 기반으로 하기 때문에, 이에 맞게 바꾸어 주어야 합니다. 즉, 12bit depth였다면, 0~255 range를 갖는 8bit depth로 변경시켜주어야 하는 것이죠.
8bit depth로 변경해주는 방법은 아래와 같습니다.
12bit depth 값들을 모두 0~1 사이로 normalization 해주기
0~1 사이로 normalization 해준 값들에 255를 곱해주어 이미지에 맞는 8bit depth로 변경해주기
(↓↓↓Normalization 공식↓↓↓)
이렇게 바꿔준 값들은 이미지로 저장시키거나 numpy로 저장시킵니다.
그리고, albumentation 같은 곳에서 load하기 쉽게 formatting을 해주죠.
"A contrast is a great difference between two or more things which is clear when you compare them."
그렇다면, contrastive learning이라는 것은 대상들의 차이를 좀 더 명확하게 보여줄 수 있도록 학습 한다는 뜻이 되겠죠?
'대상들의 차이'라는 말에서 중점적으로 봐야 할 것은 '차이'라는 용어입니다. 보통 어떤 '기준'으로 인해 '차이'가 발생합니다.
예를 들어, 어떤 이미지들이 서로 유사하다고 판단하게 하기 위해서는 어떤 기준들이 적용되어야 할까요? 즉, 어떤 '기준'을 적용하면 이미지들이 비슷한지, 비슷하지 않은지에 대한 '차이'를 만들어 낼 수 있을까요?
고양이라는 이미지가 있다고 가정해보겠습니다. 고양이 이미지에 augmentation을 주게 되도 그 이미지는 고양이 일 것입니다. 즉, 원본 고양이 이미지와 augmentation이 적용된 고양이 이미지는 서로 유사(=positive pair)하다고 할 수 있죠.
누군가(제3자)가 augmented image에 굳이 'similar'라고 labeling 해줄 필요 없이 input data 자기 자신(self)에 의해 파생된 라벨링(supervised ← ex: augmented image) 데이터로 학습(learning)하기 때문에 self-supervlsed learning이라고 할 수 있습니다.
"하지만 'similar' 정의는 어떤 기준을 삼느냐에 따라 굉장히 달라 질 수 있습니다."
물론, similar를 찾는 방법도 굉장히 다양하겠죠. 지금부터 이에 대해서 천천히 알아보도록 하겠습니다.
1. Similarity learning
앞서 언급한 내용 중에 가장 핵심적이고 자주 등장하는 용어가 'similar'입니다. 그렇다면, contrastive learning과 similarity learning은 어떤 관계가 있을까요? 먼저, similarity learning의 정의부터 살펴보겠습니다.
"Similaritylearning is closely related to regression and classification, but the goal is to learn a similarity function that measureshow similar or related two objects are."
결국, contrastive learning과 similarity learning 모두 다 어떤 객체들에 대한 유사도와 관련이 있다는걸 알 수 있습니다.
좀 더 similarity learning을 알아볼까요?
먼저, similarity learning의 3가지 종류들에 대해서 알아보도록 하겠습니다.
"Similarity learning is closely related to distance metric learning."
데이터들끼리 유사도가 높다는 것을 거리(distance)의 관점에서 해석해볼 수 도 있습니다. 예를 들어, 유사한 데이터 끼리는 거리가 가깝다는 식으로 해석해 볼 수 있는 것이죠. 그래서, similarity learning, contrastive learning을 배우다 보면 distance metric learning이라는 용어가 자주 등장합니다.
2. (Distance) Metric learning
유사도를 판단하는데 있어서는 굉장히 다양한 기준이 적용될 수 있습니다. 유사도를 판단하는 한 가지 방법은 거리의 관점에서 해석하는 것입니다.
보통 거리라는 개념을 단순히 점과 점 사이의 최단 거리로만 이해하는 경우가 있지만, 거리를 측정하는 방식에는 다양한 방법이 존재 합니다. 즉, "거리"라는 개념을 어떻게 해석하느냐가 굉장히 중요한 문제라고 볼 수 있습니다.
결국, 두 객체간의 거리를 측정할 수 있는 방법이 다양하기 때문에 두 객체간의 유사도를 적용할 수 있는 기준이 다양하다고 할 수 있습니다.
"Similarity learning is closely related to distance metric learning. Metric learning is the task of learning a distance function over objects."
위의 정의에 따라 metric learning은 객체간의 거리를 학습하는 방법들에 대해 연구하는 분야라고 할 수 있습니다.
그렇다면, metric이라는 개념부터 정의해볼까요?
"A Metric is a function that quantifies a “distance” between every pair of elements in a set, thus inducing a measure of similarity."
객체(데이터)들 간의 거리(or 유사도)를 수량화 하는 방법은 여러가지가 있습니다. (결국, 우리가 배우는 contrastive learning 기법에서도 아래와 같은 metric들 중에 어느 것을 사용하느냐에 따라 다양한 연구가 진행 될 수 있겠죠.)
Metric learning에서 중요한 개념은 '거리'입니다. 그렇기 때문에, metric learning에서 정의한 4가지 속성도 '거리'의 속성을 그대로 반영하고 있죠.
"A metric or distance function must obey four axioms"
Non-negativity: f(x,y)≥0
x, y 두 데이터 간의 거리는 음수가 될 수 없다.
Identity of Discernible: f(x,y)=0 <=> x=y
x, y 두 데이터 간의 거리가 0이라면, x와 y 데이터는 동일하다.
Symmetry: f(x,y) = f(y,x)
"x,y" 간의 거리나, "y,x" 간의 거리는 같다
Triangle Inequality: f(x,z)≤f(x,y)+f(y,z)
"x,z"간의 거리는 "x,y" 간의 거리와 "y,z"간의 거리를 합한 것보다 클 수 없다.
2-1. Metric of Two types
거리를 측정하는 metric 방식에도 크게 두 가지 종류가 있습니다.
Pre-defined Metrics
단순히 데이터들을 정의 된 metric 공식에 입력하고 '거리' 값을 도출하여 유사도 비교
Learned metrics
데이터들로 부터 추정할 수 있는 다른 지표들을 metric 공식에 적용하여 '거리' 값을 도출
'Learned metrics' 방식의 대표주자라고 할 수 있는 것은 딥러닝을 이용한 deep metric learning 방식입니다. 그럼 지금부터 deep metric learning에 대해 좀 더 알아보도록 하겠습니다.
2-2. Deep Metric Learning (Feat. Contrastive loss)
객체(데이터)들이 만약 고차원이라면 서로 간의 유사도를 비교하는건 굉장히 어려운 문제가 될 수 있습니다.
예를 들어, 의미적으로 가깝다고 생각되는 고차원 공간에서의 두 샘플(A,B)간의 실제 Euclidean distance는 먼 경우가 많습니다.그 이유는 “curse of dimension”으로 인해 의미 있는 manifold를 찾지 못했기 때문이죠.
[추후에 Auto-Encoder 관련 글이 완성되면 manifold에 대한 보충 설명 글로써 링크를 걸어두도록 하겠습니다]
즉, 실제 Euclidean distance는 manifold 상에서 구해야 하기 때문에, manifold를 잘 찾는 것이 두 데이터간 유의미한 similarity를 구하는데 결정적인 역할을 할 수 있겠죠.
결국, 유의미한 manifold를 찾기 위해서는 dimension reduction 방식이 필요한데, 그것이 오늘날 자주 사용되는 deep neural network이죠.
결국, 특정 metric(ex: Euclidean distance)을 기준으로 한 유사도를 찾기 위해 deep learning model의 parameter들이 학습된다면, 이는 해당 meteric을 찾기 위한 manifold를 찾는 과정이라고 볼 수 있고, 이 과정 자체가 "estimated from the data"를 의미하기 때문에, learned metrics라고 볼 수 있는 것입니다.
다시 말해, deep metric learning이란 deep neural network를 이용하여 적절한 manifold를 찾아 metric learning을 연구하는 분야라고 정리할 수 있습니다.
UIUC 대학의 SVETLANA LAZEBNIK 교수의 similarity learning ppt자료를 살펴보면 deep neural network를 이용하여 metric learening을 하는 것을 확인해 볼 수 있습니다.
[deep metric learning의 예시]
먼저, 유사한 이미지를 한 쌍으로 한 positive pair 끼리는 Euclidian Loss가 최소화가 되도록 학습 시키면, deep neural network는 고차원 원본 데이터 positive pair끼리 거리가 가깝도록 low dimension으로 dimension reduction(or embedding) 할 것입니다. 즉, positive pair끼리는 Euclidian loss가 최소화 되게 parameter들이 학습된 것인데, 이것을 원본 데이터로 부터 추정(estimation)되었다고 볼 수 있기 때문에 learned metric이라고 한 것이죠.
또한, negative pair 끼리는 Euclidan distance 값이 커지도록 설정해줄 수 있습니다. 아래 수식을 보면, margin (m) 이라는 개념이 도입되는데, margin은 negative pair간의 최소한의 거리를 의미합니다. 예를 들어, 우리는 loss 값이 최소가 되기를 바라는데, negative pair (xn, xq) 의 거리가 m 보다 작다면 계속해서 loss 값을 생성해낼 것 입니다. 그런데, 만약 학습을 통해 negative pair 간의 거리가 m 보다 크게 되면 loss 값을 0으로 수렴시킬 수 있게되죠.
위에서 언급한 두 수식을 결합한 loss를 contrastive loss라고 합니다.
쉽게, contrastive loss를 통해 학습을 한다는 것은 두 데이터가 negative pair일 때, margin 이상의 거리를 갖게 하도록 학습하는 것과 동일하다고 할 수 있습니다.
Pytorch에서는 negative pair 뿐만 아니라, positive pair에 대한 margin 값도 설정해놓고 있습니다. (참고로 아래 LpDistance는 Euclidean distance를 의미합니다)
참고로, margin이라는 개념을 이용하게 되면 경우에 따라 negative pairs의 관계를 크게 3가지로 나눌 수 있습니다.
d: distance를 구하는 함수
a: positive, negative pair의 기준이 되는 데이터
Hard Negative Mining: positive pair에 해당하는 margin 안에 negative sample이 포함되어 있는 경우
Semi-Hard Negative Mining: positive pair margin 범위 안에 속하진 않지만, negative pair margin 범위 안에도 속하지 않는 경우
Easy Negative Mining: negative pair margin 범위에 속하는 경우
결국, contrastive loss를 이용하여 deep metric learning을 하게 되면 아래 그림 같이, 유사한 데이터들끼리 clustering이 될 것 입니다.
사실, contrastive loss라는 용어와 개념은 "Dimensionality Reduction by Learning an Invariant Mapping"이라는 논문에서 기원했습니다. 아래 논문의 저자로 우리가 익히 알고 있는 'Yann LeCun' 교수님도 있으시네요.
“Contrastive loss (Chopra et al. 2005) is one of the earliest training objectives used for deep metric learning in a contrastive fashion.”
앞서, 소개한 contrastive loss는 contrastive learning의 한 종류입니다.
즉, contrastive learning 이라는 것은 데이터들 간의 특정한 기준에 의해 유사도를 측정하는 방식인데, contrastive loss는 positive pair와 negative pair 간의 유사도를 Euclidean distance 또는 cosine similairty를 이용해 측정하여, positive pair 끼리는 가깝게, negative pair 끼리는 멀게 하도록 하는 deep metric learning (or learned metric) 이라고 정리할 수 있습니다.
(참고로, contrastive learning을 굳이 deep neural network로 하지 않아도 되지만, deep neural network의 강력한 효용성 때문에 deep neural network를 기반으로한 deep metric learning 방식인 contrastive learning을 하려고 하는 것이 죠.)
Positive pair 끼리는 가깝게,negative pair 끼리는 멀게 하도록 하는 deep metric learning (or learned metric) 기반의contrastive learning종류는 굉장히 다양합니다.즉, 유사도를 측정하는 방식이 다양하죠. 예를 들어, infoNCE는 mutual information이라는 개념을 기반으로 유사도를 측정합니다. (Triplet loss는 이미 similarity learning에서 간단히 설명한 바 있습니다). (Mutual information 관련 설명은 다음 글에서 하도록 하겠습니다).
지금까지의 설명을 기반으로 봤을 때 deep metric learning 기반의 contrastive learning이라는 분야를 다룰 때 중요하게 다루어야 하는 개념이 두 가지가 있습니다.
Similarity Measure (Metric)
Contrastive learning은 positive pair 끼리는 가깝게, negative pair 끼리는 멀게 하도록 해주는 것이 목적입니다.
이 때, positive pair라는 것을 상징하는 유사도 값의 종류는 굉장히 다양합니다.
딥러닝 외에도 기존에 dimension reduction task에서도 다양한 unsupervied learning 모델들이 사용 됐는데, 그 중에 대표적으로 알고 있는 것들은 t-SNE, auto-encoder 같은 것들이 있습니다. T-SNE, auto-encoder 모두 라벨 없이 데이터의 latent space를 찾는 dimension reduction 기법이라 할 수 있습니다. (auto-encoder는 애초에 처음에 dimension reduction 방식으로 제안이 되었죠)
(↓↓↓T-SNE의 embeding 결과 예시↓↓↓)
(↓↓↓Auto-Encoder의 embedding 결과 예시↓↓↓)
최초의 CNN 모델인 LeNet(1998)의 창시자 Yann LeCun 교수 또한 평소에 unsupervised learning 방식을 매우 강조해왔습니다. Yann LeCun 교수는 NIPS 2016 Key Note에서는 아래 PPT 내용을 발표하였고,
같은 해(2016) CMU에서 특히 이를 강조하기도 했죠.
2. Yann Lecun & Self-Supervised Learning
[2-1. 2018]
2018.09.12 Samsung AI Forum (SAIF) 에서 Yan Lecun 교수는 self-supervised learning이라는 용어를 사용하게 됩니다. (물론 이전에도 사용해 왔을 수 도 있습니다) Yan Lecun은 supervised learning의 단점, reinforcement learning의 단점을 통해 self-supervised learning의 필요성을 주장했습니다.
Supervised learning의 단점
"레이블" 데이터가 많아야 함
학습되지 않은 데이터가 튀어나오면 예측 불가능
Reinforcement learning의 단점
실패해도 다시 시도하면 되는 게임에선 가능
현실 세계에서는 실패 자체가 치명적일 수 있어서 적용하기 힘듬
Self-supervised learning의 필요성
주변 상황과 조건을 고려해 예측해야 함
실패하기 전에 사고가 난다는 것을 예측해야 함
(↓↓↓ Yan Lecun이 self-supervised learning을 언급했다는 내용↓↓↓)
2018년도 까지만 해도 self-supervised learning과 관련된 연구들이 진행되고 있었지만, unsupervised learning이라는 용어와 별도로 분리해서 사용하지 않는 등 “self-supervised learning” 용어가 보편화 되지 않았던 것 같습니다.
하지만, Yann LeCun 교수는 self-supervised learning이라는 개념이 unsupervised learning 용어와 분별하여 사용할 필요성을 느끼고 2019년 트위터에 “self-supervised learning”이라는 개념을 구체화 하기 시작합니다.
(↓↓↓Representation learning용어는 뒤에서도 나옴↓↓↓)
[2-3. 2020]
2020.11.05 Samsung AI Forum (SAIF)에서 Yann LeCun 교수는 다시 self-supervised learning을 강조했습니다. 좀 더 구체적인 내용들을 토대로 연설을 시작하면서 왜 self-supervised learning이 필요한지 설명했습니다.
3. Self-Supervised Learning (SSL) Motivation
Self-Supervised Learnig을 배우는 이유는 다양하겠지만, 이번 글에서는 대표적인 한 가지 이유에 대해서만 말씀드리겠습니다.
Vision 분야에서 딥러닝을 가장 흔하게 사용하는 방법 중 하나는 pre-trained model을 transfer learning 하여 사용하는 것입니다. Transfer learning을 하는 이유는 ImageNet과 같이 방대한 양의 데이터를 미리 학습하여 다양한 이미지들에 대한 feature를 잘 뽑을 수 있게 filter들을 학습시키고, 특정 task에 적용하는 것이죠.
보통 초기 layer들은 edge와 같은 특징들을 뽑아낼 수 있게 학습이 될텐데, edge feature를 뽑아 줄 수 있는 filter들을 형성하는데 있어서 이미지 종류는 크게 상관이 없을 확률이 높습니다. 왜냐하면, 강아지의 edge 특징이나 자동차의 edge 특징이나 거기서 거기일 가능성이 크기 때문이죠. 하지만, 마지막 layer에서 추출할 수 있는 semantic 정보는 이미지 종류마다 다를 수 있습니다. 그래서, 우리가 최종적으로 분류할 task의 이미지 종류가 pre-training 시에 사용됐던 이미지 종류와 다르다면 마지막 layer 부분을 다시 학습(by transfer learning or fine-tuning)하여 최종 task 이미지의 semantic 정보를 적절하게 추출할 수 있도록 setting 해주는 것이죠.
여기서 중요하게 알고 넘어가야할 용어가 있습니다. 바로 "upstream task"와 "downstream task"입니다.
upstream task는 pre-training 단계에서 진행하는 학습 task를 의미하고, downstream task는 transfer learning 시에 적용하고자 하는 target task를 의미합니다.
그렇다면, transfer learning 관점에서 왜 self-supervised learning이 필요할까요? 이 질문에 답을 하기 위해서는 기존의 방식들에 대한 의문을 먼저 던져봐야합니다.
“Why should we use supervised learning method for pre-training model?”
Supervised learning학습 방식이downstream task에 효과적인feature를 학습하는데 도움이 되는가?
Pre-trainedmodel을 학습하는데 대용량의label정보가 필요한가?
사실 위의 두 질문에서 첫 번째 질문에 대한 답이 "supervised learning 방식은 좋지않다"라면 2번에 대한 답은 자연스럽게 "필요없다"가 됩니다. 즉, 우리는 첫 번째 질문에 대한 고찰만 하면 되는 것이죠.
그렇다면, 1번 질문을 집중적으로 살펴보면서 self-supervised learnin이 필요한 이유에 대해서 살펴보도록 하겠습니다.
"Supervised learning 학습 방식이 downstream task에 효과적인 feature를 학습하는데 도움이 되는가?"
위의 발표내용 중에 제가 문제라고 봤던 부분을 정리해서 설명해보도록 하겠습니다. 여기서 부터는 주관적인 해석이 많이 들어가 있으니 참고해서 봐주시고, 잘 못 됐거나 다른 관점이 있으신 분들은 댓글 남겨주시면 감사하겠습니다.
기존의 CNN이 supervised learning으로 학습하는 방식에 대해 살펴보겠습니다. CNN 분류 학습의 가장 큰 목표라고 할 수 있는 것은 아래 다양한 의자들을 모두 동일한 클래스인 "의자"라고 분류하는 것 입니다. 즉, 의자의 다양한 형태에 robust하게 분류 할 줄 알아야 하는데, 이를 위해선의자의 공통적인 feature를 잘 뽑아낼 수 있도록 Conv filter가 학습되어야 합니다. 그래서, 학습 시 아래 다양한 의자들을 모두 동일한 label로 설정하게 되는 것이죠.
그런데, 잘 생각해보면 사람들이 유아기 때 저 의자를 구분할 수 있었던 이유는 '누군가가 저 모든 형태 하나 하나씩 의자라고 알려주었기 때문'이 아니라 '먼저 각각의 의자의 특성들을 잘 파악하고 서로 유사한지 아닌지 비교해나가기 때문'인 것을 알 수 있습니다.
“People don’t rely on abstract definitions/lists of shared properties”
즉, 애초에 저 '다양한 의자들을 모두 같은 것'이라고 가정하고 출발하는게 '인간이 학습하는 방식'에 맞지 않다고 보는 것이죠.
위와 같은 문제를 해결하기 위해 딥러닝 모델도 먼저 각각의 의자 이미지들에 대한 특성을 잘 파악할 수 있게 학습시키는게 먼저라고 봤습니다.
"즉, 해당 이미지들이 무엇인지를 학습하는 것이 아닌 해당 이미지들이 무엇과 유사한지를 살펴보도록 하는게 인간의 학습관점에 더 맞다고 판단한 것이죠."
또한, 다양한 의자의 feature들을 잘 표현(representation)해줄 수 있도록 Conv filter가 학습(learning)되는게, downstream task를 위한 representation learning 관점에서 더 좋을 수 있다고 봤습니다.
4. 앞으로 볼 내용
Self-Supervised Learning은 아래의 순서대로 발전해 왔습니다.
그렇기 때문에 앞으로 Self-Supervised Learning 카테고리에서는 Pretext task, Contrastive learning, New approach 이렇게 세 가지 서브 카테고리로 나눠서 설명하도록 하겠습니다.