본문 바로가기
Deep Learning/Recurrent Neural Networks

Seq2seq Model (Sequence to Sequence Model)

by YJJo 2020. 4. 20.

개요

이번 포스팅에서는 Sequence to Sequence (Seq2seq) Model에 대해서 알아보겠습니다. Seq2seq 모형은 LSTM(또는 GRU) 기반 모형으로 고정된 길이의 sequence를 입력받아, 입력 sequence에 알맞은 길이의 sequence를 출력해주는 모형으로 2014, Google et. al에 최초 제안되었습니다.

왜?

Deep Neural Networks (DNNs)은 다양한 분야에서 좋은 성과를 거두어 왔습니다. 다만 DNNs은 고정된 차원의 feature와 고정된 차원의 출력에 특화된 방법입니다. 그래서 입력과 출력의 길이가 그때 그때 다른 데이터를 학습하고, 이를 응용하는 문제에는 적합하지 않습니다. 대표적으로 기계 번역 문제를 생각할 수 있습니다. 기계 번역은 빈번하게 입력의 길이도 다르고, 대응하는 출력의 길이도 다릅니다.

예를 들어, 영어를 한국어로 단어 단위로 번역하는 문제를 고려해보겠습니다. "I like an apple.", "Do you want to go outside?"의 문장을 단어 단위로 tokenization하면 전자의 경우 'I', 'like', 'an', 'apple', '.'로 5의 길이를 갖고, 후자의 경우 길이가 7입니다. 번역한 문장은 각각 "나는 사과를 좋아합니다.", "당신은 밖에 나가고 싶습니까?"로 각각 4, 5의 길이를 갖습니다. 

기계 번역 처럼 입력과 출력의 길이가 매번 다른 경우 DNNs으로 문제를 해결하기 어렵습니다. Seq2seq은 DNNs의 한계점을 극복한 end-to-end 학습이 가능한 모형입니다.

Seq2seq Model

Seq2seq은 LSTM(또는 GRU)기반 encoder part와  decoder part로 구성된 모형으로 고정된 차원의 입력을 받아, 입력 값에 대응하는 가변적 길이의 결과 값을 출력해주는 모형입니다. Seq2seq의 핵심은 encoder와 decoder part로 구분된다는 점입니다. Encoder는 입력 sequence의 상태를 추출해주는 역할을 합니다. Decoder는 encoder에서 생성된 상태를 초깃 값으로 이용하여 순차적으로 sequence를 생성하는 역할을 합니다.

Figure 1: Seq2seq

Seq2seq은 일반적인 딥러닝 모형과 다르게 학습 단계와 추정 단계에 차이가 있습니다. 이어서 Encoder와 Decoder의 역할 및 구체적인 내용과 더불어 학습 단계 추정 단계를 자세히 살펴보겠습니다.

Training Phase

Training Phase는 데이터를 전처리 하여 Seq2seq 모형을 학습하는 단계입니다. 먼저 Encoder와 Decoder를 자세히 살펴보고 어떻게 데이터를 전처리해서 모형을 학습시킬지 살펴보겠습니다.

Encoder

Encoder는 입력 sequence를 순차적으로 LSTM(또는 GRU)에 입력받아 sequence의 마지막단에서 상태를 추출합니다. LSTM 기준 cell state와 hidden state 값 두 가지를 추출합니다. GRU의 경우 cell state가 없음으로 hidden state만 추출합니다.

Figure 2: Seq2seq Part of Encoder

"I like an apple." 이라는 영문 문장을 "나는 사과를 좋아합니다."라는 국문 문장으로 번역하는 예제를 생각해보겠습니다. 단어 단위로 Tokenization한 뒤 순차적으로 "I", "like", "an", "apple", "."을 입력받습니다. 특히 "."은 입력 sequence의 종료를 나타내며 이를 별도로 End of Sentence (EOS)로 표기하였습니다. 종료단까지 LSTM을 통과시키고 나면 상태 벡터 $h_{final}, c_{final}$를 얻을 수 있습니다.

EOS에 대해서 첨언하면, 위 예제에서는 "." 를 이용했지만 분석 목적에 맞도록 "?", "!" 등 문장의 끝을 알리는 모든 것을 의미합니다. Seq2seq은 EOS(기계 번역이 아닌경우 sequence의 끝을 알리는 일련의 장치)가 상당히 중요합니다. EOS를 이용하여 Sequence의 끝을 알 수 있고, LSTM(또는 GRU) 특성 중 같은 가중치를 계속 사용한다는 점에서 무한히 확장 가능하기 때문입니다.

Decoder

Decoder는 Encoder에서 추출한 상태를 초기 상태로 받는 LSTM(또는 GRU)으로 순차적으로 결과를 출력해주는 파트입니다.

Figure 3: Seq2seq Part of Decoder

위 그림의 좌측 부터 우측으로 순서대로 살펴 보겠습니다. Encoder에서 추출된 $h_{final}, c_{final}$을 초기 상태로 입력 받습니다. 첫 LSTM에서는 입력으로 EOS를 받습니다. EOS를 받는 이유는 학습 후 모형을 운용할 때 시작 값을 알 수 없기 때문에 학습 단계에 강제로 EOS로 시작하도록 구성하는 것 입니다. 첫 출력으로 "나는"이 얻어졌습니다. 이는 두 번째 LSTM의 입력 값으로 이용되며 EOS에 도달 할 때까지 앞 단의 작업 순차적으로 반복됩니다.

위 그림을 자세히 살펴보면 입력[EOS, 나는, 사과를, 좋아합니다]과 출력[나는, 사과를, 좋아합니다, EOS]에 1시점이 시간차 (1-step offset)가 있도록 모형이 설계되어 있습니다. 1-step offset으로 학습하는 방식을 teacher forcing이라고 부릅니다.

Data Preprocessing

다음과 같이 데이터를 전처리 해줍니다.

  1. 단어 단위로 Tokenization
  2. Encoder, Decoder 문장의 최대 길이 찾기 (예를 들어, "I like an apple."의 길이는 5)
  3. Encoder, Decoder 별로 처리
    • Encoder
      1. 문장의 끝을 EOS 처리
      2. 문장의 최대 길이에 맞추어 뒷단을 EOS 처리
    • Decoder
      1. 문장의 시작에 EOS 추가
      2. 문장의 끝을 EOS 처리
      3. 문장의 최대 길이에 맞추어 뒷단을 EOS 처리
  4. One-Hot Encoding을 통해 문장별 행렬로 변환

Figure 4: Data Preprocessing in Seq2seq

사실 구글에서 제안한 방법을 그대로 구현하기 위해선 문장 행렬 행의 수가 가변적이어야 하지만 학습 단계에서는 위와 같이 구축합니다.

Inference Phase

Inference phase에서는 Learning phase에서 학습된 모형을 활용하여 EOS에 도달할 때 까지 순차적으로 반복하여 sequence를 얻습니다. 다음의 과정을 따릅니다.

  1. Encoder에 입력 sequence를 넣어 상태 벡터를 얻는다
  2. 최종상태를 첫 LSTM에 넣어 첫 번째 출력 값($\hat{y}^{(1)}$)첫 번째 상태 벡터($\tilde{h}_{1},\tilde{c}_{1}$)를 얻는다.
  3. 첫 출력 ($\hat{y}^{(1)}$)을 두 번째 LSTM의 입력으로 넣고, 첫 상태 벡터($\tilde{h}_{1}, \tilde{c}_{1}$)로 초기화하여 두 번째 출력 값($\tilde{y}^{(2)}$)과 두 번째상태 벡터 ($\tilde{c}_{1}$)를 얻는다.
  4. 위 과정을 EOS에 도달할 때 까지 반복한다

위 내용을 학습 단계와 비교하여 도식화하면 다음과 같습니다.

Figure 5: Decoder 작동원리

Learning phase에서는 Label을 알고 있기 때문에 입력 단에 참 값을 넣어 teacher forcing 방식으로 학습합니다. 반면 Inference Phase에서는 참값을 알 수 없기 때문에 직전의 출력 값과 상태 벡터를 다음 LSTM의 입력 및 초기 상태로 이용하여 순차적으로 출력 값을 얻습니다.

Summary & Limitation

이번 포스팅에서는 Seq2seq에 대해서 살펴보았습니다. DNNs의 발전과 더불어 여러 문제를 딥러닝으로 해결할 수 있게 되었지만, 출력 값의 차원이 때마다 다른 경우에 대해선 적용하기 어려웠습니다. 이를 end-to-end 방식으로 해결하고자 2014, Google이 Seq2seq 구조를 제안하였습니다. Seq2seq 모형은 크게 Encoder part와 Decoder part로 구성되어 있고, 각각 상태를 추출하고, 결과 sequence를 출력하기 위해 고안되었습니다.

Seq2seq의 핵심은 결국 encoder part와 decoder part로 나누는 것인데 너무 당연하게도 입력 sequence의 길이가 너무 길어져 버리면 상태 벡터에 충분한 정보를 담기 어려워지는 문제점이 있습니다. 실제로도 입력 sequence의 길이가 긴경우 상대적으로 성능이 안 좋아진다고 알려져 있습니다. 이를 해결하기 위해서 등장한 컨샙이 attention 방식으로 학습하는 것 입니다. 다음 포스팅에서는 attention을 적용한 Seq2seq을 다루도록 하겠습니다. (내용이 꽤 방대해서 새로운 카테고리에서 찾아뵙겠습니다.) 감사합니다 :) bb

References

Sutskever, Ilya, Oriol Vinyals, and Quoc V. Le. "Sequence to sequence learning with neural networks." Advances in neural information processing systems. 2014.

'Deep Learning > Recurrent Neural Networks' 카테고리의 다른 글

RNN Tensorflow + Keras  (10) 2019.12.07
Gated Recurrent Units (GRU)  (8) 2019.08.15
Long Short-Term Memory (LSTM)  (9) 2019.08.15
Recurrent Neural Networks (RNN)  (0) 2019.08.13

댓글