Transformer vs CNN
- 트랜스포머는 multihead self attention을 사용해 long range dependencies를 잘 모델링한다.
- Convolution 은 receptive field 가 제한되어 네트워크 depth 가 늘어나면서 linear하게 커진다.
- 트랜스포머는 귀납적 편향(inductive bias)가 부족해 large scale에서 트랜스포머의 이점이 발견된다.
Transformer vs LSTM
- RNN, LSTM의 약점으로 많이 언급되었던 것은 input을 순차적으로 받아 병렬처리가 어렵다는 점이었다. 순차적으로 입력받는 것이, 각 input의 위치정보를 반영할 수 있게 해주었는데, Transformer는 순차적으로 Data를 넣는 것이 아니라, Sequence를 한번에 넣음으로써 병렬처리가 가능하면서도, Attention 등의 구조를 통해 어떤 부분이 중요한지를 전달하여, 위치정보를 반영할 수 있게 되었다. Transformer의 전체적인 구조는 다음과 같다.
Attention is all you need
- 일반적으로 시계열 분석이라 하면, Recurrent Neural Network (RNN)이나 Long-Short Term Memory (LSTM)알고리즘을 배운다.
- 이보다 더 최신이면서, 간단한 알고리즘으로 GRU가 소개되었다. 이는 RNN의 장기간 학습 과정으로 인해 소실되는 정보들 중에 필요한 부분 (Remember, forget)들을 뒤의 State로 넘겨주면서 장기간 학습이 가능해지게 되었다. 기존 RNN의 약점을 보완하는 LSTM과 이를 잇는 GRU는 Motivation도 직관적으로 이해하기도, 사용하기도 편하다. Tensorflow나 Keras에서는 해당 Layer를 Import하고, Input의 Shape을 맞춰준 후에, Layer에 넣기만 하면 된다.
- 이를 능가하는 Transformer가 등장했다.
Seq2Seq와 Attention
Transformer를 이해하기 위해서는 Sequence-to-Sequence(Seq2Seq)와 Attention이라는 개념부터 정리할 필요가 있다.
- Sequence-to-Sequence는 이름을 통해 직관적으로 이해하기 쉽듯이, 어떤 Sequence (연속된 데이터)들을 다른 Sequence로 Mapping하는 알고리즘이다. 가장 알기 쉽게, 한글로 작성된 문장을 영어로 작성된 문장으로 번역하는 Translation이 가장 많이 언급되는 Application이라 할 수 있다.
- Seq2Seq은 크게 정보를 압축하는 Encoder 부분과 이를 통해 새로운 Data를 생성해내는 Decoder 부분으로 나눠져 있다. 번역으로 예를 들면, 압축되는 정보들은 '단어 및 어간'에 관한 정보들이다.
- 시계열 분석에 LSTM를 적용하면 잘 작동하지만, LSTM의 Encoder에서 Decoder로 들어가는 과정에서, 전달되는 정보에서 소실되는 시간 정보들이 생긴다. 예를 들어, output Sequence를 얻기 위해서는 단어의 Mapping만으로 충분한 것이 아니라, Keyword와 중요한 부분들에 대한 정보가 필요하다.
이를 위해서 나온 개념이 Attention이다. 쉽게 설명하면, 'Input Data의 이 부분 (Time Step)이 중요해요! 집중!' 가중치들을 같이 output으로 넘겨주는 방식. 따라서, output sequence를 생성해내는 매 Time step마다 이전 input time step들을 다시 보고 중요하다는 부분을 참고해서 output을 생성하는 방식이다.
- 말만으로는 매우 직관적이고 좋은 방법이지만, 구현으로 들어가면 어떻게 '이 부분이 중요해요'라는 수치를 만들지를 알아야 한다. 다양한 방식들이 있지만, 가장 이해하기 쉽고 자주 언급되는 내적 어텐션으로 정리해보자.
- Dot product Attention을 위해서는 Encoder의 Hidden state (h)와 Decoder의 Hidden state함수 (s)가 얼마나 유사한지를 표현하기 위한 내적으로 시작한다. 두 분포의 유사도를 비교할 때 내적을 많이 사용한다는 점을 알고 있으면 좋다.
- Dot product Attention에는 내적이 사용되지만, 다른 Attention 함수들도 있으니, 찾아보고 여러 함수를 test해보는 것도 좋을 것 같다. (e.g., scaled dot, concat) 이렇게 내적으로 얻은 Attention score들을 Softmax 함수에 넣어서 Attention Distrubtion을 얻을 수 있다. 구한 Attention Distribution 값과 Encoder의 Hidden state와 가중합을 해서, Attention Value값을 구하여 Decoder의 Hidden state 차원 밑에 concat하고, 이를 output 계산의 input으로 넣으면 Attention 알고리즘이 마무리 된다.
- 여기서의 포인트는 'Input들이 얼마나 output 생성에 기여하는지를 표현하는 Attention 알고리즘의 개념'이다.
Transformer
A. Encoder
RNN, LSTM의 약점으로 많이 언급되었던 것은, 단어를 순차적으로 입력받아서, 이를 계산하기 때문에, 병렬처리가 어렵다는 점이었다. 순차적으로 입력받는 것이, 각 input의 위치정보를 반영할 수 있게 해주었는데, Transformer는 순차적으로 Data를 넣는 것이 아니라, Sequence를 한번에 넣음으로써 병렬처리가 가능하면서도, Attention 등의 구조를 통해 어떤 부분이 중요한지를 전달하여, 위치정보를 반영할 수 있게 되었다. Transformer의 전체적인 구조는 다음과 같다.
Transformer Architecture
먼저 Embedding은 data를 임의의 N-dimension data로 만들어주는 단계다. (자연어 처리에서는 단어 등의 단위를 표현하는 N-dimension 데이터로 만들어주어야 함.)
- 본격적인 Transformer는 Positional Encoding으로 시작한다. 앞에서 설명했듯이, RNN이나 LSTM처럼 순차적으로 데이터를 넣어주지 않기 때문에, 데이터의 위치정보를 전달해주는 방법이 필요한데, Positional Encoding이 이 역할을 담당한다. Positional Encoding은 'Sequence 내에서 해당 정보의 위치 정보'와 'Embedding된 데이터'를 사인함수와 코사인함수 형태로 만들어서 다음 Layer의 Input으로 전달하게 된다. 쉽게 설명하면, Embedding을 할때 위치 정보까지 함께 넣어준다.
- 이렇게 정리된 Input Data들은 본격적으로 Encoder로 들어간다. Encoder는 Multi-head Self Attention / Add & Normalize / Position-wise FFN라는 모듈들로 구성되어 있다. Multi-head Self Attention은 앞에서 정리한 Attention과 비교했을 때 살짝 차이가 있다. Attention이 Encoder의 Hidden state와 Decoder의 Hidden state를 연산해서 Attention score값들을 계산했다면, Self-Attention은 Encoder로 들어간 벡터와 Encoder로 들어간 모든 벡터를 연산해서 Attention score 값을 구한다. 이런 Self-Attention을 통해서 각 Input Data들의 유사도를 추정할 수 있다.
- 만약 'The Animal didn't cross the street, because it was so tired'라는 문장에서 it이 Animal을 가리키는건지 street를 가리키는 것인지 알기 위해, 우리가 독해를 하면서 it이 무엇에서 오는건지 학습하는 것과 비슷한 방식을 거칠 수 있다.
- 이를 위해 Attention 함수의 Query (Q), Key (K), Value (V)를 의미하는 Weight 행렬과 'scaled Dot-Product Attention'방식으로 연산하여 Attention Value Matrix (a)를 만들어낸다. 이 과정에서 d_model개의 차원을 num_heads개 그룹으로 묶어서 d_model/num_head 개의 Attention value matrix를 뽑아낸다.
- 직관적으로는 여러 head를 가지는 Attention value matrix를 뽑아냄으로써 다양한 관점으로 연산을 할 수 있게 만드는 것이다. 이렇게 여러개로 나온 Attention value matrix는 다시 d_model 차원으로 합쳐진다.
Multi-head Self Attention
Add & Normalization은 Residual Connection과 layer Nomralization이다. Residual Connection은 (CNN RseNet) 연산을 한 부분과 안 하는 부분을 더해 층이 쌓일 때, 뒤쪽까지 학습이 잘 전달되지 않는 것을 방지할 수 있다. 그 다음으로 들어가는 FFN은 쉽게 얘기하면 Fully connected layer로 어려운 점 없이 넘어갈 수 있다. 이렇게 Multi-head Self Attention / Add & Normalize / Position-wise FFN라는 모듈들로 구성된 Encoder 함수를 N층 쌓고 여기서 나온 데이터들이 Decoder로 흘러간다.
B. Decoder
Encoder처럼 Positional Encoding과 Multi-head Self Attention을 한다는 점은 비슷하지만, 두 가지의 차이가 있다.
- Multi-head Self Attention에 Masked가 들어갔다는 점이 첫 번째 차이점인데, Decoder는 현재까지 들어온 데이터 보다 미래의 데이터를 보면서 학습하면 안 되기 때문에, 미래에 해당하는 Attention score들에는 매우 작은 음수값 (-1e9)을 넣어서 이 부분을 Masking해버린다.
- 그리고 한번 더, Attention을 진행하는데, 이 때는 Self-Attention이 아니라, Attention을 사용하여 Output을 추측하는데 사용한다. 이 때의 Input으로는 Decoder에서 사용한 Masked Attention Matrix와 Encoder에서 만든 Matrix를 Attention에 넣게된다. 이후 FFN과 Add & Normalization Layer를 통과하는 것이 decode layer이고, 이를 M층 쌓아 마지막으로 몹시 반가운 Dense Layer와 Softmax Layer로 넣으면 Transformer가 완성된다.
참고 - 블로그, Vaswani, Ashish, et al. "Attention is all you need." NIPS. 2017.
'AI > 트랜스포머' 카테고리의 다른 글
Swin Transformer 논문 리뷰 - Hierarchical Vision Transformer using Shifted Windows (2) | 2022.06.26 |
---|---|
ViViT: A Video Vision Transformer (0) | 2021.12.29 |
댓글