ML

Recurrent Neural Networks

LYShin 2022. 12. 16. 01:04

- 본 글에서는 NLP분야에 지대한 영향을 끼친 Recurrent Neural Network대해 간단히 소개합니다.

 

1.Concept

 

RNN은 과거의 정보를 현재에 추가적인 입력 정보로 사용하는 것을 특징으로 하는 딥러닝 모델입니다. 이러한 특징 때문에 기본적으로 순서가 있는 데이터를 처리하며 대표적인 데이터로 자연어가 있습니다.

 

대표적인 사용 방법으로는 그림과 같은 사용 방법이 있습니다.

 

many to one은 감정분석으로 많이 사용되는 모델인데, 하나의 순서가 있는 문자열이 들어오면 0, 1로 나타나는 부정, 긍정을 예측하는 모델입니다.

 

one to many는 이미지를 입력으로 받아 이미지를 설명하는 문자열을 생성하는 모델이 대표적입니다.

 

many to many의 모델은 크게 2가지로 나뉘는데, 입력 데이터가 들어와서 바로 출력 데이터가 리턴되는 모델과 약간의 딜레이가 있는 모델입니다. 전자는 seq2seq로 많이 알려져 있으며 하나의 문자열을 받아 번역 혹은 대답 등을 리턴하는 모델이 대표적입니다. 후자는 비디오가 들어오면 그 상황을 실시간으로 설명글을 생성하는 모델이 대표적입니다.

 

 

 

2. RNN

 

단어 레벨에서 'hello'라는 단어로 예측하는 모델을 가상으로 만들어보겠습니다. 기본적으로 h -> e , e -> l, l -> l ,l -> o를 예측하는 것을 생각해보겠습니다.

 

먼저 각 단어를 원 핫 인코더로 인코딩하겠습니다. 원 핫 인코딩을 사용하는 이유는 단순합니다. 만약 라벨 인코더로 인코딩을 하게 된다면 각 단어는 1, 2, 3, 4라는 숫자가 인코딩이 됩니다. 단어 간 서열이 없어야 하는 상황에 1, 2, 3, 4라는 인코딩으로 인해 서열이 생기기 때문에 라벨 인코더가 아니라 원 핫 인코더를 사용합니다.

 

인코딩한 각 벡터는 위의 그림과 같습니다. (Input chars의 마지막 단어는 l이 아닌 o입니다)

 

다음 단계에서 각 단어에 대해 은닉층을 구성하는데, 이 때 h에 따른 은닉층의 정보가 e와 합쳐서 e = [0,1,0,0,0.3,-0.1,0.9]가 된다고 생각하면 보다 쉽게 이해할 수 있을 것입니다. 

 

은닉층의 요소들에 softmax를 활성화함수로 사용해 출력층을 만들게 됩니다. 각 요소에 대한 output은 [o,o,l,o]가 됩니다. 

 

(h0 = 0) 각 요소의 output과 target의 loss를 계산해 gradients를 구해 가중값을 조절하는 방식으로 RNN은 학습하게 됩니다. RNN Backward의 특징은 두 번째 요소의 output에 따른 gradient가 첫 번째 가중값에도 영향을 준다는 것입니다.

 

하지만 연속된 문자열이 길어질수록 뒷 부분의 문자에 따른 gradient가 앞부분의 가중값에 영향을 준다는 것이 연산에 좋지 않기 때문에 전체 문자열을 Cell단위로 나누어 연산합니다.

 

단어 레벨을 넘어 이제 문장 레벨에서 특정 빈칸을 채우려고 합니다. 빈칸에 들어갈 단어는 John일 것입니다. John을 예측하기 위해서는 backward 과정에서 john이라는 단어의 정보가 살아있어야 합니다.

 

하지만 RNN의 backward 과정에서 빈칸 부분을 예측하기 위한 정보에 John의 정보가 너무 작아지는 경우가 발생합니다. 이것을 Gradient Vanishing이라고 합니다.

 

 

 

3. LSTM

Gradient vanishing 문제를 최대한 해결하기 위해 나온 모델이 LSTM입니다. 그림은 iteration이 커짐에 따라 데이터가 가진 정보가 소실해나가는 것을 표현한 그림입니다. RNN의 경우 3번째부터 정보가 거의 소실되었지만, LSTM은 5번째까지 정보가 남아있는 것을 확인할 수 있습니다.

 

LSTM의 구조를 살펴보겠습니다. LSTM의 한 셀 안에서는 4개의 gate가 존재합니다. 

 

첫 번째로 Forget gate는 이전 정보를 얼마나 가져갈지에 대해 결정하는 게이트이다. 기존의 값을 0~1로 얼마나 살려서 가져갈 것인지를 결정하는 부분이다. 

 

그다음으로 Input gate와 Gate가 있다. Gate는 추가할 새로운 정보를 담고 있는 게이트입니다. Input gate는 새로운 정보 중 일부를 드러내는 역할을 합니다. 두 개의 Gate를 결합하여 새로운 정보 중 일부 정보를 드러내어 사용하게 됩니다. Gate = [0.8,-0.6], Input Gate = [0.7,0.2] 라고 하면 새로운 정보는 [0.56,-0.12]가 되어 추가되는 것입니다.

 

넘어온 Cell state에 Forget gate를 곱해서 정보를 조정하고, 새로 만든 셀 벡터에 Input gate를 정보를 조정한 값을 덧셈을 통해 Cell state를 만듭니다. 새로 만든 Cell state를 tanh에 통과시켜 Output Gate을 곱해 최종적인 hidden state를 만듭니다. 만들어진 hidden state는 output을 만드는 데 사용되고 다음 Cell의 입력으로도 사용됩니다. 

 

바닐라 RNN의 단점을 해소하기위해 만들어진 모델에는 LSTM보다 약간 경량화된 모델인 GRU도 있습니다.

 

Cell state 없이 hidden state만을 활용하여 만든 모델입니다. \(h_{t-1}\)는 이전에서 넘어온 정보입니다. \(1-z_t\)는 Forget Gate라고 생각하면 쉽습니다.

 

\(\tilde{h}_t\)는 현재 만들어진 정보로 Gate와 비슷하고, \(z_t\)는 Input Gate라고 생각하면 됩니다. \(r_t\)는 Output Gate라고 생각하면 됩니다. LSTM의 Forget, Input gate를 하나의 gate로 만들어 LSTM보다 빠른 연산이 가능해졌습니다.

 

여러 연구에 따르면 GRU와 LSTM의 성능이 비슷하다고 하니, LSTM보다 GRU를 사용하는 것이 효율적일 것으로 보입니다.