본문 바로가기
Deep Learning/NLP

[NLP] Sequence to Sequence Learning with Neural Networks

by holy_jjjae 2023. 8. 18.

Submit date: Sep 10, 2014
Archive Link
https://arxiv.org/abs/1409.3215

Sequence to Sequence Learning with Neural Networks

Deep Neural Networks (DNNs) are powerful models that have achieved excellent performance on difficult learning tasks. Although DNNs work well whenever large labeled training sets are available, they cannot be used to map sequences to sequences. In this pap

arxiv.org

 Attention개념을 접하기 전 Seq2Seq에 대한 보다 근본적인 이해를 위해 이 논문을 읽게 되었다. 논문을 접한지 얼마 되지 않은 나도 이해할 수 있을 정도의 수준으로 쉽게 서술되어 있었다.
 
 Sequnce to Sequence with Neural Networks는 Statistical Machine Translation(SMT)에서 부분적으로만 활용되었던 Deep Neural Networks(DNNs)을 본격적으로 활용하여 BLEU 점수에서의 향상을 기록했다는 점에서 의미가 있다. 그리고 기존 NLP에서는 Input으로 고정된 길이의 벡터를 넘겨줘야만 했는데, 가변 길이의 벡터를 사용할 수 있게 했다는 점도 큰 발전이었다.
 

💡 Abstract

 DNNs은 label이 있는 거대한 training set이 사용가능할  때 잘 작동한다. 하지만 각 요소들이 어떠한 관계를 가지고 있는 언어의 특성을 반영하기 위해 연속적인 데이터를 통한 sequence를 sequence와 연결하기 위해서는 사용하는데 한계가 있다.
 
 따라서 이 논문에서는 이러한 한계를 극복하기 위해 sequence 구조에 대한 최소한의 가정으로 end-to-end 접근을 제시한다.  방법은 Input sequence를 고정된 차원수의 벡터로 매핑하기 위해 Multilayered Long Short-Term Memory(LSTM)을 사용하고 그 다음 Target sequence를 벡터로부터 뽑아내기 위해 다른 Deep LSTM을 사용한다.
 
 구체적으로 Encoder와 Decoder, 두 개의 Deep LSTM으로 구성된 모델에서 먼저 Encoder를 통해 Input sequence를 읽고 Context에 해당하는 큰 하나의 고정길이 Vector, C를 만들어낸다. 그리고 Decoder는 Input과 Latent vetor H 그리고 Context vector C까지 고려해 조건부 확률을 최대화시키는 output을 내놓는다.
 
 특이한 점은 Encoder를 통해 문장을 읽을 때 역순으로 읽는 점이다. 이를 통하면 순방향으로 읽을 때보다 성능이 훨씬 좋게 나온다. 처음 단어들을 마지막에 읽게 되니 초반부에 대한 Gradient가 적게 소실되게 되고 이를 통해 첫부분의 Output을 내놓을 때 정확도를 높일 수 있으므로 이후에 차용되는 Beam Search 방식을 통해 SGD를 통한 목적함수 최대화를 효과적으로 이루었을 것이라는 가설을 내놓았다.
 
 해당 모델은 긴 길이의 문장에 대해서도 좋은 성능을 보였으며, Translation에 있어서 방향점을 제시했다는 점에서 상당히 유의미할 것이라고 말한다.
 

🛠 모델의 구조

 기본적인 구조는 Encoder를 통해 Input Sentence를 하나의 누적된 Cell State로 계산하는 부분과 Encoder에서 Input으로 받은 Cell State를 기반으로 Output에 해당하는 Sequence를 생성하는 Decoder 부분으로 나눠볼 수 있다.

 위 그림을 보면 입력으로  "ABC"가 첫 번째 LSTM에 입력되고, 해당 입력에 대한 결과(번역)인 "WXYZ" 가 두 번째 LSTM을 통해서 제공된다. 즉, 두가지의 모델이 순차적으로 실행이 되는 것이다. 그리고 각 문장의 끝은 EOS 라는 토큰으로 구분한다.
 
  LSTM을 이용해서 가변 길이의 입력에 대해서 유연하게 처리할 수 있었다. 처음에 언급한 DNNs은 input들과 target들이 고정된 차원으로 인코딩된 벡터를 사용해야만 했다. 그러나 현실 세계에서는 다양한 길이의 sequence들이 존재하므로 이를 적용하는 것에는 한계가 있었다. 따라서 적용하려는 도메인과는 별개로 Sequence to Sequence로 매핑하는 것을 학습하는 것이 중요하다고 할 수 있다.
 
  가변 길이의 벡터를 사용하기 위해 논문은 LSTM 하나를 사용하여 입력 시퀀스를 입력으로 받고 고정된 차원의 벡터를 출력한다. 그리고 또 하나의 LSTM을 사용하는데, 이는 이전 LSTM에서 출력된 벡터를 입력으로 받아 출력 시퀀스를 생성한다. 여기서 입력으로 사용된다는 말은 두 번째 LSTM의 초기 hidden state로 사용된다는 것을 의미한다.
 
 이처럼 LSTM의 큰 장점 중 하나는, 이러한 가변 길이의 입력에 대해서 고정길이의 vector representation을 생성할 수 있다는 것이다.
 
 Translation을 수행하기 위해서 어느정도의 paraphrasing 을 수행하게 되는데, vector representation은 입력 문장의 의미를 paraphrased 한 vector representation을 생성 즉, context vector를 생성한다고 볼 수 있다. 유사한 의미의 문장에 대해서 유사한 vector representation을 생성하게 된다.
 
 Encoder부분에서는 위에서 서술한 것과 같이 Input Sentence를 누적된 Cell State로 계산하는 역할을 한다. 여기서는 Sequence의 길이에 관계없이 EOS토큰이 나올때까지 Input을 계속 모델에 입력한다

더보기

참고 : 이 부분은 이론과 실제가 다르다고는 한다. 실제로는 Training의 편의성 내지 병렬처리를 위해서는 Fixed Length를 가질 필요가 있을 것이며, 해당 실험에서도 8개 GPU를 사용하기 위해 Sentence를 분할시킨다. 이는 최대길이를 설정하거나 또는 원하는 길이를 설정해준 후 Padding / Clipping을 해줘야 할 것이라고 얘기된다.

 이렇게 생성된 Vector는 Context Vector이자 Latent Vector로 파악 가능하다. Sequence Data를 다루기 위해 RNN을 사용하고자 했지만 RNN의 특성상 장기의존성을 Vanishing Gradient가 훼손하기 때문에 Long term dependency에 취약하다. 
 
 그래서 LSTM 모델을 사용해 이를 해소하고자 했으며 긴 기간에 대해 고려할 수 있어 보다 높은 성능을 보장할 수 있었다. LSTM은 현재 시점의 Input과 이전 시점의 Latent Vector H를 고려해 현재 시점의 Latent Vector H를 만들고 이를 통해 Output을 내놓는 형태이다.

 LSTM 모델이 하고자 하는 것은 우리가 출력한 (y1, y2, ..., yt')이  Input X = (x1, x2 ,..., xt)에 대해 조건부 확률에서 최대화하고 그렇게 만들어낸 예측 문장 T’가 Target sentence T와 최대로 유사하게 하는 것이다.

 이때 결과값에 softmax를 씌우게 되면 확률값으로 변하게 된다. 이를 통해 조건부 확률을 최대화하고자 했다. 순차적으로 ABC의 문장을 읽고 난 후에 WXYZ로 내놓을 output에 대한 조건부 확률을 파악하게 된다.
 
 여기에 더해 논문 저자는 4-Layers의 Deep LSTM 모델을 사용했으며 문장을 역순으로 읽도록 만들었다. 이는 위의 요약에서 서술한 것처럼 이렇게 진행했을 때 성능이 훨씬 뛰어나기 때문이다.
 
 LSTM은 long sequence 에 대해서 취약하다는 연구들이 있었지만, 해당 논문에서 제안하는 모델에서는 긴 문장에 대해서도 좋은 성능을 보장했다.
 

💡 Decode, Beam Search

찾고자 하는 목적함수는 위와 같이 log 확률 즉, log likelihood의 최대화이다. 이는 결과적으로 조건부확률을 도출해낼 것이다. 또한 이러한 가능도들의 총합을 최대화시키는 것이 목표이기 때문에 이를 Training set 전체에 해당하는 1 / |S|로 나눈다. 이를 통해 일부 문장만을 너무 정확하게 맞추는 모델보다 평균화된 성능이 높은 거을 유도하고자 했음을 알 수 있다.

그리고 여기서 Decoder를 통해 Target 문장을 만들 때에 Beam Serach 기법이 사용된다.
https://blog.naver.com/PostView.naver?blogId=sooftware&logNo=221809101199 

[Sooftware 머신러닝] Beam Search (빔서치)

Machine Learning: Beam Search (+ Implementation by PyTorch) "Sooftware" 이 글은 제...

blog.naver.com

더보기

- 각 후보 시퀀스는 가능한한 모든 다음 스텝들에 대해 확장된다.

- 각 후보는 확률을 곱함으로써 점수가 매겨진다.

- 가장 확률이 높은 k 시퀀스가 선택되고, 다른 모든 후보들은 제거된다.

- 위 절차들을 시퀀스가 끝날때까지 반복한다.

 결과적으로 Decoder로 결과물을 출력하고자 할 때에 greedy choice를 약간 보완한 방식으로 위치와 단어 선택에 대한 설정을 하고 있는 것이다.
 
 그리고 길이에 대한 penalty를 부여해서 길이가 긴 문장이 짧은 문장보다 터무니 없이 작게 나오지 않도록 조절해준다.


🔥 문장을 왜 거꾸로 읽는가

 놀랍게도 Encoder가 문장을 거꾸로 읽을 때 Translation 성능이 훨씬 좋아졌다.
예를 들어 ['a', 'b', 'c']를 입력으로 받고, target은 ['A', 'B', 'C']라고 해보자. 입력과 target을 이어붙인다고 했을 때, 입력 단어와 매핑되는 target 단어 사이의 거리는 모든 입력에 대해 3으로 동일하다. 이때의 거리들의 평균은 3이고, 최소 거리는 3이 되는데, 이 최소 거리가 minimal time lag가 된다.

  이제 입력의 순서를 바꿔보자. ['a', 'b', 'c'] 대신 ['c', 'b', 'a']를 입력하면 거리가 늘어나는 단어와 줄어드는 단어가 모두 생길 것이다. 그러나 거리의 평균은 3으로 변함이 없으며, 대신 최소 거리가 1로 줄어든다.

  논문 저자들은 이같은 최소 거리의 감소가 minimal time lag를 의미하고, 이로 인해 역전파를 할 때 입력 단어와 target 단어 사이의 "관계 형성(establishing communication)" 이 쉬워져서 결국 전체적인 성능 증가로 이어진다고 설명한다. 실제로 입력을 inverse 했을 때는 안했을 때와 비교하여 test perplexity가 5.8에서 4.7로 줄어들었고, BLEU 점수도 25.9에서 30.6으로 증가했다.
 
 결과적으로 Decoder를 진행할 시에 처음 Beam Search의 순위가 높은 것을 찾아야 하는데 여기서 최대 확률이 거의 결정되게 된다. 이에 대한 정확도를 가장 높이는 방법이 문장을 역순으로 읽어 Latent Vector를 만들어내는 것이기 때문이라고 말한다.
 
 '그렇다면 마지막 부분에서의 정확도가 낮아지지 않을까?' 라는 의문에 대해서도 오히려 그렇지 않다고 논문저자는 말한다. 결과적으로 문장을 역순으로 읽을 때 보다 높은 성능을 기대할 수 있다고 말한다.
 

💡Train

  4개의 layer로 구성된 LSTM을 사용했으며, 각 layer는 1000 cell로 이루어졌고 word embedding은 1000 차원으로 이루어졌다. 입력 사전의 단어는 160,000개이고 출력 사전의 단어는 80,000개이다. 따라서 LSTM은 8000개의 실수를 사용하여 문장을 나타낸다. 그리고 naive softmax를 사용하여 80,000개의 단어에 대한 확률분포를 만든다. 최종적으로 LSTM은 384M개의 파라미터가 존재하게 된다.
 
  LSTM의 파라미터들은 [-0.08, 0.08] 에서의 균등분포에 따라 초기화되었다. 또한, LSTM은 기울기 소실 문제가 적지만 기울기 폭발(Exploding gradients) 문제가 존재한다. 따라서 norm이 일정 값을 넘었을 때, 이를 스케일링 해주는 것으로 제약을 걸었다. 각 훈련 배치마다 gradient의 크기를 구한 뒤, 이 크기가 5를 초과한다면 5*gradient / (gradient 크기)로 gradient 벡터를 나눠준다.  또한, 데이터셋에서 짧은 문장은 많지만 긴 문장은 적은 문제가 있다. 이로 인해 각 minibatch마다 많은 양의 계산 낭비가 발생한다. 이를 해결하고자 minbatch 안의 모든 문장들이 어느 정도 비슷한 길이의 문장들로만 구성되도록 설정하였다.


🔥 GPU 병렬처리

 총 8개의 GPU를 사용하는데,  4개는 LSTM에 그리고 4개는 softmax 계산에 진행하고 이들을 연관시킴으로써 계산의 효율을 극대화했다고 말한다.
 

💡Experimental Results

 실험은 English to French Machine translation 데이터셋을 이용하여 진행되었고,  번역의 질을 평가하기 위하여 BLEU score를 이용하였다. 

  실험결과 제안한 방법을 Ensemble한 결과가 Baseline 모델인 SMT모델에 비해 더 좋은 성능을 보였다. 이는 처음으로 Neural Network를 사용한 모델의 성능이 SMT모델을 능가한 경우이다.

  SMT모델의 상위 1000개의 결과를 다시 제안한 방법으로 평가하여 각 모델의 평균을 결과로 하였을 때, State-of-the Art(SOTA)모델에 비해서는 다소 낮은 성능이지만 충분히 향상된 성능을 얻었다.

 제안된 모델은 충분히 긴 문장에서도 좋은 성능을 보였다.


✏️ 후기

  • 인코더 디코더 / CNN 같이 최신 모델들의 기본 틀이 되는 내용 관련된 논문 읽어보고
  • LSTM을 먼저 읽지 않은 것이 아쉬웠다. 빠른 시일 내로 LSTM을 읽고 다시 살펴봐야겠다.
  • minimum time lag는 아직도 의문이다...
  • 꼭 논문보면서 직접 layer나 class같은거 짜보는 연습해보기
  • 그러고 나서 최신 모델이나 인기있는 모델 논문 살펴보기
  • BLEU 점수와 Beam Search 에 대한 부분이 많은데 이 부분에 대한 공부가 필요하다고 생각