[NLP | 논문리뷰] Attention is all you need(Transformer)

0

논문리뷰

목록 보기
6/29

드디어 Transformer 논문 프리뷰를 마치고 이제 본편을 시작하고자 한다. 배보다 배꼽이 큰 것 같지만 그것이 공부 아닌가. Transformer 논문은 정말 공부해볼 지점이 많은 것 같다.

특히나 Encoder 부분은 많은 블로그나 게시글에서 인사이트를 볼 수 있었지만 Decoder 부분은 상당히 설명이 빈약했다. 그래서 참 어려움을 많이 겪었었는데 이번 리뷰에서는 그러한 고민도 공유해보고자 한다.

💡 전체적인 개요

Attention이라는 획기적인 Embedding 방식이 소개되어 NLP에 새로운 방향을 제시했으나 Sequential한 문제를 해결해야 한다는 특성상 병렬 처리가 어렵다는 큰 단점을 가지고 있다. Attention 역시 LSTM, RNN의 하부 구조로 사용되며 결국에는 문제를 순차적으로 다룰 수 밖에 없었다.

이러한 순차적인 학습은 문장 자체가 연관이 있는 단어가 멀리 떨어져 있는 long term dependency를 잘 학습하지 못한다. 이를 해결하고자 여러 트릭을 사용하지만 문제를 완전히 해결하지는 못한다.

논문의 도전적인 제목에서 알 수 있듯이 transformer는 RNN, LSTM과 같은 구조를 완전히 배제하고 Attention만을 사용한다. 이를 통해 단어의 Embedding을 더욱 효과적으로 하고 병렬처리를 가능하게 했다. 기본적으로 one-hot encoding된 단어들을 위치 정보를 추가적으로 주입한 후, 여러 개로 쌓여 있는 encoder들과 decoder들을 통해 처리한다. Attention 처리가 되어 있는 vector들이기 때문에 각각의 단어 vector들은 그들간의 관계성이 존재하며 이들만으로도 학습이 가능하다.

기존 논문에서는 Neural Machine Translation을 학습의 목표로 삼았다. 하지만 이후에 Transformer는 이미지 영역까지 다루는 포괄적인 모델이 되었다.

📕 Background

Transformer 논문 프리뷰3에서 다루었듯이, 해당 논문 이전에도 Sequential한 문제를 보다 효율적으로 해결하기 위해 다양한 시도들이 있었다. 특히나 End to End memory는 Transformer의 Query, Key, Value의 기초가 되었고 Extended Neural GPUs는 Convolution layer를 통해 특징적인 벡터를 뽑아낸다는 즉, 이와 유사한 Attention만으로도 학습이 될 수 있다는 신호를 주었다.

해당 내용이 궁금하면 아래의 이전 포스트를 참고하면 좋을 것 같다.
https://velog.io/@xuio/Transformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-%EC%A0%84-%ED%94%84%EB%A6%AC%EB%B7%B03End-to-End-Memory-Extended-Neural-GPU

🛠 Model Architecture

우선 트랜스포머는 기존의 auto-regressive한 구조(RNN, LSTM)를 완전히 제거하고 fully connected layers 구조를 사용해 병렬처리가 가능한 특이한 구조를 만들었다.

내연기관 엔진처럼 생긴 이것을 처음 보면 당황스러울 수 있으나 뜯어보면 그렇게 어려운 구조는 아니다. 우선 왼쪽이 Encoder이며 오른쪽이 Decoderd이다. 그리고 Encoder 옆에 Nx라고 붙어 있는 것은 이러한 구조가 n번(논문에서는 6번) 반복된 구조라는 것이다.

왼쪽부터 순서대로 encoder부터 살펴보면, 하나의 encoder는 두 개의 sub-layer로 구성되어 있으며 multi-head self-attention mechanism과 position-wise fully connected feed-forward network를 가지고 있다.

이때 두개의 sub layer은 residual connection을 사용한다. 이를 통해 보다 빠르고 정확한 학습이 가능해지는데 해당 내용은 Transformer 프리뷰2에서 다루었다.

https://velog.io/@xuio/Transformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-%EC%A0%84-%ED%94%84%EB%A6%AC%EB%B7%B02Positional-Encoding%EA%B3%BC-Residual-Connection

오른쪽의 Decoder도 n번 반복되지만 sub layer는 총 3개로 이루어져 있다. 위에 두개는 동일하지만 가장 먼저 오는 layer은 Masked Multi-head attention을 사용하고 있다. 이는 프리뷰 1에서 다루었으므로 아래 글을 읽기전에 먼저 읽으면 좋을 것 같다.

https://velog.io/@xuio/Transformer-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-%EC%A0%84-%ED%94%84%EB%A6%AC%EB%B7%B0

Encoder에서 Query, Key, Value의 연산으로 나온 행렬 중, Key와 Value만을 가지고 Decoder로 넘겨주게 된다. 그리고 Decoder에서는 Masked Decoder Self-Attetion을 통해 나타난 Query Vector와 Encoder에서 넘겨받은 Key, Value의 연산으로 행렬을 만들게 된다.

Decoder에서 이러한 방식을 사용하면, Decoder는 Masked Self-Attention을 통해 이전의 Output이었던 것들로만 만든 Query와 Encoder의 Key, Value를 통해 학습된 관계성을 바탕으로 단어를 예측하게 된다. 이후에는 Attention을 수행할 때에 Masked할 필요가 없으므로 기존의 Multi-head Attention을 사용하게 되는 것이다. 이와 같은 Decoder들을 거쳐나가며 계속해서 Encoder와 유사한 행렬을 만들어준다.

최종적으로 나타난 결과물들에 선형변환을 시켜주어 기존에 One-hot embedding한 차원으로 돌려주고 Softmax를 사용해 확률로 바꾸어 가장 높은 확률을 지닌 vector를 결과물로 내보내게 되는 것이다.

🏋️‍♀️ Training

Optimizer

train에서 특징적으로 바라볼 것은 optimizer에서 Adam을 사용하는 동시에 learning rate를 고정이 아닌 유동적으로 사용했다는 것이다.

위의 식을 통해서 learning rate를 조절해주었는데 이것의 식은 아래 그래프와 같다.

warmup_step까지는 linear하게 learning rate를 증가시키다가, warmup_step 이후에는 step_num의 inverse square root에 비례하도록 감소시킨다.

이렇게 하는 이유는 처음에는 학습이 잘 되지 않은 상태이므로 learning rate를 빠르게 증가시켜 변화를 크게 주다가, 학습이 꽤 됐을 시점에 learning rate를 천천히 감소시켜 변화를 작게 주기 위해서라고 한다.

이것은 Adam optimzier의 특성과도 유사하게 처음에는 momentum을 주어 빠르게 변화시키다가 일정 수준 이후에는 많이 변동된 가중치에는 penalty를 부여하여 보다 천천히 변화시키려고 하는 것이다.

또한 Adam의 논문에 따르면, β1 = 0.9, β2 = 0.98 ϵ\epsilon = 10−9이 최적의 hyperparameter라고 나오는데 그것을 따라 설정해 주었다.

Regularization

논문에 자세히 나와있지는 않지만, Regularization을 위해 Residual Dropout을 사용했다. 즉, input x를 output y에 더해주기 이전에 y에 dropout을 실시해주었다. 또한, positional encoding시에도 dropout을 사용했다고 나온다.

그러나 몇몇 구현에서 보면, Encoder 자체 내에서도 Dropout을 사용해주는 경우가 있다. 즉, 논문에는 나와있지 않지만 Transformer를 개량하면서 사람들이 추가하게 된 것으로 보인다.

Label Smoothing

Label Smoothing은 데이터 정규화(regularization)에서 사용되는 테크닉으로 모델의 일반화 성능을 높여줍니다. 하지만 이 기법 역시 내부 작동 원리 등에 대해서는 거의 밝혀진 바가 없다. 이를 고찰하기 위해 제프리 힌튼 교수가 https://arxiv.org/pdf/1906.02629 논문을 내었었는데, 이는 Smoothing이 왜 잘 되는지에 대한 고찰을 담고 있다.

이 논문은 다음에 간단하게 다뤄보자..!

어쨌든 이것은 기존의 정답이 4개였다면 [ 0 , 1, 0, 0] 이었을테지만 여기에 조금 조작을 가해 α=0.1\alpha = 0.1이라면 [0.025,0.925,0.025,0.025]으로 정답을 만드는 것이다. 이렇게 되면 모델은 덜 overfitting되게 되고 더 좋은 일반화 성능을 보인다.

🎯 Result

논문에 따르면 모델의 기본 성능은 기존의 Ensemble보다도 좋은 성능을 발휘하고 있다고 말한다. BLEU는 영어 독일어의 경우 앙상블 모델보다도 2의 수치가 높은 성능을 발휘하고 영어 프랑스의 경우는 그 정도는 아니지만 최고의 성능을 보였다.

위의 사진을 파라미터를 어떻게 설정하냐에 따라서 성능이 달라지고 있음을 보이는 것이다. 최고의 성능을 가장 밑단에 있는 실험으로 구현이 가능했다.

각각의 영역들을 살펴보면 다음과 같다.

  • (A) head의 개수, dk.dv 값 변경한 경우 : 최종 차원은 변경하지 않으면서 head 수만을 증가시키면 오히려 성능이 떨어진다.
  • (B) key dimension 변경 : key demension을 변경시킬 경우, 자동으로 Query도 변경되는데 이는 dimension이 어느 정도 큰 것이 좋다.
  • (C) : 모델의 크기를 키운 경우 : 모델이 커지면 성능이 더 좋아진다.
  • (D) dropout 의 영향 : 적절한 dropout은 성능을 향상시킨다.
  • (E) : positional embedding의 중요성 : learned positional embedding을 사용해도 성능에 큰 변화는 없다.(오히려 시간은 증가)

여기에 더해 논문 저자들은 Transformer가 다양한 task에 적용이 가능한지 English Constituency에 적용해보았다. 학습에 있어 40000개의 문장을 학습시키고 1700만개의 문장을 semi-supervised 학습시켰다. paramete는 번역에 사용했던 그대로 사용했다.

결과적으로 많은 튜닝이 없이도 최고의 성능을 발휘했다고 한다.

✏️ 논문리뷰 후기

드디어 길고 길었던 Transformer 리뷰가 마무리 되었다. 기존에 번역을 위한 논문의 총집합이었다고 생각되는 논문을 공부하며 정말 알게 된 점이 많았던 것 같다. 또한 이번 네이버부스트캠프에서도 해당 내용을 다루었었는데 덕분에 이해가 훨씬 더 잘 되었던 것 같다.

이제 transformer는 어떤 딥러닝 분야인지를 막론하고 정말 중요한 arhchitecture이 되었다고 생각한다. 얼마전, ViT에서도 트랜스포머를 사용해 이미지를 만들어내고 있었다. 작년에 나왔던 DALL-E 역시 transformer를 차용한 모델이라고 알고 있다.(맞나..?) 논문 리뷰를 마쳤음에도 반드시 다시 보게 될 논문 1순위가 아닐까 싶다.

아무튼 다음 리뷰가 optimizer가 될지, AAE가 될지, BERT가 될지 모르겠지만 4회에 걸친 transformer 논문리뷰 끝~

참고 : https://wikidocs.net/31379

https://blog.lunit.io/2017/03/28/neural-gpus-and-extended-neural-gpus/

https://www.quantumdl.com/entry/9%EC%A3%BC%EC%B0%A81-EndtoEnd-Memory-Network

https://kangbk0120.github.io/articles/2018-03/end-to-end-memorynet

https://www.youtube.com/watch?v=AA621UofTUA&list=PLRx0vPvlEmdADpce8aoBhNnDaaHQN1Typ&index=9

https://ganghee-lee.tistory.com/41

https://itrepo.tistory.com/36

https://www.youtube.com/watch?v=Yk1tV_cXMMU

https://better-tomorrow.tistory.com/entry/Transformer-Decoder-Masked-Self-Attention

https://www.youtube.com/watch?v=AA621UofTUA&list=PLRx0vPvlEmdADpce8aoBhNnDaaHQN1Typ&index=9

진짜 많이 봤넹

profile
프리미어와 IDE만 있다면 무엇이든 만들 수 있어

0개의 댓글