이번에 리뷰할 논문은 자연어 처리를 시작으로 여러 가지 task에 적용가능한 Attention만을 사용하는 구조를 고안한 트랜스포머이다.
논문리뷰시 architecture쪽을 맡아 이 부분을 집중적으로 리뷰하겠다.
Abstract
당시 통역 task는 encoder로 context vector로 만든 뒤 decoder를 이용해 이를 번역하는 과정이 메인이었으며 이에 Attention mechanism을 이용하여 추가적으로 여러 시퀀스의 hidden state에서 정보를 뽑거나 넣어주는 방식의 논문이 나오고 있었다.
하지만 Transformer는 RNN, CNN 구조 없이 오직 Attention mechanism만을 활용하여 연산을 병렬적으로 수행하게 되면서 기존 sota 모델들보다 더 적은 훈련시간 안에 더 높은 성능을 달성할 수 있었다.
Introduction
Introduction에서는 기존 통역 task의 흐름을 짧게 설명했다.
- RNN, LSTM, GRU은 현재 입력상태ht가 이전의 은닉상태 ht-1을 지속적으로 받아야 하므로 긴 시퀀스의 데이터를 처리하는데 있어서 취약하며 메모리적 문제로 훈련이 어려움
- Attention mechanism을 통해 input 또는 output의 거리에 상관없이 가중치를 흘려주는 방식을 통해 이전 방식보다 높은 성능을 달성했지만 이 역시 RNN 구조를 기반으로 만들어졌으므로 한계가 존재함
- 따라서 우리는 이러한 반복 구조를 버리고 attention메커니즘만을 사용한 모델로 기존의 문제를 해결한 모델을 만듦
Background
Background에서는 이어서 Convoloution을 base로 사용하여 시퀀셜 정보를 병렬적으로 처리했던 예를 보여준다.
하지만 여기서 Transformer가 이러한 모델보다 좋은 이유를 크게 두가지로 설명한다.
- Convolution을 거치면 상대적으로 먼 거리에 있는 단어들끼리의 연관성을 얻기 위해서는 중간에 많은 연산이 필요한데 Transformer는 Attention구조를 사용하여 이 점에서 더 유용하다
- Attention구조를 사용하여 줄어든 effective resolution을 Multi head Attention구조를 사용하여 대응하였다 (CNN구조 모델에서 Maxpooling후 channel 수를 두배로 하는 연산과 유사하다 생각된다)
Model Architecture
Transformer가 Attention구조를 활용하여 성능을 끌어올린 모델임은 이미 알고 있는 사실일것이다.
모델 구조를 알아보기 전에 어째서 Attention구조를 사용하였는지 설명해 보겠다.
기존의 Attention은 디코더의 특정 시퀀스에서 인코더의 모든 타임스텝의 정보를 참고하기 위하여 사용되었다.
최초로 고안된 Additive attention은 score를 구하기 위한 추가적인 파라미터가 존재하여 학습이 느리고 메모리 사용량 역시 컸다.
따라서 저자는 Dot product Attention을 사용하였는데 Transformer에서는 Q, K, V가 입력 데이터 하나의 문장으로 만들어진다.
기존에는 encoder decoder기반의 모델을 사용하였으므로 벡터를 구하는 방법 역시 다른 것이 당연한데 대체 어떤 점에서 성능차이를 이끌어낸 걸까?
해답은 Self-Attention에 있다. Q, K, V는 하나의 입력 데이터로부터 나왔으므로 이전과 다르게 각 단어 간의 연관성을 파악할 수 있게 된다.
input을 d_model size의 임베딩벡터로 만든 다음 포지셔널 인코딩의 값을 더해주어 문장 전체에 문장의 시퀀셜 정보를 더해준다.
식에서 pos는 행을 i는 열에 대한 인덱스를 의미한다. 각행에 더해주는 값이 주기적으로 조금씩 증감하므로 벡터에 위치에 대한 정보를 인코딩해줄 수 있습니다.
추가적으로 값의 증감으로 cos, sin 같은 주기함수를 사용한 이유는 시퀀스 길이에 상관없이 계정성을 넣어주기 위함이다.
이후 선형 변환을 거쳐 입력데이터로 Q, K, V 벡터를 만든 식과 같은 순서로 연산하여 Attention score를 구한 후
기존의 Dot-product연산에 루트d_k를 추가적으로 분모에 넣어 Q@K.T의 결과를 나눠주는데 이는 너무 큰 d_k를 가질 시 행렬연산의 결과 간의 차이가 너무 커지고 이 벡터가 softmax를 거치면 원핫벡터에 가까운 출력을 뱉는다.
이는 결국 gradient vanishing 문제로 이어지므로 d_k가 길어질 시 이를 적절히 제어해 주기 위함이다(확실히 알지 못하지만 이러한 방법을 temperature scailing이라 한다)
Transformer는 이러한 Scaled dot product 연산을 병렬적으로 h회 수행하는 MHA를 사용한다.
이때 각 vector공간 역시 h로 나누어지므로 연산결과를 concat하면 다시 d_model차원을 가지게 되며 이후 한 번의 Linear연산을 거친다.
Linear 연산을 거친 후에도 입력 데이터와 같은 차원을 가지고 있으므로 기존의 값과 residual연산을 진행할 수 있다.
Residual 연산 이후에 Layer normalization, Feed-Forward network까지가 한번의 인코더를 통과하는 과정이며
논문에서는 이 과정을 6번 거치게 된다.
디코더는 인코더와 다르게 디코더 모듈마다 2번의 어텐션연산과 한 번의 FFN으로 이루어져 있다
첫 번째 어텐션은 Masked multi head attentinon으로 attention점수에서 각 시퀀스에서 자신의 이후의 값을 보지 못하도록 이후의 시퀀스에 큰 음수값을 대입한다.
두 번째는 encoder-decoder attetion으로 기존의 연산과 동일하지만 K, V vector로 인코더의 값을 사용합니다.
모든 연산이 끝나면 기존의 RNN과 동일하게 d_model을 word_vector의 수에 맞게 변환시킨 다음 softmax를 거쳐 다음 단어의 출력을 예측할 수 있다.
Why self-attention
어째서 self-attention방식을 사용했고 성능향상이 이루어졌는데 에 관한 discussion파트이다.
저자는 총 3개의 이유로 self-attention을 적용했다고 서술한다.
- RNN의 총 연산량의 문제
- 이러한 연산을 병렬로 진행하여 연산량을 줄일 수 있었기 때문
- 긴 시퀀스 데이터에서 단어 간의 연관성을 높여주기 위하여
Conclusion
결론을 딱히 말할 필요가 있을까도 싶다. 트랜스포머는 번역에서는 sota급 성능과 매우 빠른 훈련 속도를 보여주었다.
Transformer의 아키텍처 부분을 특히 집중적으로 리뷰했는데 적어도 NLP쪽에서 어째서 그렇게 각광받는지 알 수 있을 것 같다.
기존과 완전히 다른 모델 구조와 그에 따라 Attention 구조가 전체 단어 간의 유사성을 찾기에 매우 유리해졌다고 생각한다.
아직 읽어보진 않았지만 멘토님의 언급에 따르면 Vision류의 Transformer는 오히려 너무 넓은 범위 간 유사성을 찾기보다는 이것을 적절히 제한하는 연구가 더 트렌디하다고 언급하셨다.
NLP와 Vision task 간의 다른 데이터 형태와 모델이 집중해야 할 부분 그리고 task의 타겟이 다르고 그에 따라 같은 모델을 정반대의 방향으로 발전시켜 나가는 점 역시 흥미로웠다.