etc/구글 머신러닝 부트캠프

[DSL] Convolutional Neural Networks Week4 : Face Recognition & Neural Style Transfer

uyt8989 2022. 7. 16. 23:09

이번 강의의 마지막 주차에서는 조금 더 실제 응용에 가까운 내용을 배운다.

 

1. Face Recognition

강의 초반에 바이두 본사에서 얼굴 인식으로 출입문을 통과하는 영상을 보여준다. 사실 지금 기술이 어디까지 발전했는지, 저때는 어땠는지 몰라서 막 엄청 신기하지는 않았다. 그래도 인식이 엄청 빨리되긴 하더라. 만약 이런 출입문을 만들고 싶다면 사람 얼굴 인식하는 모델을 개발해야 된다. 지금까지 했던 방식대로라면 A라는 사람의 얼굴에 대해서 학습하기 위해서는 A의 사진이 겁나 많이 필요하다. 그런데 실제로 데이터베이스에 그렇게 사진을 많이 가지고 있는 건 현실적으로 불가능하다. 이 문제를 One Shot Learning이라고 한다. 새로운 직원이 들어올 때마다 신경망을 학습시키기가 어렵기도 어렵다.

 

그래서 사진 두 개를 비교해서 둘이 같은 사람인지를 판별해주는 함수를 사용해서 문제를 해결한다. 이미지 두 개를 입력으로 받아서 두 사진의 거리를 출력하는데 이 값이 임계 값 미만이라면 같은 사람으로 판정하고 아니라면 다른 사람으로 판정한다. 예를 들어 A가 출입문에서 얼굴을 들이밀면 DB에 있는 모든 사진과 A를 대조해보고 A의 사진이 있었다면 문을 열어준다. 이 신경망 구조를 Siamese Network라고 하는듯하다. 그래서 이 신경망은 같은 사진에 대해서는 거리 값을 작게, 다른 사진에 대해서는 거리 값을 크게 학습한다.

 

그래서 Triplet loss라는 새로운 손실 함수가 필요하다. 지금까지는 맞는지 아닌지에 대해서 0과 1로 판정하는 경우가 대부분이었기에 어떤 목표에 가까워지기만 하면 됐다. 하지만 이건 가까워져야 하는 대상과 멀어져야 되는 대상을 한꺼번에 사용한다.  판정해야 되는 애를 anchor A라고 하고 가까워져야 하는 애를 positive P, 멀어져야 하는 애를 negative N이라고 한다. 여기서 alpha는 하이퍼 파라미터다. 이걸 사용하지 않으면 의도치 않은 결과가 나올 수도 있다. 그 예시로 모든 이미지에 대해서 똑같이 인코딩한다던가, 함숫값이 무조건 0 벡터인 상황이 있다. 그리고 학습이 끝난 이후에는 상관없지만 학습 시에는 똑같은 사람에 대해서 P 이미지가 여러 장 있어야 한다. 그래서 사람은 천 명인데 사진은 만 개가 필요할 수도 있다. 그리고 A, P, N을 선정할 때 무작위로 선정하면 안 된다. 너무 쉬운 테스트 케이스는 학습에 도움이 안 되기 때문에 헷갈릴 수 있는 케이스를 넣어줘야 한다.

위에서는 이미지를 벡터로 인코딩하는 부분까지 했다. 그리고 최종적으로 마지막 레이어에서 시그모이드 함수를 사용해서 서 두 벡터가 얼마나 비슷한지 0과 1 사이의 값으로 나타낸다. 여기서 인코딩 된 벡터의 차원은 (128,1)이다. 그리고 회색 부분은 카이제곱 유사도 함수 같은 걸로도 대체할 수 있다. 실제 응용에서는 어떤 크기의 벡터를 사용할지는 모르겠지만 이미지를 벡터로 나타내서 두 벡터를 비교한다는 아이디어가 참 신기하다. 나는 평생 생각해내지 못했을 듯. 아직도 실제로 저게 잘 되나... 싶은 마음이다.

 

2. Neural Style Transfer

개인적인 느낌으로는 지금까지는 뭔가 산업(?)의 느낌이 강했다면 이번 주제는 조금 더 문화(?)에 가까운 것 같다. 그림처럼 별이 빛나는 밤 그림체로 사진을 바꾸는 작업을 neural style transfer라고 한다. 잘 안 써서 모르긴 하지만 요새 카메라 어플에도 저런 거 많지 않나? 아무튼 C와 S를 사용해서 G를 만들어낸다.

이 작업을 위해서는 신경망을 학습을 시켜야 된다. 그럴라면 비용 함수 J가 필요하다. 여기서는 J를 두 개로 나눠서 정의한다. 하나는 C랑 G가 얼마나 비슷한 내용을 담고 있는지에 대한 비용 함수, 나머지 하나는 S와 G가 얼마나 비슷한 스타일인지에 대한 비용 함수다. 이걸 사용해서 gradient descent를 진행한다. 

각각의 비용 함수를 정의하기 전에 CNN의 레이어에 대한 이야기를 잠깐하고 넘어갈 필요가 있다. 신경망 초반 레이어에서는 아주 작고 간단한 부분에 집중한다. 그리고 점점 깊어질수록 다양한 특징을 잡아낼 수 있다. 강의에서는 뉴런의 활성화를 최대화하는 이미지를 몇 개 보여주면서 이걸 설명했다. 

 

아무튼 content 비용 함수는 여러 레이어 중 하나만 골라서 사용한다. 이 레이어는 너무 얕지도 않고 너무 깊지도 않도록 적당하게 고른다. 그리고 C와 G의 activation을 비교한다. 둘이 비슷한 내용을 담고 있을 수록 activation도 비슷할 테니 비용 함수의 크기도 작아진다.

다음으로 style 비용 함수는 content보다 복잡하다. 이건 하나의 레이어만 딱 고르지 않는다. 여러 레이어에 걸쳐서 gram matrix라는 것을 구한다. 한 레이어에는 채널이 여러 개 있을 수 있다. Gram matrix는 이 채널 간의 상관관계(?)를 파악한다. 각 채널에서 같은 위치에 있는 뉴런을 곱한다고 보면 될 것 같다.

이렇게 두 가지 비용 함수를 만들어서 더해 neural style transfer의 비용 함수로 사용한다. 이걸 사용해서 gradient descent를 진행하여 신경망을 학습시킬 수 있다.

 

3. 1D and 3D Convolution

지금까지는 2D에서의 convolution만 했었는데 이걸 똑같은 방법으로 1차원과 3차원으로도 확장할 수 있다. 뭔가 그림을 통해서 직관적으로 받아들여지지는 않는다. 특히 3차원인 경우에 채널이 많아지면 4차원이 되는데 이건 도저히 머릿속으로 상상할 수가 없다. 그래도 그냥 차원을 손으로 적으면서 하면 이해가 되긴 한다.

 

드디어 4번째 강의도 끝났다. 구글 부트캠프 일정보다는 훨씬 빠르지만 내가 원래 계획했던 것보다는 속도가 느려서 고민이다.

 

 

* Courera의 Deep Learning Sepcialization 강의를 수강하는데 도움이 되고자 작성한 요약문입니다. 틀린 내용 있다면 정정해주시면 감사하겠습니다.