RNN Seq2Seq에서 Attention까지

개굴이·약 17시간 전

멋쟁이 사자처럼 NLP

목록 보기
14/15

RNN Seq2Seq에서 Attention까지

번역이나 요약처럼 문장을 입력받아 새로운 문장을 만드는 모델은 어떻게 동작할까? RNN 기반 Seq2Seq와 여기에 Attention이 필요한 이유를 정리했다.

Seq2Seq란?

Seq2Seq는 입력 시퀀스를 출력 시퀀스로 변환하는 구조다. 시퀀스는 문장의 토큰처럼 순서대로 나열된 데이터를 뜻한다.

  • 번역: 한국어 문장 → 영어 문장
  • 요약: 긴 문서 → 짧은 요약
  • 질의응답: 질문과 관련 정보 → 답변

입력을 읽는 인코더와 출력을 만드는 디코더로 나뉘며, 입력과 출력의 길이가 달라도 된다.

RNN 기반 Seq2Seq

RNN은 현재 입력과 이전 은닉 상태를 이용해 새로운 은닉 상태를 만든다.

ht=f(xt,ht−1)h_t=f(x_t,h_{t-1})

인코더는 문장을 순서대로 읽고, 기본 구조에서는 마지막 은닉 상태를 Context 벡터로 전달한다.

c=hTc=h_T

디코더는 이 정보로 초기 상태를 설정한 뒤, 앞서 생성한 토큰을 참고해 다음 토큰을 하나씩 예측한다.

시작 → I → love → an → apple → 종료

학습할 때는 예측한 이전 토큰 대신 정답의 이전 토큰을 입력하기도 한다. 이를 Teacher Forcing이라고 한다.

참고로 Seq2Seq 자체가 RNN을 뜻하는 것은 아니다. 인코더와 디코더를 Transformer로 구성할 수도 있다.

긴 문장에서는 무엇이 문제일까?

RNN은 학습 신호가 여러 시점을 거치면서 작아지는 기울기 소실이 발생할 수 있다. 이 때문에 멀리 떨어진 정보 사이의 관계, 즉 장기 의존성을 학습하기 어려워진다.

LSTM과 GRU는 이 문제를 완화한다. 하지만 기본 Seq2Seq에는 다른 한계도 있다.

긴 입력 전체를 하나의 고정 크기 Context 벡터에 담아야 한다는 점이다.

문장이 길수록 세부 정보를 충분히 담기 어려워진다. Attention은 디코더가 인코더의 각 위치를 직접 참고하도록 해 이 정보 병목을 완화한다.

Attention의 핵심

Attention은 출력할 때마다 필요한 입력 정보에 가중치를 주고, 그 정보를 섞어 Context를 만든다.

예를 들어 나는 사과를 좋아해를 번역한다면, love를 생성할 때는 ‘좋아해’를, apple을 생성할 때는 ‘사과를’을 더 많이 참고할 수 있다.

이 과정을 세 가지 역할로 나누면 다음과 같다.

  • Query(Q): 현재 어떤 정보가 필요한가?
  • Key(K): 어떤 위치가 관련 있는가?
  • Value(V): 그 위치에서 가져올 정보는 무엇인가?

RNN Seq2Seq에서는 디코더 상태가 Q 역할을 하고, 인코더의 각 위치 상태가 K와 V 역할을 할 수 있다.

Attention 계산 과정

먼저 Q와 각 K의 관련성 점수를 구한다.

et,i=score⁡(qt,ki)e_{t,i}=\operatorname{score}(q_t,k_i)

그다음 softmax로 점수를 가중치로 바꾼다.

αt,i=exp⁡(et,i)∑jexp⁡(et,j)\alpha_{t,i}=\frac{\exp(e_{t,i})}{\sum_j\exp(e_{t,j})}

Softmax는 큰 점수에 더 큰 비중을 주면서, 전체 합이 1이 되도록 만드는 함수다.

마지막으로 이 가중치로 V를 더한다.

ct=∑iαt,ivic_t=\sum_i\alpha_{t,i}v_i

예를 들어 ‘나는’, ‘사과를’, ‘좋아해’의 가중치가 각각 0.1, 0.2, 0.7이라면 다음과 같다.

ct=0.1V1+0.2V2+0.7V3c_t=0.1V_1+0.2V_2+0.7V_3

‘좋아해’의 정보가 가장 많이 반영된 Context가 만들어진다. 디코더는 이 Context와 자신의 상태를 함께 사용해 다음 토큰을 예측한다.

여기서 정답 love를 미리 알고 정보를 찾는 것은 아니다. 이전까지의 정보를 반영한 디코더 상태로 관련성을 계산하고, 그 결과를 이용해 love를 예측하는 것이다.

Transformer의 Attention 공식

Transformer에서 많이 사용하는 Scaled Dot-Product Attention은 다음과 같다.

Attention⁡(Q,K,V)=softmax⁡(QK⊤dk)V\operatorname{Attention}(Q,K,V) = \operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_k}}\right)V
  1. Q와 K의 내적으로 관련성 점수를 계산한다.
  2. Key 벡터 차원의 제곱근으로 나눠 점수 규모를 조절한다.
  3. Softmax로 가중치를 구한다.
  4. 그 가중치로 V를 가중합한다.

이것은 Attention의 한 종류이며, 모든 RNN Attention이 이 공식을 쓰는 것은 아니다.

결국 기억할 것은 Q와 K로 참고할 비중을 정하고, 그 비중으로 V를 섞는다는 흐름이다. RNN Seq2Seq에 이 과정을 추가하면, 디코더는 하나의 고정된 요약에만 의존하지 않고 출력 단계마다 필요한 입력 정보를 참고할 수 있다.

0개의 댓글