DL&ML/concept

One-shot learning (siamese network)

식피두 2020. 10. 23. 14:37

one-shot learning에 대한 좋은 설명 블로그가 있는데,

평소에 말이 많은 사람인지, 본론이 시작되기 전에

서론을 지나치게 길게 써놔서 번역하여 중요 부분만 간략히 정리해본다.

 

One Shot Learning and Siamese Networks in Keras

[Epistemic status: I have no formal training in machine learning or statistics so some of this might be wrong/misleading, but I’ve tried my best.]

sorenbouma.github.io

뉴럴넷을 이용하면 고차원의 데이터에 대해 좋은 퍼포먼스를 보인다.

하지만, 일반적으로는 학습데이터가 클 때만 해당되는 말이다.

 

반면 사람은 one-shot learning이 가능하다. 

전에 본적이 없는 것이라도, A를 한 번만 보여주면

A와 다른 것들과의 구분을 잘 한다.

 

문제 정의

one-shot learning이란

S = {(x1, y1), (x2, y2), ... }

와 같이 학습 데이터가 주어지고,

테스트 데이터 x_ 가 주어졌을 때,

x_의 라벨 y_는 S에 있는 y중 어떤 것과 같은지 찾는 문제이다.

 

N-way one-shot learning이란

클래스가 N개 임인 one-shot learning을 의미한다.

 

20-way one-shot learning에서

random guessing의 정확도는 5%가 된다.

 

대표적인 데이터 셋으로는 omniglot dataset이 있다.

github.com/brendenlake/omniglot

 

brendenlake/omniglot

Omniglot data set for one-shot learning. Contribute to brendenlake/omniglot development by creating an account on GitHub.

github.com

1623 개의 손글씨로 작성된 캐릭터들이 있고

각 캐릭터들 당 20개의 example로 구성이된다.

 

Euclidean distance를 이용해서 omniglot dataset를

1 nearlest neighbor로 분류를 해보면 28% 정도의 정확도를 얻을 수 있다.

파라미터 학습 없이 분류기를 구현할 수 있으므로

non parametric one shot learner라고 부를 수 있다. 

딥 뉴럴넷을 통한 one-shot learning

나이브하게 vanilla CE loss softmax classifier를 이용하여 뉴럴넷을 학습시킨다면

굉장한 overfit이 일어날 수 밖에 없다. 파라미터는 많고 데이터는 매우 적기 때문이다.

 

사람은 평생을 비슷한 물건들을 관찰하며 학습하면서 살아왔기 때문에

랜덤하게 초기화된 Neural Net과 분류 능력을 비교하는 것은 fair하진 않다.

 

따라서 많은 논문들에선 Knowledge Transfer를 이용하여 다른 태스크에서 학습된 뉴럴넷 모델을 끌어와서 활용한다.

 

미리 학습된 백본 네트워크의 마지막 레이어에 softmax classifier를 붙여

주어진 support set에 대해 fine tuning 한다. (Transfer Learning)

하지만, 역시나 클래스당 데이터가 20개 밖에 안되기 때문에(omniglot의 경우)

마지막 classifier 레이어에 overfit이 생길 수 밖에 없다.  

 

* feature ; transformation of the data that is useful for learning

 

overfit 걱정을 덜기 위해 앞서 언급했던 non parametric learning 예시로 돌아가보자.

random guessing 보다는 훨씬 성능이 좋았는데 더 개선할 수 없을까?

왜 28% 정확도 밖에 나오지 않은 것인가?

사용했던 distance metric이 omniglot 같은 고차원 데이터에 적합하지 않기 때문이다.

A라는 이미지를 몇 픽셀식 shift시켜 A'를 만들면 위의 distance metric을 계산한 결과

그 거리가 매우 커진다.

 

딥러닝을 통해서 적절한 similarity function을 학습해보자.

관련 논문 ; www.cs.cmu.edu/~rsalakhu/papers/oneshot1.pdf

 

Siamese network

 

Siamese Neutral Networks for One-shot Image Recognition

논문 링크 ; www.cs.cmu.edu/~rsalakhu/papers/oneshot1.pdf (링크 클릭이 안되는 경우 제목으로 검색) 이전에 Extrative Summarization as Text Matching 논문에서 siamese-BERT 아키텍쳐가 제안되었는데, siames..

aimaster.tistory.com

위 논문에서 소개된 접근 법은 다음과 같다.

뉴럴넷에 2개의 이미지를 입력하고, 결과로 같은 카테고리인지 아닌지를 학습하는 것.

테스트를 진행할 때는 support set에 있는 이미지와 테스트 이미지를 비교하여 가장 높은 확률의 케이스를 뽑으면 된다.

 

중요한 것은 x1, x2를 전달 했을 때와, x2, x1을 전달 했을 때 symmetric 해야 한다는 점이다.

 

이를 위해서 이미지가 입력되는 두 네트워크의 파라미터를 공유시킨다.

그 이후에 네트워크의 출력 feature들 간의 absolute difference를 linear classifier에 전달하는 방식이다.

 

아래 이미지는 공유되는 네트워크를 의미하며, 최종 출력은 4096 차원의 벡터 하나다.

 

Siamese Neural Networks for One-shot Image Recognition, Gregory Koch

 

두 개 이미지 각각에 대한 4096차원의 출력 벡터 두 개를 이용하여

absolute difference가 구해지고

linear classifier에 의해 0(다른 클래스)~1(같은 클래스) 사이 값으로 떨어진다.

 

logistic regresssion으로 학습이 되고, binary cross entropy를 loss로 사용하면 된다.

크기가 작고 노이즈가 적은 웨이트를 학습하기 위해서 L2 weight decay도 적용해준다.

 

Pairwise learning

one-shot learning을 위한 데이터 셋 크기는 일반적으로 작다.

하지만 siamese network를 학습 시키기 위해 pairwise로 데이터를 생성하면 굉장히 커진다.

 

964 클래스에 각 20개 데이터가 있다고 가정할 때

서로 다른 클래스 example은 (964*963/2) * 20 = 464,166 * 20 pairs 까지 만들어질 수 있다.

같은 클래스 example은 (20, 19/2) * 964 = 183,160 pairs 까지 만들어 질 수 있다.

 

구현

코드는 참조 블로그(뭔가 어설픔)말고 아래 코드를 !

 

siamese network를 구성하는 네트워크의 최종 output을 2차원 벡터로 뽑고

contrastive loss를 이용해 학습하여

같은 클래스들이 2차원 좌표상에 얼마나 잘 모이는지 보여주는 예시다.

 

delijati/pytorch-siamese

Siamese Network implementation using Pytorch. Contribute to delijati/pytorch-siamese development by creating an account on GitHub.

github.com

그 외, 메트릭 러닝에 대한 글

 

메트릭러닝 기반 안경 검색 서비스 개발기(2)

본 글은 AI 가상피팅 기반 안경쇼핑앱 ‘라운즈’에 최근 추가된 안경 검색 서비스 ‘Glass Finder’의 개발기를 공유하고자 작성된 글입니다. 지난 1부에서는 메트릭 러닝 기반 안경 검색 프로젝트

blog.est.ai

 

Pairwise / Triplet Loss

loss - 복사본 Pairwise ranking loss 친구한테 영화를 추천해야 하는 상황을 생각해보자. 친구가 이때까지 본 영화에 대해 매긴 평점이나 영화평을 통해, 많은 새로운 영화 후보 중 친구가 볼 법한 영화

wwiiiii.tistory.com

 

Triplet Loss

Triplet Loss (wiki) Triplet loss는 baseline인 anchor를 positive, negative input들과 비교하는 인공 신경 네트워크에 대한 손실 함수 (loss function)임. anchor input과 positive input 사이의 거리는 최소화..

soobarkbar.tistory.com

 

1.퓨샷 러닝(few-shot learning) 연구 동향을 소개합니다. - 카카오브레인

카카오브레인 AutoLearn 연구팀은 데이터 수가 매우 적은 상황에서도 모델을 훈련시킬 수 있는 퓨샷 러닝(few-shot learning) 연구를 진행하고 있습니다. 퓨샷 러닝에 대한 간략한 개념을 설명하고, 자

www.kakaobrain.com

 

'DL&ML > concept' 카테고리의 다른 글

Under/overfit, Validation, Regularization, Dropout, Normalization, Ensemble etc.  (0) 2021.03.10
Cross Entropy, KL-Divergence  (0) 2021.03.10
MAP(Maximum A Posterior)  (0) 2021.03.10
Likelihood & MLE(최대 우도 추정)  (0) 2021.03.10
Transformer  (0) 2020.10.21