DARTS: Differentiable Architecture Search

nas
deepmind
cmu

(Leo) #1

참조: Neural Architecture Search: A Survey
블로그: http://www.fast.ai/2018/07/16/auto-ml2/

Essence

Contribution

  • RL 이나 evolution method 를 쓰지 않고 gradient 기반 architecture search 방법론을 제시 (★★★)
  • 고효율/고성능 search efficieny (★★)
  • 보다 어려운 task 로 transfer 가능 (★)

Key Ideas

  • DARTS 는 아래와 같은 4개의 key idea 로 이루어진 것으로 파악 (Section 2 참조)

Idea 1. 식 (2) 와 같은 continuous relaxation 을 통해 operation 선택확률을 모델링

  • Operation o 의 선택은 categorical choice 이지만 softmax 를 사용해 가중치 \alpha 를 학습하는 모형으로 간주
  • Search 가 끝나면 학습된 \alpha 중 가장 큰 가중치를 가진 연산을 사용

Idea 2. 식 (2) 에서 가중치 \alpha 를 학습하기 위해 (3), (4) 와 같은 bilevel-optimization 문제를 푼다

Idea 3. 식 (3), (4) 를 정확하게 푸는건 불가능하니 Algorithm 1 과 같이 approximate iterative optimization 을 해준다. 이 때 approximation 에서 사용하는 식은 (6), (7) 인데, 공식 유도방법은 2nd-order finite difference 를 사용한다.

Idea 4. 가중치 \alpha 에 대한 학습이 끝나면 가장 \alpha 가 큰 operation o 만 사용하고 (즉 \alpha_{o} = 1) cell node 중 가장 strength 가 높은 k 개의 input 만 남긴다 (이 논문에선 k=2 인 CNN cell input 을 사용합니다)

Results

  • CIFAR-10 에서 높은 성능(Test error 2.83%) 대비 search cost 가 4 GPU days 로 다른 method 에 비해 뛰어남
    • ENAS 보다는 느리지만 모델 크기는 더 작음 (저자의 주장)
  • CIFAR-10 에서 찾은 모델을 ImageNet 에 tuning 했을 때 RL 을 쓴 NASNet 보다 error 대비 학습속도 빠름


  • Penn Treebank 에선 ENAS 나 NASNet 보다 빠르고 test perplexity 가 더 좋음
  • WikiText-2 에서도 ImageNet 과 유사하게 transfer 가 더 잘되는 결과를 보임



(Curtis Kim) #2

Contribution

하나만 추가하고 싶은데요, 아래와 같습니다.

  • Neural Network Architecture를 선택하는 것은 Combinatorial한 프로세스이기 때문에 기존 방법론들은 Discrete한 관점으로 바라보았는데, 이를 Continuous하게 Relax하고, Approximate 된 Gradient를 이용해도 이 문제를 잘 푸는 것을 보여주었다.

Key Idea

저는 Key Idea 부분만 조금 더 쉬운 버전으로 이야기를 정리해볼까합니다.

Cell Design

NASENAS 등에서, Neural Architecture Search를 하는 방식은 주로 Cell Design 입니다. 즉 네트워크가 몇개의 Cell로 이루어져있다고 전체적인 구조는 잡아두고, 각 Cell이 어떤 모양이어야 하는지를 찾는 문제로 만든 방식입니다.

Relaxation & Core Concept

위와 같은 구조의 Cell이 있다고 가정합시다. NAS, ENAS 등에서는 각 Operation을 어떤걸로 선정할까?를 Operation의 선정의 관점에서 보았습니다 - 사용한다 혹은 사용하지 않는다의 Discrete한 관점.

이 논문에서는 이 Discrete한 모델링을 Continous한 방식으로 전환하는 Relaxation을 합니다. 즉, 선택가능한 여러 Operation중 고르는 문제가 아니라, 여러 Operation의 Weighted Sum으로 바꾼 것입니다. 위 그림을 예시로 사용하면, 0 에서 1로 가는 여러 Operation 들을 Weighted Sum을 한 결과로 계속 트레이닝을 해가면서, 좋은 Operation에는 더 많은 Weight를 주는 방식으로 최적화하는 거라고 생각하면 됩니다.

그림의 (d)처럼 최종적인 네트워크 구조는 가장 높은 가중치를 갖는 Operation을 k개를 선별하여 만듦니다.

Bilevel Optimization

최적화 수리 모형을 더 자세하게 설명하면 이렇습니다. 네트워크 Weight w 는 정해진 아키텍쳐 \alpha 하에서, 트레이닝 로스를 최소화하는 것으로 정의합니다. 최종적인 목적식은 아키텍쳐 \alpha 에 의해 밸리데이션 로스를 최소화하는 방향으로 정의합니다. 이때 네트워크 Weight w 는 아키텍쳐 구조 \alpha 에 의해 바뀌는 것이므로 위와 같습니다.

Bilevel Optimization을 쉽게 풀기 위해 아래와 같은 방식을 제안합니다.

알고리즘은 위와 같이 아키텍쳐 \alpha 를 고정하고, 트레이닝 데이터에 대해서 네트워크 파라미터 w 를 업데이트하고, 이렇게 업데이트된 파라미터 하에서 아키텍쳐 \alpha 를 업데이트하는 형태입니다.

이 때, Gradient 를 구하는 과정을 빠르게 하기 위해서 Approximation을 적용할 수도 있습니다.

Architecture

이렇게 구해진 아키텍쳐 \alpha 에서 큰 값 순으로 k개를 선정해 각 edge중에 가장 큰 것만 남기고, predecesor(input) 중에 큰 것 2개를 선정해 고정적인 아키텍쳐로 결정합니다. 이후 스크래치로부터 트레이닝을 다시해 weight를 확정합니다.

CNN의 경우 아래와 같은 연산들의 weight sum으로 다음 node로 연결하도록 합니다.

3 × 3 and 5 × 5 separable convolutions, 3 × 3 and 5 × 5 dilated separable convolutions, 3 × 3 max pooling, 3 × 3 average pooling, identity, and zero

셀의 종류는 2가지로, normal과 reduction입니다. reduction은 normal과 다르게 output size가 절반이 되는, 마치 pooling과 같은 역할을 하는 셀입니다. 전체 아키텍쳐는 normal-architecture가 3번 번갈아가는 형태로 디자인되어 있습니다.

RNN의 경우 아래와 같은 연산입니다.

tanh, relu, sigmoid, and identity mapping


(Leo) #3

그렇잖아도 Key Ideas 부분을 좀 더 풀어쓰고 싶었는데 훨씬 더 쉽게 풀어주셨네요! 감사합니다 :smile:


(Curtis Kim) #4

위 글에서 일부 수정합니다.

이렇게 구해진 아키텍쳐 α 에서 큰 값 순으로 k개를 선정해 고정적인 아키텍쳐로 결정합니다.

부분이 틀렸습니다.

각 edge중에 가장 큰 것만 남기고, predecesor(input) 중에 큰 것 2개를 선정하는 방식입니다.


You only search once: single shot neural architecture search via direct sparse optimization