오늘은 RNN의 long-term dependency에 대해 다뤄보도록 하겠습니다.
RNN에는 어떤 문제가 존재하는지 살펴보고, 이 문제를 완화하는 방법인 LSTM과 GRU에 대해 다뤄볼 것입니다.
그리고, RNN에서 gradient exploding, vanishing이 왜 발생하는지 computational graph를 통해 살펴보도록 하겠습니다.
더불어 RNN의 base model들을 리뷰하고, 기존 RNN-based model의 overfitting 문제를 해결하기위한 방법들을 알아보겠습니다.
Vanishing Gradient
RNN은 long term dependency라는 문제가 있다. 이는, 오래전에 있었던 문제를 쉽게 까먹는다는 것이다.
예를 들면, 'Jane walked into the room. John walked in too. It was late in the day. Jane said hi to __ ' 라는 예시 문장이 있을 때, 빈칸에 들어갈 정답은 'John'이 될 것이고, 정답이 나온 정보는 두 번째 문장에 존재한다. word-level이라고 생각하면, 두 번째 문장에서 존재하는 정답이 그 뒤로 수 많은 time step들을 거치고 나서도 이 정보를 기억해야만 빈칸에 대한 정답을 예측할 수 있을 것이다. 하지만, RNN은 time step이 많이 지나면서 이전의 정보를 잊는 vanishing gradient 문제가 생긴다.
이러한 문제가 생기는 이유는 hidden state vector 중에서 한 vector에 여러가지의 정보를 너무 많이 저장해서 새로운 정보가 계속해서 들어옴에 따라 이전의 정보가 변형되기 때문이다.
약간의 극단적인 예시는 다음과 같다.
항상 같은 RNN을 곱해주기 때문에, 곱셈에 기반한 연산이므로 곱해주는 값(RNN)이 1이어야 원래의 정보가 유지되는데, 1보다 커지면 h가 너무나도 커지고, 1보다 작으면 h가 계속해서 작아져서 0에 가까워질 것이다.
즉, RNN은 곱셈에 기반한 구조이기 때문에, 이전의 값이 온전히 보존될 수 없는 구조이다.
이 후 모델들은 곱셈에 기반한 연산을 덧셈에 기반한 연산으로 바꿈으로써, 성능을 높일 수 있게 되었다.
LSTM
곱셈에 기반한 모델이 문제점을 갖고 있어서 덧셈에 기반한 모델로 바꿔주자는 의견에서 나온 모델이 Long Short Term Memory(LSTM)이다.
RNN의 기본구조를 기반으로 본다면, xt와 ht-1을 받아서 tanh를 해주어 ht를 받는 중간 과정을 조금 복잡하게 바꿀 것이다.
ht-1이나 ht를 2차원 벡터라고 하자. 이러한 2차원 벡터를 바로 만드는 것이 아니라, 2차원 벡터를 총 4개를 만들 것이다. 총 8차원 벡터를 만들고, 이를 4등분으로 나누어 쓴다고 생각해보자. 이는 fully connected layer를 통과시켜 만든 벡터일 것이다.
그 다음, 8차원 벡터를 총 4등분을 해서 만들어진 2차원 벡터 4세트들을 non linear unit에 통과시켜준다. 결론적으로 1번, 2번, 3번 벡터는 sigmoid를 통과시켜주고, 4번에 해당하는 벡터는 tanh를 통과시켜준다. 통과시켜주고나면 1, 2, 3번의 결과 값은 0에서 1사이가 될 것이고, 4번의 결과 값은 -1에서 1사이가 될 것이다.
왜 어떤 것은 sigmoid를 통과시키고, 어떤 것은 tanh를 통과시킬까? RNN에서는 zero-centered 문제가 생긴다. 그렇기 때문에, non linear unit을 통과시킨 후에도 0근처에 있는 것들은 계속해서 0근처에 있게끔 유지하는 것이 중요하다.
sigmoid는 보통 logistic regression에 기반해서 sigmoid에서 나온 0에서 1사이의 output으로, 이는 보통 binary classification의 최종 output으로 나타내는 용도로 주로 쓰인다. 또 다른 sigmoid의 용도는 gating이다.
gating은 0에서 1사이의 값을 만들어 놓고, 이 값을 누군가와 곱해주어서, 기존에 곱해지는 대상에 해당하는 값을 어느정도 감소시키는 역할을 한다. 예를 들어 , 5라는 값에 0.7을 곱한다는 것은 5가 나타내는 정보를 70%만큼 down시켜주는 것이다. 이처럼, 기존에 갖고 있던 정보를 필요한 만큼만 0에서 1사이의 가중치를 주어서 줄여준다는 의미이다.
기본적으로 LSTM에서는 첫 번째 time step에서 두 번째 time step으로 넘어가게 되는 정보를 두 세트의 벡터로 관리를 한다.
위 사진의 LSTM의 구조를 보면, 위쪽과 아래쪽으로 나눠질 것이다. 이는 2세트의 hidden state vector가 있다는 것이다.
이 두 세트의 벡터는 cell(C)이라고 불리는 cell state vector가 있고, 우리가 알고 있는 hidden state vector가 있다. LSTM에서는 cell state vector가 조금 더 중요한 역할을 한다.
RNN에서의 이전의 hidden state vector 정보가 cell state 정보라고 생각하자.
기존의 hidden state vector는 tanh의 output으로 나온 -1에서 1사이의 값이었다면, cell state vector는 기본적으로 -∞ 부터 +∞ 까지 자유로운 값을 가지는 형태의 vector이다. 왜냐하면, 이것은 덧셈에 기반해서 update되는 것이기 때문이다.
이전 단계에서 넘어온 cell state vector에 무언가를 곱해주면, 이 정보를 얼마나 흘려보낼지에 대한 gate가 존재한다. 이전에 gate를 총 4개를 만들었다.
이 중 forget gate를 가져온다. 이 forget gate를 cell state vector에 곱해주게 된다. 이 gate는 cell state vector에서 어느정도의 정보만 살려줄지를 결정하는 것이 되고, 그렇게 이 둘이 곱해지면 새로운 vector가 나오게 된다.
예를 들면, [ 3 -5 ] 라는 벡터에 [ 0.7 0.2 ] 라는 forget gate를 곱해주자. 그렇게 나온 결과는 forget gate가 정해진 만큼의 정보만 살아남게 될 것이다. 이는 과거에서 넘어온 정보에서 일정부분을 버린다는 의미로 forget gate라고 이름지어졌다.
이렇게 새롭게 나온 vector에서 지금 time step에서 나온 정보를 바탕으로 덧셈으로 update해 주어서 cell state vector를 만든다.
forget gate는 ht-1과 xt를 입력으로 받아서 만들어진 vector 중 한 세트의 vector가 된다.
forget gate에 의해서 버려지고 만들어진 cell state vector에 덧셈을 하는 방식으로 현재의 cell state vector를 update해 주어야 한다. 이 더해주는 vector는 현재 time step에서 생성된 추가 정보이다.
이러한 추가 정보는 2 단계를 통해서 만들게 된다. sigmoid를 통해 만들어진 input gate와 tanh를 통해 만들어진 gate gate를 곱해서 추가 정보를 만들게 된다.
왜 tanh를 통해 만들어진 gate gate로 한번에 추가 정보를 만드는 것이 아닐까? 더해주어져야 할 정보가 gate gate인 것은 맞지만, gate gate도 xt와 ht-1로 만들어진 한 번의 선형변환에 의해서 만들어진 정보이므로, 한 번에 원하는 정보로 나오지 않을 수 있다. 그렇기 때문에 4개의 gate로 크게 나누고 두 번째 step에서 이들을 조합하여 원하는 정보를 만드는 것이다.
이렇게 덜어낼 부분은 덜어내고, 더해줄 부분은 더해주는 방식으로, 덧셈을 기반으로하여 최종적인 cell을 update해주는 방식으로 진행된다.
GRU
cell과 hidden state vector가 하나의 hidden state vector로 통합된 것이 GRU이다.
위 식에서 맨 마지막 줄을 살펴보자.
여기서 ht는 cell이고, ht-1은 이전의 cell이다.
LSTM에서의 cell은 이전의 cell에 forget gate를 곱해주었었다.
현재 만들어진, tanh에서 나온 추가해야할 vector가 ht hat이고, LSTM에서는 이것과 zt라는 input gate를 곱해주었었다. 이 뜻은, gate gate의 정보에 input gate만큼의 정보를 곱해준다는 것이다. 이렇게 일부분만 가져와서 cell을 update해주려고 하는 의도는, 기존에 있던 정보를 1-input gate만큼만 유지한다는 것과 같다.
이처럼, 덜어낼 부분과 추가할 부분의 비율의 합을 언제나 1로 맞춰주도록 한다. 이러한 방식의 GRU는 한 세트의 vector가 줄게 된다.
'NLP > AI기술 자연어처리 전문가 양성 과정 3기_NLP' 카테고리의 다른 글
Day 41. RNNs with Attention (0) | 2022.06.11 |
---|---|
Day 40. NLP Quiz 1 (0) | 2022.06.11 |
Day 38. RNN (0) | 2022.06.09 |
Day 37. Word Embedding (0) | 2022.06.08 |
Day 36. Topic Modeling (0) | 2022.06.07 |