Paper Review - FaceNet
이 포스트에서는 2015년 IEEE Computer Society Conference on Computer Vision and Pattern Recognition에 실린 “FaceNet: A Unified Embedding for Face Recognition and Clustering” 논문에 대해 살펴보겠습니다.
Key Point
- apply triplet network to Face recognition/verification/clustering
- propose new triplet sampling(selection) methods
introduce triplet network
이 논문에서는 지난 포스트 [Paper Review - Deep Ranking]와 [Paper Review - DEEP METRIC LEARNING USING TRIPLET NETWORK]
에서 살펴봤던 Triplet Network를 얼굴 이미지 데이터셋에 적용해서, 해당 데이터가 누구의 얼굴 이미지인지 검출하는 Face Recognition, DB내 얼굴 이미지 데이터에 포함된(와 같은) 이미지인지 검증하는 Face verification
, 그리고 여러 데이터셋에서 해당 사람 얼굴을 찾는(?) Face clustering을 수행합니다.
논문의 내용은 기본적으로 이전 포스트들에서 다뤘던 Triplet Network의 동작과 매우 유사합니다.
두 이미지 데이터 쌍간의 유사성은 squared L2 distance를 이용해서 정의했고,
verification은 Triplet Network를 이용해서 얻어낸 embedding vector의 distance를 임계값을 두어, 임계값 이내이면 True, 아니면 False의 형태로 검증하고,
recognition은 embedding vector에 대해서 k-NN classification을 적용해서 누구의 얼굴인지 검출하도록 했으며,
clustering은 embedding vector에 대해서 k-means 를 적용해서 clustering 했습니다.
이 논문에서 주목할 점은 대용량 데이터을 대상으로 triplet network를 적용하기 위한 Triplet Selection 방법을 제안한 것입니다.
Triplet Selection
Triplet은 어떤 기준이 되는 샘플 데이터 anchor example( \(x_i^a\) )와 기준 샘플 데이터와 유사한(혹은 동일한 카테고리의) positive example( \(x_i^p\) ),
그리고 기준 샘플 데이터와 유사하지 않은(혹은 다른 카테고리의) negative example( \(x_i^n\) ) 으로 구성됩니다.
또한, Triplet Network는 샘플링한 Triplet이 다음의 수식(1)을 만족하도록 network parameter를 최적화(학습)시켜야 합니다.
\[||f(x_i^a) - f(x_i^p)||_2^2 + \alpha < ||f(x_i^a) - f(x_i^n)||_2^2\]
위 수식에서 \alpha는 각 example 쌍의 distance에 대한 margin을 의미합니다.
network가 위 조건을 만족시키도록 최적화하기 위한 loss function은 다음과 같이 정의될 수 있습니다.
\[\sum^N_i[ ||f(x_i^a) - f(x_i^p)||_2^2 - ||f(x_i^a) - f(x_i^n)||_2^2 + \alpha ]\]
여기까지는 지난 두 포스트에서 살펴봤던 Triplet Network의 내용과 같습니다.
이제 triplet 을 샘플링하는 경우에 수의 대해서 살펴봅시다. 이전의 [Paper Review - Deep Ranking] 포스트에서 살펴본 바와 같이,
만약 데이터셋에 \(N\) 개의 데이터가 있을 경우 생성 가능한 triplet의 개수는 \(N^3\) 이 됩니다.
그런데 여기서 가장 큰 문제는, 대부분의 triplet이 위에서 살펴본 수식 (1)의 조건을 만족한다는 것입니다.
즉, triplet 이 수식 (1)의 조건을 만족할 경우, 해당 triplet에 대한 loss는 0이 될 것이고, 만약 batch 내에 이러한 triplet이 많으면 많을수록 전체 batch에 대한 loss가 0에 가까워지게 됩니다.
loss가 0에 가까워진다는 것은, 학습 속도를 느리게 만드는 단점이 있으며, 이러한 단점은 대규모 데이터셋을 학습시키고자 할 경우 더욱 부각될 수 있습니다.
따라서, 이 논문에서는 이러한 문제들을 해결하기 위해서 triplet 을 샘플링하는 방법들을 제안합니다.
먼저 수식 (1)을 만족하지 않는 triplet을 샘플링하는 가장 간단한 방법에 대해서 생각해봅시다.
수식 (1)을 만족하지 않는 positive example을 샘플링하는 방법은 anchor example에 대응하는 모든 positive example간의 거리를 구한 후, 가장 거리가 큰 example (hard positive)을 샘플링하는 것이 될 수 있습니다.
\[argmax_{x_i^p}||f(x_i^a) - f(x_i^p)||_2^2\]
마찬가지로 negative example을 샘플링하는 방법은 anchor example에 대응하는 모든 negative example간의 거리를 구한 후, 가장 거리가 짧은 example (hard negative)을 샘플링하는 것이 될 것입니다.
\[argmin_{x_i^n}||f(x_i^a) - f(x_i^n)||_2^2\]
하지만 이러한 방법은 데이터 셋의 규모가 크면 클수록 실행이 불가능해집니다.
왜냐하면 데이터 셋에 포함된 모든 데이터의 (anchor-positive) 쌍과 (anchor-negative) 쌍에 대한 거리를 알아내기 위해서는,
데이터들을 모두 Triplet Network에 대입해서 embedding vector로 변환하고, 변환된 embedding vector들간에 거리를 계산해야 되기 때문입니다.
이러한 비효율적인 방법을 개선하기 위한 방법으로 다음과 같은 2가지 해결책이 있습니다.
- generate triplet offline:
network 학습의 n step마다, 가장 최근에 학습된 checkpoint network를 이용해서 데이터 셋의 임의의 일부 집합에 대해 hard positive (\(argmax\))와 hard negative (\(argmin\))을 구하는 방법
- generate triplet online:
network 학습 시, mini-batch 내의 샘플들에 대해서 hard positive와 hard negative example 들을 구하는 것
이 논문에서는 online triplet mining 방식으로 triplet 을 샘플링하는 것에 초점을 맞추어서 학습했으며,
positive example의 경우, mini-batch 내에서 hard positive를 계산해서 샘플링 (batch bard)하지 않고, mini-batch 내에서 가능한 모든 positive example (batch all) 을 샘플링했습니다.
논문에 따르면 positive example 에서는 batch hard 보다는 batch all 방식으로 샘플링했을 때 학습 속도가 약간 더 빨랐다고 하네요.
negative example의 경우, hard negative example 만 샘플링해서 학습시킬 경우 \(f(x) = 0\) 이 될 수 있고, network 학습에서 bad local minima에 쉽게 빠지기 때문에,
논문에서는 다음 수식을 만족하는 semi-hard 방식으로 negative example을 샘플링했습니다.
\[||f(x_i^a) - f(x_i^p)||_2^2 < ||f(x_i^a) - f(x_i^n)||_2^2\]
이 방식으로 샘플링된 negative example 들은, anchor example을 기준으로 positive example 보다는 거리가 멀지만, negative 로 분류되기 어려운 샘플들로, 수식 (1)에서 margin \(\alpha\)에 놓여있는 샘플들을 의미합니다.
How to implement TRIPLET NETWORK?
// 향후 구현 예정 //
Results
// 향후 구현 예정 //
References
[1] FaceNet: A Unified Embedding for Face Recognition and Clustering, 2015 [paper]