2018년 7월 31일 화요일

Efficient NAS

Neural Architecture Search(NAS)는 딥러닝 넷 구조를 자동으로 찾는 알고리즘이다. 이미지 분류용 NAS 알고리즘을 살펴보자.
먼저 입력(image or feature map)에 적용할 복수의 연산 후보들을 정의하고, net 내 레이어들이 어떤 연산을 선택할지, 그리고 레이어들을 상호간 어떻게 연결할지를 함께 결정해야 한다.
CNN 구조의 경우, 연산 후보는 sepconv3x3, sepconv5x5, maxpool3x3, avgpool3x3, identity(skip-connection) 등이 될 수 있다.

NAS는 2가지로 달성 가능한데, Macro 및 Micro search이다.
Macro는 전체 넷을 한번에 설계한다. 이 경우 개입되는 파라메터가 너무 많아 문제 규모가 커지므로 풀기도 어렵고 성능도 낮다.
Micro는 Macro 문제점을 해결하기 위해 Cell 개념을 도입한다. Cell이란 내부에 소규모 연결 요소들을 가지는 단위 구조이다. Cell을 먼저 설계하고 Cell간을 연결하여 전체 구조를 만든다.  Cell간 연결은 다음 처럼 미리 정해 놓는다.

CNN 경우,

Cell(N)-Cell(N)-Cell(R)-Cell(N)-Cell(N)-Cell(R)

로 할 수 있다.

N은 Normal, R은 Reduction인 2가지 타입 cell이 있다. Normal은 입력 이미지(특징맵) 크기를 유지하여 출력하고 Reduction은 입력 크기를 절반으로 줄여 출력한다.
Cell은 입력 2개와 출력 1개를 가지며 이전 Cell 출력을 입력으로 사용한다. 맨 앞 Cell 입력 2개는 이미지 입력을 동일하게 사용한다.

정리하면, Micro 탐색으로 Cell 구조를 먼저 설계하고 이들을 연결하여 전체 넷을 구성하면 설계 파라메터도 줄이고 실용적이며 성능도 좋다.


CNN 예에서 N셀은 4개이며 내부 구조가 동일하다. 2개의 R셀도 동일 구조이다. N과 R은 서로 구조가 다르므로 생성 알고리즘은 같지만 객체는 따로 유지한다.

Cell 설계는 RNN을 사용한다. RNN 사용 이유는 Cell 내 노드(layer) 연결은 입력 2개에서 시작하여 차례로 새로운 노드(layer)을 생성, 추가하면서 구조를 키워 나가는데, 생성 노드는 이전 노드에 의존적이고 노드 상관성을 가지기 때문이다.
더 이상 후속 연결이 없는 노드들은 concat으로 합쳐 단일 출력으로 내 보낸다.


RNN 출력 예를 보면,
2255/3355/4455/5555/6655
이고 5회 step 동안 전부 20개의 출력을 준다. 숫자는 리스트 크기이고, 인덱스를 저장한다.

각 step 당 4개 출력은 (node_L, node_R, op_L, op_R)이다. node_L과 node_R은 이전 입력 어떤 것을 선택할지를, op_L, op_R은  입력에 어떤 연산을 적용할지를 보여준다.

예를 들면, 2255에서 길이 2는 node_L이 cell 두 입력 중 1개를 선택하며 one-hot vector [0,1] 또는 [1,0]를 사용하기 때문이다. 길이 5는 후보 연산 중 1개를 선택하므로 [0,1,0,0,0] 또는 [0,0,0,1,0] 등이다.

3355는 Cell에 들어간 두 입력을 이용하여 앞 단계에서 새로운 노드(layer)가 이미 생성되었으므로 이제 선정할 후보는 세개이다. 따라서 3이 되고, 연산 후보는 불변이니 5로 유지된다.


References
[1] ENAS paper
[2] Keras-enas
[2] Tensorflow-enas




2018년 7월 5일 목요일

Mask R-CNN

github (https://github.com/matterport/Mask_RCNN)
paper (https://arxiv.org/pdf/1703.06870.pdf)