드디어 오랜 시간 공부해온 트랜스포머에 대해서 정리할 수 있을 정도로 개념이 쌓인 것 같다. 그래서 순차적으로 쭉 자세히 정리해보려고 하는데, 인트로 느낌으로 논문 리뷰를 하면 좋을 것 같다.
https://arxiv.org/abs/1706.03762
서론
논문이 나왔을 2017년 NLP의 여러 분야에서 SoTA의 성능을 보였던 Recurrent한 언어모델 (RNN, LSTM, GRU 등)과 이를 기반으로 한 Seq2Seq 모델들을 언급한다. Recurrent한 모델의 한계는 longer sequence lenght, 즉 input의 길이가 길어지면 성능이 떨어진다는 것이다. 또한 순차적으로 계산을 처리해야한다는 점 때문에 병렬적인 처리가 불가능해진다는 점도 단점으로 지적한다. factorization tricks 나 conditional computation 같은 방식으로 효율성을 크게 증가시키고, 한계를 약간 넘긴 했으나, 역시나 긴 input에 대해선 문제가 남아있다고 언급한다. Attention Mechanism은 이런 긴 Input에서의 해결법으로 Recurrent한 모델들에서 함께 쓰여져오며 이러한 문제점들을 해결하는 데에 도움을 주었다고 한다.
하지만 본 논문에선 이런 Recurrent를 완전히 버리고, Attentinon 메커니즘만을 사용하여 병렬화를 가능하게 하고, 성능 또한 기존 SoTA 모델들을 완전히 뛰어넘는 Transformer라는 모델을 제안한다. (Recurrent를 버리고 Attention만을 사용했기에 제목이 Attention is All You Need가 된다.)
배경
Extended Neural GPU, ByteNet, ConvS2S 같은 모델들을 언급하는데, 이 모델들은 CNN을 사용하여 병렬 계산을 가능하게 하지만 입력과 출력에서 임의의 위치 정보를 사용한다는 점에서 역시나 긴 거리에 있는 정보 계산은 잘 못 한다는 단점이 지적된다. 트랜스포머는 Muti-Head Attention을 사용해서 이 점을 해결하면서 동시에 적은 계산을 보장한다. (attention-weighted position을 평균내면서) 또한 intra attention이라고도 불리는 Self-Attention 을 사용하면서, 한 문장의 의미를 더욱 잘 이해할 수 있게끔 한다고 설명한다. 트랜스포머 이전에도 Self-Attention이 존재하기는 해서, 독해나 요약, 번역 등의 task에서 많이 성공적으로 사용되었다고 한다. 그러나 어디까지나 이런 Attention 기법들은 항상 Recurrent한 모델들과 함께 사용되어왔으며, 트랜스포머는 처음으로 이 Recurrency를 버린 모델로 제안된다.
모델 구조
이렇게 단순하면서도 복잡한 것 같은 트랜스포머의 모델 구조가 제시된다. 전체적인 흐름은 Encoder에서 Input x를 문장의 표현인 z로 변환하고, 디코더에서 z로 output인 y를 생산해내는 구조다.
논문에서 소개하는 모델 아키텍처의 상세 내용은 차후 포스팅들에서 하나하나 자세히 살펴볼 것이라 여기선 간략하게 개요만 정리한다.
- 인코더+디코더 Stacks
- Scaled dot-product Attention
- Multi-Head Attention
- Attention의 적용
- Position-wise Feed-Forward Network
- Embeddings and Softmax
- Positional-Encoding
순서대로 치자면 Embedding - Positional-Encoding - 인코더 - 디코더 - 임베딩이 되겠다.
인코더 내에선 인풋이 임베딩과 Positional-Encoding 이후에 Multi-Head Attention을 거치면서 Scaled dot-product Attention이 적용되고, PFFN 을 거쳐서 디코더의 Multi-Head Attention 레이어로 넘어간다. 디코더 내에선 인풋이 똑같이 임베딩과 Positional-Encoding을 거치고, Masked Multi-Head Attention 레이어를 거치고 Multi-Head Attention 레이어를 통과한다음 PFFN을 거친다. 이후 Linear를 한 번 더 거친 다음 Softmax 함수를 통과하여 최종적인 Output -Probability가 계산된다.
왜 셀프 어텐션인가?
이 파트에선 Self-Attention이 Recurrent 모델과 Convolution 모델들에 비해 무엇이 더 좋은가를 설명한다.
첫 번째 장점은 계층별 계산 복잡도가 매우 낮다는 것이다. Sequentional Operation 파트를 보면 O(n)의 연산 시간만이 필요한 Recurrent와는 달리 O(1)의 시간이 필요하다.
두 번째 장점은 병렬화할 수 있는 계산량이 훨씬 많다는 것이다. Complexity per Layer를 보면 Self-Attention은 O(n^2*d)의 복잡도를 갖지만, Recurrent는 O(n*d^2), Convolutional은 O(k*n*d^2)의 복잡도를 갖는다. 이는 n이 d보다 짧을 때 더 큰 차이를 체감할 수 있는데, 당시의 대부분의 모델들이 SoTA 성능을 달성한 케이스를 보면 n이 d보다 훨씬 짧음을 언급한다.
세 번째 장점은 long-range의 dependency를 잘 학습한다는 것이다. Maximum Path Length 파트를 보면 그 차이를 잘 느낄 수가 있다.
n이 d보다 큰 경우에 대해선 제한된 Self-Attention을 사용하여 근처 r개의 이웃에 대해서만 Self-Attention을 진행할 수 있다고 한다. 다만 이런 방법은 Maximum Path Length를 O(n/r)로 키우게 되는데 이 점에 대해선 추가 연구를 진행할 것이라고 언급했다.
이후엔 Convolution과의 Maximum Path 길이를 비교하는 내용이 나온다. Separable Convolutions라는 기법을 쓰면 계산량을 비약적으로 줄일 수 있다고 하는데, 이 Convolution에서의 최선의 방법이 트랜스포머에서 적용한 Self-Attention과 PFFN의 시간복잡도와 동일하다고 밝히며 모델의 우수성을 더 어필한다.
실험과 결과
이후엔 실험과정과 결과를 상세하게 설명해주었다.
자세한 내용은 옮길 필요가 없을 것 같고, 한 가지 특기할 만한 건 하이퍼파라미터에 따른 성능 변화다. base 모델을 바탕으로 big 모델까지 모델의 차원, PFFN의 차원, 어텐션 헤드의 개수, Dropout 비율 등이 성능에 큰 영향을 미쳤다는 것이다. 이는 하이퍼파라미터의 정교한 설정이 성능을 결정할 수 있음을 시사하며, dot-product Attention 보다 더 정교한 함수를 사용해야 할지도 모른다고 말했다.
이렇게 논문을 정리해보았다.
'NLP' 카테고리의 다른 글
[NLP] Transformer의 Attention Head 파이썬으로 정리 (3) | 2024.10.30 |
---|---|
[NLP] Transformer의 Attnetion 간단한 정리 (0) | 2024.06.11 |
[NLP] Transformer의 Input은 어떻게 Embedding Vector로 변환되나? (0) | 2024.06.06 |
[NLP] Transformer의 Positional Encoding 정리 (0) | 2024.06.06 |
[NLP] 트랜스포머 사용 시 숫자 텍스트 데이터 전처리에 대해 (0) | 2024.04.18 |