* 구글 딥마인드가 ICLR 2016에서 발표한 논문입니다.
Abstract
논문은 Neural Programmer-interpreter(NPI) 모델을 제안합니다. 이 모델은 프로그램을 표현하고 실행하는 법을 배우는 recurrent하고 compositional한 뉴럴 네트워크입니다.
NPI는 세 가지 요소를 가지고 있습니다.
1) Task와 상관없는 코어 RNN
2) key-value 프로그램 메모리
3) Task 도메인마다의 특정 인코더 - 이를 통해 다양하고 다른 여러가지 환경에서 NPI가 작동할 수 있게 해줍니다.
하위 레벨의 프로그램들을 조합하여 상위 레벨의 프로그램을 표현하는 법을 배우기 위해, NPI는 기존 Seq2Seq LSTM 모델과 비교하였을 때 학습과정에서의 샘플 필요 수를 줄이고, 일반화 능력을 높였습니다.
프로그램 메모리는 이미 존재하는 프로그램들과 함께 추가적인 task에 대한 효율적인 학습을 할 수 있게 합니다.
NPI는 또한 RNN의 hidden state에 대한 장기적인 기억에 대한 부담을 감소시킬 수 있게끔 환경을 이용할 수 있습니다. 예를 들어 환경에 패드(메모장)가 존재한다면, 그 패드에 계산의 중간값을 저장할 수 있습니다.
NPI는 완전지도학습으로 학습됩니다. 각각의 프로그램은 Input에 따라 중간중간 서브프로그램을 실행하는 예시 순서들을 가지고 있습니다. 많은 수의, 하지만 상대적으로 빈약한 training 데이터보다, 풍부하지만 적은 수의 training 데이터를 이용해 학습한다고 합니다.
이 논문은 NPI가 여러 타입의 프로그램들(덧셈, 정렬, 3D 모델 회전시키기)을 학습할 수 있다는 것을 증명하려 합니다.
더 나아가서, 단 하나의 NPI가 이 프로그램들과 21가지의 연관된 서브프로그램을 실행할 수 있게 학습시킬 수 있습니다.
Introduction & Model
Recurrent와 Compositional, 이 두 말의 의미는 논문에서 대략 이렇게 사용됩니다.
1) Recurrent는 말 그대로 반복적인 모델이라는 뜻인데, 보통 RNN이라고 표현합니다.
2) Compositional은 여러 개의 모델이 합쳐져 사용된다는 뜻으로 보입니다.
이 두가지를 그림으로 표현하면 아래와 같습니다.
h 가 써져있는 네모난 블록이 하나하나의 신경망이라고 보시면 됩니다. 그림을 보시면 h 블록으로부터 다른 h 블록으로 화살표가 이어져있는 것을 볼 수 있는데, 이전에 나왔던 출력값이 다시 입력값으로 들어가는 Recurrent한 모습을 보여줍니다. 하지만 모든 블록들이 이렇게 이어져있지 않고 여러 그룹이 존재합니다. 이렇게 여러 그룹들이 존재하는 모습이 Compositional 하다라고 볼 수 있습니다.
이 논문의 모델을 잘 표현한 그림이라 조금만 더 설명드리겠습니다. h 는 신경망이라고 했는데, 아래에 위치한 블록들이 입력값, 위에 위치한 블록들이 출력값입니다. 모델의 입력으로는 현재 실행하는 프로그램과 현재의 State 값이 들어가게 됩니다.
<Input>
1) 현재 실행되는 프로그램을 나타내는 임베딩 값
2) 현재의 State는 두 개의 값으로 구성됩니다. 프로그램을 실행할 때 같이 들어온 매개변수와 환경의 상태입니다.
- 환경의 상태는 task를 수행할 환경마다 다르기 때문에 환경마다 특정한 Encoder를 사용합니다. 위의 그림에서는 이미지로 받아들이기 때문에 CNN 기반의 Encoder가 사용될 것입니다.
- 매개변수 또한 환경마다 다를 수 있기 때문에 특정 Encoder에 같이 들어가게 됩니다.
2)에서 사용되는 Encoder를 통해 NPI 모델이 받아들일 수 있는 Input의 사이즈에 맞게 항상 환경의 특징들이 추출된다고 볼 수 있습니다.
<Output>
1) KEY 는 다음에 실행할 프로그램을 찾을 수 있는 키값입니다. 이를 이용해 프로그램 메모리에서 적절한 프로그램을 찾습니다.
2) END 는 현재 실행되고 있는 프로그램을 종료할 확률입니다. 특정 쓰레쉬홀드값을 넘어가게끔 하면 이 프로그램은 끝을 맺습니다.
3) ARG 는 다음에 실행할 프로그램의 매개변수입니다.
전체적인 동작의 과정은 알고리즘을 보시면 좀 더 이해하시기 편할 것 같습니다.
* 반복문 while의 조건은 END 확률이 쓰레쉬홀드값을 넘어가기 전까지 계속해서 반복됩니다.
1) 매개변수와 환경을 Encoder에 넣어서 나온 출력값 s 와 현재의 프로그램 p, 그리고 RNN이기 때문에 이전 출력값 h도 함께 모델에 입력값으로 넣습니다.
2) 모델로부터 나온 출력값 h 를 이용하여 KEY, END, ARG를 구해냅니다.
3) KEY를 이용하여 어떤 프로그램을 실행할지 알아내는 과정은 프로그램 메모리에 저장되어 있는 키값들 중에서 가장 유사한 값을 찾는 방식입니다.
4) 만약 이번에 실행할 프로그램이 ACT(가장 원자단위의 행동 프로그램이라는 뜻입니다) 라면 환경에 대해서 실행하고, 아니라면 재귀적으로 RUN 함수를 호출하면서 또 다른 모델구조를 만듭니다.(Compositional)
위 알고리즘과 그림을 함께 보시면, 대략적인 구조가 이해되실 것 같습니다.
Training
이 모델의 학습은 아래의 식을 이용합니다.
즉, 이전의 Input history가 주어질 때 output으로 나와야하는 Ground-truth output의 확률을 높이는 방식으로 되어있습니다. 이는 아래와 같이 표현할 수 있습니다.
Experiments
이 논문에서의 실험 환경은 3가지입니다.
1) Addition
input1, input2, carry, output 4개의 row로 이루어져 있으며, 각각의 row마다 포인터가 존재합니다. 두 개의 인풋이 들어오면 덧셈 연산을 합니다.
환경마다의 특정한 Encoder가 필요하다고 했었는데, Addition 환경에서의 Encoder는 위와 같습니다. Q는 각각의 포인터가 가리키는 숫자가 원핫 인코딩으로 표현되어있습니다. 즉, 이 환경에서는 4개의 포인터가 가리키는 4개의 숫자와 함께 매개변수 3개를 합쳐서 MLP에 입력하여 나온 출력값을 S 값으로 사용합니다.
2) Sorting
Bubble-sort를 이용하여, 정렬을 하는 환경입니다. 하나의 row에 두 개의 포인터로 이루어져 있습니다.
Encoder는 위 Addition과 비슷하게 이루어져 있습니다.
3) Canonicalizing 3D Models
3D 환경에서 주어진 차의 모습을 target 각도로 돌리는 것이 목표인 환경입니다.
Encoder가 위 두 개의 환경이랑 조금 다르게 되어있습니다. 이 환경에서 target은 각도와 고도가 각각의 숫자로 나타내어져 있고, 그것을 Q를 통해 읽게 됩니다. 또한 3D 환경이므로 현재의 상태를 CNN을 통해 파악하게 됩니다.
첫번째 실험과 두번째 실험은 bubble-sort task에 대하여 평범한 Seq2Seq LSTM과의 비교실험입니다. Bubble-sort는 시간복잡도가 O(N^2)이기에, 정렬해야할 숫자가 길어질수록 급격하게 상태정보가 커지게 되고, 이는 LSTM의 hidden state에 전부 담기에 불가능해집니다. 하지만 NPI는 Compositional 하기 때문에 평범한 LSTM에 비해 더 많은 상태저장이 가능합니다.
훈련 데이터는 2개에서부터 20개까지의 숫자 리스트들에 대한 64개의 예시와 1216개의 trace 과정들을 통해 이루어집니다.
길이가 20인 배열의 정렬을 가능하게끔 하기 위해 필요한 훈련 데이터의 갯수를 그래프로 나타낸 것입니다. 한 눈에 보기에도 NPI가 2개부터 학습을 시작하여, 8개에서 이미 학습을 완료한 점이 눈에 띕니다. 그에 반해 Seq2Seq 모델은 64개부터 시작하여, 250개에 이르러서야 어느정도 학습이 되는 모습입니다.
이번에는 길이가 20을 넘어서는 배열에 대해서도 정렬이 가능한지에 대한 실험입니다. 이것이 가능하다는 것은 배우는 것에 대해 일반화를 했다고 볼 수 있는데, NPI가 Seq2Seq 모델에 비해 훨씬 강력한 일반화 능력을 보여주고 있습니다.
NPI는 추가적인 프로그램을 학습시키는 것이 가능합니다. 이것에 대해 먼저 걱정되는 점은 새로운 학습이 기존의 task에 대한 성능을 떨어뜨릴 수 있지 않을까 하는 점입니다. 이를 극복하기 위해 NPI core 모델의 가중치는 고정을 시키고, 오로지 프로그램 메모리를 업데이트하는 식으로 프로그램을 추가합니다. 하지만 이렇게 되면 실수로 기존의 프로그램이 새로운 프로그램을 불러버리는 일도 있을 수 있습니다. 이점을 극복하기 위해서는 이 논문에서는 새로운 프로그램의 trace들 뿐만 아니라, 기존에 존재하던 trace들 또한 학습에 사용했습니다.
위 실험은 하나의 task에 대해서 학습시킨 Single 모델과, 한번에 여러가지의 task를 학습시킨 Multi모델, 그리고 Multi에 추가로 Max 프로그램을 학습시킨 모델 세 가지의 Acc를 비교합니다. 이를 통해
1) 새로운 프로그램을 학습시키는 것은 기존의 다른 task들의 성능에 영향을 주지 않는다는 것
2) 하나의 NPI 코어만으로 여러 task에 접목하는 것이 가능하다는 것
두 가지를 증명했습니다.
Conclusion
오로지 하나의 NPI만으로 비슷하지 않은 여러 환경들의 프로그램들에 대해 배우는 것이 가능한 모델입니다.
그리고 NPI는 LSTM과 비교하여 강력한 일반화 능력을 가지고 있습니다.
또한 NPI는 여러 새로운 프로그램들을 기존 프로그램을 잊지 않으면서 학습하게끔 할 수 있습니다.