Few shot learning 정리

4 minute read

들어가며

딥러닝을 공부하는 사람은 모두 같은 고민을 한다. “어떻게 하면 적은 데이터로 모델을 학습시킬 수 있을까..?”하고. 내가 Few shot learning에 대한 개념을 찾아본 이유는 실제로 데이터가 희귀해서라기보다는 단순히 라벨링을 적게 해보고 싶어서다. 개념에 대한 직관적인 설명을 찾던 도중 정말정말 별이 5개짜리 유튜브 강의 영상을 찾았고, 동영상의 자료들을 이용하여 내용을 정리하고자 한다. 사실 이 글보다 링크를 들어가서 제작자의 강의를 듣는 것을 더더 추천한다.

Few shot learning

Few shot learning이란, 말 그대로 “Few”한 데이터도 잘 분류할 수 있다는 것이다. 그런데, 헷갈리지 말아야 할 것은 “Few”한 데이터로 학습을 한다는 의미는 아니라는 것이다. 나는 처음에 적은 데이터로 학습한다는 줄 알고 있었다.

Few shot learning의 정의에 들어가기 전에, 기존의 딥러닝이 사람의 인지과정과 얼마나 다른지 알아보자.

사람에게 왼쪽과 같은 Support set ( 아르마딜로 사진 두 장, 천산갑 사진 두 장 )을 주고, 오른쪽의 Query가 아르마딜로인지 천산갑인지 맞춰보라고 물어보자. ( 이 사람은 태어나서 아르마딜로나 천산갑을 본 적이 없다 ) 백이면 백 Query 이미지는 천산갑이라고 잘 대답할 것이다.

전통적인 딥러닝모델은 이와 같이 각 클래스별 사진 단 두장을 가지고 Query 이미지를 맞출 수 있었을까? 전혀 아니다. 아마도 아르마딜로 사진 1000장, 천산갑 사진 1000장을 준비했어야 할지도 모른다. 그렇다면 우리는 이 문제에 어떻게 이렇게 쉽게 답할 수 있는 걸까? 바로 우리는 “구분 하는 법”을 배웠기 때문이다. 한마디로 구분을 하는 “방법을 배웠”던 것이다. 이러한 학습 시도를 Meta Learning이라고 하며, “Learn to Learn”이라고 표현한다. 하지만 우리가 구분하는 “방법을 배우”는 과정에서는 분명히 수많은 학습이 있었다. 사자와 호랑이가 다른 것을 배우고, 토끼와 고양이가 다른 것을 배우고와 같은 수많은 시행착오와 학습이 바로 지금의 내가 천산갑과 아르마딜로가 다르다는 것을 판단내릴 수 있게 도와주었던 것이다.

Few shot learning은 바로 이러한 점에 착안한 Meta learning의 한 종류이다. 따라서 “배우는 법을 배우”려면 어찌 되었든 많은 데이터가 필요하고 아래와 같은 데이터들로 학습이 될 것이다. 다만 다른 점은 구분하려는 문제 ( 아르마딜로냐 천갑산이냐 )의 데이터는 Training set에 없어도 된다.

우리는 Few shot learning을 위해 Training set, Support set, Query image가 필요하다는 점을 이해할 수 있다. 한마디로 정리하면, Training set을 통해 “구분하는 법을 배우”고, Query image가 들어왔을 때 이 Query image가 Support set 중 어떤 것과 같은 종류인지를 맞추는 일을 하는 것이다. 즉, Query image가 어떤 클래스에 “속하느냐”의 문제를 푸는 것이 아니라 어떤 클래스와 “같은 클래스냐”의 문제를 푼다고 생각하면 이해하기 쉽다.

무엇이 다른가요?

아직 Few shot learning이 다른 Supervised learning이나 Transfer learning과 무엇이 다른 지 헷갈릴 수 있다. 먼저 Supervised learning은 아래의 그림처럼 Test image ( Query image ) 의 클래스가 Training set에 있다. 즉, 학습에 강아지 사진을 주고 강아지를 잘 학습했는 지 묻는 것이다.

하지만 Few shot learning은 Training set에 없는 클래스를 맞추는 문제이다.

참고로, 이 Support set의 클래스 개수와 샘플 수를 기준으로 k-way n-shot 이라는 표현을 쓴다. k-way는 Support set이 k개의 클래스로 이루어졌다는 것이고, 이는 Query image가 k개의 클래스 중 어떤 것과 같은 것인지 묻는 문제가 되므로 k가 클수록 모델의 정확도는 낮아지게 된다. n-shot은 각 클래스가 가진 sample의 개수로 비교해볼 사진이 많으면 많을수록 어떤 클래스에 속하는지 알기 쉽기 때문에 n이 클 수록 모델의 정확도는 높아지게 된다. 그리고 이 n이 1이 되면 one-shot learning이라고 부르게 된다.

각설하고, Transfer learning과 다른 점은 사실 말하기가 굉장히 애매하다. Transfer learning은 특히 vision 분야에서 다른 도메인으로 학습된 모델의 layer의 일부를 얼리고 일부를 다른 도메인의 이미지로 fine-tuning하는 과정을 통칭한다. 이 때 새로운 도메인의 경우 많은 라벨링된 데이터가 있을 수도 있다. 하지만 Few shot learning의 경우 꼭 일부를 얼리고 fine-tuning하는 것을 의미하지는 않으며 ( fine-tuning을 안해도 상관 없음 ) 말 그대로 새로운 도메인 ( 또는 unseen dataset )이 few ( 적게 ) 있는 경우를 지칭한다.

학습 방법

Few shot learning의 기본 학습 방법은 유사성을 학습하는 것이다. 즉, 두 개의 사진이 주어졌을 때 각 사진을 잘 분석해서 두 사진이 “유사한지 다른지”를 판단할 수 있다면, Query image가 주어졌을 때 Support set의 사진들과 비교하여 어떤 클래스에 속하는 지 알아낼 수 있다.

위 그림에서 보자면, x1과 x2는 같은 클래스이고, x1과 x3는 다른 클래스인 것을 잘 알아내는 모델을 학습하는 것이다. 따라서 우리의 모델은 많은 training set을 통해 각 사진별로 중요한 특징들을 잘 추출해서 “같다”와 “다르다”를 학습해야 한다.

이후에 Query 이미지에 대해 Support set의 이미지들과 유사성을 구하고 가장 유사한 이미지를 가진 class로 분류할 수 있게 된다. 그렇다면 Dataset은 어떻게 구성해야할까?

그림과 같이 Positive set, Negative set으로 구성하여 학습이 진행된다. 이 때 Feature extraction을 잘 학습할 수 있는 모델을 디자인해야하는데 일반적인 Conv-Relu-Pool의 구조도 충분히 적합하다.

기초 Few shot learning에서는 샴 네트워크 ( Siamese Network )를 사용하는데, 이 샴은 샴쌍둥이의 샴이다. 즉, 같은 CNN 모델을 이용하여 hidden representation을 각각 구한 뒤 이 차이를 이용하는 형식이다.

이후 Positive pair에 대해서 한 번, Negative pair에 대해서 한 번 번갈아가며 학습을 진행하게 되고,

Prediction에서는 위에서 설명한 것과 같이 Support set의 이미지의 representation과 Query image의 representation 간의 차이를 샴 네트워크를 이용해 트레이닝에서의 방법과 같이 계산하여 유사성을 구할 수 있게 된다.

정리

정말 좋은 유튜브 강의를 통해 Few shot learning이 무엇인지, 어떻게 학습이 되는지 알아볼 수 있었다. 이번 장에서는 정말 기본적인 샴 네트워크를 사용한 One shot learning을 확인해볼 수 있었는데, 해당 강의를 이어서 들으면 Triplet loss를 이용한다든가, Transfer를 이용한다든가 하는 새로운 많은 접근법들이 존재하는 것을 확인할 수 있다. 처음 생각처럼 데이터를 적게 라벨링해서 학습하는 것과는 달랐지만 “방법을 배운”다는 개념이 정말 새롭게 다가왔다.

Leave a comment