2022. 3. 29. 10:19ㆍSTUDY/Model
최종 : Attention is all you need
Attention을 적용한 인코더-디코더 모델 특징에서
Attention을 적용하여 유동적인 Context vector를 얻어, 효과적인 번역을 수행하였지만,
여전히 RNN셀을 사용해 순차적으로 계산한다는 점에서 속도가 느리고, Gradient Vanishing 문제 또한 존재하였다.
Transformer는 해당 두 문제점을 해결하며 등장하였다.
Transformer : Attention is all you need
Transformer 모델은 Attention 만을 사용하는 모델이다. (제목 그대로)
- RNN의 순차적인 계산이 아닌, Attention 연산 (행렬곱) 한번 수행
- RNN이 사용되지 않기 때문에 순서정보가 없어서 Positional Encoding 사용
전체구조는 위와 같다.
공통
- Positional Encoding (1)
- Layer Normalization (3)
- FFNN(Feedforward Neural Nets) (3)
- Residual Connection (3)
좌측(단일 인코더 레이어) (4)
- Self Multi-Head Attention (2)
우측(단일 디코더 레이어) (7)
- Masked Multi-Head Self Attention (5)
- Multi-Head Attention (6)
순차적으로 보자
Positional Encoding
Transformer는 RNN의 순차적인 구조를 탈피하고
병렬적인 Attention을 수행함으로써 계산비용을 눈에띄게 줄였다.
하지만 위치정보는 필요한 사항이므로 위치정보값을 넣어줘야함
아래처럼 Positional encoding 정보와 Embedding vector간의 element 합을 수행한다.
위 과정은 행렬의 덧셈연산으로 볼 수 있다.
- pos : 입력문장에서 단어의 위치 (행)
- i : 임베딩 벡터내의 차원의 인덱스 (열)
논문에서는 sin/cos을 사용한 Positional encoding을 사용하였다.
- sin / cos을 사용할경우 Positional encoding값은 -1~1 사이를 가진다.
- 학습데이터의 가장 긴문장보다 더 긴문장이 들어와도 에러없이 상대적인 인코딩값 부여가능
- 짝수이면 sin / 홀수이면 cos 사용
위치럼 Positional Encoding을 더해주면 순서정보가 보존된다.
문장내의 위치에 따라서 트랜스포머 입력으로 들어가는 임베딩벡터의 값이 달라짐
Self Multi Head Attention
Self Attention
- Self Attention은 자기 영역에서 모든 관계를 파악하는 것
- 이전 Attention 은 인코더(Key,Value) 디코더(Query)로 구성되었음
- Self Attention은 인코더(Query,Key,Value)로 구성되어있다.
Self Attention 준비 과정
- 제일 먼저수행하는것은 Query, Key, Value의 Vector를 구하는 것
# Query(현재 기준단어) / Key(비교할 단어들) / Value(전체 단어들) - Wq, Wk, Wv 가중치행렬과의 행렬연산을 통해 생성된 값이 Query, Key, Value
- 위 세개의 가중치행렬은 딥러닝모델 학습과정에서 최적화되는 값이다.
- 가중치 행렬 Size = (dmodel, dmodel/num_heads) 로 논문의 경우 (512,64)
- 예) Student(1,512) x Wq(512,64) = Query(1,64)
Self Attention 수행 과정
- Query와 Key를 Scaled dot product 수행하여 Attention Score 얻음
# Attention score의 관계의 정도(연관성)을 의미한다. - Softmax 함수 통과하여 Attention distribution 얻음 (각각은 Attention weight이다)
# 예) i와i는 0.92 / i와 study는 0.05 / i와 at은 0.02 / i와 school은 0.01 값을 지닌다. - 각 Attention weight를 Value와 곱하고 가중합하여 각 단어에 대한 Attention Value를 얻음
# 위 예시의 경우 ( i , study , at , school ) 로 총 4개의 Attention value가 나오며
# 각각의 Attention value를 엮은것이 Attention Value Matrix
Scaled dot product
- 논문에서는 Softmax이전에 Attention score 값을 Key값 차원수의 루트값으로 나누어주었음
- Key vector의 차원이 늘어날수록 dot product시 값이 너무 커지는것을 해결하기 위함
Multi Head Attention
- 한번의 Attention 을 수행한 결과 Attention Value Matrix가 아래 그림의 첫번째에 나와있다.
- Multi Head Attention은 말그대로, Attention 연산을 병렬적으로 수행하는 것
- 병렬적으로 수행한 결과값을 이어붙이고, 추가적인 행렬과 곱하여 입력과 동일한 차원의 행렬 얻음
FFNN ( Feedforward Neural Nets) & (Add / Norm)
Multi Head Attention 연산을 통과하면, 입력행렬과 동일한 차원의 행렬을 얻는다고 하였고
그 다음 해줘야 할 작업이 Add & Norm 과 FFNN 이다.
FFNN ( Feedforward Neural Nets)
- 입력행렬과 동일한 차원의 행렬을 단어별로 다시 쪼갠다.
- 각각을 FC layer를 통과 시켜서 동일한 차원의 출력값들을 얻는다.
- 해당 출력값들을 이어붙여, 최종적으로 처음 입력행렬과 동일한차원의 행렬을 얻는다.
- 위 FFNN은 학습을 통해 최적화되는 기본적인 Neural Nets
Add ( Residual Connection )
- 역전파에 의해 positional encoding 값이 많이 손실될 수 있음
# 위치정보가 흐릿할 것이다. - 이를 보완하기 위해 Residaul Connection으로 입력값을 다시한번 더해준다.
Norm ( Layer Normalization )
- Residual Connection을 통과한 뒤 Layer Normalization 을 거치게 된다.
- Layer Noramlization은 속성별로 평균과 분산을 구하는 Batch Normalization과 다르게
각 입력벡터마다 평균과 분산을 구하는 과정을 거치며, 해당 과정을 통해
데이터가 정규화되어 학습에 도움을 주게 된다.
Encoder layer 1개 구조 & Encoder Stack
위 과정 세개가 추가된 Encoder layer 1개의 전체구조가 아래와 같으며
Encoder 구조의 과정과 동일하게 수행되었음을 알 수 있다.
종합적인 과정
1. 데이터 가져옴
2. 임베딩 벡터로 전환
3. Positional encoding과 붙임
4. Multi head attention
5. 출력된 결과값을 이어붙여 새로운 행렬과 곱하여 입력과 동일한 차원의 행렬(4,3)얻음
- Residual Connection 으로 Positional encoding값 더해준다.
- Layer normalization
6. 각각의 벡터는 FC 통과
7. 이어붙여 초기 입력(4,3) 과 동일한 차원(4,3)의 최종출력을 얻는다.
- Residual Connection 으로 Positional encoding값 더해준다.
- Layer normalization
Encoder layer 1개의 결과값을 보면 입력값과 동일한 차원임을 알 수 있다.
이말은 Encoder layer를 여러개쌓아 여러번사용해도 동일한 차원으로 유지된다는 의미이다.
논문에서는 Encoder layer를 6개쌓아서 사용하였다.
중요한점은 각각의 layer는 가중치를 공유하지않는다!
디코더의 Masked Multi Head Self Attention
학습 시 디코더의 입력으로 정답값을 넣어준다. (Teacher forcing)
하지만 Transformer의 경우 입력전체를 한번에 넣어주기 때문에
미래입력에 대해서 미리 참고할 수 있는 상황이 된다.
따라서 Transformer 디코더에서는 현재시점의 에측에서 미래에 대한 단어들을 참고하지못하도록
Look-Ahead Mask를 도입한다. (미리보기 금지)
수행과정
- Attention score 구함
- 모든 단어에 대해 Attention score를 종합하여 Attention score matrix 도출
- 미래에 있는 단어들은 참고하지못하도록 마스킹 수행
디코더의 Multi Head Attention
디코더의 두번째 서브층은 인코더-디코더 Attention 이다. (self 가 아니다.)
- Query : 디코더 첫번째 서브층의 결과행렬로 부터 얻음
- Key, Value : 인코더 넘어온 행렬로부터 얻음
- Query 값이 디코더의 첫번째 sub layer 레이어의 결과라는 점만 다르고 self attention과 동일하다
Decoder Layer 1개 구조 & Decoder Stack
디코더 마지막 레이어 최종 단
- Dense Layer 와 Softmax 존재
- 앞서 얻은 최종 벡터를 실제 단어로 출력하기 위해 필요
나중에 코드 공부하고 다시보자
성능향상
Transformer는 마지막에 Label smoothing 을 사용하여서 BLEU score와 accuracy 의 성능을 올린다
BLEU(Bilingual Evaluation Understudy)
- 기계 번역결과와 사람이 직접 번역한 결과가 얼마나 유사한지 비교하여 번역에 대한 성능을 측정
- 언어에 구애받지않고 사용가능하고 계산속도가 빠름
- 높을수록 좋은 성능을 의미
Label smoothing ( "이정도면 얼추맞다!")
- hard target 을 soft target으로 바꾸는 것
- K개의 범주(Class)에 관한 레이블 스무딩 벡터의 k번째 스칼라 값은 다음 수식과 같음
- yk 는 k번째 범주가 정답이면 1, 그렇지않으면 0, alpha는 hypyer parameter
- 모델 성능 향상 (generalization / regularization)

- 위공식을 적용하면 Hard target = [0,1,0,0] 값은 Soft target = [0.025,0.925,0.025,0.925] 로 할 수 있음
https://ratsgo.github.io/insight-notes/docs/interpretable/smoothing
'STUDY > Model' 카테고리의 다른 글
Transformer 2. Attention 매커니즘이 추가된 인코더-디코더 (0) | 2022.03.29 |
---|---|
Transformer 1. 전통적인 RNN기반 인코더-디코더 모델 (0) | 2022.03.29 |