NAS라고 많이 불리는 모델을 소개하는 논문입니다.
핫한 분야인 것 같아서 한번 리뷰를 해보려 합니다.
논문은 2017년 ICLR에 기재되었습니다.
Abstract
이미지나 자연어 처리에 있어 뉴럴 네트워크는 강력하고 유연한 모델들입니다. 그럼에도 불구하고, 여전히 뉴럴 네트워크를 디자인하기란 여전히 어렵습니다. 이 논문에서는 뉴럴 네트워크의 모델을 만들어내는 RNN을 사용할 것이며, 이 RNN을 통해 만들어진 뉴럴 네트워크가 validation set에 예상되는 accuracy를 최대화하는 방향으로 강화학습을 진행할 것입니다.
이 논문에서는 CIFAR-10 데이터에 대해 모델이 테스트를 진행하였을 때 3.65%의 에러율이 나왔는데, 이는 비슷한 구조를 사용했던 기존의 최신 모델보다 0.09퍼센트 나은 성능입니다. 거기에 1.05배 더 빠르다고 합니다.
Pen Treebank(PTB) 데이터셋에 대해서, 이 모델은 다른 기존의 베이스라인들이나 널리 사용되는 LSTM cell을 능가하는 새로운 rnn cell을 만들어냈습니다.
이 rnn cell은 PTB 테스트 셋에 대해 62.4의 perplexity를 이루어냈습니다. 이는 이전의 최신 모델들보다 3.6 perplexity 나은 성능입니다. 이 cell은 또한 PTB에 대해 character language modeling task를 전달할 수 있으며, 1.214의 perplexity를 이루어냈습니다.
Introduction
최근의 몇 년동안의 딥 뉴럴 네트워크의 발전으로 음성 인식이나 이미지 인식 등 많은 챌린지들이 성공하는 것은 기존의 feature design에서 architecuture design으로 패러다임을 변경시켰습니다. 비록 이전의 feature design보다는 쉬워졌지만, architecture design 또한 많은 지식과 시간이 요구되는 일입니다.
이 논문은 좋은 architecture를 찾아주는 Neural Architecture Search(NAS)를 제시합니다. 이 논문은 뉴럴 네트워크의 구조를 가변 길이의 문자열로 표현할 수 있다는 관점에서 시작되었습니다. 이를 위해 NAS의 controller는 가변 길이의 문자열을 생성하기 위해 RNN 구조를 이용합니다. 문자열로부터 나오게 된 네트워크(child network)를 학습하면, validation set에 대해 accuracy가 나오게 됩니다. 이 accuracy를 강화학습에서의 reward의 관점으로 보아 controller의 policy를 업데이트하게 됩니다. 이를 통해 다음에 나오게 될 문자열로 표현된 네트워크가 높은 accuracy를 받을 확률을 높이게 됩니다.
Methods
아래에선 순서대로 다음에 대해 설명할 것입니다.
1) cnn architecture를 rnn(controller)으로 생성하기 위한 방법
2) rnn(controller)을 강화학습으로 훈련시키는 방법
3) 모델의 복잡도와 훈련 시간을 줄이기 위한 몇몇 방법
4) rnn architecture를 생성하기 위한 방법
<Generate model descriptions with a controller RNN>
NAS에서는 controller가 뉴럴 네트워크의 구조적인 하이퍼 파라미터들을 생성하게끔 합니다. 유연성을 추가하기 위해 이는 RNN을 이용하여 구현되었습니다. 만약 convolutional layer로만 이루어진 뉴럴 네트워크를 생성한다고 가정해보면, 아래 그림과 같이 하이퍼 파라미터가 토큰들의 시퀀스로 생성되게끔 controller를 사용할 수 있습니다.
각각의 출력값들은 softmax를 통해 값을 정하게 되고, 이렇게 정해진 값은 다음 step에서의 input으로 들어가게 됩니다. 실험에서는 layer의 수가 특정 값을 초과하면 architecture 생성을 멈추게끔 하였습니다. 이 특정 값은 훈련이 진행됨에 따라 점차 늘려갑니다. RNN controller가 architecture 생성을 마쳤을 때, 이 architecture 기반의 child 모델이 생성되고 훈련을 실시합니다. 훈련이 끝나가 child 모델이 수렴하게 되었을 때 validation set에 대한 accuracy 값이 기록됩니다. RNN controller의 가중치는 생성한 architecture에게 기대되는 accuracy 값이 최대가 되도록 가중치를 업데이트합니다. 이 방법에 대해서는 아래 더 자세히 설명드리겠습니다.
<Training with reinforce>
chile network의 하이퍼 파라미터를 하나하나 예측하는 것 자체를 action이라고 볼 수 있습니다. 그러면 action들이 연속하여 나오게 된 것이 child network의 architecture이며, child가 최종적으로 내게 된 accuracy R이 데이터셋으로부터 나오게 됩니다. 이 R 값을 일종의 reward로 생각해서 RNN controller에 강화학습을 진행하게 됩니다. 좀 더 구체적으로, 최적의 architecture를 찾기 위해 controller에게 기대되는 reward를 최대화하게끔 합니다.
본 논문에서는 현재의 가중치에서 1부터 T까지의 액션 시퀀스 a가 주어졌을 때의 기대값 R을 왼쪽과 같이 표현합니다.
이렇게 표현되는 R은 미분이 불가능하기 때문에, 지속적으로 가중치를 업데이트할 수 있는 policy gradient method가 필요합니다. 이 논문에서는 아래와 같은 식을 사용합니다.
이는 아래의 식으로 추정될 수 있습니다.
m : 한 번의 batch에서 controller가 만들어낸 architecture의 갯수
T : architecture를 디자인하기 위해 controller가 생성한 하이퍼파라미터의 갯수
Rk : k번째 architecture의 accuracy
하지만 위의 식은 분산이 굉장히 높습니다. 따라서 baseline을 추가한 아래의 식을 적용합니다.
이 논문에서 baseline b 는 이전의 architecture들의 평균 accuracy를 이용하여 결정합니다.
추가적으로 학습을 빠르게 진행시키기 위하여 아래 방법을 사용했습니다.
NAS에서 하나의 child network를 만든 뒤, accuracy 측정을 위해 이를 학습시키는 과정은 여러 시간이 소모됩니다. 따라서 controller의 학습 시간을 빠르게 하기 위해 분산 학습을 이용합니다. controller의 파라미터를 저장하는 파라미터 서버가 S개 존재하며, 이 서버들은 K개의 controller에게 파라미터를 보냅니다. 이를 통해 controller들은 m개의 architecture를 생성하고, 이를 병렬적으로 학습시켜 최종 gradient를 계산합니다. 그 뒤 이를 다시, 파라미터 서버에 보내며 업데이트 시킵니다. 이 과정을 정해진 값만큼의 epoch동안 반복합니다.
<Increase architecture complexity with skip connections and other layer types>
위에서 보았지만, controller의 탐색 공간은 skip connection 등의 최신 architecture에서 사용되는 기법들을 탐색하지는 못합니다. 이를 위해 탐색 공간을 넓힘으로써, controller가 이런 기법들에 대해서도 제안할 수 있게끔 하는 방법에 대해 소개하겠습니다.
connection을 가능하게끔 하기 위해 set-selection attention을 사용합니다. 추가적으로 각 레이어에는 Anchor point가 생기게 됩니다. 현재의 레이어가 N일 때 1 ~ N-1 까지 이전의 레이어에서 연결할지 말지를 계산합니다. 계산식은 아래와 같습니다.
v와 W는 학습해야 하는 벡터입니다.
j의 범위는 1 ~ i - 1입니다.
위 식을 통해 j 레이어가 i 레이어에 연결이 될지 말지를 결정할 수 있습니다. 이를 적용해도 강화학습 방법은 별다른 수정 없이 그대로 사용이 가능합니다. 기존에는 무조건 순차적으로 연결되있던 모델만을 생성했다면, 이번엔 Anchor를 통해서만 레이어들이 연결되는 것으로 바뀌게 됩니다.
다만 이런 connection을 추가하면 문제가 생길 수 있습니다. 예를 들어 하나의 레이어에 많은 레이어가 input으로 들어오게 될 때, 많은 레이어를 concatenation 하여 input으로 사용하게 되는데 이럴 때 차원 관련 문제가 생길 수 있습니다. 혹은 한 레이어에 input이 없는 경우가 있을 수도 있습니다. 이런 경우 컴파일 에러를 낼 수 있습니다. 따라서 이 논문에서는 세 가지 간단한 기술을 추가로 적용합니다.
1) 레이어에 input이 없는 경우 이미지를 input으로 넣습니다.
2) 최종 레이어는 output 레이어가 없는 모든 레이어를 연결합니다.
3) 만약 인풋 레이어들끼리 다른 사이즈를 가지고 있다면, 작은 레이어는 제로 패딩을 적용하여 같은 사이즈로 만듭니다.
위와는 다른 기술적 적용으로 learning rate 같은 파라미터에 대해서는 controller가 예측하지 못하는 제한적인 CNN 구조만 만들 수가 있었는데, 이런 것 또한 가능하게끔 할 수 있습니다. 그에 더해 pooling, normalization, batchnorm 등등을 추가하는 것 또한 가능하다고 합니다. 이를 위해서는 필요한 작업은 controller가 layer type을 출력하게끔 하면 됩니다.
<Generate recurrent cell architectures>
위의 방식을 수정하여 RNN cell을 만들수도 있습니다. 기본적인 rnn 모델은 hidden state Ht를 입력값 X와 이전의 출력값 H(t-1)을 이용하여 계산합니다. 이를 수식으로 나타내면 아래와 같습니다.
조금 더 복잡한 모델인 LSTM이 요즘엔 많이 쓰이기 때문에 이런 복잡한 모델을 생성하기 위해 어떻게 NAS를 사용해야 하는지 설명해드리겠습니다.
하이퍼 파라미터들을 출력하는 점은 이전의 NAS와 비슷합니다만, 레이어별로 하이퍼파라미터를 출력하는 것이 아니라 필요한 연산들을 트리 구조로 나타내어 하이퍼 파라미터를 출력합니다. 위 그림에서 왼쪽의 트리는 기본적인 RNN의 틀을 만들어 준 트리입니다.
각 트리의 노드마다 1) 계산 방법과 2) 활성화 함수를 NAS 모델이 출력하게 됩니다. 그런데 이 정도로는 복잡한 RNN 모델을 표현하기에 부족할 수 있기 때문에(LSTM 같은 경우에는 추가적으로 cell state를 활용) 추가적으로 cell inject와 cell indices 부분을 받습니다.
cell inject는 cell state가 사용할 계산 방법과 활성화 함수를 출력하는 부분이며, cell indices는 각기의 cell state가 기존의 트리 노드에 끼어들 부분을 선택하는 부분입니다. 이를 통해 만들어진 rnn cell을 트리로 나타내면 왼쪽 그림이 됩니다. 이를 추가적으로 응용하면 좀 더 복잡한 모델 또한 만들 수 있을 것으로 보입니다.
Experiments and Results
실험은 두 가지 데이터셋에서 진행됩니다. 첫 번째로는 CIFAR-10 데이터셋으로 이미지 인식에 대해 좋은 성능의 CNN 아키텍쳐를 찾기를 원하고, 두 번째로는 Penn Treebank 데이터셋으로 language modeling에 대해 좋은 성능의 RNN cell을 찾기를 원합니다.
<Convolutional Architectures for CIFAR-10>
데이터셋 : CIFAR-10 데이터셋에 전처리 과정과 augmentation 과정을 걸쳤습니다. 먼저 이미지들에 대해 whitening 과정을 걸치고 추가적으로 각각의 이미지들을 upsample 후 랜덤하게 32x32 크기로 잘랐습니다. 마지막으로, 이렇게 잘려진 32x32 이미지에 대해 랜덤한 horizontal flips를 사용했습니다.
Search space : 비선형 함수로 Relu를 사용하며 각 레이어마다 batch normalization과 skip connection이 존재합니다. 모든 convolutional 레이어에 대해, RNN controller는 filter의 height[1, 3, 5, 7]과 width[1, 3, 5, 7], 그리고 필터의 수[24, 36, 48, 64]를 선택합니다.
stride에 대해서는 두 가지의 실험을 했습니다. 한 가지는 1로 고정시킨 것이며, 다른 건 controller가 [1, 2, 3]의 값 중 하나를 선택하게끔 하는 것입니다.
Training details : RNN controller는 35개의 hidden unit을 가진 LSTM 레이어 두 개로 이루어집니다. 학습률은 0.0006으로 ADAM optimizer를 사용했으며, 균등하게 가중치를 -0.08과 0.08 사이의 값으로 초기화시켰습니다.
학습은 위에서 설명드린 파라미터 서버를 이용하여 분산 환경에서 진행을 하였습니다. 파라미터 서버의 갯수는 20개이며, 컨트롤러의 갯수는 100개, 각 컨트롤러마다 child architecture는 8개를 만들었습니다. 즉 800개의 네트워크가 800개의 GPU를 통해 동시에 학습이 되는 방식이었습니다.
각각의 child architecture는 만들어지면 50번의 epoch을 통해 학습을 진행하였습니다. 그 중 마지막 5 epoch 동안의 accuracy를 최대화하게끔 reward를 이용하여 파라미터를 업데이트했습니다.
validation set은 랜덤하게 5000개를 뽑았으며, 나머지 45000개는 훈련 데이터로 사용되었습니다.
controller를 훈련시키는 동안, 점차 child network의 레이어 수를 늘려갔습니다. 이 실험에서는 6개의 레이어에서 시작하여 1600개의 child network마다 두 개의 레이어를 늘리게끔 진행되었습니다.
Results : controller가 12800개의 아키텍쳐에 대해 학습을 마친 후, 아키텍쳐가 가장 좋은 accuracy를 가지게 된다는 것을 발견했습니다. 그 뒤, 학습률, weight decay, batchnorm epsilon, epoch에 따른 학습률 감소 분야에 걸쳐 작은 범위에서 grid search를 진행하였고, 이를 통해 찾아낸 best model을 학습시킨 결과는 아래와 같습니다.
다른 기존 모델들과의 성능 비교가 함께 되어있는데, Error rate를 살펴보시면 기존에 가장 좋은 성능을 내던 Dense-Net과 어느 정도 비슷한 성능을 내는 것을 볼 수 있습니다. 이를 통해 NAS가 dataset에 대해서 잘 작동할 수 있는 아키텍쳐를 구축할 수 있다는 점이 증명되었다고 할 수 있습니다.
표를 좀 더 살펴보시면 NAS에서도 추가적인 하이퍼파라미터나 레이어를 통해 성능을 높일 수 있다는 점이 눈에 띕니다. 그리고 v1의 경우에는 깊이가 15로 낮은 모델임에도 좋은 성능을 내고 있습니다. 그리고 또한 흥미로운 점은 v2와의 비교인데, strides를 예측하게 했더니 오히려 성능이 drop되었습니다. 이는 search space가 커지게 되어 controller 성능에 악영향을 끼친 것으로 파악이 됩니다.
v3의 경우는 13레이어와 24 레이어에 pooling layer를 추가하게끔 하는 모델로 controller는 39개의 레이어로 이루어진 모델을 만들었습니다. 성능 또한 4.47로 좀 더 좋아졌습니다. 여기서 search space를 줄이기 위해 controller가 만드는 레이어의 갯수를 13개로 줄이고, 그 대신 각 레이어마다 3개의 dense 레이어를 추가했습니다. 추가적으로 여기서 controller가 예측하는 필터의 갯수 범위를 [24, 36, 48, 64]에서 [6, 12, 24, 36] 로 변경하였습니다. 그 대신 각 레이어마다 40개의 필터를 추가하였고 이를 통해 error rate가 3.65로 기존 Dense Net 모델을 뛰어넘는 결과가 나왔습니다. Dense-Net의 가장 좋은 모델인 3.46은 1x1 convolution을 사용해서 정확한 경쟁 대상이 아니라고 합니다. 따라서 기존에 성능이 가장 좋던 모델보다 더 좋은 모델을 NAS가 만들어낸 것입니다.
위 그림은 NAS가 찾아낸 CNN 아키텍쳐 중 하나입니다. skip connection이 다양하게 불규칙적으로 이루어지는 것을 확인할 수 있습니다.
<Learning recurrent cells for penn treebank>
Dataset : Language modeling에서 벤치마크로 잘 알려진 Penn Treebank(PTB) 데이터셋을 이용합니다. 이 데이터셋에 대해서는 LSTM 모델이 뛰어난 경향을 보이며, 이를 향상시키는 것은 어렵습니다. PTB는 작은 데이터셋이기 때문에, 오버피팅을 피하기 위해 regularization 방법들이 필요하기에, Embedding dropout과 Recurrent dropout를 사용합니다. 이 방법을 input과 output Embedding에도 공유합니다.
Search space : 위에서 설명했듯이 RNN 모델을 만들기 위해 차례로 각 트리의 노드별로 계산 방법과 활성화 함수를 순차적으로 출력하게 됩니다. 계산 방법은 [Add, Elem_mult(곱)], 활성화 함수는 [identity, tanh, sigmoid, relu] 중 하나를 선택합니다.
Training details : 위 CIFAR-10 학습 과정과 몇 개의 수정사항을 제외하곤 거의 비슷합니다.
1) RNN controller의 학습률은 0.0005로 CIFAR-10보다 조금 높습니다.
2) 파라미터 서버의 갯수는 20, 컨트롤러의 갯수는 400개이며, child 아키텍쳐는 단 1개입니다. 즉 400개의 모델이 동시에 학습됩니다.
3) 파라미터 서버의 파라미터의 업데이트는 10개의 기울기가 컨트롤러에 축적되었을 때 실행됩니다.
각각의 만들어진 child 모델은 35 epoch를 통해 훈련되었습니다. child 모델은 두 개의 레이어를 가지고 있습니다. 이 실험에서 controller는 오로지 RNN cell 구조를 예측하기 위해 다른 하이퍼 파라미터들은 고정한 상태입니다. reward 함수는 c / (validation perplexity)^2 이며, c는 상수로 80으로 설정했습니다.
위 실험과 마찬가지로 가장 좋은 성능의 RNN cell이 발견되었을 때, 학습률이나 weight 초기화, dropout rate, decay epoch에 대해서 그리드 서치를 진행하였습니다.
Results : 아래의 표는 PTB 데이터셋에 대한 각 모델들의 성능을 비교한 것입니다. 표에서 확인할 수 있는 NAS로 생성된 모델이 기존의 모델을 능가하는 것을 확인할 수 있습니다. perplexity 지표만으로도 좋은 것이 확인되지만, 속도 면에서도 기존 모델보다 빠르다는 점도 주목할 만 합니다. (Zilly 모델에 비해 NAS의 모델이 2배의 속도를 가진다고 합니다.)
<Transfer learning results>
이번에는 같은 데이터셋에 대해 다른 task인 character language modeling을 해보면서 모델의 일반화 능력에 대해서 알아보겠습니다. 실험 환경은 Ha et al. 논문과 비슷하게 구성을 하였고, 이 모델과 비교를 합니다.
비교 결과가 아래의 테이블에 나와 있습니다.
이 부분에 대해선 아직 이해가 부족해서 정리를 못하겠습니다..
Conclusion
이 논문은 RNN을 활용한 뉴럴 네트워크 아키텍쳐를 찾아내는 아이디어, NAS에 대해 소개합니다.
RNN을 사용함으로써 아키텍쳐 구조에 대해 유연하게 대응할 수 있습니다.
이 방법을 통해 여러 분야의 챌린저에서 가장 좋은 성능의 모델들보다 좋은 성능을 내는 아키텍쳐를 구해냈습니다.
이를 통해 다양한 분야에서 좋은 아키텍쳐 구조를 찾는 데 도움이 될 것으로 보입니다.
개인 의견
사실 요즘 인공지능 딥러닝 분야는 여러 다양한 복합적인 모듈들이 섞여서 하나의 지능적인 task를 해내는 걸 주로 하는 듯 한데, 위 NAS를 이용하려면 꽤 많은 변경과 아이디어가 필요할 것으로 보입니다. 그래도 RNN을 강화학습으로 학습시키는 부분이나, 신경망의 파라미터들의 시퀀스를 출력하게끔 한다는 점은 훌륭한 아이디어로 보입니다.