Neural Architecture Search with Reinforcement Learning

reinforcement
iclr
google
2016
iclr2017
rnn
automl

#1

Recurrent Neural Network(RNN)으로 Neural Network의 구조를 출력하도록 한 후, Reinforcement Learning을 사용해서, RNN이 더 나은 Network 구조를 출력할 수 있도록 설계한 논문입니다.

사람이 디자인한 네트워크에 비해서 나은 성능, 그리고 효과적인 연산양의 네트워크를 얻게 되었습니다.

Controller

CNN

컨트롤러는 RNN 구조로, 네트워크 디자인을 출력하는 부분입니다.

위 그림은 CNN을 디자인하는 컨트롤러입니다. 각 Layer별로 Convolution의 하이퍼파라미터인

  • Filter Height
  • Filter Width
  • Stride Height
  • Stride Width
  • Number of Filters

를 출력하고 이를 Layer 개수 만큼 반복하는 형태입니다. 그리고, 이전 RNN의 결과가 다시 인풋으로 들어가는 Auto-Regressive한 구조입니다.

사용자가 원하는 Layer 개수 만큼 디자인되면, RNN을 멈추고, 디자인된 네트워크를 처음부터 수렴될 때까지 학습시킵니다.

RNN Cell

RNN Cell을 디자인하기 위해서 논문에선 큰 구조는 가정하고, 해당 구조에 어떤 Activation Function을 사용할 것인지 등만 결정하도록 했습니다. 즉,

image

위와 같은 Tree 구조로 고정하고, 3개의 구조가 어떤 방식으로 이루어질지만 결정하는 것입니다. 그래서, 컨트롤러는 아래와 같이

각 트리 구조에서 어떤 연산을 사용할 것인지만을 결정하도록 하고, 최종적으로는 output의 index를 주도록 합니다. 이렇게 결정된 RNN Cell은 아래와 같게 됩니다.

image

Training the controller (Reinforcement Learning)

방금 전 설명한 RNN 구조의 Controller는 실제로 학습된 네트워크의 성능을 Reward로 받아서 개선하게 됩니다. 데이터가 Online으로 만들어지는 등의 특성이 있으므로 Reinforcement Learning으로 학습하고, Reward가 Accuracy 등으로 non-differentiable하므로 Policy Gradient 를 사용해서 학습합니다.

정성적으로 이해하면, k번재 네트워크 구조의 Reward(eg. Accuracy)인 R_k 가 높으면 해당 Action을 선택할 확률을 높여주고, 반대의 경우 낮추어준다고 위 식을 이해할 수 있습니다.

이 때, variance를 낮추어 주기 위해, baseline b를 reward의 Moving Average로 정의하고, 아래처럼 사용합니다.

Parallel Training

컨트롤러 RNN을 통해 출력된 네트워크를 학습해 Reward를 얻고, 이를 통해 다시 컨트롤러를 개선하는 프로세스를 반복하여야 하는데,

  • Network Architecture의 Search Space가 매우 크고
  • 각 Network Architecture마다 학습에 필요한 시간이 길어서

이를 순차적으로 진행하는 것은 매우 시간이 오래 걸립니다. 따라서 Distributed(분산) 환경에서 Parallel한 학습 환경에서 효율적이도록 아래와 같은 구조를 사용했다고 합니다.

즉 K개의 Controller는 Parameter Server를 통해 모두 동일한 Weight를 Share하되 Asynchronous하게 업데이트하는 구조이고, 각 Controller는 m개의 Network 구조를 제안해 각각을 학습시키고, Reward를 받는 구조입니다.

Experiements

CNN : Cifar10

Convolutional Layer의 파라미터로 Filter Width와 Height를 각각 {1, 3, 5, 7}, 그리고 Filter 개수를 {24, 36, 48, 64}, Stride의 경우 {1, 2, 3} 중 선택하도록 했습니다. RELU와 Batch Normalization 등은 기본적으로 삽입된 것으로 하였습니다.

800개 GPU를 이용해서 100개의 컨트롤러가 각각 8개의 네트워크를 만들어 학습하는 형태로 진행했고, 최종적으로는 12,800개의 네트워크를 평가해 최종 결과를 얻게되었다고 합니다.

Stride나 Pooling이 없는 버전의 경우 이정도 Depth의 Deep Learning Model 중에서는 최고 성능이라고 합니다. 그리고 Residual 에서처럼 매우 많은 Skip Connection을 가지는 구조였다고 합니다.

재미있는 것은 이 아키텍쳐를 임의로 조금만 바꾸어도 성능이 하락한다는 점입니다. 즉 이를 통해서, RNN이 찾아낸 네트워크 구조가 적어도 local optimum이라고 주장합니다.

그리고, 네트워크에게 Stride를 사용할 수 있게하면 Search Space가 급격히 늘어남으로 인해서 기존에 비해서 좋은 성능을 보여주지 못하는 것을 확인할 수 있습니다.

마지막으로 사람이 어느 정도 개입한 실험을 진행했는데요. 13, 24번째 레이어에 강제로 Pooling Layer가 있다고 가정하고 39개의 레이어를 갖는 CNN을 찾으면 4.47%로 사람이 디자인한 최고 성능에 근접하며, 여기에 filter size를 조절한 버전이 3.74%로 매우 좋은 성능을 보여주는 것을 확인할 수 있습니다.

RNN : Penn Treebank

image

{Add, Elm_mult} 중 하나, 그리고 {identity, tanh, sigmoid, relu} 의 Activation 중 하나를 고르는 형태로 컨트롤러를 디자인했습니다. Base Number를 8로, 위 그림에서 leaf node 의 수를 늘려서 학습했고, 이 때 대략 6 \dot 10^16 개의 아키텍쳐가 가능하다고 합니다.

기존의 최고 모델을 3.6 perplexity 로 넘어서는 결과를 보여줍니다.

찾아낸 LSTM Cell 모습입니다.

Comparison against Random Search

Random Search는 Policy Gradient에 비해 성능이 많이 안나오는 것을 보여줍니다.


(ENAS) Efficient Neural Architecture Search via Parameter Sharing
Learning Transferable Architectures for Scalable Image Recognition
'Optimization / Training' Outline