2018년 8월 2일 목요일

DARTS

Differentiable Architecture Search(DARTS)는 NAS 알고리즘 일종으로 기존 NAS에서 사용하던 강화학습 기반의 discrete한 후보 선택 방법을 미분 가능하고 연속적인 최적화 방법으로 바꾸었다.

입력 $x=[64,3,32,32]$에 연산자 $op$를 적용한다. $op$ 후보가 8개라 가정하자. 이 중 1번만 적용하고 나머지 7개는 무시하면 $x'=op_1(x)$이다.

만일 2번, 5번 연산자를 동일한 가중치로 적용하고 나머지를 무시하면
$x'=0.5 \cdot op_2(x)+0.5 \cdot op_5(x)$
이다. 단, 이 연산이 성립하려면 $op_2(x)$와 $op_5(x)$는 같은 shape를 가져야 한다.

8개 모두 적용 시
$x'=\sum w_i \cdot op_i(x)$
이다.
DARTS는 $w_i(i=0...7)$ 탐색을 통해 $x'$가 연결되어 만든 net의 validation loss 최소화로 NAS 해결방법을 찾았다.


이는 $x'$가 만드는 loss를 $w_i$에 대해 편미분해 구한다.
통상 CNN에서 층(layer)이라 함은 Conv나 ReLu 등 연산을 선택 후, 이 $op$에 관련된 학습 가중치를 net loss가 최소화되게 구하는 것이다.
그런데, 이종의 $op$가 결합되어 층 하나를 구성한다면 어떤 연산을 지배적으로 사용할건지를 나타내는 연산 가중치 $w_i$ 결정과 각 연산에 들어 있는 학습 가중치 결정 2가지 문제를 함께 풀어야 한다.


두 타입 인자 결정을 동시에 할 수는 없다. $op$ 가중치 최적화, CNN 학습 가중치 최적화를 차례로 수행해야 한다. DARTS는 두 단계 수행 방법을 설명한다.


Reference
[1] DARTS paper
[2] pytorch-DARTS



댓글 1개:

  1. 논문 내 식 (2)를 부연 설명하자면,
    alpa(i,j)는 길이가 |O|인 vector(후보 연산자 수만큼 길이)입니다. 예를 들면, (i,j)=(1,2)라 하면 1번 2번 node를 연결하는 에지 상에 가해지는 연산으로 conv, maxpool, zero, skip, ... (10가지 연산)이고 각각에 대한 가중치 값 10개가 들어 있는 vector입니다.
    이 edge에는 특정 연산 1개가 가해지는 것이 아니라 10개의 연산이 가중되어 합쳐 가해집니다.

    식 (2)는 sigma{ A * o(x) } 형태인데 A는 10개 벡터 가중치를 pdf로 정규화하였습니다. 그래서 softmax폼입니다. 뒤 o(x)는 10개 연산자 중 하나로 A에 곱해집니다.

    식 (2)를 반복 호출(i,j index값을 바꾸면서)하면서 학습하면 edge에서 연산자 가중치는 어떤 것은 커지고 어떤 것은 작아지겠지요. 결국 최고 큰 가중치를 가지는 연산자가 선택됩니다.






    답글삭제