[딥러닝 스터디] Attention을 활용한 기계번역

[딥러닝 스터디] Attention을 활용한 기계번역

다음의 책을 공부하며 정리한 내용입니다.

시퀀스-투-시퀀스(seq2seq)

: 입력된 시퀀스로부터 다른 도메인의 시퀀스를 출력하는 모델.

이는 다음과 같은 분야에서 사용된다.

  • 챗봇: 입력시퀀스와 출력시퀀스를 각각 질문/대답으로 구성하면 챗봇을 만들 수 있다.
  • 기계번역: 입력시퀀스와 출력시퀀스를 입력/번역문장으로 구성하면 번역기를 만들 수 있다.
  • Text Summerization, Speech to Text 등에 사용될 수 있다.

seq2seq 모델은 기본적으로 위의 구조를 띄고 있다.

  • 인코더와 디코더는 두개의 RNN 아키텍처이다. 입력 문장을 처리하는 RNN셀을 인코더, 출력 문장(번역된 문장)을 처리하는 RNN셀을 디코더라고 하는 것.
  • 중간의 컨텍스트 벡터는 인코더 마지막 시점의 히든 스테이트의 크기이다. 즉, 이전의 내용이 함축된 하나의 벡터이다.

이때 디코더에서 단순히 매 단계마다 가장 가능성이 높은 단어 하나를 선택하는 방식은 생각보다 효율적이지 않다. 이때 적용하는 방법이 Beam search.

Beam search : 매 스텝마다 가장 ㄴㄴ 높은 n개의 단어를 선택하여, 이 N개의 단어 각각에 대해 다음 스텝에서 등장할 수 있는 모든 단어들의 확률을 예측한다. 이러한 방식으로 매 스텝마다 n개의 후보군을 유지하여 최적의 시퀀스 후보를 뽑아낸다.


Attention model

  • seq2seq 모델은 기본적으로 인코더 -> [컨텍스트 벡터] -> 디코더 의 구조를 갖는다.

  • 이러한 모델의 문제는 아래와 같다

    • 컨텍스트 벡터는 결국 하나의 벡터에 불과하다. 인코더의 모든 정보를 하나의 고정된 크기의 벡터에 압축하다 보면 필연적으로 정보의 손실이 발생하게 된다.
    • RNN의 고질적인 Vanishing gradient 문제가 발생한다.

    : 이러한 문제는 결과적으로 입력 시퀀스가 길어질수록 번역의 품질이 저하되는 문제를 야기한다.

Attention Overview

어텐션 모델의 기본 아이디어는 다음과 같다.

디코더의 매 time step마다 인코더에서의 전체 입력문장을 다시 한번 참고한다.

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

Dot product attention

어텐션은 다양한 종류가 있다. 그 중 가장 기본적인 닷 프로덕트 어텐션의 구조를 살펴보자.

먼저 기본적인 용어 정의, seq2seq모델과 어텐션 모델의 차이점을 알아보자.

  • 1, 2, 3… n : 인코더의 시점
  • h1, h2, h3… hn : 각 시점에서의 인코더의 은닉 상태(hidden state)
  • t : 디코더의 현재시점
  • st : 현재 시점에서의 디코더의 은닉 상태

이전에 배웠던 seq2seq에서 디코더는 두개의 값(이전시점의 은닉상태, 이전시점의 출력)을 통해 현재시점의 은닉상태를 계산했다. 이때 어텐션 모델에서는 계산을 위해 필요한 값이 하나 더 추가된다. 바로 t시점의 어텐션 값 at이다.

따라서 어텐션 모델은 (seq2seq + 어텐션 값 계산) 인 모델이다. 즉, 어텐션 모델에서의 핵심은 이 어텐션 값을 어떻게 구하는가이며, 이 과정에서 어텐션 스코어값을 구하는 방법에 따라 닷 프로덕트 어텐션, 루옹 어텐션, 바다나우 어텐션 등으로 종류가 나뉘게 된다.

또한 모든 어텐션 값 at는(“값”이라는 명칭에서 예상할 수 있듯) 스칼라 값이다.

Step 1. 어텐션 스코어를 구한다.

어텐션 스코어는 다음을 의미한다.

Attention score : 인코더의 각 은닉상태 h1 - hn이 현재 시점의 디코더 은닉상태 st얼마나 유사한지의 정도

닷 프로덕트 어텐션에서는 이 스코어 값을 구하기 위해 st와 hi(i : 1~n)를 닷 프로덕트 한다. 이때 둘다 열벡터이므로 디코더의 은닉상태 st값을 전치하여 내적한다.

따라서 dot product attention의 attention score 함수 수식은 다음과 같다.

score(st, hi) = stT * hi

따라서 디코더의 현재 시점 t에 대한 은닉상태 st와 인코더의 모든 시점에 대한 은닉상태의 어텐션 스코어의 모음(et)은 아래와 같다.

et = [stT * h1, …, stT * hN]

Step 2. Softmax를 통해 Attention Distribution(어텐션 분포)를 구한다.

구해낸 모든 어텐션 스코어의 모음, et에 softmax를 적용해 확률 분포를 얻어낸다.

이를 통해 얻어낸 분포를 Attention Distribution(어텐션 분포)라 하며, 각각의 값을 Attention Weight(어텐션 가중치)라고 한다.

어텐션 분포와 어텐션 값디코더의 현재시점 t에 대해 정의된다.

Attention Distribution : 어텐션 스코어의 모음에 softmax를 적용해 얻어낸 확률분포. 어텐션 가중치의 모음값

Attention Weight : 어텐션 분포의 각각의 값

따라서 어텐션 분포를 αt의 식은 다음과 같다.

αt = softmax(et)

Step 3. Attention Weight과 인코더 은닉상태를 가중합하여 Attention Value를 구한다.

구해낸 Attention Distribution의 각 Attention Weight들을 해당 시점의 인코더 은닉상태(h1 ~ hN)가중합(Weighted sum) 한다.

결과로 나오는 벡터 a는 최종 어텐션 값, 즉 Attention Value가 되며 이는 인코더의 문맥을 내포하고 있다는 의미에서 Context Vector라고 부르기도 한다.

a = ∑αti * hi (i : 1~N, ati : i번째 어텐션 분포의 값)

Step 4. 어텐션 값과 현재 상태 대코더의 은닉상태 st를 연결한다(Concatenation).

최종적으로 구해낸 어텐션 값(컨텍스트 벡터) a를 현재 시점의 디코더 은닉상태 st와 결합한다. 이때 둘을 연결해 하나의 벡터로 만드는(concatenation) 작업을 수행한다.

해당 결합 작업을 통해 산출된 최종 벡터 vt는 t시점의 디코더 예측값 y_hat를 도출하기 위한 연산의 입력값으로 사용된다.


Bahdanau Attention(바다나우 어텐션)

: 위에서 어텐션의 종류는 step 1의 어텐션 스코어를 구하는 방법에 따라 달라진다고 했다.

닷 프로덕트 어텐션은 인코더의 각 은닉상태 h1 ~ hN과 현재시점 디코더 은닉상태 st의 유사도인 어텐션 스코어를 내적으로 구하였기 때문에 닷 프로덕트 어텐션이라는 이름이 붙었다.

이때,

  • 현재시점 디코더의 은닉상태 : query

  • 이전 인코더의 모든 은닉상태 : key(=value)

라고 한다면 닷 프로덕트 어텐션의 스코어 함수는 아래와 같을 것이다.

score(query, key) = queryT * key

이때 바다나우 어텐션은 아래와 같은 스코어 함수를 사용한다.

score(query, key) = vT * tanh(W1 * key + W2 * query)

: vT는 transposed weight vector

댓글