1. RNN (Recurrent Neural Network)
자연어 처리 분야에서 문장내 단어들은 순서에 따라 서로 영향을 주고받기때문에 순서 정보가 굉장히 중요하다. 따라서 순서정보를 사용하여 학습하는 것을 시퀀셜 모델링 (Sequential Modeling)이라고 한다. 순환신경망(RNN)은 입력과 그 직전의 hidden state를 참조하여 다음 hidden state를 결정하기 때문에 시퀀셜 모델링이 가능하다. RNN은 foward와 back-propagation 과정을 거치며 학습한다.
1) 피드포워드
함수 f는 xt와 h t-1를 입력으로 받아서 파라미터 Θ를 통해 h t 를 계산한다. ReLU대신 tanh를 활성화 함수로 사용하고, 최종적으로는 각 time-stamp에 대한 손실 L을 구한 후, time-stamp 수만큼 평균을 내어 최종 손실을 구한다. 이때 입력으로 주어지는 xt 의 크기는 (batch_size, 1, input_size)이다. batch_size는 미니배치에서의 샘플인덱스를 나타내고, 1은 현재 time-stamp에서의 인덱스를 나타내며, input_size는 미리 정해진 임베딩 계층의 출력벡터 차원수를 나타낸다. 이러한 텐서를 여러개 입력으로 받아 RNN은 매 단계마다 hidden state 를 갱신한다. hidden state 의 크기는 (batch_size, hidden_size)으로 고정되고, 이것을 n개의 time-stamp에 대해서 이어붙이면 출력텐서의 크기는 (batch_size, n, hidden_size)가 된다. 이렇게 하나의 층만 갖는 경우에는 hidden state와 출력값이 같은 값이지만, RNN이 여러계층을 갖게 된다면 전체 출력값이 맨 위층의 hidden state가 된다. 따라서 hidden state의 크기는 (num_layer, batch_size, hidden_size)가 된다. 이외에도 양방향 RNN을 이용할 수 있는데, 각 층마다 두방향의 time-stamp 값을 이어붙이게 된다. 이때에는 hidden state의 크기가 (2*num_layer, batch_size, hidden_size) 가 된다.
2) BPTT (Back Propagation Througn Time)
앞서 구한 손실 L에 미분을 통해 역전파를 수행하게 되면 각 time-stamp별로 Θ의 기울기가구해지고, 이는 이전 time-stamp Θ의 기울기에 더해진다. RNN의 역전파 속성으로 인해 마치 time-stamp수만큼 계층이 존재하는 것과 같이 동작하고, time-stamp이 길어짐에 따라깊은 신경망처럼 동작한다.
하지만 여기서 활성화함수로 tanh함수를 쓰기때문에 양 끝의 값을 반환하는 층에서는 기울기가 0에 가까워지고, 결국 제대로 된 미분값을 전달 받을 수 없게 된다. 이를 기울기 소실(Vanishing Gradient)라고 하는데, RNN 처럼 time-stamp수가 많거나, 여러 계층 구조를 갖는 MLP에서 이러한 문제가 생길 수 있다.
하지만 반대로 입력의 길이가 길어지면 기울기가 커지는데, 이때는 학습률을 줄여 업데이트 스텝의 크기를 너무 커지지 않게 조절해야한다. 가변길이에 맞게 학습률 최적의 값을 찾아 조절해주는 것을 그래디언트 클래핑이라고 하는데, 기울기 벡터의 방향은 유지하되 크기를 조절해 주는 것이다. 이때 Adam과 같은 동적 학습률을 갖는 옵티마이저를 사용할때에는 그래디언트 클리핑을 적용하지 않아도 된다.
2. LSTM (Long Short-Term Memory)
RNN은 가변길이의 시퀀셜데이터에 잘 동작하지만, 그 길이가 길어지면 앞쪽 데이터를 반영하지 않게 되는 단점이 있다. 이 단점을 보완하기 위해 LSTM은 별도의 cell-state를 두어 앞쪽 데이터를 반영할 수 있도록 대처한다. 하지만 LSTM의 수식은 RNN에 비해 복잡하고, hyperparameter의 개수가 증가하였기 때문에 상대적으로 학습시키는데 드는 시간이 증가한다.
각 게이트 앞에는 sigmoid함수가 붙어 0과 1사이의 값으로 게이트를 열지 닫을지를 경정하고, 결정된 값에 따라서 cell-state의 값이 결정된다. RNN과 마찬가지로 LSTM도 양방향으로 구현하거나, 여러층으로 쌓는 것이 가능하다. LSTM의 복잡한 수식을 간소화한 GRU도 있는데, 아직까지는 LSTM이 더 많이 쓰인다.
※본 게시물은 「김기현의 자연어처리 딥러닝캠프-파이토치편」을 참고하여 작성되었습니다.
'NLP' 카테고리의 다른 글
8. 텍스트 분류 (0) | 2021.07.23 |
---|---|
6. 단어 임베딩 (0) | 2021.07.21 |
5. 자연어의 중의성을 해결하는 법 (0) | 2021.07.21 |
4. 전처리 (0) | 2021.07.19 |
3. 파이토치 기초문법 (0) | 2021.07.13 |