일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 부스트코스
- 정렬
- greedy
- 벡엔드
- 네이버 부스트캠프 ai tech
- dbms
- Prim's Algorithm
- 순열 알고리즘
- jsp
- Kruskal's Algorithm
- 브라우저
- mst
- 크루스칼 알고리즘
- 백준
- DP
- 웹서버
- SERVLET
- 그리디
- 프로그래머스
- 소수
- request
- 정렬 알고리즘
- mysql
- 프림 알고리즘
- 해시
- BJ
- 다이나믹 프로그래밍
- 웹프로그래밍
- 웹 프로그래밍
- programmers
- Today
- Total
끵뀐꿩긘의 여러가지
Transformer 완전 정복 본문
seq2seq
seq2seq는 "Learning Phrase Representations using RNN Encoder-Decoder"에서 제안된 transformer 이전에 번역기에 대표적으로 사용되는 모델이다.
내부구조는 번역할 입력 데이터를 encoding하는 Encoder와 encoding된 데이터를 decoding하여 번역된 출력 데이터를 생성하는 Decoder로 이루어져있다.
길이가 고정되지 않은 자연어를 입력으로 받고 번역된 자연어를 출력해야하기 때문에 Encoder와 Decoder의 길이는 가변적이다.
Encoder
위의 그림처럼 Encoder는 RNN(LSTM,GRU)를 이용하여 데이터를 h라는 hidden state Vector로 변환한다.
Encoder 마지막 시점에 출력하는 은닉상태를 context vector라고 하며, 입력으로 주어진 문장의 특성을 고정 길이 벡터로 만들어 놓은 것이다.
Decoder
decoder는 RNN(LSTM,GRU)로 이루어진 언어 생성 모델이고, encoder로부터 context vector를 넘겨받는다.
decoder는 첫 입력으로 언제나 <s>(<sos>,<bos>, 문장의 시작점을 나타냄)를 받고 넘겨받은 context vector와 입력을 바탕으로 새로운 hidden state를 계산하고 affine과 softmax 계층을 거쳐서 입력값 뒤에 등장할 확률이 높은 단어를 예측한다.
예측된 단어가 다시 다음 RNN(LSTM,GRU)의 입력값으로 들어가며, 이는 출력값으로 </s>(<eos>,<end>, 문장의 끝점을 나타냄)가 나올때까지 반복한다.
seq2seq 학습
seq2seq는 기본적으로 각 time-step 별로 가장 확률이 높은 단어를 선택하는 분류 문제이므로, cross entropy와 비슷한 negative log likelihood를 log softmax layer와 함께 사용한다.
각 출력값의 negative log likelihood를 합쳐서 평균을 내어 BPTT(Backpropagation Through Time)로 gradient를 역전파 해준다.
Seq2Seq with Attention
seq2seq은 전체 문장을 단일 벡터로 처리하기 때문에 문장의 앞부분의 정보가 희석되고 병목현상이 일어나는 문제점이 발생한다.
특히 입력 시퀸스가 길어질 경우에는 long term dependencies 문제가 발생하여 모델의 성능이 하락한다.
이러한 문제를 해결하기 위해서 attention mechanism이 제시되었다.
Attention
인간의 시각적 집중(visual attention)현상을 구현하기 위한 신경망적 기법
보고 있는 지점은 take more attention하여 고화질을 유지하고, 보고 있는 지점에서 멀리 떨어진 부분은 take less attention하여 저화질로 유지한다
attention은 가중치와 달리 전체 또는 특정 영역의 입력값을 반영하여 그 중에 어떤 부분에 집중해야 하는지를 나타내는 것을 목표로 한다.
이를 NLP에 적용하면 decoder에서 출력단어를 예측하는 매 시점마다, 예측해야할 단어와 연관이 있는 입력 단어 부분을 좀 더 집중해서 encoder에서의 전체 입력 문장을 참고하게 된다.
Attention을 사용해서 seq2seq 학습하기
1. seq2seq with attention의 decoder에서 출력단어를 예측할 때, decoder의 hidden state값인 $s_{i-1}$을 Query로 하여
encoder의 모든 hidden state값들의 집합인 $h_j$ key에 질의하여 attenstion score를 구한다.
2. energy는 dot-product attention에서 Query와 key의 행렬곱이고 energy들에 softmax함수를 씌운것인 attention score(attention distribution)이다.
3.구해진 attention score를 encoder의 모든 hidden state값들의 집합인$h_j$ vlaue와 가중합하여 attention value를 구한다.
4.구해진 attention value는 decoder의 t 시점의 hidden state와 concat되고 학습가능한 가중치인 $W_c$와 합성곱된 $s_{t}^{'}가 tanh함수를 지나게되고, 그것의 출력값이 decoder의 입력으로 사용된다.
*다양한 종류의 attention score함수가 있다.(dot, sclaed dot, concat 등)
Teacher Forcing
teacher forcing은 t시점의 decoder가 값을 잘못 예측했더라도 t+1 시점의 디코더의 입력에 ground truth를 넣어주는 것을 의미한다. 이는 NLP 특성상 이전 출력값이 틀리면 뒤의 출력값도 틀릴 가능성이 매우 높아져 학습이 어려워지는 현상을 완화시키기 위함이다.
위의 그림처럼 "저녁은" 출력이 잘못 예측되었더라도 ground truth인 "그동안"을 넣어 틀린 시점 이후의 출력값들이 좀 더 정확히 예측이 가능해져 학습속도를 올릴 수 있다.
Transformer
이전의 RNN 계열 기반 모델들은 시계열에 의존하는 구조를 사용하기 때문에 병렬처리를 할 수 없었다.
하지만 transformer는 RNN 계열이 주를 이뤘던 NLP 분야에서 RNN을 전혀 사용하지 않고, attention만을 사용하여 sequential computation을 획기적으로 줄여 병렬처리가 가능하게 하는 동시에 더 많은 단어들 간 dependency를 모델링한 획기적인 성능을 보여주었다.
Positional Encoding
transformer는 RNN 계열 모델과 달리 순차적으로 입력을 받지 않기 때문에 기본적인 입력에 위치 정보가 들어있지 않다. 이를 보완하기 위해서 input embedding 값에 positional encoding 값을 더해주어 각 input이 위치정보를 가질 수 있게 해준다. 논문에서는 sin과 cos함수를 사용하여 positional encoding을 해주었다.
삼각함수를 사용하여 seq_len가 10000을 넘지 않는 이상 고유한 위치정보를 생성한다.
Positional Encoding 값을 word embedding 값에 더해도 그 의미가 혼동되지 않는다.
== Positional Encoding 값과 word embedding 값이 잘 분리된다. ex.(7.2의 정수부와 소수부를 잘 구별할 수 있듯이)
추가적으로 Positional Encoding 값을 word embedding 값에 더하는 것뿐만이 아니라, concat elementwise multiply 등 여러 시도가 있었지만, +이 가장 효과가 좋았다고 한다.
Residual Learning
성능향상을 위해서 잔여학습(residual Learning)을 사용한다.
resnet에서 증명되었듯이 residual을 다음 층으로 넘기는 것은 gradient 소실을 막아주고 forward와 backward path를 단순하게 만들어주어 층을 깊게 쌓을 수 있게 도와준다.
Multi-Head Attention
Multi head attention은 seq2seq의 attention mechanism과 굉장히 유사하다.
attention 값을 구하기 위해서는 세가지 입력 요소가 필요하다.
- Query: Key의 단어들과 어떤 연관성이 있는지 질의하는 벡터
- Key: 질의를 받는 단어들의 집합 벡터
- Value: key에 대한 의미적 결과 값
1. 임베딩된 입력값에 대해서 Query, Key, Value 벡터를 만들어준다
Query, Key, Value 벡터의 차원 = (입력값의 개수, 임베딩 벡터 크기 / 헤드의 개수)
위의 그림에서는 입력값의 개수가 3, 임베딩 벡터 크기가 2, 헤드의 개수가 2이므로
Query, Key, Value 벡터의 차원 = (3,2)이다.
논문에서는 이베딩 벡터 크기가: 512 헤드의 개수가:8 이다.
차원에 맞는 Query, Key, Value 벡터를 만들기 위해서 learnable parameter $W_{Q}, W_{K}, W_{V}$를 사용한다.
2. scaled dot-product attention으로 Query, Key, Value 벡터를 사용하여 , energy, attention score, attention vlaue를 구한다.
- energy: Query와 key.T의 scaled dot product - matmul & scale
- attention score: 각각의 energy에 softmax를 씌운 값 - softmax
- attention value: attention score와 value의 가중합 - matmul
* mask:
attention energy에 mask matrix를 elementwise multiplication해주어서 특정 mask matrix값이 음수 무한이면
그 부분의 attention score가 0이 나오게 해준다.
3. 각각의 head 값들을 concat해주고 가중치 $W_0$ 를 곱하여 가중합을 만들어준다. multi head attention이 수행된 뒤에도 출력값의 차원과 입력값과 차원이 같다는 특징이 있다.
$d_v$는 value vector의 크기로 $d_{model} / h$로 구하였으므로
각각의 head의 출력값들을 concat한 값의 차원은
$Concat(head_1, \cdots, head_h)$의 차원 : (seq_len(문장의 길이),$d_{model}$)이다.
차원이 ($d_{model}$, $d_{model}$)인 $W_0$와 가중합을 구해주면
(seq_len(문장의 길이),$d_{model}$)로 output 값도 input값과 차원이 같아진다.
Encoder
transformer의 encoder는 옆의 그림과 같이
1. multi-head attentiond을 encoder self - attention으로 수행한다.
encoder self - attention에서는 encoder에서 입력된 단어 간의 관계를 알고 싶어 수행하는 attention이므로 Q,K,V가 모두 encoder의 입력값이다.
- Q = Query : t 시점의 인코더 셀에서의 은닉 상태
- K = Keys : 모든 시점의 인코더 셀의 은닉 상태들
- V = Values : 모든 시점의 인코더 셀의 은닉 상태들
2. residual learning을 활용하여 res를 흘려주고 BN을 해준다
3. 입력 단어들에 대응하는 벡터 시퀸스(multi-head attention의 출력)를 feed forward의 입력으로 받아 계산한다.
4. residual learning을 활용하여 res를 흘려주고 BN을 해준다
Encoder는 4개의 과정을 가지는 encoder layer 여러개로 구성되어 있다.
첫 encoder layer의 입력값은 positional encoding 된 단어들의 집합이다.
마지막 encoder layer의 값이 decoder 안에 있는 모든 decoder layer의 2번째 multi head attention의 K,V 입력 값으로 들어간다.
Decoder
decoder layer는 옆의 그림과 같이
1. 첫번째 multi-head attentiond을 Masked Decoder self - attention으로 수행한다.
Masked Decoder self - attention에서는 decoder에 입력된 단어 간의 관계를 알고 싶어 수행하는 attention이므로 Q,K,V가 모두 decoder의 입력값이다.
하지만 자신의 단어의 오직 앞 단어들만 참조하여 attention을 구해야 정답을 보지 않고 예측하는 것이므로, mask를 사용하여 뒷 단어들은 참조하지 못하게 가려준다.
- Q = Query : t 시점의 디코더 셀에서의 은닉 상태
- K = Keys : 모든 시점의 디코더 셀의 은닉 상태들
- V = Values : 모든 시점의 디코더 셀의 은닉 상태들
2. residual learning을 활용하여 res를 흘려주고 BN을 해준다
3. 두번째 multi-head attentiond을 Encoder - Decoder attention으로 수행한다.
Encoder - Decoder attentiondp에서는 Encoder의 입력 단어들의 의미벡터를 참조하여 Decoder의 입력 단어가 Encoder의 단어들 중 어느 단어와 연관도가 높은지 파악하여 attention을 구한다.
- Q = Query : t 시점의 인코더 셀에서의 은닉 상태
- K = Keys : 모든 시점의 인코더 셀의 은닉 상태들
- V = Values : 모든 시점의 디코더 셀의 은닉 상태들
4. residual learning을 활용하여 res를 흘려주고 BN을 해준다
5. 입력 단어들에 대응하는 벡터 시퀸스(multi-head attention의 출력)를 feed forward의 입력으로 받아 계산한다.
6. residual learning을 활용하여 res를 흘려주고 BN을 해준다
Decoder는 6개의 과정을 가지는 decoder layer 여러개로 이루어져있다.
첫 decoder layer의 입력값은 Teaching Forcing을 위한 정답 문장이다.
* multi head attention, encoder, decoder 과정, 심지어 ffnn 중에도 단어끼리 섞이지 않는다.
=> 각 단어 안의 가중치들은 바뀌고 섞일 수 있으나, 그 단어와 다른 단어의 가중치가 섞이지는 않는다.
'Naver boostcamp -ai tech > week 03' 카테고리의 다른 글
Optimization (0) | 2022.10.05 |
---|---|
Neural Networks & Multi-Layer Perceptron (1) | 2022.10.04 |
딥러닝의 역사 (0) | 2022.10.03 |