Programming/(Python)(Ubuntu)

Seq2Seq 알고리즘 이해 + Attention

$choice 2020. 2. 27. 13:53

1. Sequence to Sequence

 

seq2seq 는 번역기에서 대표적으로 사용되는 모델입니다. 설명하는 내용의 대부분은 RNN 내용들입니다. 단지 이것을 가지고 어떻게 조립했느냐에 따라서 seq2seq 라는 구조가 만들어집니다.

 

위의 그림은 seq2seq 모델로 만들어진 번역기가 'I am a student'라는 영어 문장을 입력 받아, 'je suis étudiant' 라는 프랑스 문장을 출력하는 것을 보여줍니다. 

 

seq2seq 모델의 내부 모습은 이렇게 구성되어 있습니다.

 

 

seq2seq 는 크게 두 개로 구성되는데, 인코더(Encoder)와 디코더(Decoder)입니다.

 

  1. 인코더(Encoder)는 입력 문장의 모든 단어들을 순차적으로 입력받은 뒤에 마지막에 이 모든 단어 정보들을 압축해서 하나의 벡터로 만드는데 이를 컨텍스트 벡터(Context vector)라고 합니다.
  2. 입력 문장의 정보가 하나의 컨텍스트 벡터로 모두 압축되면 인코더는 벡터를 디코더로 전송합니다.
  3. 디코더(Decoder)는 컨텍스트 벡터를 받아서 번역된 단어를 한 개씩 순차적으로 출력합니다.

위의 사진의 컨텍스트 벡터로 사이즈 4로 표현했지만 실제에서는 수백 이상의 차원을 가지고 있습니다.

 

 

인코더 구조와 디코더 구조의 내부는 사실 RNN 구조입니다.

  • 입력 문장을 받는 RNN 셀을 인코더
  • 출력 문장을 출력하는 RNN 셀을 디코더

추가적으로 RNN 셀을 LSTM 셀 또는 GRU 셀들로 구성할 수 있습니다.

 

우선 인코더를 자세히보면, 입력 문장은 단어 토큰화를 통해서 단어 단위로 쪼개지고 단어 토큰 각각은 RNN 셀의 각 시점의 입력이 됩니다. 인코더 RNN 셀은 모든 단어를 입력받은 뒤에 인코더 RNN 셀의 마지막 시점의 은닉 상태를 디코더 RNN 셀로 넘겨주는데 이를 컨텍스트 벡터라고 합니다. 이 컨텍스트 벡터는 위의 그림에서 볼 수 있듯 디코더 RNN 셀의 첫번째 은닉 상태로 사용됩니다.

 

디코더는 기본적으로 RNNLM(RNN Language Model)입니다.

 

디코더는 초기 입력으로 문장의 시작을 의미하는 심볼 <BOS>가 들어갑니다. 디코더는 <BOS>가 입력되면, 다음에 등장할 확률이 높은 단어를 예측합니다. 첫번째 시점(time step)의 디코더 RNN 셀은 다음에 등장할 단어로 je를 예측하였습니다. 첫번째 시점의 디코더 RNN 셀은 예측된 단어 je를 다음 시점의 RNN 셀의 입력으로 입력합니다. 그리고 두번째 시점의 디코더 RNN 셀은 입력된 단어 je로부터 다시 다음에 올 단어인 suis를 예측하고, 또 다시 이것을 다음 시점의 RNN 셀의 입력으로 보냅니다. 디코더는 이런 식으로 기본적으로 다음에 올 단어를 예측하고, 그 예측한 단어를 다음 시점의 RNN 셀의 입력으로 넣는 행위를 반복합니다. 이 행위는 문장의 끝을 의미하는 심볼인 <EOS>가 다음 단어로 예측될 때까지 반복됩니다. 

 

seq2seq 는 훈련 과정과 테스트 과정 혹은 실제 모델 사용 과정의 작동 방식이 조금 다르니다. 훈련 과정에서는 디코더에게 인코더가 보낸 컨텍스트 벡터와 실제 정답인 <BOS> 'je suis étudiant' 를 입력 받았을 때,  'je suis étudiant'<EOS> 가 나와야 된다고 정답을 아려주면서 훈련합니다. 반면 테스트 과정에서는 앞서 설명한 과정과 같이 디코더는 오직 컨텍스트 벡터와 <BOS> 만을 입력으로 받은 후에 다음에 올 단어를 예측하고, 그 단어를 다음 시점의 RNN 셀의 입력으로 넣는 행위를 반복합니다. 즉 앞서 설명한 과정과 위의 그림은 테스트 과정에 해당됩니다. 

 


워드 임베딩(Word Embedding)

 

기계는 텍스트보다 숫자를 잘 처리합니다. 그리고 자연어 처리에서 텍스트 벡터로 바꾸는 방법은 워드 임베딩(Word Embedding)을 사용합니다. 즉, seq2seq에서 사용되는 모든 단어들은 워드 임베딩을 통해 임베딩 벡터로서 표현된 임베딩 벡터입니다.

 

 

RNN 동작 동영상 및 Seq2Seq 동작 동영상

 

 

RNN 단계

첫 히든 스테이트 #(t-1) 과 입력 벡터를 사용하여 다음에 들어갈 히든 스테이트 #t를 생성하고 해당 시점(time step의 출력 벡터을 만드는 것을 반복합니다.


+ 어텐션(Attention)

 

앞서 배운 seq2seq 모델은 인코더에서 입력 시퀀스를 컨텍스트 벡터라는 하나의 고정된 크기의 벡터 표현으로 압축하고, 디코더는 이 컨텍스트 벡터를 통해서 출력 시퀀스를 만들어냈습니다.

 

하지만 이러한 RNN에 기반한 seq2seq 모델에는 크게 두 가지 문제가 있습니다.

 

  • 하나의 고정된 크기의 벡터에 모든 정보를 압축하려고 하니까 정보 손실이 발생합니다.
  • RNN의 고질적인 문제인 기울기 소실 (Vanishing Gradient) 문제가 존재합니다.

 

즉, 결국 이는 기계 번역 분야에서 입력 문장이 길면 번역 품질이 떨어지는 현상으로 나타났습니다. 이를 위한 대안으로 입력 시퀀스가 길어지면 출력 시퀀스의 정확도가 떨어지는 것을 보정해주기 위한 등장한 기법이 어텐션(attention)입니다.

 

어텐션의 기본 아이디어는 디코더에서 출력 단어를 예측하는 매 시점(time step) 마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고한다는 점입니다.

전체 입력 문장을 전부 다 동일한 비율로 참고하는 것이 아니라 해당 시점에서 예측해야할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중(attention)해서 보게 됩니다.

 

 

 

 

동영상 및 내용 출처

http://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

https://wikidocs.net/24996

https://wikidocs.net/22893

반응형