cs

ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시퀀스 투 시퀀스(Seq2Seq) 모델
    개인 스터디/NLP 2020. 7. 17. 13:55

    일반적인 인공 신경망을 사용한 자연어 처리 과제는 단어 표현이나 라벨링처럼 단일한 출력값을 만들어냅니다.

    하지만 많은 자연어 처리 과제는 가변적인 길이의 순차적인 출력값(sequential output)을 결과로써 요구합니다.

    예컨대 다음과 같은 과제들이 있습니다.

     

    • 번역: 특정한 언어로 쓰인 문장을 입력값으로 받아 다른 언어로 쓰인 같은 문장을 출력하는 것
    • 대화: 문장이나 질문을 입력값으로 받아 그에 반응하는 것
    • 요약: 긴 글을 입력값으로 받아 그에 대한 요약을 출력하는 것

    여기에서는 이런 유형의 문제들을 딥 러닝 기반으로 다룰 수 있는 seqence-to-sequence 모델을 살펴보도록 하겠다.

     

    1. Seq2Seq 이전의 접근법

     

    과거에는 확률적 모델에 기반해 번역 시스템을 만들었습니다.

    • 번역 모델(translation model): 주어진 문장/구문이 번역될 확률이 가장 높은 문장/구문을 알려준다.
    • 언어 모델(language model): 주어진 문장/구문이 얼마나 그럴듯한지(likely) 알려준다.

    이렇게 만들어진 번역 시스템은 단어 혹은 구문에 기반합니다.

    그런데, 한국어의 "나는 딸기잼을 샀다"와 영어의 "I bought a strawberry jam"은 같은 뜻이지만 서로 순서가 다릅니다.

    naive한 단어 기반 시스템은 이렇게 언어간의 서로 다른 어순을 반영하기가 힘들 것이라고 예측할 수 있습니다.

     

    구문 기반 시스템은 Seq2Seq 이전의 가장 흔한 접근법이었습니다.

    구문 기반 번역 시스템은 입력값과 출력값을 구문의 sequence로 볼 수 있었습니다.

    그러나, 구문 기반 번역 시스템 역시 장기 의존성 문제(the problem of long-term dependencies)를 가지고 있습니다.

     

    LSTM 기반의 Seq2Seq가 가진 큰 이점은 이전의 접근법들과 다르게, 입력 문서 전체를 본 후에 출력 문장을 생성할 수 있다는 것입니다.

     

    2. Seq2Seq 개요

    Seq2Seq는 두 개의 순환 신경망(recurrent neural network)로 이루어진 종단간 학습 모델(end-to-end model)입니다.

    Seq2Seq를 이루는 두 개의 순환 신경망은 다음과 같습니다.

     

    • encoder: 입력값을 받아 이를 고정된 크기의 문맥 벡터(context vector)로 변환한다.
    • decoder: 문맥 벡터를 seed로서 사용해 출력값을 만든다.

    인코더와 디코더로 구성되어 있기 떄문에, Seq2Seq 모델은 종종 encoder-decoder model이라고도 불립니다.

     

    3. Seq2Seq - encoder

    인코더 네크워크는 입력 시퀀스를 읽어 고정된 크기의 문맥 벡터 $C$를 생성하는 것입니다.

    인코더는 순환 신경망(주로 LSTM)을 사용해 입력 토큰들을 순차적으로 읽습니다.

     

    그러나, 임의 길이의 입력 시퀀스를 고정된 크기의 벡터로 매핑하는 것은 쉽지 않은 문제입니다.

    인코더는 따라서 stacked LSTM으로 구성됩니다.

    이는 여러 개의 LSTM 레이어로, 각 레이어의 출력값이 다음 레이어의 입력값이 됩니다.

    이 때 $C$는 마지막 레이어의 hidden state가 됩니다.

     

    Seq2Seq 인코더는 특이한 특징을 갖는데, 입력 시퀀스를 역전된 순서로 처리하는 것입니다.

    Seq2Seq 원저자들은 이 현상에 대한 완벽한 설명을 하지는 못했다고 하지만, 다음과 같은 설명을 제시하고 있습니다.

     

    위의 "나는 딸기잼을 샀다" 가 예시라면 "샀다 딸기잼을 나는" 순서로 읽어들이는 것입니다.

    이렇게 할 경우, 거칠게 일반화를 했을 때 인코더가 보는 마지막 입력값(나는)이 모델의 첫 번째 출력값(I)에 대응합니다.

    이 특성은 디코더가 출력값을 생성하기 시작하는 것을 조금 더 쉽게 만들어 주어, 적합한 전체 출력값을 생성하는 것도 쉽게 해 줍니다.

    말하자면 네트워크가 첫 번째 몇 개의 단어를 보자마자 번역하게 하는 것인데,

    만약 그 번역이 정확하다면 나머지 문장을 정확히 번역하는 것이 훨씬 쉬워질 것입니다.

     

    만약 입력 시퀀스를 역전된 순서로 처리하지 않는다면, 입력값과 출력값 사이의 거리가 항상 멀게 되어 큰 minimal time lag를 가지게 되는 문제가 발생합니다.

    역전된 순서로 처리할 경우 입, 출력값의 평균 거리는 같지만, 첫 몇 개의 단어들은 출력값과 밀접한 거리를 갖게 되므로 이 문제가 상당수 해소됩니다.

     

    이렇게 역순으로 처리했을 경우 처음의 몇 단어의 번역 정확도 뿐 아니라 긴 문장에 대한 전체적 성능도 크게 향상되었다고 합니다.

     

    인코더 네트워크는 그림1과 같은 구조를 가집니다.

     

    그림1. Seq2Seq encoder 네트워크의 예시

     

    3. Seq2Seq - decoder

    디코더 역시 LSTM 네트워크로 이루어져 있지만, 인코더 네크워크보다 조금 더 복잡한 쓰임새를 가진다.

    디코더는 지금까지 생성된(번역된) 단어들과 입력값 모두를 반영하게 됩니다.

    디코더의 기본적인 구조는 stacked LSTM으로 인코더와 같은데, hidden state가 인코더에서 생성한 문맥 벡터로 초기화된다는 점이 다릅니다.

    디코더는 문자 그대로, 입력값들의 문맥을 사용해 출력값을 만들게 됩니다.

     

    디코더가 초기화되고 나면, 출력값 생성을 시작하는 신호가 되는 <EOS> 토큰을 건네게 됩니다.

    그 후 여러 개의 레이어와 마지막 레이어의 softmax 함수를 거쳐 첫 번째 단어를 출력합니다.

    출력된 첫 번째 단어는 다시 첫 번째 레이어의 입력값이 되어 이 과정을 반복합니다.

    그림 2에서 디코더 네트워크의 구조를 확인할 수 있습니다.

     

    그림2. Seq2Seq decoder 네트워크의 예시

     

    출력 시퀀스를 만든 후에는 기존과 같은 방법을 통해 학습합니다.

    즉 loss함수(categorical crossentropy)를 정의하고, gradient descent와 backpropagation을 통해 이를 최소화합니다.

    인코더와 디코더는 동시에 학습되기 때문에, 같은 문맥 표현을 배우게 됩니다.

     

    4. Recap

    Seq2Seq모델의 특징은 입력 시퀀스의 길이와 출력 시퀀스의 길이 사이에 연관성이 없다는 것입니다.

    따라서 어떤 길이를 가진 문장이건 입력값이 될 수 있고, 출력값 역시 마찬가지입니다.

    그러나, LSTM모델의 현실적인 한계점들로 인해 아주 긴 입력값에 대해 Seq2Seq 모델의 효과는 떨어지게 됩니다.

     

    Seq2Seq 모델이 "나는 딸기잼을 샀다"를 "I bought a strawberry jam"으로 번역하는 과정을 한 번 생각해 봅시다.

    먼저, 세 개의 one-hot vetor에서부터 시작합니다.

    이 one-hot 벡터들은 조밀한 벡터 공간으로 다시 한 번 임베딩 될수도 있고, 그렇지 않을 수도 있습니다.

    그리고, stacked LSTM(인코더) 네트워크는 이 시퀀스를 역순으로 읽어 문맥 벡터로 인코딩합니다.

    이 문맥 벡터는 딸기잼을 구매했다는 의미가 담긴 벡터 표현이 되고,

    다른 stacked LSTM(디코더)를 초기화하는 데 사용됩니다.

    디코더의 마지막 레이어에서 softmax를 거쳐 나온 첫 번째 출력값을 얻으면 이를 다시 첫 번째 레이어의 입력값으로 사용합니다.

    backpropagation 과정 동안 인코더 LSTM 레이어들의 가중치는 문장들을 더 정확하게 임베딩할 수 있도록 학습되고,

    디코더 LSTM 레이어들의 가중치는 문맥 벡터로부터 문법적으로 올바른 문장들을 생성하도록 학습됩니다.

     

    5. Bidirectional RNNs

    한 가지 생각해볼 점은, 문장의 의존성이 한 방향으로만 작동하지는 않는다는 것입니다.

    단어는 해당 단어 이전과 이후의 단어들에 모두 영향을 받을 수 있습니다.

    그런데, 지금까지 이야기한 Seq2Seq의 설계는 모든 시점에서 해당 단어가 등장하기 전의 단어들만 고려하기 때문에 이러한 양방향성을 반영하지 않습니다.

     

    양방향 RNN(Bidirectional RNN)은 시퀀스를 양방향으로 탐색하고, 결과값을 이어붙임으로써 이 문제를 해소합니다.

    각 RNN 셀에 대해 반대 방향으로 입력값을 갖는 셀을 하나씩 더함으로써 양방향 RNN을 구성할 수 있습니다.

    $t$번째 단어에 대응하는 출력값은 정방향 셀의 출력값과 역방향 셀의 출력값을 이어붙인 $[o_t^{(f)}, o_t^{(b)}]$가 됩니다.

    유사하게, 마지막 hidden state는 $h = [h^{(f)}, h^{(b)}]$가 됩니다.

    ($h^{(f)}$는 정방향 RNN의 마지막 hidden state, $h^{(b)}$는 역방향 RNN의 마지막 hidden state)

     

    그림 3에서 양방향 LSTM의 구조를 확인할 수 있습니다.

    그림3. 한 개의 레이어를 가지는 Bidirectional LSTM encoder 의 구조

     

     

    reference:

    [1] CS224N https://web.stanford.edu/class/cs224n/readings/cs224n-2019-notes06-NMT_seq2seq_attention.pdf

    [2] Sequence to Sequence Learning with Neural Networks, I. Sutskever et al.

     

    댓글

:D