머신러닝, 딥러닝/Meta Learning

One-Shot Learning, Siamese Network

Deeppago 2022. 5. 1. 15:52
-목차-

1. Problem Definition

2. Siamese Network

3. Triplet loss

    3.1 Triplet selection

 

이 글에서는 Coursera Andrew Ng Lecture와 'FaceNet: A Unified Embedding for Face Recognition and Clustering' 논문을 바탕으로 one shot learning에 대한 전반적인 내용을 소개 및 정리해보려고 한다.


1. Problem Definition

딥러닝 모델이 인간처럼 소량의 데이터만으로 학습을 할 수 있게 하는 것을  Few-shot learning이라고 한다. One-shot learning은 few-shot learning의 극단적인 예시로, 한 장의 데이터만으로 학습을 할 수 있게 만드는 것을 말한다.

얼굴 인식 분야에서 직면하고 있는 문제 중 하나는 One-shot learning 문제를 해결해야 한다는 것이다.  대부분의 얼굴 인식 애플리케이션들은 주어진 하나의 사진이나 그 사람에 대한 하나의 예시만으로 사람을 인식해야 한다. 하지만 딥러닝 알고리즘들은 하나의 학습 예시만 주어졌을 때 잘 동작하지 않는다.  이러한 문제를 해결하는 한 가지 방법은 "similarity function" d 이용하는 것이다. 

 

d(img1, img2) = degree of difference between images

 

similarity function d는 두 개의 이미지를 입력받아서 두 이미지의 차이 정도를 반환하는 함수이다.

만약 두 이미지가 같은 사람이라면 작은 수를 반환할 것이고, 두 이미지가 서로 다른 두 사람에 대한 것이라면 큰 숫자를 반환한다. 만약 이 수의 차이가 임계값 τ 보다 작다면 모델은 같은 사람이라고 예측할 수 있고, τ보다 크다면 다른 사람이라고 예측할 수 있다.

이러한 similarity function d를 어떻게 학습해야 할까?


2. Siamese Network

 

similarity function d를 딥러닝 방법을 통해 학습할 수 있는 한 가지 방법은 Siamese network 이용하는 것이다. Siamese network 는 2005년 CVPR에서 Learning a Similarity Metric Discriminatively, with Application to Face Verification 라는 논문에서 발표된 방법으로, weights를 공유하는 두 개의 CNN \(G_w(X)\)을 제안한다. 만약 두 개의 사진 \(x_1\)과 \(x_2\) 비교하고 싶다면 두 개의 입력에 대해 weight를 공유하는 두 개의 합성곱 신경망을 각각 실행하여 두 입력에 대한 vector representation인 \(G_w(X_1)\) 과 \(G_w(X_2)\)를 구하고 두 벡터 간에 L1 norm이나 L2 norm을 사용하여 거리를 구한다. 만약 두 이미지가 같은 사람의 이미지라면 거리는 작을 것이고, 다른 사람의 이미지라면 거리는 큰 값을 가질 것이다. 이렇게 weight를 공유하는 CNN을 활용하여 입력 이미지 \(x_1\)과 \(x_2\)를 \(G_w(X_1)\) 과 \(G_w(X_2)\) 라는 vector representation으로 변환하여 비교하는 방법을 Siamese network라고 한다.

위와 같은 task를 잘 수행하기 위해 이미지에 대한 좋은 vector representation을 얻기 위해서 신경망의 변수를 학습하는 하나의 방법은  Triplet loss를 정의하고 경사 하강법을 적용하는 것이다.


3. Triplet loss

 

 

Triplet loss는 3개의 이미지로부터 loss function을 만드는 방법이며, 아이디어는 같은 사람의 이미지의 distance 가 다른 사람의 이미지의 distance 보다 작아지도록 하자는 것이다. 이는 기술적으로  D(Anchor, Positive) 가 D(Anchor, Negative) 보다 작아지도록 잡자는 것이다. 이때, Anchor와 Positive는 같은 사람의 다른 이미지이고, Negative는 Anchor, Positive와 다른 사람이다. 이때, alpha라는 margin을 주어 충분한 차이가 벌어지도록 한다.

 

FaceNet에서는 Triplet loss를 다음과 같이 정의한다.

\(x_i^a\) : Anchor image

\(x_i^p\) : Positive image

\(x_i^n\) : Negative image

\(f(x)\) : image \(x\)에 대하여 Convolution neural network를 수행하여 얻은 representation vector

\(\alpha \) : margin

즉, Anchor image와 positive image사이의 거리와 Anchor image와 Negative image사이의 거리의 차가 최소 \(\alpha \)보다는 커지도록 neural network를 학습하게 된다.

 

3.1 Triplet selection

Triplet loss의 문제는, \(x_i^a\), \(x_i^p\), \(x_i^n\) 을 random 하게 골랐을 때, loss 가 0이 되는 것이 너무 쉽게 만족한다는 것이다. FaceNet은 더 좋은 representation vector를 생성하며, 학습에서 빠른 수렴을 위해 다음과 같은 Positive image와 Negative image를 선택하는 작업을 거친다.

\(x_i^p\)(hard-positive) : \(argmax_{x_i^p}\left\|f(x_i^a) - f(x_i^p)\right\|_2^2\)

\(x_i^n\)(hard-negative) : \(argmin_{x_i^n}\left\|f(x_i^a) - f(x_i^n)\right\|_2^2\)

 


참고 자료

FaceNet: A Unified Embedding for Face Recognition and Clustering

Coursera Andrew Ng Lecture

Learning a Similarity Metric Discriminatively, with Application to Face Verification

https://tyami.github.io/deep%20learning/Siamese-neural-networks/