Monday, August 6, 2018

논문 - Neural Arithmetic Logic Units



Neural Arithmetic Logic Units이라는 단순한 제목의 논문입니다. 딥마인드와 옥스포드에서 나온 이 논문은 "Arithmetic Logic", 즉 사칙연산과 같은 기초적인 연산을 수행하는 유닛을 제안합니다. 일단, 학계와 업계에 꽤 반향을 일으킬만한 좋은 연구와 논문입니다.

이 논문에서 제안하는 NALU는 따지자면 좀 특별한데, 따지자면 레이어의 유형이라고 볼 수도 있고 혹은 레이어의 activation function에 해당한다고도 볼 수 있습니다. NALU를 이용하면 사칙연산과 지수, 로그 함수를 모델링할 수 있습니다. 그런데, 뉴럴넷이 이미 아주 복잡한 함수까지 모방하지 않냐고 반문할수도 있습니다.

기존 연구와의 차이를 살펴봅시다. 일반적인 딥 뉴럴 넷은 결국은 아주 복잡한 형태의 regression 모델이고 학습 데이터를 근거로 하여 $f: X \rightarrow Y$ 의 맵핑을 근사합니다. 이미지 등 많은 경우에 이 $x$는 고차원 벡터지만 이 근사과정의 원리는 $x$가 1차원일때랑 차이가 없습니다.


이 함수는 $x \in [0, 1] $의 데이터를 이용했습니다. 그런데 이렇게 학습된 뉴럴넷으로 $x=-10$이나 $x=1000$ 같은 입력을 넣으면 잘 될까요? 아뇨, 폭망합니다.

아래 그림은 아마 $-1 < x < 1 $ 의 범위에서 사인 함수를 근사한 결과같군요. 학습 데이터 바깥에서는 저렇게 되버립니다.


이를 다르게 표현하면, 사실 일반적인 뉴럴넷은 숫자를 세는 능력이 없습니다. 5 이하의 숫자끼리 더하는 법을, 3+4=7, 2+3=5, .. 등의 데이터로 열심히 가르치고나서  8 + 2=? 하면 망한다는거죠. 실제로 망하나요? 이 논문 섹션 1.1에 나온 그림 1을 보니, 그보다 더 쉬운 작업도 망하는군요,  $f(x)=x$를 가르치려고 했지만 이마저 extraploate에 실패합니다. 무려 15종류의 activation function을 시험했지만 다 망합니다.




이를 해결하기 위해 이 논문에서는 NALU를 소개하는데요, 그 전에 NALU의 근간이 되는 NAC(Neural Accumulator)를 먼저 소개합니다.

NAC


그림만으론 설명이 완벽하지 않지만 글에 잘 써있고, 원리는 간단합니다.

NAC는 parameterised unit입니다. 근데 이 파라미터의 사용이 사실상 거의 레이어에 가깝습니다. 일단 NAC의 파라미터는 $\mathbf{W}$입니다.
이 $\mathbf{W}$는 특정 레이어의 액티베이션 $y$에 추가로 붙는 affine transform이에요. 그런데, 일단 $\mathbf{W}$의 값이 $\{-1, 0, 1\}$이길 바란다고 합니다. 왜냐면 그렇게하면, affine transform의 $\mathbf{W} y$(논문을 따라서 표기는 행렬과 벡터처럼 했지만 벡터와 벡터의 곱이라고 생각합니다) 결과가 $\mathbf{W}$의 성분의 합(1이랑 곱한애들), 차(-1이랑 곱한애들), 혹은 무시(0이랑 곱한애들)가 될테니까요.

이런 특징을 강제하기 위해 결과적으로 2페이지 하단처럼 $\mathbf{W}$를 정의합니다.

$$\mathbf{W} = \tanh(\mathbf{\hat{W}} \odot \sigma(\mathbf{\hat{M}})) $$

알파벳을 보면 $\mathbf{\hat{W}}$에다가 마스킹을 적용한거라고 이해할 수 있습니다. 이렇게 하면 결과가 대체로 -1, 0, 1에 매우 가깝게 나오게 되면서도 값이 미분가능하므로 Gradient descent를 이용할 수 있습니다.


NALU

NAC를 잘 이해했다면 NALU는 간단합니다. 일단, 방금 NAC로 아마도 덧셈과 뺄셈을 수행하는 유닛을 구현한것같습니다. 그러면 곱셈과 나눗셈은 어떻게 하느냐? 똑같은 과정을 옆에 병렬로 연결해주고, 대신 그 앞뒤에 $\log()$와 $\exp()$를 달아주면 됩니다.


그런데 여기에서 각각의 element가 덧셈/뺄샘 vs. 곱/나눗셈 중 무엇을 수행하게 될지를 골라야하므로.. 하나의 게이트 값 $g$를 양쪽에 $g$, $1-g$로 적용해서 둘 중에 하나만 수행되도록 하겠습니다.  정리하면...

$$\mathbf{W} = \tanh(\mathbf{\hat{W}}) \odot \sigma(\mathbf{\hat{M}}) $$
이고, NAC의 출력은 다음과 같습니다.
$$\mathbf{a} = \mathbf{W}\mathbf{x}$$
예를들어 W가 32개라면 얘도 32개겠죠.
그리고 $\log$, $\exp$를 거치는, 즉 곱과 나눗셈을 수행하는, 변형된 NAC입니다. (이 식에 약간의 의문점이 있습니다.)
$$\mathbf{m} = \exp{\mathbf{W}(\log |\mathbf{x} + \epsilon |)} $$
얘도 마찬가지로 32개죠.
이제 32개의 게이트를 이용해 {+ -} vs {* /}를 결정합니다. 이 과정에서 $\mathbf{G}$라는 매개변수가 추가됩니다.
$$g = \sigma({\mathbf{G}x})$$
최종적으로 이 NALU의 출력은 아래와 같습니다.
$$\mathbf{y}=\mathbf{g} \odot \mathbf{a} + (1-\mathbf{g})\odot \mathbf{m}$$

(좀 더 생각해봐야하는데, 위에서 변형된 NAC가 최종적으로 곱, 나눗셈, 지수연산이 가능하다고 하는데 이게 잘 이해가 안가는군요. $\textbf{x}$가 NALU의 입력인데, 얘는 항상 log 함수를 거치는데.. $\mathbf{W}$의 성분이 1이면 ... ??? 합과 곱을 exp, log로 사용한다는 원리는 쉬운데 이 구현이 왜 이런지 막상 따지니 헷갈려요. )

실험 결과

이번에도 실험결과는 생략합니다. RL관련은 제가 잘 모르지만 다른 실험을 보면 아주 직관적으로 잘 이해할 수 있게 설계했고, NALU는 extrapolate이 필요한 사칙연산 등등 연산을 아주 훌륭하게 수행합니다.








No comments:

Post a Comment