[NLP] Encoder∙Decoder 구조와 Seq2Seq, Seq2Seq with Attention

nkw011·2022년 7월 20일
1
post-thumbnail

1. Seq2Seq

sequence-to-sequence 모델. sequence를 입력받고 sequence를 출력하는 모델이다. (입력 sequence를 source sequence, 정답 sequence를 target sequence라고 한다.)

대표적으로 다음과 같은 분야들이 존재한다.

  • 기계 번역(Machine Translation): 번역하려는 문장을 입력받아 번역된 문장을 출력한다.
  • 챗봇: 질문을 입력받아 답변을 출력한다.
  • 내용 요약(Text Summarization), Speech to Text, Image Captioning, 말의 어투를 변경하는 등 입력된 sequence를 다른 도메인의 sequence로 변경되는 곳에 많이 쓰인다.

아래서 설명하는 내용은 모두 기계 번역에 초점을 맞추어 내용을 작성하였다.

구조

seq2seq를 크게 보면 many-to-many 형태라고 볼 수 있다. 입력된 sequence를 끝까지 읽고 정보를 압축한 뒤 압축된 정보를 바탕으로 출력 sequence를 구성한다. seq2seq에서 입력된 문장을 끝까지 읽고 정보를 압축하는 역할을 하는 모듈을 Encoder라고 한다. 압축된 정보를 바탕으로 출력 sequence를 만드는 역할을 하는 모듈을 Decoder라고 한다. 그리고 압축된 정보를 context vector라고 부른다.

Encoder와 Decoder의 내부를 살펴보면 RNN, LSTM과 같이 sequence를 처리하는 모델이 담겨져있다. (여기서는 LSTM으로 설정하였다.) 주의할 점은 Encoder와 Decoder에 있는 모델이 파라미터를 공유하지 않는다는 것이다. 서로 다른 모델이기 때문에 Encoder는 입력 sequence와 관련된 도메인을 학습하고 Decoder는 출력 sequence와 관련된 도메인을 따로 학습한다. (여기서는 예시로 기계 번역을 사용하였다.)

Encoder는 입력 sequence의 정보를 압축해 context vector를 만드는 역할을 한다. Encoder RNN 모델의 마지막 시점 hidden state vector가 context vector로 사용되며 context vector는 Decoder에 있는 RNN 모델의 첫번째 시점 hidden state vector가 된다.

Decoder는 context vector를 활용해 출력 sequence를 만든다. Decoder의 RNN 모델은 sequence의 시작을 알리는 스페셜 토큰인 를 첫번째 시점의 입력으로 받는다. 토큰과 context 벡터를 바탕으로 첫번째 시점의 출력값을 생성한다.

두번째 시점부터는 어떤 방법을 사용하느냐에 따라 입력값이 달라진다. (hidden state vector는 이전 시점 hidden state vector를 사용한다.)

  • 첫번째 방법: 첫번째 시점의 출력값을 두번째 시점의 입력값으로 사용한다.
    • 첫번째 시점에서 출력값을 정상적으로 만들었다면 정답 sequence의 첫번째 토큰이 나올 것이다.
    • 세번째 시점에서는 두번째 시점의 출력값을 사용하고 네번째 시점에서는 세번째 시점의 출력값을 사용한다. (모델의 예측값을 입력값으로 사용한다.)
    • 학습 속도가 상대적으로 느리지만 실제 환경과 가깝다.
  • 두번째 방법: 정답 sequence의 첫번째 토큰을 두번째 시점의 입력값으로 사용한다.
    • 정답을 알려주면서 하는 방식으로 teacher forcing이라고도 한다.
    • 세번째 시점에서는 정답 sequence의 두번째 토큰이 입력으로 들어오고 네번째 시점에서는 정답 sequence의 세번째 토큰이 입력으로 들어온다.
    • 학습 속도가 빠르지만 실제 환경과 좀 떨어져있다.

첫번째 방법은 출력값이 정답과 달라도 모델의 입력으로 쓰이는 것을 알 수있다.

최종적으로 두 방법 모두 Decoder가 sequence의 끝을 알리는 스페셜 토큰인 를 출력하면 끝난다.

단점

한정된 길이의 벡터(마지막 시점의 hidden state vector)만을 이용해 Encoder의 입력 sequence 정보를 담기 때문에 sequence의 길이가 길수록 시작 시점에 가까운 정보가 유실될 수 있다.

RNN 모델이 지닌 구조적인 한계점인 long-term dependency 문제가 있을 수 있다.

  • LSTM도 long-term depedency 문제를 완벽하게 극복한 것은 아니다.

2. Seq2Seq with Attention

앞서 언급했듯이 seq2seq 구조는 한정된 길이의 벡터를 이용해 입력 sequence의 모든 정보를 담기 때문에 입력 정보의 유실이 일어난다.

seq2seq에 attention을 적용하여 이러한 한계점을 극복한 모델이 seq2seq with attention이다.

Core Idea

Decoder의 매 시점마다 관련이 깊은 입력(source) 부분에 초점을 맞추어 예측을 진행한다.

  • 기계 번역으로 예를 들면 입력과 출력의 여러 단어 중 어떤 단어가 연관이 있는가에 대한 대응관계를 보는 것이라고 할 수 있다.
    • 정답이 되는 단어와 대응 관계에 있는 입력 단어들을 찾은 이후 그 정보를 활용해 예측 성능을 높이는 것이라고 할 수 있다.
  • 입력 sequence 중에서 Decoder의 현재 시점과 가장 관련이 깊은 부분을 찾는다.

Decoder의 매 시점마다 관련이 깊은 입력(source) 부분을 찾아내기 위해 Encoder 모든 시점의 hidden state vector 정보를 활용해 유사도를 계산하는 작업(Attention)이 추가된다.

Attention을 이용해 Output 구하기

Encoder에서 입력 sequence를 모두 처리한 후 Decoder의 첫번째 시점에서 작업을 수행한다고 가정한다.

  1. 먼저 Decoder에서 현재 시점에 생성된 hidden state vector와 Encoder의 모든 hidden state vector들과 내적하여 유사도를 구한다.
    • 이렇게 구하게 된 유사도를 Attention score라고 부른다.

  1. attention score를 softmax 함수를 사용해 합이 1인 확률로 바꾼다.
    • 이렇게 만들어진 확률 값들을 Attention distribution이라고 한다.

  1. 만들어진 확률값(attention distribution)을 가중치로 사용하여 encoder의 hidden state vector들의 가중합을 구한다.
    • 이렇게 구한 가중합 벡터를 Attention output이라고 하겠다. 만들어진 확률값의 합이 1이므로 가중평균으로 볼 수도 있다.

  1. Attention output과 Decoder의 현재 시점 hidden state vector이 concatenation 한다.
  2. 이 벡터를 output layer에 통과시켜 현재 시점의 예측값을 구한다.

1~5번 과정을 다음 시점에서도 계속 반복한다.

주의할 점

Decoder에서 매 시점마다 hidden state vector를 생성해야하기 때문에 context vector가 Decoder 첫번째 시점의 hidden state vector로 그대로 활용된다.

  • Encoder 마지막 시점의 hidden state vector가 context vector로 그대로 활용된다.

Decoder에서 예측값을 구하는 output layer 이전에 attention 과정이 추가된 구조라고 보면 된다.

Encoder의 파란색 화살표는 모든 시점의 hidden state vector를 가리키고 검은색 화살표는 마지막 시점의 hidden state vector를 가리킨다.

장점

  • NMT(Neural Machine Translation)의 성능을 올린다.
    • Decoder가 입력(source)의 특정 부분에 집중해 번역하는 효과가 있기 때문에 번역 성능을 높일 수 있다.
  • bottleneck problem을 해결한다.
    • 기존 seq2seq모델의 경우 모든 정보가 마지막 hidden-state vector에 집중되기 때문에 정보의 손실이 발생하지만,
    • attention의 경우 decoder가 입력(source)의 모든 부분을 직접적으로 볼 수 있기 때문에 정보의 손실이 거의 발생하지 않는다.
  • vanishing gradient 현상 해결한다.
    • RNN 계열 모델의 경우 문장의 길이가 길면 역전파할때 전달되는 경로가 길어지기때문에 vanishing gradinent 현상이 발생하지만,
    • Attention을 이용한 경우 output에서 직접적으로 encoder의 각 hidden-state vector를 바라보기 때문에 encoder까지 가는 경로의 길이가 줄어 vanishing gradient 문제를 해소한다.
  • Attention은 해석 가능성(interpretability)을 제공한다
    • Attention distribution을 이용하면 decoder가 매 시점마다 어떤 부분에 집중하는 지 알 수 있고 이는 decoder에서 언제 어떤 단어를 학습하는 지를 보여준다.

3. 실습

profile
Deep Dive into Development (GitHub Blog: https://nkw011.github.io/)

2개의 댓글

comment-user-thumbnail
2023년 4월 6일

안녕하세요! 포스팅 잘 보았습니다!! 혹시 일부 그림을 발표자료에 사용해도 될까요? 교내 수업에 사용할 예정입니다. 출처는 꼭 남기도록 하겠습니다!

1개의 답글