본문 바로가기
Concepts/ML & DL

Few-Shot Learning

by Dobby1234 2023. 12. 10.

 

 Few-Shot Learning 

: 매우 적은 수의 샘플을 기반으로 분류 또는 회귀를 수행하는 것을 의미함

 

위의 Support Set 이미지에서 왼쪽 두 개의 이미지는 아르마딜로(Armadillo)이고 오른쪽 두 개의 사진은 천산갑(Pangolin)이다. 여기에서 아르마딜로나 천산갑에 대해 들어본 적이 없을 수도 있지만 그것은 중요한 것이 아니다.

단지, 이 두 가지 종류의 동물에 대한 차이점에 집중을 하고, 두 동물을 구별하려고 한다.

이 두 동물의 차이점은 귀와 비늘의 크기에서 차이가 있다.

 

그리고 위에서 본 4장의 이미지를 바탕으로 Query 이미지를 보면 아르마딜로? 천산갑? 둘 중에 천산갑이라고 할 것이다.

대부분의 사람들은 아르마딜로와 천산갑의 차이점을 모름에도 불구하고 단지 4개의 훈련 샘플을 사용하여 두 동물을 구별하는 방법을 배울 수 있기 때문이다.

이것은 사람들이 두 종류의 동물을 보고 "구분하는 방법"을 배웠기 때문이다. 이것은 바로 "Learn to Learn"이라고 표현한다. (= Meta Learning)

 

사람들의 경우에는 4개의 훈련 샘플을 기반으로 예측하는 것은 어렵지 않다.

그러나 컴퓨터는 클래스에 샘플이 2개만 있는 경우 올바른 예측을 할 수 있을까? 이것은 표준 분류 문제보다 어렵다.

심층 신경망을 훈련시키기에는 샘플의 수가 너무 적기 때문이다.

 

여기에서 Support Set은 모델을 훈련 시키기에는 너무 작다.

그래서 여기에서 Few-Shot learning이라는 방법이 나오게 되었다. (Few-shot learning은 Meta learning의 한 종류임)

Few-shot Learning은 제한된 수의 샘플을 기반으로 예측하는 문제이다.

 

Few-shot learning의 목표는 모델이 훈련 셋(training set)의 이미지를 인식한 다음 테스트 셋(test set)으로 일반화하도록하는 것이 아닌, 배우는 법을 배우는 것이다.

 

"배우는 법을 배우는 것(learn to learn)"은 먼저 Training Set에서 모델을 훈련 시키는 것이다.

여기에서 훈련을 시킨다는 것은 코끼리가 무엇인지, 호랑이가 무엇인지 아는 것이 아니다.

바로 객체간의 유사성과 차이점을 아는 것이라는 의미이다.

 

훈련 후에 두 이미지를 모델에 보여주고 두 이미지가 같은 종류의 동물인지 물어볼 수 있다.

이 모델은 객체 간의 유사성과 차이점을 학습했다. 따라서 모델은 두 이미지의 내용이 동일한 종류의 객체임을 알 수 있다. 

 

위에 Traning Set을 다시 보면, 훈련 데이터에는 다람쥐 클래스를 포함하는 않는 5개의 클래스가 있다. 따라서 모델은 다람쥐를 인식할 수 없다. 모델에게 다람쥐 이미지를 보여주면 모델은 자신이 다람쥐인지 알지 못한다.

모델은 두 이미지를 볼 때 그것이 다람쥐인지 알지 못한다. 하지만 모델은 이 두 다람쥐 이미지가 비슷해 보인다는 것을 알고 있다. → 모델은 위의 두 사진이 동일한 종류의 객체라는 것을 높은 확신을 가지고 말할 수 있다.

 

위와 같은 이유로 이 두 사진을 보여줘도 모델은 훈련 중에 토끼를 본 적이 없으므로 두 이미지가 토끼인지 알지 못한다.

하지만 모델은 사물 간의 유사점과 차이점을 알고 있다.

모델은 두 이미지의 내용이 매우 유사하다는 것을 알고 있다. → 모델은 이 두 이미지가 동일한 객체임을 알 수 있다.

 

그런 다음 두 이미지를 모델에게 보여주면 모델은 천산값과 불독을 본 적이 없지만 두 동물이 상당히 다르게 생겼다는 것을 알고 있다. 모델은 이 두 사진이 서로 다른 객체라고 믿을 것이다.

 

이제는 위에 다람쥐, 토끼, 천간갑, 불독 사진처럼 두 개의 사진을 보여주는 것과 달리 아래의 사진처럼 한 장의 사진만 보여준다.

위와 같이 Query 이미지가 있다. 모델에게 이 이미지를 보여주면서 이게 무슨 이미지인지 물어본다면 모델은 이 이미지가 무슨 이미지인지 대답하지 못한다. 모델은 훈련 중에 이런 종류의 객체를 본 적이 없다. 

 

그런 다음 모델에 아래의 이미지와 같은 추가 정보를 제공한다. 

모델에게 추가로 6개의 이미지를 보여준다. 

모델에게 Fox, Squirrel, Rabbit, Hamster, Otter, Beaver라고 알려준다. 

이렇게 알려주면 모델이 질문에 답을 할 수 있다.

 

모델은 위에 보여준 Query 이미지를 6개의 Support Set 이미지와 각각 비교하면서, 결국 모델은 Otter 이미지와 가장 유사한 Query를 찾는다. 따라서 모델은 Query 이미지가 Otter이라 믿는다.

 

여기에서 Support Set은 메타 학습(meta learning)의 전문 용어이다.

레이블이 지정된 이미지의 작은 셋(small set)을 Support set이라고 한다. 

 

이제 Training Set과 Support Set의 차이점을 보면, 

Training Set에는 많은 이미지들이 있고, 심층 신경망을 학습하기에 충분히 크다. 하지만 비교적으로 Support Set은 작다. Support Set의 모든 클래스에는 최대 몇 개의 샘플이 있다. 위의 Support Set에서는 모든 클래스에 샘플이 하나만 있다. 이렇게 작은 데이터셋을 사용하여 심층 신경망을 훈련시키는 것은 불가능하다. 

 

Few-shot은 큰 Training Set을 사용하여 큰 Model을 훈련한다. 

Training Set에서 호랑이나 코끼리와 같은 특정 객체를 인식하도록 모델을 훈련시키는 대신, 객체 간의 유사성과 차이점을 알도록 모델을 훈련시킨다. Support Set에서 제공되는 추가 정보를 사용하여 모델은 Query 이미지가 Otter이라는 것을 알게 된다. Otter은 Training Set의 클래스에 속하지 않지만 Otter이라는 것을 알게 된다. 

 

 

 Few-Shot Learning & Meta Learning 

Few-shot learning은 일종의 meta learning이다.

meta learning은 "배우는 방법을 배우는것(learn to learn)이다.

 

meta-learning은 기존의 지도학습(supervised learning)과는 다르다.

기존의 지도학습에서는 모델이 훈련한 데이터를 인식한 다음 보이지 않는 테스트 데이터로 일반화하도록 요청한다. 이와는 다르게 meta learning의 목표는 학습하는 것이다.

 

배우는 방법을 배우는 것은 아래와 같다.

 

아이를 동물원에 데려가면, 아이는 이전에 한 번도 본 적이 없는 물속의 복슬복슬한 동물을 보게 되어 신이날 것이다.

아이는 아빠에게 이 동물이 어떤 동물인지 궁금해서 물어볼 것이다. 비록 아이는 이 동물을 본 적이 없지만 스스로 배울 수 있다.

이제 아이에게 동물과 이름이 나와있는 card set을 준다. 이 아이는 card set에 나와있는 동물을 본 적이 없지만 모든 카드를 보고 물 속의 동물이 Otter이라는 것을 알아챈다. 물속에 있는 동물은 Otter과 가장 유사하다.

이와 같이 아이가 스스로 학습하도록 가르치는 것을 meta learning이라고 한다.

동물원에 가기 전에 아이는 이미 스스로 배울 수 있었고, 그 아이는 동물들 사이의 유사점과 차이점을 알고 있었다. 또한 아이는 이전에 Otter을 본 적이 없지만 스스로 배울 수 있었다. 카드를 읽으면서 아이는 Otter이라는 것을 알게된다.

 

이 아이는 한 번도 본 적 없는 물속의 동물을 알고 싶어한다. → meta learning에서는 알 수 없는 동물을 Query라고 한다.

그리고 Give hime the cards는 Support Set을 말한다.

 

Meta learning?

: 스스로 학습하는 것

→ 아래의 사진의 예시에서는 아이가 다른 동물을 구별하도록 하는 것이 meta learning이다.

동물원에 가기 저에 아이는 수달에 대해 들어본 적이 없었지만, 물속의 수달과 카드에 있는 수달을 연관시키는 방법을 알고 있었다. 이 예시에서 아이는 카드 세트를 사용하여 수달을 인식하는 방법을 배운다. 

여기에서 Support Set의 모든 종류의 동물은 하나의 사진만 있다. 

아이는 단 하나의 카드를 사용하여 Otter을 알아보는 방법을 배운다. → 이것을 one-shot learning이라고 한다.

 

 

이제 Supervised Learning(지도학습)과 Few-shot learning을 비교해보면, 

 

Supervised learning은 아래의 사진과 같다.

먼저, 큰 훈련 세트를 사용하여 모델을 학습한다. 모델이 훈련된 후에는 예측을 위해 모델을 사용할 수 있다.

그 다음 모델에게 test sample을 보여준다. 여기에서 test sample은 이 전에 본 적이 없는 이미지이며, training set에 없는 이미지 이다.

그래도 다행히 Test sample의 이미지 클래스는 Training Set의 클래스에 있는 이미지이다. 바로 Husky 클래스에 속한다.

이 Husky 클래스에는 수 백개의 샘플이 있다. 이 모델은 Test Sample의 Husky 이미지를 본 적이 없지만 수백 마리의 Husky를 본 적이 있다. 모델이 이 Test Sample이 Husky라고 말하는 것은 어렵지 않다. 

 

 

하지만, Few-shot은 다르다.

위의 그림과 같이 Query Sample은 이 전에 본 적이 없는 이미지이며, Query Sample은 알 수 없는 클래스에서 왔다. 

Query Sample은 rabbit이다. 이 rabbit은 Training Set의 클래스에 속하지 않는다. 모델은 훈련 중에 rabbit을 본 적이 없다. 

▶ 이것이 기존의 Supervised Learning과 Few-shot Learning의 차이점이다.

Training Set에는 rabbit 클래스가 없으므로 모델은 Query Sample이 무엇인지 알 수 없다. 모델에 더 많은 정보를 제공해야한다. 

 

이렇게 모델에게 더 많은 정보를 제공해주기 위해 Support Set을 제공해준다.

Support Set의 모든 카드에는 이미지와 이름이 있다. 모델은 Query와 Support Set을 비교하여 rabbit과 가장 유사한 Query를 찾는다. 따라서 모델은 Query가 rabbit이라고 예측한다.

 

 

k-way n-shot Support Set은 Few-shot learning의 용어이다.

  • k-way → Support Set에 k개의 클래스가 있음을 의미함
  • n-shot → Supprot Set의 모든 클래스에 n개의 sample이 있음을 의미함

 

 

Few-shot learning을 수행할 때 예측 정확도는 방법 수(k-way)와 샷 수(n-shot)에 따라 달라진다.

아래의 그래프에서 x 축은 way의 개수(Support Set에 포함된 클래스의 개수), y축은 예측 정확도이다.

→ 방법의 수가 증가할수록 예측 정확도는 떨어진다

 

why?

동물원에 Otter이 있다. 그 아이는 무엇인지 모른다. 아이에게 카드 3장을 주고 그 중 하나를 선택하라고 한다. 

→ 3-way 1-shot 학습

 

만약, 아이에게 카드 6장을 주고 그 중 하나를 선택하라고 하면?

→ 6-way 1-shot 학습

 

이 두개를 비교하면 3-way가 6-way보다 쉽다. 3개 중 하나를 선택하는 것이 6개 중 하나를 선택하는 것보다 쉽기 때문이다.

(= 3-way가 6-way보다 정확도가 높다)

 

아래의 그래프에서는 x축은 shot 수(Support Set의 클래스당 샘플 수), y축은 예측 정확도이다.

→ shot 수가 증가할수록 예측 정확도가 향상된다.

→ sample이 많을수록 예측이 더 쉬워진다.

 

 

 Few-Shot learning의 기본 아이디어는 유사성을 예측하는 함수를 훈련하는 것 

 

sim(x, x')

  • sim(x, x')에 의한 유사성 함수를 나타낸다
  • 두 샘플 x와 x' 사이의 유사성을 측정한다

위의 이미와 같이 3개의 샘플이 있다. Bulldog(x1), Bulldog(x2), Fox(x3)

 

이렇게 x1과 x2의 입력으로 사용하면 유사성 함수는 1을 출력한다. 이 두 동물이 동일하다는 것을 의미

 

이렇게 x1과 x3의 입력으로 사용하거나, x2와 x3를 입력을 사용하면 유사성 함수는 0을 출력한다. 이것은 두 동물이 서로 다르다는 것을 의미한다.

 

 

최종적으로 정리하자면,

  1. 먼저 대규모 훈련 데이터 세트(training data)에서 유사성 함수를 학습한다. (유사성 함수는 두 이미지가 얼마나 유사한지 알려준다) →  ImageNet과 같은 대규모 데이터셋을 사용하여 네트워크를 훈련할 수 있다.
  2. 훈련 후에는 학습된 유사성 함수를 사용하여 보이지 않는 Query에 대한 예측을 할 수 있다. 유사성 함수를 사용하여 Support Set의 모든 sample과 Query를 비교하고 유사성 점수를 계산할 수 있다.
  3. 그런 다음 유사성 점수가 가장 높은 샘플을 찾아서 예측을 사용한다.

→ Query와 비교하여 각 이미지마다의 유사성 점수를 내고, 그 점수 중 가장 높은 sample인 Otter로 예측하게된다.

 

* 여기에서 유사함수가 될 수 있는 것은 Siamese 네트워크가 있다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 참고 

https://www.youtube.com/watch?v=hE7eGew4eeg