본문 바로가기
딥러닝관련/기초 이론

seq2seq, attention 정리

by 머리올리자 2021. 11. 8.

최근에 transformer 관련된 이야기가 많이 나와 한 번 정리해보고자 한다.

 

Transformer를 알기 위해서는 그 전에 Attention 메커니즘이 무엇인지 알아야 한다.

 

(computer vision 관련 분야가 메인인데 자연어까지 봐야하다니.. 세상에 공부해야 할 것들이 너무 많다)

 


Attention을 보기 전에 sequence-to-sequence(seq2seq)를 봐야 한다.

(seq2seq -> attention -> transformer 이렇게 발전되어 오는 듯 하다)

 


Sequence-to-Sequence

 

번역기에서 대표적으로 사용된다고 함.

 

그림 출처 : https://wikidocs.net/images/page/24996/%EC%8B%9C%ED%80%80%EC%8A%A4%ED%88%AC%EC%8B%9C%ED%80%80%EC%8A%A4.PNG

 

 

seq2seq 모델 기반 번역기가 있다고 해보자.

그 번역기는 I am a student 문장 입력으로부터 프랑스어로 번역한 결과가 나온다.

 

위 기계 번역기(sequence to sequence)의 내부 모습은 어떻게 되는 것인가?

 

그 모습은 아래와 같다.

 

 

그림 출처 : https://wikidocs.net/images/page/24996/seq2seq%EB%AA%A8%EB%8D%B811.PNG

 

위 그림을 보면 크게 encoder와 decoder로 구성되어 있음을 알 수 있다.

 

[Encoder]

입력 문장의 모든 단어들을 순차적으로 입력 받은 뒤에 마지막에 모든 단어 정보들을 압축해서 하나의 vector로 만듦

-> Context vector (보통 많은 수의 dimension으로 구성)

context vector : https://wikidocs.net/images/page/24996/%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8_%EB%B2%A1%ED%84%B0.PNG

[Decoder]

Context vector를 받아 번역된 단어를 한개씩 순차적으로 출력

 

출처 : https://wikidocs.net/images/page/24996/%EC%9D%B8%EC%BD%94%EB%8D%94%EB%94%94%EC%BD%94%EB%8D%94%EB%AA%A8%EB%8D%B8.PNG

Encoder-decoder 세부 구조는 위와 같다.

 

크게 RNN 구조가 두 개 있는 것으로 볼 수 있으며, 보통 LSTM or GRU가 들어간다.

 

[Encoder]

1. 입력 문장은 단어 토큰화를 통해 단어 단위로 쪼개지고 단어 토큰은 각각 RNN 셀의 각 시점의 입력이 된다.

2. Encoder 셀은 모든 단어를 입력 받은 후 Encoder RNN 셀의 마지막 시점의 hidden state를 decoder RNN 셀로 넘겨줌

(context vector)

 

Context vector는 디코더 RNN 셀의 첫번째 hidden state로 사용

 

[Decoder]

1. Decoder는 초기 입력으로 문장의 시작을 의미하는 심볼 <sos>가 입력으로 들어감.

2. <sos>가 입력되면, 다음에 등장할 확률이 높은 단어 예측

3. 예측한 단어가 다음 RNN 셀의 입력으로 들어감.

4. 문장의 끝을 의미하는 심볼인 <eos>가 다음 단어로 예측될 때까지 3번 반복

 

학습 할 때는 decoder의 입력과 출력을 비교해가며 학습 진행.

 

 

출처 : https://wikidocs.net/images/page/24996/%EB%8B%A8%EC%96%B4%ED%86%A0%ED%81%B0%EB%93%A4%EC%9D%B4.PNG

위는 입출력에 쓰이는 단어 토큰들이 있는 부분

 

실제 동작은 텍스트를 vector로 바꾸면서 사용된다. -> embedding vector

(word embedding을 이용해 vector와)

 

위 그림은 embedding 과정을 거치는 embedding layer의 모습을 보여줌

 

그림 출처 : https://wikidocs.net/images/page/24996/%EC%9E%84%EB%B2%A0%EB%94%A9%EB%B2%A1%ED%84%B0.PNG

예를 들어 I, am, a, student의 입력이 들어가면 위와 같이 embedding vector가 형성된다.

 

실제로는 dimension이 4가 아니라 수 백개이상이 있을 수 있다.

 

 

RCNN 셀

 

입력 : t-1의 hidden state, t 시점에서의 입력 벡터

출력 : t에서의 hidden state

 

t 시점에서의 hidden state는 바로 위에 또 다른 hidden state나 output이 존재할 경우 위 층으로 보낸다.

 

필요하면 값을 무시 가능

 

그리고 RNN 셀은 다음 시점에 해당하는 t+1 RNN 셀의 입력으로 현재 t에서의 hidden state를 입력으로 보낸다.

 

현재 시점 t에서의 hidden state : 과거 시점의 동일한 RCNN 셀에서의 모든 hidden state의 값들의 영향을 누적한 것

 

 

Decoder는 마지막 RCNN 셀의 hidden state인 context vector를 첫번째 hidden state 값으로 사용.

 

첫번째 decoder의 RCNN 셀 -> hidden state + 입력 <sos> -> 다음 단어 예측

 

출처 : https://wikidocs.net/images/page/24996/decodernextwordprediction.PNG

위는 decoder가 다음에 등장할 단어를 예측하는 부분.

 

출력 단어로는 다양한 단어들이 있음.

 

seq2seq는 선택될 수 있는 모든 단어들로부터 하나의 단어를 골라서 예측

 

-> t시점에서 RNN 출력 vector가 나오면 softmax로 예측

 


Attention Mechanism(어텐션 메커니즘)

기존의 RNN에 기반한 seq2seq 모델에는 두 가지 문제가 있음

 

1. 하나의 고정된 크기의 벡터에 모든 정보를 압축하려고하여 정보 손실 발생

2. Vanishing Gradient 문제가 존재

 

위는 입력 문장이 길면 번역 품질이 떨어지는 현상으로 나타남.

 

이를 위한 대안 → attention

 

 

[기본 아이디어]

 

Encoder에서 출력 단어를 예측하는 매 시점마다,

 

encoder에서의 전체 입력 문장을 다시 한 번 참고한다는 것

 

[어텐션 함수]

 

출처 : https://wikidocs.net/images/page/22893/%EC%BF%BC%EB%A6%AC.PNG

 

어텐션을 함수로 표현했을 때

 

Attention(Q, K, V) = Attention Value

 

주어진 Query에 대해서 모든 Key와의 유사도를 각각 계산.

 

구해낸 이 유사도를 키와 매핑되어 있는 각각의 값(value)에 반영.

 

그 유사도가 반영된 값(value)를 모두 더해서 리턴

 

이를 어텐션 값(Attention value)

 

Q = Query : t 시점의 decoder 셀에서의 hidden state

K = Keys : 모든 시점의 encoder 셀의 hidden state

V = Values : 모든 시점의 encoder 셀의 hidden state

 

 

[Dot-Product Attention]

출처 : https://wikidocs.net/images/page/22893/dotproductattention1_final.PNG

 

위는 dot-product attention

 

세번째 LSTM 셀에서 출력을 예측할 때, attention mechanism을 사용하는 모습.

(decoder의 첫번째, 두번째 LSTM 셀은 이미 attention mechanism을 통해 예측했다고 가정)

 

출처 : https://wikidocs.net/images/page/22893/dotproductattention1_final.PNG

Decoder의 세번째 LSTM 셀은 출력 단어를 예측하기 위해서,

encoder의 모든 입력 단어들의 정보를 다시 한번 참고하고자 함.

 

주목해야할 점은 encoder의 softmax 함수

출처 : https://wikidocs.net/images/page/22893/dotproductattention1_final.PNG

softmax를 통해 나온 결과값은 I, am, a, student 단어 각각이 출력 단어를 예측할 때 얼마나 도움이 되는지 수치화

 

빨간 직사각형의 크기 : 소프트맥스 함수의 결과값의 크기 -> 클 수록 더 도움이 된다.

 

출처 : https://wikidocs.net/images/page/22893/dotproductattention1_final.PNG

수치화하여 측정되면 이를 하나의 정보를 담아서 decoder로 전송(초록색 삼각형)

 

결곽적으로는, decoder는 출력 단어를 더 정확하게 예측할 확률이 높아진다.

 

[디테일한 attention mechanism]

 

1. Attention score 계산

출처 : https://wikidocs.net/images/page/22893/dotproductattention2_final.PNG

 

출처 : https://wikidocs.net/images/page/22893/dotproductattention2_final.PNG

Encoder의 hidden state (h)

Decoder의 hidden state (s)

 

Decoder의 입력은 

1. 바로 이전 시점인 t-1의 hidden state

2. 이전 시점 t-1에 나온 output 단어

 

어텐션 메커니즘에서는 출력 단어 예측에 또 다른 값을 필요로 함.

 

바로 Attention value

 

t번째 단어를 예측하기 위한 attention value를 a^t라고 정의

 

attention value를 구하기 위해 attention score를 먼저 구해야 함.

 

attention score란

현재 디코더 시점 t에서 단어를 예측하기 위해(목적),

encoder의 모든 hidden state 각각이

decoder의 현 시점의 hidden state s_t와

얼마나 유사한지 판단하는 score 값

 

Dot-product attention에서는 이 score 값을 구하기 위해

 

s^t를 transpose하고 각 hidden state와 dot product 수행.

 

모든 attention score 값은 스칼라임.

 

출처 : https://wikidocs.net/images/page/22893/i%EB%B2%88%EC%A7%B8%EC%96%B4%ED%85%90%EC%85%98%EC%8A%A4%EC%BD%94%EC%96%B4_final.PNG

 

어텐션 스코어 함수
S^t와 인코더의 모든 hidden state의 attention 스코어의 모음값

2. Softmax 함수를 통해 attention distribution을 구한다.

 

출처 : https://wikidocs.net/images/page/22893/dotproductattention3_final.PNG

위에서 구한 attention score의 모음값(e^t)에 대하여 softmax를 적용하여 확률 분포를 얻어냄.

(attention distribution)

 

각각의 값을 attention weight

 

attention weight가 클수록 위 빨간색 직사각형이 큼

 

attention 분포를 a^t라고 할 때 식은 아래와 같이 나타낼 수 있음.

3. 각 encoder의 attention weight와 hidden state를 weighted sum하여 attention value 구함.

 

출처 : https://wikidocs.net/images/page/22893/dotproductattention4_final.PNG

 

모든 information을 하나로 합치는 단계

 

최종 결과값을 얻기 위해

 

각 encoder의 hidden state * attention weight 를 계산

 

후에

 

sum

 

-> weighted sum을 한다고 볼 수 있음.

 

식은 아래와 같음

 

attention value

a_t는 encoder의 context를 포함하고 있다고 하여,

 

context vector라고도 불림.

 

4. Attention value와 decoder t 시점의 hidden state를 concatenate

출처 : https://wikidocs.net/images/page/22893/dotproductattention5_final_final.PNG

 

출처 : https://wikidocs.net/images/page/22893/dotproductattention5_final_final.PNG

v_t를 y^hat 예측 연산의 입력으로 사용하므로써 encoder로부터 얻은 정보를 활용하여

 

y^hat을 좀 더 잘 예측할 수 있게 됨

-> Attention의 핵심

 

5. 출력층 연산의 입력이 되는 s_t를 계산

 

출처 : https://wikidocs.net/images/page/22893/st.PNG

Dot product attention에서는 바로 output layer로 보내기 전에 신경망 연산을 한 번 더 추가했다고 함.

 

weight matrix와 v_t를 곱한 후 tanh 함수를 지나도록하여 새로운 벡터인 s_t를 얻는다.

 

식은 아래와 같다.

 

 

6. s_t를 출력층의 input으로 사용하여 predict vector를 얻는다.

 

참조

https://wikidocs.net/31379

 

1) 트랜스포머(Transformer)

* 이번 챕터는 앞서 설명한 어텐션 메커니즘 챕터에 대한 사전 이해가 필요합니다. 트랜스포머(Transformer)는 2017년 구글이 발표한 논문인

wikidocs.net

https://wikidocs.net/24996

 

1) 시퀀스-투-시퀀스(Sequence-to-Sequence, seq2seq)

참고 : 이번 챕터의 실습은 케라스 함수형 API에 대한 이해가 필요합니다. 8챕터(https://wikidocs.net/38861)를 참고하시기 바랍니다. 시퀀스-투 ...

wikidocs.net

https://wikidocs.net/22893

 

1) 어텐션 메커니즘 (Attention Mechanism)

앞서 배운 seq2seq 모델은 **인코더**에서 입력 시퀀스를 컨텍스트 벡터라는 하나의 고정된 크기의 벡터 표현으로 압축하고, **디코더**는 이 컨텍스트 벡터를 통해서 ...

wikidocs.net