최근에 transformer 관련된 이야기가 많이 나와 한 번 정리해보고자 한다.
Transformer를 알기 위해서는 그 전에 Attention 메커니즘이 무엇인지 알아야 한다.
(computer vision 관련 분야가 메인인데 자연어까지 봐야하다니.. 세상에 공부해야 할 것들이 너무 많다)
Attention을 보기 전에 sequence-to-sequence(seq2seq)를 봐야 한다.
(seq2seq -> attention -> transformer 이렇게 발전되어 오는 듯 하다)
Sequence-to-Sequence
번역기에서 대표적으로 사용된다고 함.
seq2seq 모델 기반 번역기가 있다고 해보자.
그 번역기는 I am a student 문장 입력으로부터 프랑스어로 번역한 결과가 나온다.
위 기계 번역기(sequence to sequence)의 내부 모습은 어떻게 되는 것인가?
그 모습은 아래와 같다.
위 그림을 보면 크게 encoder와 decoder로 구성되어 있음을 알 수 있다.
[Encoder]
입력 문장의 모든 단어들을 순차적으로 입력 받은 뒤에 마지막에 모든 단어 정보들을 압축해서 하나의 vector로 만듦
-> Context vector (보통 많은 수의 dimension으로 구성)
[Decoder]
Context vector를 받아 번역된 단어를 한개씩 순차적으로 출력
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의 입력과 출력을 비교해가며 학습 진행.
위는 입출력에 쓰이는 단어 토큰들이 있는 부분
실제 동작은 텍스트를 vector로 바꾸면서 사용된다. -> embedding vector
(word embedding을 이용해 vector와)
위 그림은 embedding 과정을 거치는 embedding layer의 모습을 보여줌
예를 들어 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> -> 다음 단어 예측
위는 decoder가 다음에 등장할 단어를 예측하는 부분.
출력 단어로는 다양한 단어들이 있음.
seq2seq는 선택될 수 있는 모든 단어들로부터 하나의 단어를 골라서 예측
-> t시점에서 RNN 출력 vector가 나오면 softmax로 예측
Attention Mechanism(어텐션 메커니즘)
기존의 RNN에 기반한 seq2seq 모델에는 두 가지 문제가 있음
1. 하나의 고정된 크기의 벡터에 모든 정보를 압축하려고하여 정보 손실 발생
2. Vanishing Gradient 문제가 존재
위는 입력 문장이 길면 번역 품질이 떨어지는 현상으로 나타남.
이를 위한 대안 → attention
[기본 아이디어]
Encoder에서 출력 단어를 예측하는 매 시점마다,
encoder에서의 전체 입력 문장을 다시 한 번 참고한다는 것
[어텐션 함수]
어텐션을 함수로 표현했을 때
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]
위는 dot-product attention
세번째 LSTM 셀에서 출력을 예측할 때, attention mechanism을 사용하는 모습.
(decoder의 첫번째, 두번째 LSTM 셀은 이미 attention mechanism을 통해 예측했다고 가정)
Decoder의 세번째 LSTM 셀은 출력 단어를 예측하기 위해서,
encoder의 모든 입력 단어들의 정보를 다시 한번 참고하고자 함.
주목해야할 점은 encoder의 softmax 함수
softmax를 통해 나온 결과값은 I, am, a, student 단어 각각이 출력 단어를 예측할 때 얼마나 도움이 되는지 수치화
빨간 직사각형의 크기 : 소프트맥스 함수의 결과값의 크기 -> 클 수록 더 도움이 된다.
수치화하여 측정되면 이를 하나의 정보를 담아서 decoder로 전송(초록색 삼각형)
결곽적으로는, decoder는 출력 단어를 더 정확하게 예측할 확률이 높아진다.
[디테일한 attention mechanism]
1. Attention score 계산
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 값은 스칼라임.
2. Softmax 함수를 통해 attention distribution을 구한다.
위에서 구한 attention score의 모음값(e^t)에 대하여 softmax를 적용하여 확률 분포를 얻어냄.
(attention distribution)
각각의 값을 attention weight
attention weight가 클수록 위 빨간색 직사각형이 큼
attention 분포를 a^t라고 할 때 식은 아래와 같이 나타낼 수 있음.
3. 각 encoder의 attention weight와 hidden state를 weighted sum하여 attention value 구함.
모든 information을 하나로 합치는 단계
최종 결과값을 얻기 위해
각 encoder의 hidden state * attention weight 를 계산
후에
sum
-> weighted sum을 한다고 볼 수 있음.
식은 아래와 같음
a_t는 encoder의 context를 포함하고 있다고 하여,
context vector라고도 불림.
4. Attention value와 decoder t 시점의 hidden state를 concatenate
v_t를 y^hat 예측 연산의 입력으로 사용하므로써 encoder로부터 얻은 정보를 활용하여
y^hat을 좀 더 잘 예측할 수 있게 됨
-> Attention의 핵심
5. 출력층 연산의 입력이 되는 s_t를 계산
Dot product attention에서는 바로 output layer로 보내기 전에 신경망 연산을 한 번 더 추가했다고 함.
weight matrix와 v_t를 곱한 후 tanh 함수를 지나도록하여 새로운 벡터인 s_t를 얻는다.
식은 아래와 같다.
6. s_t를 출력층의 input으로 사용하여 predict vector를 얻는다.
참조
'딥러닝관련 > 기초 이론' 카테고리의 다른 글
Vision Transformer (ViT) 정리 : An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale (0) | 2021.11.12 |
---|---|
Transformer 정리 (0) | 2021.11.09 |
선형(linear) vs 비선형(non-linear) (4) | 2021.11.05 |
Squeeze-and-Excitation Networks(SENET) (0) | 2021.10.19 |
신경망 정리 (학습 관련 기술들 - optimizer) (0) | 2021.08.16 |