4주차 Transformer 정리

kimkihoon·2022년 2월 11일
0

부스트캠프 AI

목록 보기
12/49

Seq2Seq & Attention

Seq2Seq(Sequence-to-Sequence)는 말 그대로 어떤 연속된 데이터들을 다른 Sequence로 Mapping 하는 알고리즘이다. Seq2Seq는 크게 정보를 압축하는 Encoder 부분과 이를 통해 새로운 Data를 생성하는 Decoder 부분으로 나눠져 있다.

인코더를 자세히 보면 입력 문장은 단어 토큰화를 통해 단어 단위로 쪼개지고 단어 토큰들은 각각 RNN셀의 각 시점의 입력이 된다. 인코더 RNN 셀은 모든 단어를 입력 받은 뒤에 인코더 RNN 셀의 마지막 시점의 은닉 상태를 디코터 RNN 셀로 넘겨준다. 디코더는 RNN language model이다. 초기 입력으로 문장의 시작을 의미하는 sos가 들어가고 다음에 등장할 확률이 높은 단어를 예측한다. 그리고 이 예측값을 다음 시점의 RNN 셀의 입력으로 입력한다. 이런 식으로 반복하여 문장의 끝을 의미하는 eos가 다음 단어로 예측될 때까지 반복이 된다.
LSTM의 Encoder에서 Decoder로 들어가는 과정에서, 전달되는 정보에서 소실되는 시간 정보들이 생기게 되는데 이를 해결하기 위해 나온 개념이 Attention이다.
Attention은 Decoder에서 출력 단어를 예측하는 매 시점마다 Encoder에서의 전체 입력 문장을 참고하는 것이다. 해당 시점에 예측해야할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중한다고 해서 attention이라고 한다.


Attention을 함수로 표현하면 다음과 같이 표현할 수 있다.

Attention(Q,K,V) = Attention Value

Attention 함수는 주어진 Query에 대해서 모든 Key와의 유사도를 각각 구하고 이렇게 구해낸 유사도를 Key와 Mapping 되어 있는 각각의 Value에 반영해준다. 그리고 유사도가 반영된 Value를 모두 더해서 리턴한다. 이 리턴된 값을 Attention Value라고 한다.

Query : t 시점의 디코더 셀에서의 은닉 상태
Keys : 모든 시점의 인코더 셀의 은닉 상태들
Values : 모든 시점의 인코더 셀의 은닉 상태들

요약하면 Query * Key = attention score (높을수록 연관성 높고 낮을수록 연관성 낮다)
attention score를 key의 차원수로 나누고 softmax를 취해준다.
softmax 결과값이 key값에 해당하는 단어가 현재 단어에 어느정도의 연관성이 있는지를 나타낸다.
문장 속에서 지닌 word의 값은 softmax값과 value 값을 곱하여 다 더한다.
-> 하나의 word값이 아니라 문장에서 연관성이 반영된 값이기 때문에 context가 반영이 된다.


위 그림은 디코더의 세번째 LSTM 셀에서 출력 단어를 예측할 때 Attention 매커니즘을 사용하는 모습이다. 디코더의 세번째 LSTM 셀은 출력단어를 예측하기 위해서 인코더의 모든 입력 단어들의 정보를 참고하고자 한다. 이 때 인코더의 소프트맥스 함수를 통해 나온 결과값이 I,am,a,student 단어 각각이 출력 단어를 예측할 때 얼마나 도움이 되는지를 수치화한 값이고 빨간 직사각형으로 표현했다.

Attention Score


h는 인코더의 은닉상태를 s는 디코더의 은닉상태를 나타낸다. t시점에서 출력 단어를 예측하기 위해서 디코더는 t-1의 은닉 상태와 t-1에 나온 출력 단어이다. 여기에 Attention 매커니즘에서는 Attention Value라는 값이 하나 더 필요하게 된다. Attention Value를 구하기 위해서는 Attention Score를 구해야 한다. Attention Score는 현재 디코더의 시점 t에서 단어를 예측하기 위해 인코더의 모든 은닉 상태 각각이 디코더의 현 시점의 은닉 상태와 얼마나 유사한지를 판단하는 값이다.

Transformer

Encoder

RNN, LSTM의 약점은 단어를 순차적으로 입력받아서 계산하기 때문에 병렬처리가 어렵다는 점이다. 그러나 이렇게 순차적으로 입력받는 것이 input 의 위치정보를 반영할 수 있게 해 주었다. Transformer에서는 순차적으로 넣는대신 Sequence를 한 번에 넣어서 병렬처리가 가능하면서 Attention등의 구조를 통해 어떤 부분이 중요한지 전달해서 위치 정보를 반영할 수 있게 되었다. 전체적인 구조는 다음과 같다.

Embedding

Embedding은 data를 임의의 N-dimension data로 만들어주는 단계이다. 본격적인 Transformer는 Positional Encoding으로 시작한다. 데이터를 순차적으로 넣어주지 않기 때문에 데이터의 위치 정보를 전달해주는 방식을 Positional Encoding으로 대체한다. Positional Encoding은 Sequence 내에서 해당 정보의 위치정보Embedding된 데이터를 사인함수와 코사인 함수의 형태로 만들어서 다음 Layer의 input으로 전달한다. 이렇게 정리된 Input Data들은 Encoder로 들어가게 된다.

Multi-head Self Attention

Attention이 Encoder의 hidden state와 Decoder의 hidden state를 연산해서 Attention Score값들을 계산했다면 Self-Attention은 Encoder로 들어간 벡터와 Encoder로 들어간 모든 벡터를 연산해서 Attention Score값을 구한다.

Self Attention은 본질적으로 Query, Key, Value가 동일한 경우를 말한다. 마지막 Attention의 경우에는 Query가 디코더의 벡터인 반면 Key와 Value가 인코더의 벡터이므로 Self Attention이 아니다. 벡터의 값이 같은 것은 아니고 출처가 같다는 의미이다.
Self Attention에서의 Q,K,V는 다음과 같다.

Q: 입력 문장의 모든 단어 벡터들
K : 입력 문장의 모든 단어 벡터들
V : 입력 문장의 모든 단어 벡터들


Self Attention에서의 Q,K,V는 각 단어 벡터들로부터 Q 벡터, K 벡터, V 벡터를 얻는 작업을 거친다. 각 단어 벡터들은 d_feat // num_heads 의 차원을 가진다. 그리고 num_heads 개의 병렬 Attention을 수행을 한다.
병렬 Attention을 모두 수행하면 모든 Attention Head들을 concat 해준다. 여기에다가 또 다른 가중치 행렬 W를 곱해서 나온 결과 행렬이 최종 결과물이다. 앞서 설명한 것을 구조화하여 나타내면 다음과 같다.

Add & Normalization

Residual Connection과 layer Normalization이다.

Residual Connection


ResNet과 동일한 구조로 연산을 한 부분과 안 하는 부분이 합쳐지도록 만든 것이다. 이렇게 함으로써 기울기 소실 문제를 해결할 수 있다.

Layer Normalization

텐서의 마지막 차원에 대한 평균과 분산을 구해서 어떤 수식을 통해 값을 정규화하여 학습을 돕는다.

Position-wise FFNN


쉽게 말해 Fully Connected Layer이다. 개별 단어마다 적용되기 때문에 position-wise이다. network는 두 번의 linear transformation과 ReLU 활성화 함수로 이루어져 있다.

Decoder

Decoder 역시 Encoder 처럼 Positional Encoding과 Multi-head Self Attention을 한다는 점이 비슷하지만 크게 2가지의 차이점이 있다.
1. Multi-head Self Attention에 Masked가 들어간다는 점이다. Decoder는 현재까지 들어온 데이터보다 미래의 데이터를 보면서 학습하면 안되기 때문에 미래에 해당하는 Attention Score들에는 매우 적은 음수값을 넣어서 이 부분을 Masking한다.
2. Attention을 진행할 때 Self-Attention이 아니라 일반적인 Attention을 사용하여 Output을 추측한다.

0개의 댓글