우노
[DL] One Shot Learning, Siamese Network, Triplet Loss, Binary Loss 본문
[DL] One Shot Learning, Siamese Network, Triplet Loss, Binary Loss
운호(Noah) 2021. 2. 10. 18:09One Shot Learning
- One Shot Learning이란, 이미지 인식 분야에서 많이 사용되며
- 각 Class 에 따른 하나의 Training 이미지만으로, 이미지를 인식하고 분류하는 모델을 만드는 것을 말합니다.
- 보통의 얼굴 인식 시스템은 사용자의 사진이 한 장만 존재할 수도 있기 때문입니다.
- 하지만, 각 Class 에 따른 Training 이미지 수가 적다면, 이미지를 인식하고 분류하는 모델을 만드는 것은 어렵습니다.
- 물론 augmentation 과 같은 방법으로 샘플 수를 늘려서 해결할 수 있지만,
- 이 경우, 새로운 이미지가 데이터 베이스에 추가되었을 때, 모델을 새로 학습해야한다는 문제가 생깁니다.
- 즉, 실시간 시스템에 적합하지 않습니다.
- 따라서, 이러한 문제를 해결하기 위해, "입력 이미지와 사원 이미지 간의 유사도를 구하자"라는 아이디어가 나왔으며, 이 유사도 함수를 "Distance function" 이라고 부릅니다.
- D(x_1, x_2) = 두 이미지의 차이
- 두 이미지의 차이가 어떤 임계값 τ(타우) 보다 크면 두 이미지가 서로 많이 다른 것이고, 작으면 비슷한 것입니다.
- 즉, 우리는 인식하고자 하는 이미지가 입력으로 들어오면, 유사도 함수를 사용해 DB 에 있는 모든 Image 와 distance를 계산한 후, distance 가 가장 작은 사람으로 분류할 수 있습니다.
Siamese Network
Distance function은 이미지가 입력되면, 모든 사원의 이미지와 입력 이미지를 비교해 각각의 d를 출력합니다.
이 때 사용되는 신경망이 Siamese Network 입니다.
아래 그림은, Siamese Network를 사용한 Distance function 연산 과정입니다.
- x_1은 입력 이미지, x_2는 사원 이미지입니다.
- x_1과 x_2는 동일한 Siamese Network를 거쳐 각각의 feature vector로 인코딩됩니다.
- 이 때, x_1의 feature vector는 f(x_1) 이며, x_2의 feature vector는 f(x_2) 가 됩니다.
- 이후, f(x_1)과 f(x_2)의 L2 norm 값이 바로 Distance function의 결과값이 됩니다.
따라서 우리는, 두 이미지가 다르다면 d가 크게 나오고, 비슷하다면 d가 작게 나오도록 Siamese Network를 학습시키면 됩니다.
입력 이미지와 사원 이미지에 사용되는 Siamese Network는 동일한 구조와 파라미터로 구성되어 있습니다.
Triplet Loss
Distance Function을 위한 Siamese 신경망을 배워보았습니다.
그렇다면, Siamese Network 학습 시, 목적 함수는 어떻게 정의해야할까요?
이 때, 사용되는 목적함수가 바로 Triplet Loss(삼중항 손실) function 입니다.
Triplet Loss 는 3개의 이미지로부터 Loss Function 을 만드는 방법이며,
3가지 이미지는 다음과 같습니다.
- A (Anchor) : 입력 이미지 인코딩 벡터
- P (Positive) : 입력 이미지와 동일한 사람의 인코딩 벡터
- N (Negative) : 입력 이미지와 다른 사람의 인코딩 벡터
기본적인 아이디어는, 입력 이미지와 동일한 사람과의 distance가 다른 사람과의 distance 보다 작아지도록 하는 것입니다.
- d(A, P) : 입력이미지와 동일한 사람과의 distance
- d(A, N) : 입력이미지와 다른 사람과의 distance
즉, d(A, P) ≤ d(A, N)이 되도록 만드는 것이며, d(A, P)와 d(A, N)가 충분한 차이가 벌어지도록 alpha라는 margin 값을 추가로 할당합니다.
따라서, [ d(A,P) + α ≤ d(A,N) ] 이 되며, 이는 [ d(A,P) - d(A,N) + α ≤ 0 ] 와 동일합니다.
- 이 때, A, P, N 벡터는 0이 되면 안되며
- d(A,P)와 d(A,N) 또한 0이 되면 안됩니다.
이러한 아이디어를 통해, 실제로 정의되는 Triplet Loss는 아래와 같습니다.
- d(A,P) - d(A,N) + a 가 0보다 작으면 Loss는 0
- d(A,P) - d(A,N) + a 가 0보다 크면 Loss는 그 자체
- 따라서, 이 목적함수는 d(A,P) - d(A,N) + a 값이 0보다 작거나 같아지도록 하는 효과가 있습니다.
실제 배치 트레이닝 시, Loss는 아래와 같이 계산 될 것입니다.
- m은 배치 샘플 수 입니다.
Triplet Loss의 단점
- Triplet Loss 의 문제는 A, P, N 에 사용되는 이미지를 random 하게 골랐을 때,
- Loss 가 너무 쉽게 0이 된다는 것입니다.
- d(A,N)은 d(A,P)보다 거의 항상 크기 때문에
- d(A,P) - d(A,N) + a 은 항상 0보다 작아지게 되고 Loss는 0이 되게 되므로
- 훈련이 잘 안됩니다.
- 그래서 실제 트레이닝 시 중요한 것은, 구분하기 어려운 샘플 조합을 고르는 것입니다.
- 즉, A, P, N에 사용되는 이미지를 무작위로 고르는 것이 아닌
- 세 개의 이미지가 비슷한, d(A,P) 와 d(A,N)의 차이가 크지 않은 이미지를 우선적으로 사용하는 것이 좋습니다.
Binary Loss
Siamese Network는 Triplet Loss 뿐만 아니라 Binary Loss를 사용할 수도 있습니다.
예제를 통해 얼굴 인식이 어떻게 이진 분류로 진행될 수 있는지 알아보겠습니다.
- x_1은 입력 이미지, x_2는 사원 이미지입니다.
- 우선, 두 이미지를 Siamese Network로 통과시킨 뒤, 두 개의 인코딩 벡터 f(x_1), f(x_2)를 얻습니다.
- 두 인코딩 벡터의 L1 vector를 구합니다.
- L1 vector는 단순히 두 인코딩 벡터의 차이를 절대값 나타낸 벡터입니다.
- L1 vector 를 hidden layer 에 통과시킨 후, output layer 에서 sigmoid 변환을 합니다.
- hidden layer는 추가적인 W, b 파라미터를 가지며,
- sigmoid(W*L1 vector + b)를 출력하게 됩니다.
- Binary cross entropy 를 loss function 으로 두어 모델을 학습합니다.
- loss function은 0~1 사이의 값을 output으로 내보내며
- 1은 두 이미지가 비슷하다는 것을 의미하고
- 0은 두 이미지가 다르다는 것을 의미합니다.
- 따라서 우리는, 위와 같은 방법으로 두 이미지가 다르면 0이 나오도록, 비슷하면 1이 나오도록 Siamese Network를 학습시키면 됩니다.
추가 사항
- Siamese Network를 구현했다면, 사원 이미지들에 대한 인코딩 값을 미리 계산해 둘 수 있습니다.
- 사원 이미지들의 인코딩 값을 미리 계산해둔다면, 인식하고자 하는 이미지가 들어왔을 때
- 사원 이미지 인코딩 값은 미리 계산 된 값을 가져오면 되기 때문에, 추가적인 계산이 필요 없어집니다.
- 인식하고자 하는 이미지의 인코딩 값만 Siamese Network를 통해 계산하면 됩니다.
'AI > Deep Learning' 카테고리의 다른 글
[DL] Sequence Model이란? (3) | 2021.02.15 |
---|---|
[DL] Neural Style Transfer (1) | 2021.02.10 |
[DL] Object Detection (Sliding Windows, YOLO) (1) | 2021.02.10 |
[DL] Landmark Detecting (1) | 2021.02.09 |
[DL] Object Localization (객체 위치 식별) (3) | 2021.02.09 |