How to deal with sequential data?
Vanilla feed forward network는 fixed size (e.g., image) 입력을 받아 fixed size 출력을 내놓는다. 그렇다면 길이가 고정되어 있지 않은 sequence 데이터를 뉴럴넷으로 처리하려면 어떻게 해야할까? 또 모델에 입력되는 데이터의 순서는 중요할까?
가변적인 시퀀스 입력(동영상)을 뉴럴넷으로 처리한 연구는 16년에 발표되었지만, 입력 순서를 고려하지 않은 averaging이 사용되었다
Recurrent neural network (RNN)은 가변적인 길이의 입력을 순서를 고려하면서 처리하는 vanilla feed forward network와는 다른 새로운 네트워크였다.
Recurrent Neural Network (RNN)
많은 task들에서 입력 데이터들은 temporal dependency를 가지고 있었다. Image captioning, sentiment analysis, machine translation, Part-of-speech (POS) tagging task가 RNN을 사용할 수 있는 대표적인 task들이다.
RNN의 수식을 살펴보자.
새로운 new state h_t는 f_w로 표현되는 RNN에 이전 time step에서의 hidden state와 현재 time step에서의 input vector를 입력함으로써 얻어진다. 이러한 이전과 현재 time step의 input을 함께 넣어주는 것은 RNN이 temporal dependency를 학습하게 한다. 여기서 유의할 점은 많은 그림에서 RNN의 각 셀(cell)마다 새로운 파라미터를 갖는 다른 네트워크로 보일 수 있지만, 모두 같은 파라미터를 각 time step마다 계속해서 사용한다는 것이다.
h_t는 W_hh, W_xh로 표현되는 두 파라미터와 tanh 함수로 구성되고, 마지막에 W_hy 파라미터와 곱해짐으로써 해당 time step에서의 output vector를 얻게 된다.
아래는 Many to Many (sequence to sequence)의 예시이다.
앞서 설명한 것처럼 파라미터의 집합 W는 모든 time step에서 계속해서 사용되고, h_t에 곱해지는 W_hy 역시 계속해서 사용된다.
각 time step에서 y_t와 L_t를 얻고, 모든 L_t를 합쳐 L이라는 sequence output을 출력하게 된다.
Many-to-one (Sequence to vector)의 경우는 더 간단한데, W는 모든 time step에서 공유되지만, W_hy는 마지막 time step의 h_T에만 곱해져 output vector를 얻게 된다.
더 구체적으로 sentiment analysis task에서의 RNN의 쓰임을 살펴보면
One-hot encoding으로 This moive is fun이라는 sequence가 입력되게 되고, 마지막 time step인 T에서 h_T를 사용해 positive / negative의 분류를 수행하게 된다.
POS tagging task에서의 RNN도 좀 더 살펴보면,
각 time step에서의 h_t에 동일한 W_hy 파라미터가 곱해져 POS tag에 대한 분류를 모든 x_t에 대해 수행할 수 있는 것을 확인할 수 있다.
Long-Short Term Memory (LSTM)
Long-Short Term Memory (LSTM)은 기존의 RNN의 vanishing gradient 문제를 해결하기 위해 고안된 RNN이다. 위 figure의 가운데 셀에서 이전 셀과 다음 셀을 연결하는 직선이 보이는데, 이것을 cell state라 하며 시간이 오래 흐르더라도 역전파를 위한 gradient가 흐를 수 있도록 해 vanilla RNN의 vanishing gradient 문제를 어느정도 해결하였다.
LSTM은 forget, input, output의 3개의 gate로 이루어져 있다. 먼저 input gate와 forget gate를 살펴보자.
위의 forget gate는 '과거 정보를 잊기 위한' 게이트이다. 이전 시점의 hidden state h_t-1와 x_t를 입력받아 시그모이드를 취한 값이 forget gate의 결과값이 되고, 이전 cell state를 얼마나 유지할지를 결정하게 된다. 1에 가까울 수록 이전 상태를 유지하고, 0에 가까운 값을 내놓을수록 이전 상태를 잊게(forget) 된다.
아래의 input gate는 현재 time step의 정보를 기억하기 위한 게이트이다. 이전 시점의 hidden_state h_t-1와 x_t를 입력받아 각각 시그모이드, 하이퍼볼릭탄젠트 함수를 취하고, 둘의 결과값을 Hadamard product해준 값이 input gate의 결과값이 된다. input gate의 출력값은 cell state에 element-wise로 더해져 cell state에 이번 시점의 정보를 더해주게 된다.
Output gate는 forget, input gate의 출력값에 따라 얻어진 이번 time step에서의 cell state와, 이전 시점의 hidden state h_t-1, x_t를 입력받아 이번 step에서의 hidden state를 결정해주게 된다.
LSTM에 더해 GRU와 다른 기존의 vanilla RNN을 개선한 네트워크들이 있으니, 필요하다면 더 찾아보면 좋을 것 같다.
'Lecture > (2021-1) Deep learning for NLP' 카테고리의 다른 글
[Week 11] Transformer Network (0) | 2021.06.11 |
---|---|
[Week 9] Machine Reading Comprehension with Attention (0) | 2021.06.11 |
[Week 7] Sequence to sequence and attention mechanism (0) | 2021.05.25 |
[Week 3] Word embeddings (0) | 2021.05.13 |
[Week 2] ML/NN/DL Basics (0) | 2021.05.01 |