일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 딥러닝
- dp
- 동적프로그래밍
- 리눅스
- 그래프
- nlp
- AI
- kick start
- 네트워크
- 코딩 테스트
- 프로그래머스
- 구글 킥스타트
- 브루트포스
- PYTHON
- 파이썬
- 순열
- 동적 프로그래밍
- 코딩
- BFS
- 알고리즘
- 킥스타트
- 코딩테스트
- linux
- 프로그래밍
- 백준
- DFS
- google coding competition
- OS
- 운영체제
- CSS
- Today
- Total
오뚝이개발자
Attention is all you need(NIPS 2017) 논문 리뷰 본문
오늘 리뷰할 논문은 구글 리서치팀에서 발표한 "Attention is all you need"(링크)이다. 해당 논문은 현대 NLP의 중요한 backbone으로 사용되는 Transformer에 관한 논문이다. 사실 원논문의 제목보다 Transformer라는 이름으로 더 많이 알려져 있다.
NLP model history
그 동안 ML분야에선 vision과 관련된 분야들이 눈에 띄는 발전을 이루어 온 것에 비해 NLP 분야의 발전은 더딘 편이었다. 그러나 최근 들어 좋은 성능을 보이는 다양한 모델들이 나오면서 NLP 분야에서도 급진적인 발전이 이루어지고 있다. 이러한 NLP의 발전을 이끈 모델들의 변천사는 대략 아래와 같다. 오늘 리뷰할 Transformer 논문은 2017년에 발표된 것이다.
What does the title mean?
Attention is all you need란 말 그대로 attention만 있으면 된다!! 는 의미이다. 다시 말해, attention 기법만을 사용해서 NLP task에서 좋은 성능을 내는 모델을 만들 수 있다는 뜻이다.
기존의 sequence 변환 모델들의 한계
기존의 sequence 변환을 수행하는 모델들의 경우 대부분 RNN이나 CNN을 사용해왔다. 그러나 이러한 모델들은 다음과 같은 한계점들을 가지고 있다.
- RNN의 sequential한 특징은 parellelization이 불가능하게 만든다.(특히 longer sequence의 computing 측면에서 critical하다. 예컨대, 기계번역과 같은)
- Attention 메커니즘의 경우 기존 seq2seq 모델의 고정된 context vector를 사용하면서 생기는 입력 데이터의 정보 소실 문제를 해결하였지만, 아직까지는 RNN 모델과 함께 사용되는 경우가 많았다.
Transformer는 word order를 어떻게 알까?
text data와 같은 sequence 데이터를 처리하는데 있어 word order가 중요하다. 좀 더 정확히는 해당 word의 position에 대한 정보가 중요하다. 같은 단어라고 하더라도 문장에서 어느 위치에 등장하느냐에 따라 해당 단어가 갖는 문맥적 의미가 달라지기 때문이다.
기존 RNN과 같은 경우 sequential하게 처리하므로 이러한 word order에 대한 정보가 내재되어 있었다. 그러나 Transformer는 이러한 RNN 구조를 사용하지 않으므로 해당 정보를 얻을 수 없다. 그렇다면 Transformer는 이러한 word order 정보를 어떻게 알까?
정답은 바로 positional encoding이다. 해당 word의 position에 대한 정보를 따로 만들어 기존의 input 데이터와 합치는 것이다. 본 논문에서는 positional encoding을 위해 sine, cosine과 같은 주기 함수를 사용하였다.
positional encoding은 어떻게 이루어질까? 위의 그림이 바로 그것을 나타내고 있다. "I love my dog"이라는 문장이 있다고 해보자. 그럼 이것을 token(word) 단위로 나누면 각 행에 표시된 것과 같이 I, love, my, dog으로 표현할 수 있다. 이것이 2-d array로 표현되어 각 행과 열은 (pos,i)가 된다. pos는 각 단어가 등장하는 position을 말한다. 예컨대, I는 1, dog는 4이다. i는 각 word의 위치 정보를 표현한 벡터의 차원에서 특정 index를 가리킨다. 여기선 각 word를 4차원으로 표현한다고 가정한 것이다. 이렇게 만들어진 word order에 대한 정보를 input matrix와 더해줘서 위치 정보를 함의하도록 한다.
Model architecture
위의 그림은 원논문에서 Transformer의 구조를 나타낸 것이다. 좌측이 encoder, 우측이 decoder의 구조이다. 크게 보았을 때 Transformer는 encoder와 decoder로 이루어져있다. 가장자리에 Nx라고 쓰여진 것을 볼 수 있는데 이것은 stack을 몇개의 구조로 쌓을지에 관한 정보이다. 그림엔 encoder와 decoder가 각각 1개씩 표현되어있지만 사실 Transformer는 이러한 구조가 여러 개가 쌓인 stack이다.
이러한 stack 구조가 가능한 이유는 encoder에서 input vector와 output vector의 차원이 갖게 설계되어있기 때문이다. 따라서 이전 encoder의 output을 다음 encoder의 input으로 사용할 수 있는 것이다. decoder도 마찬가지이다. 원논문에선 stack의 갯수 N=6으로 설정하였다.
Encoder는 2개의 sublayer로 구성되어있다. Multi-head attention layer와 Feed Forward layer이다. input data에 positional encoding 정보를 더해준 뒤 residual connection으로 multi-head attention layer를 거치지 않고 더해주는 부분도 있다.(prevent vanishing gradient)
Decoder는 encoder보다 1개 많은 3개의 sublayer로 구성되어 있다. Masked multi-head attention, Multi-head attention, Feed Forward layer이다. Encoder와 마찬가지로 decoder에도 residual connection이 있다.
Attention in Transformer
Transformer에는 크게 3개의 attention이 등장한다. 먼저 위그림에서 1번으로 표시된 attention은 encoder 측의 attention이다. 이는 input text 내에서 문맥 정보를 파악하기 위한 것이다. 예컨대, I love my dog이라는 문장에서 I가 I, love, my, dog 각각과 얼만큼의 연관성을 갖고 있는지 계산한다. 때문에 이는 encoder self-attention이라고도 한다.
다음으로 3번으로 표시된 attention은 predict하는 word가 이전에 나온 word들만을 기반으로 예측하도록 한다. 좀 더 자세히 말하면, 뒤쪽의 단어들을 미리 알고 predict하지 않도록 하여 cheating을 방지한다. 바꿔 말하면, position i에 올 단어를 예측할 때 position 0~(i-1)까지의 단어들만을 기반으로 예측하도록 한다. 이는 mask matrix로 구현이 가능하다. mask matrix에서는 무시하고자 하는 position의 word를 음의 무한대 값으로 만든다. 이렇게 하면 softmax(음의 무한대)가 0에 수렴하는 값으로 아주 작아지므로 해당 word들의 영향력을 적게 만들 수 있다.(자세한 건 아래서 다시 설명하겠다.) 이러한 역할을 하여 해당 attention은 masked decoder self-attention이라고도 한다.
4번으로 표시된 attention은 decoder에서 출력되는 단어가 input text의 단어들과 얼마만큼의 연관성을 갖는지 계산한다. 그림에서 보면, encoder에서 온 2개의 값이 input으로 들어가고 decoder에서 온 1개의 값이 input으로 들어간다. 이는 encoder에서 온 K,V와 decoder에서 온 Q를 가지고 attention score를 계산하는 것이다. 해서, 이를 encoder-decoder attention이라고도 한다.
위 그림은 각 attention들의 동작 방식을 도식화한 것이다. Encoder self-attention 같은 경우 각 word가 자기 자신을 포함한 다른 단어를 참고해 연관성을 계산한다. Masked decoder self-attention 같은 경우는 앞에 먼저 등장한 단어들만을 참고한다. Encoder-decoder attention은 Encoder에서 나온 word들을 참고해 decoder에서 나온 단어와 연관성을 계산한다. 예를 들어, 영어를 한국어로 번역하는 task에서 위 그림의 파랑 네모 3개가 각각 I love dog이고, 검정 네모 1개가 '나'라는 단어라고 해보자. 그럼 이 '나'라는 단어가 I, love, dog 3개의 단어들과 어느 정도의 연관성을 갖는지 계산한다.(물론, I와 가장 높은 연관성을 보일 것이다.)
Scaled dot-product attention
Attention을 계산하는 방식엔 additive,dot-product 2가지가 있는데, 원논문에선 dot-product attention을 사용했다. attention의 input으로는 d_k의 dimension을 갖는 Q,K 그리고 d_v의 dimension을 갖는 V가 주어진다. Attention score를 계산하는 수식은 다음과 같다.
여기서 sqrt(d_k)로 나누어주는 부분이 바로 scaling을 적용하는 부분이다. 이렇게 해주는 이유는 gradient vanishg을 방지하기 위해서이다. d_k가 커질수록 즉, 차원이 큰 data를 계산할수록 값의 magnitude가 일반적으로 커지는 경향이 있다. 이렇게 큰 값에 softmax를 취해주면 기울기가 0에 근사한 값으로 가서 gradient vanishing이 발생한다. 따라서 "scaled" "dot product" attention이라는 이름이 붙게 된 것이다.
Why multi-head attention?
Multi-head attention을 사용하면 parallelization을 통해 계산 성능상의 이점을 누릴 수 있다. 그냥 큰 d_model이라는 큰 dimension을 가진 Q,K,V를 가지고 single attention function으로 계산하는 것보다 이들을 h개로 나누어 병렬적으로 계산하는 것이다.
Regularization
원논문에선 dropout과 label smoothing이라는 두 정규화 방법을 사용했다. dropout은 워낙 유명한 method이니 label smoothing에 대해서만 설명하겠다. 보통 encoding을 one-hot encoding으로 하는 경우가 많다. 그런데 text에서는 이 경우 문제가 생길 수 있다. 예컨대, Thank you를 감사합니다, 고마워라는 두 label이 함께 있는 경우 one-hot encoding으로 표현하려면 둘 중 하나는 무조거 0이 되어야 한다. 사실 둘 다 정답인데 말이다. label smoothing을 말 그대로 좀 더 smooth한 방식을 사용해 정답에 가까울수록 1에 근사한 값을, 반대의 경우 0에 근사한 값을 갖도록 한다. 물론 이러한 방법이 model의 perplexity를 해치긴 하지만, accuracy를 개선하고 실제로 BLEU score도 더 높게 나온다고 한다.
학습에 사용한 Dataset
- WMT 2014 English-German dataset
- WMT 2014 English-French dataset
- Consist of sentences pair and source-target vocabulary of many tokens
Result
Transformer는 영어를 독일어로 바꾸는 task(EN-DE)에선 기존의 모든 single 모델들과 앙상블 모델들을 outperform하는 성능을 보여주었다. 또한 영어를 프랑스어로 바꾸는 task(EN-FR)에선 single 모델들을 outperform하고 앙상블 모델들과 거의 match하는 결과를 냈다. training cost는 FLOPs로 나타냈는데 여기서도 Transformer는 기존의 모델들과 비교했을 때 상대적으로 더 적은 cost로 더 좋은 성능을 내는 걸 알 수 있다.
Reference
- https://wikidocs.net/31379
- https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf
- https://www.youtube.com/watch?v=AA621UofTUA&t=1s
'AI > Deep Learning Paper Review' 카테고리의 다른 글
Towards a Human-like Open-Domain Chatbot(Meena) 리뷰 (0) | 2021.11.04 |
---|---|
ELECTRA(ICLR 2020) 논문 리뷰 (1) | 2021.10.27 |
BERT(NAACL-HLT 2019) 논문 리뷰 (0) | 2021.10.08 |
NLG(Natural Language Generation)에 대하여 (0) | 2021.09.12 |
RealFormer : Transformer Likes Residual Attention 논문 리뷰 (0) | 2021.09.12 |