Motivation & Contribution
이 논문의 기존의 RNN 및 attention을 이용한 방법론들이 QA에서는 잘 동작하지 않는것이 간단한 로직이나 수치연산 오퍼레이션 조차 배우지 못했기 때문이라 말한다. 따라서, 간단한 연산 오퍼레이터 셋을 제공하여 자연어 쿼리를 주었을 때 결과값과 오퍼레이터들로 이루어진 프로그램을 배우는 Neural Programmer를 제안한다. Neural Programmer 거의 100%에 가까운 정확도 성능을 보인다. 기존에는 모델에게 입출력 데이터만을 제공하고 그것이 온전히 모델의 파라미터에 의해 학습되도록하였다면 여기서는 명시적으로 해당 결과값을 얻을 수 있는 중간 연산자들을 제공하는것이다.
Task
여기서 다루는 문제는 Table과 자연어 쿼리가 주어졌을때 쿼리의 결과값을 구하는 것이다. 예를 들어, "Sum of elements in column C" 라는 자연어 쿼리와 컬럼 C를 포함하는 테이블이 주어졌을때 컬럼 C의 모든 요소를 합한값이 결과값이 되고 이것을 모델이 출력하게 된다. 이 논문에서는 Scalar, Table lookup 두가지 출력형태를 지원한다.
Method
Components
- A question RNN to process the input questions
- Two selectors to assign probability distributions at every step, one over the set of operations and the other over the data segments
- A list of operations that the model applies
- A history RNN to remember the previous operations and data segments selected by the model until the current time step
- Outputs and row select variable
자연어 쿼리를 입력으로 주기 때문에 자연어 문장을 처리할수 있는 Question RNN으로 Sentence representation으로 마지막 word의 hidden을 사용한다. Selector는 Sentence representation을 입력으로 받아 데이터에 적용해야 할 Operation과 Data segment, Columne을 선택하는 두개가 있다. operation을 data segment에 적용하여 row select variable을 업데이트 한다. 그리고 실행된 operation의 embedding과 columne의 embedding은 history RNN에 입력으로 들어가 다음 step에서 사용하게 된다. 만약 이때 operation이 scalar나 lookup을 수행하는 경우 output variable로 scalar값과 lookup값이 업데이트된다.
Algorithm
- table과 자연어 쿼리를 입력으로 받고 output variable과 각 hidden state를 초기화한다.
- 자연어 쿼리에서 숫자를 제거하고 숫자와 해당 숫자전의 단어를 저장한다.
- Question RNN으로 각 word의 hidden state와 sentence representation을 얻는다.
- 숫자의 이전 단어 state와 greater, lesser 등의 비교 operation embedding을 이용하여 각 operation에 해당하는 pivot value값을 얻는다.
- 사전에 정의된 T만큼 Neural programer를 포워딩한다.
- Scalar answer와 lookup answer를 출력한다.
Training
학습시에는 전체 loss는 아래 같고 두가지 output 타입에 대한 각 loss를 계산하여 더한다.
- Scalar loss
- table lookup loss
데이터 셋 구성에서 현재 question이 어떤 타입의 output을 출력하는지 $n_{k}$를 통해 알수 있다. $a$는 정답과 scalar output의 절대값이며 scalar loss에서는 Huber loss를 사용한다. $a$이 huber constant $\delta$ 이상일 경우 linear loss를 사용하고 이하일 경우 squared loss를 사용한다. 이는 값의 차이가 너무 클시 gradient가 크게 계산되어 발산하는 경우를 방지한다. table lookup loss의 경우 table size에 맞는 ground truth binary map과의 lookup answer간의 binary cross entropy를 계산한다.
Experiments
참조해야할 column수가 늘어더라도 성능이 어느정도 유지되는 모습을 보이며 training때 보여지지 않은 template로 생성된 quetion이 test때 들어오더라도 성능이 유지되었다. 이를 통해 Neural Programmer의 generalization 성능이 유지됨을 보였다.