one-shot learning에 대한 좋은 설명 블로그가 있는데,
평소에 말이 많은 사람인지, 본론이 시작되기 전에
서론을 지나치게 길게 써놔서 번역하여 중요 부분만 간략히 정리해본다.
뉴럴넷을 이용하면 고차원의 데이터에 대해 좋은 퍼포먼스를 보인다.
하지만, 일반적으로는 학습데이터가 클 때만 해당되는 말이다.
반면 사람은 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
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
위 논문에서 소개된 접근 법은 다음과 같다.
뉴럴넷에 2개의 이미지를 입력하고, 결과로 같은 카테고리인지 아닌지를 학습하는 것.
테스트를 진행할 때는 support set에 있는 이미지와 테스트 이미지를 비교하여 가장 높은 확률의 케이스를 뽑으면 된다.
중요한 것은 x1, x2를 전달 했을 때와, x2, x1을 전달 했을 때 symmetric 해야 한다는 점이다.
이를 위해서 이미지가 입력되는 두 네트워크의 파라미터를 공유시킨다.
그 이후에 네트워크의 출력 feature들 간의 absolute difference를 linear classifier에 전달하는 방식이다.
아래 이미지는 공유되는 네트워크를 의미하며, 최종 출력은 4096 차원의 벡터 하나다.
두 개 이미지 각각에 대한 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차원 좌표상에 얼마나 잘 모이는지 보여주는 예시다.
그 외, 메트릭 러닝에 대한 글
'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 |