본문 바로가기

AutoML 논문

Neural Architecture Search for Deep Face Recognition 논문 리뷰

요즘 하루에 1논문을 실천하고 있다.

기본기도 다지고 있지만, 역시 석사는 논문인 것 같다. 기본기는 언제나 중요하지만, 충분히 못 다졌더라도 논문은 항상 읽는 게 맞는 것 같다. 기본기와 논문은 항상 다져놔야할 것 같다.

그리고 물론 누구나 잘은 알아보지 못하겠지만, 그래도 정리를 해 놓는 것이, 나중에도 보기 편하기도 하고 정말 좋은 것 같다.

 

원래는 분할 또는 의료영상 쪽만으로 AutoML 논문을 읽으려고 했지만, 아이디어를 얻는 단계에서는 어느 ? 까진 아니더라도 그 분야의 다양한 논문을 읽는 것은 많이 도움이 되는 것 같다.

 

오늘은 얼굴인식에 사용된 AutoML 논문을 읽었다.

내가 얼굴인식에 대해서 해본 적이 없어서 잘은 몰랐었는 데, 새로운 사실도 알게되면서 새로운 아이디어 또한 얻을 수 있었다.

사실 컴퓨터 비전에서 실용성이 가장 좋은 것 중 하나가 사람의 얼굴을 탐지하거나 인식하는 것이라고 하는 데, 읽어서 좋은 듯하다.

 

또 느끼는 게, 내가 논문 읽는 속도가 좀 빠르다. 요즘은 발음을 연습하려고 항상 입으로 소리내어 읽는 데, 남들과 좀 다른 점은 구글 번역기를 안 쓴다는 것이다. 물론 솔직히 나 말고도 영어 잘 하는 사람들이 많은 것은 알지만, 어찌되었든 내 장점중에 하나라고 생각한다. 영어가 최고얌.

시작하겠다.

 

내가 얼굴 인식 분야를 잘 모르기도 하고, 딥러닝 공부를 하지만, 분명 모르는 것도 있다.

그렇기 때문에, 잘못 해석하는 것도 있겟고, 잘못 이해한 것도 분명히 있을 것이다.

그래도 핵심을 파악하는 것이 

 

[ 요약 ]

생물학적 기술은 인증에 편리하다

그중에 얼굴이 최고

얼굴 인식은 중요한 문제

 

기존의 얼굴 인식은 두가지 연구방향으로 나뉘는 데,

1. 얼굴 인식률을 높이는 방향

2. 네트워크의 크기를 줄이는 방향

기업이나 고객 입장에서는 핸드폰에서 실시간으로 하기를 원하기 때문에 그런 것 같다.

무튼...

그 중에서도 네트워크 구조를 바꾸는 경우는 없다고 한다.

 

이 와중에 네트워크 구조를 자동적으로 설계해주는 NAS가 성공적으로 되었고,

여기서 저자는 NAS 기술을 얼굴 인식에 더 적합한 네트워크를 만드는 데에 사용하였다고 한다.

그렇게 해서 좋은 결과를 얻었다.

 

[ 소개 ]

얼굴 인식은 많이 쓰인다.

문제는 어떻게 정확히 얼굴 특징을 뽑을 까 였다.

 

얼굴 인식은 특징 추출방법으로 두 종류로 나뉠 수 있는 데,

1. Shallow Feature : 영상처리 기법인 SIFT, LBP, HOG 등이 있다.

2. Deep Feature : 딥러닝 기법을 사용

 

딥러닝은 여러 데이터로 학습이 가능하여 강건하다는 장점이 있는 데, 특정한 조명이나 자세 등의 기존 얼굴 인식에 중요하게 평가되었었던 특징들을 요구안한다는 장점 또한 있다.

원래 얼굴 인식에서는 내가 예전에 읽은 논문으로는, 실내에서 가깝고 밝은 자세에서 찍는 얼굴은 정확도가 좋은 데, 어둡고 실외에서 멀리서 찍은 얼굴은 아직도 잘 인식 못한다고 알려져있는 것으로 알고있다.

 

딥러닝은 훈련할 때, 얼굴에서 bottleneck 특징을 뽑는다. 그리고 loss를 이용하여 CNN을 Fine-tune을 한다.

보통 얼굴 인식에서 쓰이는 네트워크는 ICPVR 대회에서의 구조들을 많이 참고했다고 하고,

그 중에서도 ResNet을 많이 쓰고 선호한다고 한다.

기업과 고객들은 휴대폰을 타겟으로 한는 MobileNet을 많이 선호한다고 한다. 그래서 CNN 훈련에 필요한 손실함수 즉 Loss를 고르는 게 얼굴인식 분야에서 최근까지 가장 핫하다고 한다.

Loss 개발은 두 분야가 있는 데,

1. Metric Learning : Contrastive Loss, Trplet Loss, 관련 샘플링 방법들

2. Margin Based Classification : Softmax with CenterLoss, Sphere Face, Soft-Margin Loss, AM-Softmax , ArcFace

이렇게 있다고 한다.

 

최근 몇년동안 NAS가 등장하였다.

강화학습을 기반으로한 NAS는 네트워크 생성에 있어서 기존에 사람들이 설계한 네트워크만큼의 성능을 입증하였다.

DARTS, SNAS, Proxyless NAS 등의 다른 방법들도 개발이 되었는 데,

탐색공간을 줄이거나, 탐색 전략을 바꾸어 탐색을 가속화하였다.

근데 정확도가 낮았다.

 

저자들이 알기로 대부분 NAS 연구쪽은 CIFAR-10이나 IMAGENET을 대상으로 하였다.

이 데이터셋들을 기반으로 엄청난 시간을 들여 높은 정확도를 냈었다.

 

이 논문에서는 NAS와 얼굴인식을 합쳤다고 한다.

네트워크의 사이즈를 고려하여 보상에 정확도와 함께 latency(지연도)를 합쳤다고 한다.

이 논문의 목표는 현재의 얼굴 인식 네트워크보다 더 좋은 네트워크를 생성하는 데에 있다고 한다.

 

이 방법을 증명하기 위한 데이터 셋으로 2가지 데이터 셋을 썻는 데, 

MS-Celeb-1M 에서는 98.77%

LFW에서는 99.89% 

를 이루었다고 한다.

네트워크 정확도도 올림과 동시에 네트워크 사이즈도 줄였다고 한다.

제일 큰 네트워크가 19.1M 밖에 안된다고 한다.

 

[ 관련 연구 ] ( loss 발전 과정에 대하여 설명 )

 

손실함수는 딥러닝에서 매우 중요하고, 적절한 손실함수는 성능향상에 매우 좋다.

반면, NAS는 두가지 차원으로 생각할 수 있는 데,

탐색 공간과 탐색 전략이다.

 

[[ 손실함수의 발전 과정 ]]

얼굴 인식에 가장 대표적인 5개의 손실함수가 있다.

Cross Entropy Loss

Angular Softmax Loss

Additive Margine Softmax Loss

ArcFace Loss

 

(각 수식을 그냥 설명하는 데, 이거는 그냥 이렇게만 알아두려고 한다. 그리고 5개 라더니 4개만 보여줌)

 

[[ Neural Architecture Search ]]

AutoML은 급격히 발전 중이다.

 

탐색공간은 생성될 네트워크의 질과 합리성?을 정의하며,

탐색 공간을 줄이는 것은 시간을 가속화 할 수 있지만 오히려 제한을 걸 수도 있다.

 

탐색공간의 종류

- chain architecture space

- multi-branch architecture space

- cell/block based search space

 

이 탐색공간에서 쓰이는 연산의 종류

- Convolution

- Pool

- residual 연결

- 그 이외

 

탐색 전략은 빠르고 정확하게 찾을 수 있도록 해주는 역할

탐색 전략 종류

- Algorithms based on reinforcement learning

   NAS-Net , BlockQNN, ENAS, MnasNet

- Algorithms based on evolution learning

   Hierarchical, AmoibaNet

- Continuos diffeerentiable algorithms

   SMASH, PNAS, Auto-Keras, Graph hypernet, Efficient Multi-Scale Architectures, Proxyless NAS

 

NAS 가속화 방법 ( 계산이 너무 크기 떄문에 쓰임 )

- Parameter Sharing

- Network morphism

- network pruning

전략이 많이 사용.

 

NAS의 성능 평가 방법

- Test accuracy ( 테스트 정확도 )

- Number of Parameters ( 파라미터 양 )

- Memory utilization ( 메모리 사용량 )

- FLOPS ( 부동 소수점 계산 ) 

- 그 이외 등등

 

[ 방법 ]

여기서는 전체적으로만 말해준다.

 

많은 종류의 NAS가 있지만 그중에서도 효율적으로 네트워크를 탐색하는 방법은 계산적으로 효율적이다.

이 논문에서는 DAG를 사용하였다.

네트워크를 탐색할 때, 강화학습 알고리즘(policy gradient)를 사용하여 controller가 최적의 child network를 찾도록 하게끔 훈련하였다.

 

controller와 child는 번갈아가면서 훈련을 한다.

네트워크 탐색 속도를 향상시키기 위해 가중치 공유를 한다.

controller는 100개의 Hidden Unit을 가진 LSTM

핵심 파라미터는 controller의 LSTM 파라미터와 child의 공유 파라미터이다.

 

훈련 과정은 두 단계로 나뉘는 데, 

child를 훈련시킬 때는 controller를 멈춘다.

controller를 훈련시킬 때에는 child를 멈춘다.

이 과정을 반복한다.

 

그림 1 ] 전체 과정이다. 노랑 부분은 영역을 나타내는 데, 왼쪽은 controller, 오른쪽은 child이다. 설명을 하자면,  입력 이미지의 미니배치가 들어가면, controller는 child를 생성해내고, child는 학습을 하고 학습된 가중치는 공유된다. 이 과정을 예를 들어, 미니배치가 10로 되어있으면, 10번 반복한다. 즉 10개의 child network가 생성된다. 그게 바로 child 1 epoch이다. 이 과정을 정해진 epoch마다 수행하는 것이다. 반면, child에서 1 epoch이 끝나면, Controller는 예시로 든 10개의 네트워크를 평가를 하여 정확도를 낸다. 그 정확도의 평균과 각 child network의 Latency의 평균을 arcsin을 이용한 계산식으로 계산을 하고, 그 계산값을 보상으로 하여 Controller를 Update한다.

 

전체 설명은 알고리즘을 보면 이렇다. 내가 설명한 대로 그대로 알고리즘을 이해하면 된다.

 

3 ~ 5 : 미니배치마다, Controller에서 child를 1개 생성하고, 가중치를 update함. 즉 공유함, 이 과정을 미니배치 개수 만큼 함. 7 ~ 11 : 미니배치 개수만큼 생성된 네트워크의 정확도를 각각 구하고, 평균을 낸 것을 Accuracy로 삼고, 정확도를 구할 때 생긴 latency를 평균낸 것을 Latency로 삼는다. 보상은 arcsin 함수에 Accuracy * (Latency / 목표 Latency) 으로 계산한다. q는 latency에 대한 가중치다. 보상을 policy gradient를 사용하여 controller를 업데이트한다. 그리고 이 과정을 Epoch 개수만큼 반복 

 

[ child 훈련 ]

각 데이터의 미니배치마다, contoller를 멈추고 네트워크를 생성하도록 한다.

생성된 child는 cross-entropy loss를 사용하는 데, decay를 사용하여 momentum을 사용함.

ENAS 방법을 사용하되, 여기서는 탐색 공간을 좀 바꿈.

기존 ENAS에서는 5개인가 6개의 연산 집합을 가졌다면,

여기서는 4개를 가짐.

( OPS )

3 x 3 depthwise separable convolution

5 x 5 depthwise separable convolution

average pooling

max pooling

 

각 Convolution은 Block인데, 그림으로 보는 것이 쉬울 것이다. 설명은 그림으로 하겠다.

그림 2] 그러니까 사실 위에서 골랐던, Convolution 연산은 다 위에 보듯이 conv block으로 되어있다는 것이다. 예를 들어 3x3 depth sep conv를 찾으면 conv 1x1, conv 3x3, batch norm, relu 로 자동적으로 이루어진다는 것이다. 저기에 conv라고 되어있는 데, 사실 depth conv다. 모든 conv는 depth sep con로 했다고 한다. 그리고 Pooling을 찾는 것도 block으로 마찬가지로 되어있는 것이다. pooling의 크기가 몇인지는 알려주지 않았지만 2x2 인듯 하다.

 

[ Controller 학습 ]

Controller는 100 hidden unit을 가진 LSTM이다.

Controller 학습시에는 child weight을 멈춘다.

강화학습이 최적화 알고리즘 역할.

각 미니배치마다 만들어진 child network를 각 validation seg의 미니배치로 정확도를 미니배치 개수만큼 얻는다.

그 정확도를 보상으로 쓴다.

coefficient를 사용하여 정확도와 복잡성 사이의 trade-off를 조절함.

즉, 어떻게 하냐면, 매번 validation set을 평가해서 정확도를 얻을 때, 그 시간도 측정한다. 

그래서 정확도와 시간을 같이 reward에 넣는다. 

overfitting을 피하기 위해, controller는 매번 다른 구조를 만들어냄.

 

[ 찾은 구조 학습하기 ]

 

Epoch이 다 끝나면, 여태까지 만든 것 중에서인지, 아니면 마지막 단계에서인지 모르겠다만.... 아마 여태까지 만든 것이 아닐까... 생각한다. 

무튼 그 중에서 정확도를 기준으로 순위를 매기고

제일 높은 세개를 고른다.

그 세개는 처음부터 다시 훈련시키는 데,

입력 이미지에 ( 자르고, 뒤집고, 뱉겨내는 등의 ) 전처리 과정을 수행한다.

세 개의 네트워크는 수렴할 때까지 학습을 시키고, 테스트 셋으로 평가한다.

 

알고리즘은 대강 이렇다는 데, 뭐 쉽게 이해했을 거라 생각한다

 

[ 실험 결과 ]

사실 제일 중요한 것은 소개, 관련연구, 방법이라고 생각되지만 뭐 state-of-the-art를 도달했으니 조금 간단간단하게 핵심만 설명하겠다.

 

4.2 얼굴 데이터 셋

[ 4.1.1 학습 데이터 셋 ]

가장 유명하고 어려운 MS-Celeb-1M을 학습 데이터 셋으로 함.

이 데이터 셋은 10M개의 영상이 있는 데, 얼굴의 종류는 100k개이다. 한 얼굴당 약 100장 들어있다.

근데 이 데이터셋이 노이즈가 심해서

ArcFace 저자들이 향상시킨 고품질의 부분 데이터셋을 썼다고 한다.

그래서 결국

350k 개 이며, 8.7k 종류의 얼굴을 가지고 있으며, 각 얼굴당 수십에서 수백장이 있다고 한다.

 

[4.1.2 테스트 데이터 셋 ]

LFW를 사용

이 데이터셋은 평가할 때 많이 쓰인다고 함.

나머지는 그냥 설명뿐임.

13000개중에 6000개를 평가 정확도에 썼다고 함.

 

4.2 자세한 학습 과정

[ 4.2.1 ] 데이터 전처리

얼굴 영상의 전처리를 위해 

MTCNN을 사용하여 다섯개의 얼굴 마커를 탐지함 ( 눈 중앙 두 개 , 코 끝 하나, 입 꼬리 두 개 )

이미지의 각 화소는 평균을 빼고 분산으로 나눠서 normalize

모든 이미지는 random flip 하고 pad를 더해 120 x 120으로 만들고 random cut하여 112 x 112로 만듦

마지막으로 모든 데이터는 섞음.

이 과정은 학습과 테스트 데이터 셋 다 적용.

그리고 네트워크의 강건ㄴ함을 향상시키기 위해 학습 셋을 16-size cut을 하여 regularize함.

그리고 tain, val, test를 8,1,1로 쪼갬.( MS-Celeb-1M data)

 

[ 4.2.2 네트워크 세팅 ]

예시 네트워크다.

네트워크 도입부에 3x3 convolution -> BatchNorm으로 함.

NAS로 찾은 Skip Connection은 Relu + conv 1 x1 + BN 으로 이루어져 있으며,

처음 block 세개 사이에는 FR을 각각 추가해주었다고 한다. 

위에서 보인 NL은 nonlinear로서, 밑에서 설명이 나온다.

FR은 Factor 또는 Feature Reduction module로서, 이미지의 가로 세로를 절반으로 줄이고 채널을 2배로 해준다.

마지막 뒤에는 drop block과 FC layer를 임의로 추가했다고 한다.

 

Skip Connection과 FR의 구조는 다음과 같다.

 

Nonlinear Module이 a, FR은 b이다.

 

[ 4.2.3 하이퍼파라미터 선택 ]

가증 흔한 cross entropy loss 사용

block 개수는 총 5개로 설정.

GPU는 8개 사용하였고, GPU 한개 당 128 batch size

..등등...

warm up 을 위해 20 epoch을 warm up에 사용하였다고 하고,

SGD를 사용해 controller를 update했다고 한다.

 

나머지 구현 부분은 더이상 설명 안하겠다. 

 

찾은 구조만 보여주겠다.

세 개를 찾았고, 각각 A,B,C로 이름을 지었다.

 

[4.3. 학습 결과 ]

훈련 시, 정확도를 보면, 

 

학습 정확도는 그렇게 중요하진 않으니 테스트 정확도를 보면,

 

그리고, LFW 로 테스트 한 것은, MS 데이터셋으로 찾고 학습했던 구조를 그대로 LFW로 테스트 한 것이다.

 

이렇게 SOTA를 달성했다고 한다.... 뭐 향후에는 Cross entropy loss가 아닌 다른 loss로도 학습시킨다고 한다...

 

[ 느낀 점 ]

여기서 흥미로운 점은 학습 정확도가, 기존에 비교한 성능을 보면, cross entropy는 그냥 성능이 평균적임에 불구한데도 불구하고 엄청난 정확도를 보였다는 것이다.... 정말 압도적이다. 여기에 일반적으로 성능 향상에 도움이 되는 Angular loss를 하면 더 높아질 수도 있을 것 같다. 정말 놀랍다. 물론 설계를 잘 한 것도 있겠지만, 분명 이 정도의 정확도는 괄목할 만 하다.

역시 나는 AutoML이 앞으로의 딥러닝 분야를 주무를 것이라고 믿어 의심치 않는다.

아.. 특징을 마저 말하자면, 여기서는 요즘 일반적으로 다양한 방법이 나왔었는 데, 쓰지 않고 정통적인 NAS 방법이라고 해야할 까? 무튼 정통 방법을 써서 높은 정확도를 낸 것에 정말 높은 점수를 쳐주고 싶다. 그리고 최대한 사람의 설계를 최소화하고 컴퓨터 보고 찾으라고 한 점에서 매우 좋은 점수를 주고 싶다. 일개 석사인 내가 점수를 주는 것도 웃기긴 하지만 말이다.

근데 사실 Controller는 거의 안 건드렸고, Child를 만드는 방법도 사실은 거의 안 건드렸다고 볼 수 있다.

왜냐면, Child Block을 찾을 때에도 단지 Operation만 기존 5개에서 4개로 줄인 것밖에 없다.

AutoML을 그냥 활용했다고 생각할 수도 있다. 기여를 찾는 다면, AutoML을 얼굴에 적용했다는 정도일 수도 있다. 예를 들어, V-NAS 같은 경우에는 Medical 분야에 AutoML을 적용한 것도 있겠지만, 빈약하긴해도 거기에 맞게끔 어떻게 찾을 지 설계를 했는 데, 그런 경우가 거의 없다는 것이다. 기존에 있었던 것을 거의 다 활용해서 그냥 찾기만 하라고 한 것이외에는 그렇게 기여가 크지는 않다. 단지, AutoML의 주 목적인, 사람의 설계를 최소화 했다는 점에만 높은 점수를 주고 싶은 것이지, AutoML을 방법적으로 얼굴 데이터에 맞게끔 어떻게 변화시킨 것도 없고 단지 활용을 한 것일 뿐이여서 뭔가 잘 했다고 하기에도 잘 못했다고 하기에도 애매하다.

말이 좀 횡설수설 했는 데, 

결론은

거의 가져다가 썼다.

다만 그 의도를 잘 활용을 하였고, 높은 성능을 냈다는 것에는 높은 점수를 주고 싶다.

새로운 분야에 활용을 했다는 점도 good

 

왜 ENAS를 그대로 사용하였냐면, 다른 논문을 보면, 본인 분야에 맞게 연산 집합을 새로 고안해서 짜거나 새로운 연산을 집어넣는 등의 행동을 하는 데,  여기는 기존 ENAS에서 사용했었던 것을 그대로 사용했다는 점 때문이다. 물론 대부분 쓰이는 게 비슷하다면 뭐 어쩔 수 없는 선택이라고 할 수도 있어서.... 내 점수는 80점!

 

물론 내가 이렇게는 말해도 활용 자체도 하기 어려웠을 것이다. 나도 활용정도는 자유자재로 해야할 것 같다.