2021. 1. 28. 18:57ㆍData Analysis
- https://reniew.github.io/43/
- https://www.theteams.kr/teams/2829/post/69500
- 이 논문에서는 attention만으로 모든 모델을 만들었다
- 기존의 모델들처럼 rnn, cnn을 사용하지 않고 attention 만 사용해서 연산량이 매우 줄었다(성능이 매우 높게 나온다)
- transformer라고도 불린다
Introduction
rnn은 기계번역이나 언어 모델링 등 sequence를 다루기 위한 모델로 많이 사용되고 있다. 하지만 rnn을 활용한 모델은 문장이 길어질수록 성능이 떨어지고 memory의 제약으로 batch에도 제한이 생길 수 있다. 또한 단순한 sequence to sequence 모델은 sequence의 alignment(순서, 정렬, 일직선)를 해결하지 못한다.
attention mechanism을 통해 위에서 언급했던 rnn모델의 문제점을 어느정도 해결했지만 결국 대부분의 모델은 attention이 rnn과 함꼐 사용되는 용도로만 사용되었다.
해당 논문에서는 transformer라 불리는 모델을 소개한다. 다른 cnn 혹은 rnn모델없이 단순히 attention mechanism만으로 모델을 구성했으며 학습시간이 매우 빠르다는 장점이 있다.
Model Architecture
대부분의 sequence를 다루는 모델들은 encoder -decoder 구조로 되어있다. 여기서 encoder는 input sequence를 continuous한 representation로 바꾸고 decoder는 representation을 통해 output을 만들어 낸다.
transformer의 전체적인 아키텍쳐는 stacked self-attention과 point-wise fc layers들을 사용해서 구성되어 있다 . 아래 그림이 전체 아키텍처이다 (왼쪽 - 인코더, 오른쪽 - 디코더)
encoder
encoder는 동일한 layer가 n개 반복되는 형태. 이 논문에서는 6번 반복. 그리고 각 layer는 두개의 sub-layer로 구성. 첫 sub-layer는 multi-head self-attention이고 두번째는 간단한 point-wise fc-layer(position-wise fully connected feed-forward network)이다. 그리고 모델 전체적으로 각 sub-layer에 residual connection을 사용했다. 그리고 residual 값을 더한뒤에 layer값을 normalized한다. 즉 각 sublayer는 결과에 대해 residual 값을 더하고 그 값을 normalize한 값이 output으로 나오게 된다. 그리고 모델 전체적으로 residual계산을 쉽게 하기 위해서 output의 dimension은 모두 512로 맞췄다. (layer normalization)
residual connection - input을 output으로 그대로 전달
decoder
decoder도 encoder와 마찬가지로 동일한 layer가 n개 반복되는 형태. 이 논문에서 6번 반복, 그러나 반복되는 layer가 encoder와 다른 구조이다. 총 3개의 sublayer로 구성되어있는데 2개는 기존의 encoder의 sublayer와 동일하고 나머지 하나는 인코더의 output에 대해 multihead attention을 계산하는 sublayer가 추가되었다.
decoder에서도 residual connection사용 , residual값을 더한후 동일하게 layer normalize를 해준다. 그리고 self attention을 인코더와는 약간 다르게 수정했는데 마스킹을 추가했다. self-attention시 현재 위치보다 뒤에 있는 단어는 attend못하도록 마스킹을 추가한것이다
위의 예시를 보면, a를 예측할 때는 a이후에 있는 b,c에는 attention이 주어지지 않는 것입니다. 그리고 b를 예측할 때는 b이전에 있는 a만 attention이 주어질 수 있고 이후에 있는 c는 attention이 주어지지 않는 것이죠.
attention
- attention은 단어의 의미처럼 특정정보에 좀더 주의를 기울이라는 것
- 예를 들어 model이 수행해야 하는 task가 번역이라고 해봅시다. source는 영어이고 target은 한국어입니다. “Hi, my name is poza.”라는 문장과 대응되는 “안녕, 내 이름은 포자야.”라는 문장이 있습니다. model이 이름은이라는 token을 decode할 때, source에서 가장 중요한 것은 name입니다.
- 그렇다면, source의 모든 token이 비슷한 중요도를 갖기 보다는 name이 더 큰 중요도를 가지면 되겠죠. 이때, 더 큰 중요도를 갖게 만드는 방법이 바로 attention입니다.
이 모델에서 사용한 attention은 총 2가지
- Scaled dot-product attention
인풋 3가지
dk dimention을 가지는 queries(Q)와 keys(K)
dv dimention을 가지는 values(V)로 구성
하나의 query에 대해 모든 key들과 dot product를 한 뒤 각 값을 루트 dk로 나눠줌. 그리고 softmax함수를 씌운후 마지막으로 value곱함
실제로 계산할 때는 query,key,value를 vector 하나하나 계산하는 것이 아니라 여러개를 matrix로 만들어 계산
추가 설명) query는 어떤 단어와 관련되어있는지 찾기 위해 모든 key들과 연산함 여기서 실제 연산을 보면 query와 key를 dot-product한뒤 softmax를 취하는데 의미하는 것은 하나의 query가 모든 key들과 연관성을 계산한 뒤 그 값들을 확률 값으로 만들어줌 , 따라서 query가 어떤 key와 높은 확률로 연관성을 가지는 지 알게됨 , 이제 구한 확률값을 value에 곱해서 value에 대해 scaling한다고 생각하면 됨
추가 설명) key와 value는 사실상 같은 단어를 의미함. 하지만 두개로 나눈 이유는 key값을 위한 vector와 value를 위한 vector를 따로 만들어서 사용함. key를 통해서 각 단어와 연관성의 확률을 계산하고 value는 그 확률을 사용해 attention값 계산하는 용도
key - 각 단어의 연관성 확률 계산
value - 확률 사용해서 attention값 계산
정리****
쿼리와 키를 dot product하여 softmax 취하기 - 하나의 쿼리가 모든 key들과의 연관성을 계산
value와 곱하여 scaling(쿼리와 유사한 value일수록 더 높은 값을 가짐)
- Multi-head attention
기존 attention은 전체 dimention에 대해서 하나의 attention만 적용시킴. 여기서 사용한 multihead attention이란 전체 dimension 에 대해서 한번 attention을 적용하는 것이 아니라 전체 dimention을 h로 나눠서 h번 적용하는 방법
각 query,key, value의 vector는 linearly하게 h개로 project된다. 이후 각각 나눠서 attention을 시킨후 만들어진 h개의 vector를 concat하면 된다. 마지막으로 vector의 dimension을 dmodel로 다시 맞춰주도록 matrix를 곱하면 끝난다.
해당 논문에서는 h =8 8개의 head를 사용함 따라서 각 vector들의 dimension은 다음과 같이 8로 나눠짐
h번 계산했지만 각 head들이 dimension이 줄었기 때문에 전체 연산량은 비슷하다.
*** 정리 ***
dimension의 key, value, query들로 하나의 attention을 수행하는 대신 key, value, query들에 각각 다른 학습된 linear projection을 h번 수행하는 게 더 좋다
- query들은 이전 decoder layer에서 오고 key와 value들은 encoder의 output에서 오게 됩니다. 그래서 decoder의 모든 position에서 input sequence 즉, encoder output의 모든 position에 attention을 줄 수 있게 됩니다.
- query가 decoder layer의 output인 이유는 query라는 것이 조건에 해당하기 때문입니다. 좀 더 풀어서 설명하면, ‘지금 decoder에서 이런 값이 나왔는데 무엇이 output이 돼야 할까?’가 query인 것이죠.
- 이때 query는 이미 이전 layer에서 masking out됐으므로, i번째 position까지만 attention을 얻게 됩니다.이 같은 과정은 sequence-to-sequence의 전형적인 encoder-decoder mechanisms를 따라한 것입니다.
Applications of Attention in our Model
Transformer에서 multi-head attention을 다음과 같은 방법으로 사용했다.
- “encoder-decoder attention” layer에서 query들은 이전 decoder layer에서 온다. 그리고 encoder에서 온 key와 value를 사용한다. 따라서 decoder의 모든 위치의 token은 input sequence의 어느 곳이든 attend할 수 있게 된다.
- encoder는 self-attention layer를 가진다. 모든 key, value, query는 같은 sequence에서 온다. 정확히는 이전 layer의 output에서 온다. 따라서 encoder는 이전 layer의 전체 위치를 attend할 수 있다.
- decoder의 self-attention layer도 이전 layer의 모든 position을 attend 할 수 있는데, 정확히는 자신의 position이전의 position까지만 attend 할 수 있다. 직관적으로 이해하면 sequence에서 앞의 정보만을 참고할 수 있게 한 것이다. 이러한 목적을 scaled dot-product를 masking 함으로써 구현했다.
Position-wise Feed-Forward Networks
attention sub layer 에 이어서 fully connected feed-forward network를 거치게 되는데 이 네트워크는 두개의 linear transformation으로 구성되어있고 ReLU함수 사용함
Why self-attention
이 모델에서 recurren나 convolution사용하지 않고 self -attention만을 사용한 이유에 대해 알아보자
3가지이유로 selfattention을 선택함
- 레이어당 전체 연상량이 줄어든다
- 병렬화가 가능한 연산이 늘어난다
- long range의 term들의 dependency도 잘 학습할 수 있게 된다
- 모델자체의 동작을 해석하기 쉬워진다
Training data and batching
학습에 사용된 데이터는 WMT 2014 English-German 데이터 셋이다. 총 450만개의 영어-독일어 문장 쌍이 있다. 그리고 WMT 2014 English-French 데이터 셋도 사용했다. 총 360만개의 문장 쌍이 있다. 학습시 대략 25000개의 token을 포함하는 문장 쌍을 하나의 배치로 사용했다.
Optimizer
학습에 사용된 optimizer는 Adam을 사용했다. 하이퍼 파라미터로는 β1=0.9, β2=0.98, ϵ=10−9를 사용했다. 학습률(learning rate)의 경우 학습 경과에 따라서 변화하도록 만들었다. 아래의 공식으로 학습률을 계산해서 적용했다.
여기서 warmup_step의 값으로는 4000을 사용했다.
Regularization
학습 시 정규화를 위해서는 세가지 방법을 사용했다.
- Residual dropout
- Attention dropout
- label smoothing
여기서 dropout 값은 0.1로 했고, label smoothing 값도 0.1로 설정했다.
Conclusion
번역에서 Tansformer는 다른 모델들 보다 훨씬 빠르게 학습했다. 그리고 빠른 속도에도 성능에서도 이전의 모델들보다 좋은 성능을 보여줬다.
Recurrent, convolution을 전혀 사용하지 않고 attention만 사용해서 만든 모델임에도 좋은 성능을 보여줬다. 우선 이 모델이 크게 의미하는 바는 빠른 학습속도를 보여준 것이다. 따라서 앞으로도 번역 뿐만 아니라 이미지 등 큰 input을 가지는 문제에도 적용할 수 있을 것이다.
트랜스포머는 Recurrent, convolution을 전혀 사용하지 않고 빠르고 정확하게 sequential data를 처리할 수 있는 model로 제시되었다
여러가지 기법이 사용됐지만 가장 핵심적인것은 인코더와 디코더에서 어텐션을 통해 쿼리와 가장 밀접한 연관성을 가지는 value를 강조할 수 있고 병렬화가 가능해진것
- query들은 이전 decoder layer에서 오고 key와 value들은 encoder의 output에서 오게 됩니다. 그래서 decoder의 모든 position에서 input sequence 즉, encoder output의 모든 position에 attention을 줄 수 있게 됩니다.
- query가 decoder layer의 output인 이유는 query라는 것이 조건에 해당하기 때문입니다. 좀 더 풀어서 설명하면, ‘지금 decoder에서 이런 값이 나왔는데 무엇이 output이 돼야 할까?’가 query인 것이죠.
- 이때 query는 이미 이전 layer에서 masking out됐으므로, i번째 position까지만 attention을 얻게 됩니다.이 같은 과정은 sequence-to-sequence의 전형적인 encoder-decoder mechanisms를 따라한 것입니다.
요약
트랜스포머 모델에서 어텐션 메카니즘으로 번역처리에 뛰어남을 보이는 것을 나타낸 논문
핵심은 인코더와 디코더에서 어텐션 통해 쿼리와 밀접한 연관성 가지는 밸류를 강조할수 있는 것
인코더에서 멀티헤드 어텐션은 - 멀티헤드 셀프 어텐션이다
여기서 q,k,v는 인코더의 아웃풋 스테이트다
인코더 - 디코더 어텐션은 q는 이전레이어의 히든 스테이트, k는 인코더의 아웃풋 스테이트, v는 인코더의 아웃풋스테이트
인코더의 셀프어텐션
q-영향을 받는단어
k-영향을 주는단어
v-영향에 대한 가중치
q,k가 내적되는 행위가 영향을 받는 단어와 주는단어들의 유사도를 측정하는 행위
<참고자료>