본문 바로가기

DeepLearning Specialization(Andrew Ng)/Convolutional Neural Networks

[Week 4] 1. Face recognition

728x90
Face recognition
1. What is face recognition?
2. One Shot Learning
3. Slamese Network
4. Triplet Loss
5. Face Vertification and Binary Classification

1. What is face recognition?

- Verification : Image가 해당 사람과 일치하는지 1:1 확인을 하는 것

- Recognition : K 명의 사람에 대한 데이터베이스를 가지고 있을 때, Image 가 누가인가?

 

Verification이 99%의 정확도를 갖고, K=100이면 Recognition을 한번 실행할 때마다 1번의 오류가 생길 것이다. 따라서 Verification의 정확도는 훨씬 높아야하고 그러고 나서 Recognition에 적용해야한다.


2. One Shot Learning

1) 기존 방식의 문제점(One Shot learning의 필요성)

 기존 방식대로는 위와 같이 이미지를 넣고 CNN을 돌리고 6개짜리 softmax를 출력할 수 있다. 그러나 

  • Training set 이 너무 작고
  • 위의 예에서 새로운 팀원이 들어가면 전체 모델을 재학습해야하기 때문

2) Similarity function(유사도 함수)

 그래서 우리는 '유사도 함수'를 새로 정의할 필요가 있다. 

- d(img1, img2)는 두 이미지의 차이 정도이며 자세한 수식은 뒤에 설명할 것.

- 어찌되었든 d()를 정의했다면 특정 임계치를 기준으로 두 이미지의 일치여부를 판단할 수 있다.

3. Slamese Network

 위와 같이 같은 network와 parameter를 사용하여 두 이미지를 FC를 통해 벡터화 한다. 벡터화한 것을 각각 f(x1), f(x2)라 하며 이것은 "encoding of x(1)" 로서 이미지를 숫자형태로 표현한 것이라 이해하면 됨. 이제는 이 숫자가 이미지를 나타내는 것. 

 그렇게 구한 f(x1)과 f(x2)로 d()를 위와 같이 정의한다. 

 당연한 얘기겠쥬


4. Triplet Loss

1) 학습 목표 정의 

  • 그래서 우리는 모델이 무엇을 학습하도록 해야하는가? 위와 같이 같은 사람을 비교한 d()는 작게, 다른 사람을 비교한 d()는 크게 되도록 학습시켜야 한다.
  • 따라서 전자가 후자보다 항상 같거나 작아야 한다.
  • a를 추가한 이유는 d()가 같으면 해당 조건을 충족시켜버리는데, 해당 경우는 우리가 목표로 하는 경우가 아니다. 양쪽이 같다라는건 A,P,N 모두 같은 사진이라는 뜻인데도 해당 부등호를 만족시키기 때문이다.
  •  a를 margin(hyper parameter)으로 지정하여 d(A,P)와 d(A,N)이 최소한 a정도는 벌어져야한다~ 고 이해하면 될듯.

2) Loss function

  • 우리의 목표를 알았으니, 모델이 기울기 하강을 통해 목표에 맞게 학습할 수 있도록 Loss function을 정해야한다.
  • max()를 이용해서 수식이 0보다 같거나 작으면 목표를 이뤘으므로 0이고 아니면 수식이 도출된 값으로 Loss값을정의한다. 
  • 만약 10000장의 사진이 있다면, 이걸 적절히 (A,P,N)의 triplet 으로 만들어 훈련시켜야 한다. 

  • 주어진 Training image로 triplet을 만들어야 하는데, 그냥 막 랜덤으로 뽑으면 우리가 정의해놓은 목표(부등호)를 너무도 쉽게 충족시킨다. 
  • 이래 되뿌면 많은 training set에서 Loss가 0이 될 것이고, 이렇게 되면 gradient descent를 하지도 않았는데, 최적화가 된 것처럼 되어버린다. 이게 뭐가 문제냐고 생각할 수 있지만, 본래 최적화는 parameter를 update하는 방법으로 이루어져야하는데 그게 아니라 단순히 triplet 을 랜덤하게 구성하는 것으로 cost가 낮아진다면 문제가 생기는 것.
  • 즉, triplet을 그냥 randomly choose하면 그냥 왠만한 parameter로도 적은 cost를 만들고 따라서 적절하게 parameter가 update될 수 없는 것(혹은 너무 오래걸릴 것). 따라서 의도적으로 hard to train 한 triplet을 만들어 그걸로 학습시키는 것이 더 적절한 방법.
  • 따라서 d(A,P)와 d(A,N) 을 비슷하게 만들어 의도적으로 cost 를 증가시킨 상태를 만들어 놓아야 한다. 그래야 parameter를 update할테니.

저 한줄한줄이 triplet 으로써 training에 이용된다고 할 수 있다. 

정리하자면,

1. (A, P, N) 으로 이루어진 training set을 준비한다.
2. A, P, N을 Conv net에 통과시키고 나온 결과값을 토대로 J 를 구한다.
3. J 를 토대로 Conv net 의 parameter를 update한다. 

 본래 Conv net을 학습시키는 방법과 '같다'. 단지 training set과 J를 정의하는 방법이 다를 뿐.


5. Face Vertification and Binary Classification

- 저렇게 FC한 걸 묶어서 binary classification 방법으로도 vertification을 할 수 있다. 저 때 시그모이드 안을 저런식으로 결합해서 넣을 수 있으며, 유사도에 대한 정의에 따라 여러 방법으로 바꿀 수 있다. 초록색은 카이제곱 유사도임.

Training set은 위와 같지. 

 

비판과 질문은 언제나 환영입니다. 많이 꾸짖어주세요.

728x90