신사(SinSa)
article thumbnail

순환 신경망은 신경망이 텍스트, 오디오 및 비디오와 같은 일련의 데이터로 작업할 수 있게 하는 심층 학습의 필수 요소 중 하나이다. 이는 높은 수준으로 시퀀스를 이해함으로서 시퀀스에 주석을 남긴다거나 새로운 시퀀스를 생성하는 데에 사용할 수 있다. 


전통적인 RNN 디자인은 비교적 긴(Gap 차이가 큰) 시퀀스에 적용하는 데에 어려움을 겪지만 LSTM은 긴 시퀀스에서도 잘 작동될 수 있게끔 변형되었으며 이는 번역, 음성 인식 및 이미지 캡션과 같은 많은 작업들에서 놀라운 결과를 이끌어 내었다. 결과적으로 RNN이 지난 몇 년간 널리 보급되게 하는 효과를 이끌었다. 이런 일이 발생하면서 새로운 속성으로 RNN을 보강하려는 시도가 증가하고 있다. 

Neural TuringMachineshave external memory that they can read and write to.
AttentionalInterfacesallow RNNs to focus on parts of their input.
AdaptiveComputation Timeallows for varying amounts of computation per step.
NeuralProgrammerscan call functions, building programs as they run.

각각이 모두 RNN의 강력한 확장이긴 하지만 정말 눈에 띄는 부분은 결합이 가능하고 더 넓은 공간에서 활용될 수 있다는 것이다. 또한 이것들은 모두 기본 트릭(또는 Attention)을 사용하고 있다. 이러한 "Augmented RNNs"는 향후 학습 능력을 확장하는 것에 가장 큰 도움이 될 것이다. 이중에서 구글 딥마인드(Google Deepmind)에서 2014년에 발표한 Neural Turing Machines에 대해 알아보고자 한다.


Turing Machines는 쉽게 이야기하면 현대 컴퓨터 구조의 토대가 된 가상의 기계로, 수치 연산, 메모리 읽기, 메모리 쓰기의 기능을 가지고 있다고 볼 수 있다. Turing Machine의 이론을 토대로 발명된 현대 컴퓨터 구조는 연산을 수행하는 CPU와 값들을 저장하는 Memory 이렇게 두 가지 부분으로 구성되어 있다.  Neural Turing Machines 논문에서 주목하는 것은 기존의 Neural Networks 구조가 연산을 수행하는 것(CPU)은 적절하게 모델링할 수 있지만, 값들을 저장하는 Memory 형태는 존재하지 않는다는 한계점이다. 물론 Neural Turing Machines 논문 이전에도 이전 시간의 값들을 일종의 메모리 형태로 저장하는 Recurrent Neural Networks(RNNs) 구조와 Long-Short Term Memory Networks(LSTM Networks) 구조가 있었지만, 이 구조들은 일종의 묵시적인 메모리 구조(Implicit Memory)를 가지고 있었다. 즉, 값들을 Hidden Layer의 Weight와 Bias에 암시적으로 저장하는 구조이다.  이에 반해 Neural Turing Machines(NTM)은 Neural Networks 외부에 명시적인 메모리 구조(External Memory)를 만들고, 현대 컴퓨터 구조처럼 연산을 수행하는 Controller(CPU)-Neural Networks-와 값을 저장하는 Memory-Memory Matrix-를 분리한 구조이다. 아래 그림은 Neural Turing Machine의 구조(architecture)를 보여준다.



Neural Turing Machines는 RNN을 외부 메모리 뱅크와 결합하는데 벡터가 신경망의 자연어이므로 메모리는 벡터 배열로 구성되어 있다. 하지만 읽고 쓰는 것에 어떻게 작동하는가에 대한 문제에 직면하게 된다. 그리고 이 방법은 그것에 대한 차별화된 아이디어와 논리 구조를 가지고 있다. 그렇게 때문에 우리는 어디서 다시 읽고 쓰는지 확인하고 기억할 수 있으며 이는 메모리 주소가 근본적으로 분리되어 있는 까다로운 환경에서도 NTM이 현명한 해결책을 갖게 한다. 즉, 이 방법은 모든 단계를 읽고 작성할 수 있다는 의미이다. 


우선 메모리(Memory)로부터 값을 읽는 Reading 연산을 수행하는 법을 살펴보자.  먼저 아래와 같이 $N \times M$ 크기의 memory matrix가 존재할때, 시간 $t$에서, $N$개의 location들의 각각의 중요도를 나타내는 normalized된(모든 합이 1인) weight vector $w_t$를 구한다. 


$\begin{equation*} \sum_{i}w_{t}(i)=1,\ \ \ \ 0\leq w_{t}(i) \leq 1,\   \forall i \end{equation*}$


그리고 각각의 location에 해당하는 실제 memory matrix의 값-$M_t-$과 weight vector-$w_t-$를 곱해서 구한 $M$ 크기의 read vector $r_t$를 구한다. 이 read vector $r_t$가 우리가 실제로 memory로부터 읽어들이는 값이 된다.


$\begin{equation*} r_t \leftarrow \sum_{i}w_{t}(i)M_{t}(i) \end{equation*}$





profile

신사(SinSa)

@신사(SinSa)

포스팅이 좋았다면 "좋아요❤️" 눌러주세요!