2017년에 Transformer가 나온 이후로 정말 많은 후속 연구가 있었습니다. 기본적인 "Attention is all you need"에서의 Transformer의 구조는 위와 같습니다. 그 이후로 Transformer는 아래와 같은 방향으로 주로 발전했습니다.
- Complexity의 개선
- 성능 개선
- 도메인 확장
이의 개선 방법에 따라 아래와 같이 범주화 할 수 있습니다.
- Module level
- Architecture level
- Pre-Train
- Application
Recap: 트랜스포머(Transformer) & Computational Costs
실제로 Self-attention, Recurrent, Convolutional, restricted self-attention의 시간 복잡도와 Sequential Operation, Maximum Path Length는 위와 같습니다. 우리가 이전에 $O(n^2 \dot d$는 기존에 비해 개선된 것이라고 했습니다. 하지만 NLP domain에서와 같이 $n$(=seq_len)이 매우 길게 들어오면 이 또한 실제로 느린 Complexity라고 할 수 있습니다.
그리고 Transformer에서의 self-attention, position-wise FFN의 시간복잡도는 위와같고 #Parameters도 위와 같습니다. 실제로 모델에서도 다양한 최적화 기법(i.g. Skip-connection,..) 등과 Batch Size에 따라서도 모델의 계산 복잡도가 달라집니다. 위는 일반적인 상황을 가정한 모델의 수치입니다.
갑자기 궁금한점이 생겼습니다. 배치 크기를 1로 설정하는 것은 왜그런것일까요?
배치 크기를 1로 설정하는 것은 "온라인"학습이라고도 하며, 이러한 접근 방식은 특정 상황과 목표에 따라 여러 이유로 사용될 수 있습니다
1) 메모리 절약
2) 데이터 불균형 해소
3) 온라인 학습 -> 실시간 시스템에서의 스트림을 모델이 즉시즉시 업데이트 할 수 있도록
4) 고성능이 필요하지 않는 경우
5) 정규화 효과
6) 탐색적 연구 -> 일부 연구에서 활용
Module-level의 개선 - Attention
Self-attention은 Transformer의 핵심 구성 요소이지만, 후속 연구에서 크게 2가지 문제가 제기되었습니다.
- Complexity
- $O(n^2 * d)$의 속도는 나쁘지 않지만, 전체 transformer의 연산 중 bottle-neck입니다. 만약 빠르게 할 수 있다면 전체적인 속도는 빨라질 것입니다.
- Efficient Transformer!
- $O(n^2 * d)$의 속도는 나쁘지 않지만, 전체 transformer의 연산 중 bottle-neck입니다. 만약 빠르게 할 수 있다면 전체적인 속도는 빨라질 것입니다.
- Structural prior
- Self-attention은 CNN, RNN과 다르게 input에 대한 가정이 없습니다.
- CNN은 주변의 인근 feature들이 관련 있을 것이라는 정보, RNN은 Time-series이므로 관련된 정보를 time에 over해서 얻을 것이라는 정보가 있는 반면 self-attention은 없습니다.
- 그러므로 pre-training 등이 없다면 작거나 적당한 사이즈의 데이터에서 overfit하기 쉽습니다.
- Self-attention은 CNN, RNN과 다르게 input에 대한 가정이 없습니다.
이를 개선하기 위한 방법론들에 대해 차례차례 알아보도록 하겠습니다.
Module-level의 개선 - Attention: sparse Attention
Attention은 기본적으로 모든 query에 attend를 시도합니다. 하지만 실제로 attention이 필요한 영역은 일부에 불과합니다. 그래서 실제로 softmax를 취하기 전에 unnormalized attention matrix $A_{ij}$를 아래와 같이 정의합니다.
왼쪽과 같이 그리고 Position기반으로 sparse attention을 정해서 미리 정의된 패턴으로 sparsity를 정의하는 방법을 활용합니다. 왼쪽과 같이 atomic한 sparse pattern이 있습니다. global이 있을 수 있고, CNN처럼 local pattern이 있을 수 있고, dilated, random, block등등 다양한 패턴이 존재합니다.
그래서 왼쪽에 있는 predefined된 모형을 조합하여 오른쪽과 같은, Star-transformer, long-former, big-bird등을 만들 수 있게됩니다.
그리고 Content 기반 sparse attention기법도 있습니다. 이는 input content에 따라 sparse graph를 생성합니다. 즉 input에 따라 sparse attention의 형태가 달라지는 것을 말합니다. 이에는 Routing Transformer(=K-means clustering 기반), Reformer(=locality-sensitive hashing: LSH기반)이 이에 속하게 됩니다.
이는 쉽게 말해서, attention을 계산할 토큰의 부분집합만을 선택합니다. 이 규칙은 입력 토큰의 "내용"을 기반으로 할 수 있으며, 이러한 선택은 연산의 복잡도를 크게 줄일 수 있게 됩니다.
왼쪽은 Rounting Transformer, 오른쪽은 Reformer인데, 이를 통해 현재 단어와 문법적 또는 의미론적으로 관련된 이전 단어들만 고려할 수 있도록 설계될 수 있다고 합니다.
Module-level의 개선 - linearized attention
linearized attention이란 Kernel method등을 이용하여 bottleneck인 matrix연산 및 softmax를 linear 연산으로 줄이는 방법입니다.
선형대수 시간에, input space X를 linear model이 해결할 수 있는 형태인 feature space $\pho$(X)로 만들면 문제를 해결할 수 있다고 배웠습니다. 이는 마치 PCA를 이용해 새로운 feature를 찾는 것과 같은 원리라고 할 수 있습니다. 여기서 사용한 함수 $\phi$를 기저함수(base function) 혹은 feature map이라고 합니다. 대개 SVM을 통해 내적을 통해 계산하게 되면 시간복잡도가 크게 증가하게 된다고 합니다. 제가 수학적인 측면이 약해서 이에 대한 증명과 설명은 나중에 다루어 보도록 하겠습니다
Module-level의 개선 - query prototype & memory compression
query prototype & memory compression은 query (디코더에 집중하고자 하는 부분; query prototype)이나 key-value(인코더 부분; memory compression) pair의 크기를 줄여 computational complexity를 줄이는 방법입니다. 이에는 Clustered attention, informer등이 이에 속하게 됩니다.
Module-level의 개선 - low-rank self-attention
선형대수학적으로 2차원 행렬 Matrix와 3차원 이상 행렬 Tensor는 data를 나타내고 처리할 수 있는 도구입니다. 그리고 이러한 행렬과 텐서는 다양한 분해가 가능합니다. 예를 들어 low-rank 행렬은 SVD(=특이값 분해) 등을 사용하여 low-rank 근사로 나타낼 수 있는데, 이 근사는 행렬의 중요한 정보를 캡쳐하면서 차원을 줄이는데 사용될 수 있게됩니다.
위와같이 low-rank self-attention은 이론적/실험적으로 self-attention matrix는 종종 low-rank인 경우가 많은데, 이러한 성질을 이용해서 계산복잡도를 낮추는 방법입니다.
Module-level의 개선 - with prior knowledge
Attention은 기본적으로 모든 영역에 동일한 가중치를 두고 학습을 합니다. 특정 도메인의 데이터 등으로 부터 얻은 가중치에 대한 기본 knowledge를 attention의 선험지식(prior)로 활용하는 것입니다.
여기에는 데이터의 특성에 대한 locality를 반영하는 prior를 이용하는 모델인 Gaussian transformer, CNN와 같은 lower module로부터 prior를 얻는 모델인 predictive attention transformer, realformer등이 있습니다.
Module-level의 개선 - multi-head mechanism improvement
그 다음에 transformer의 multi-head 구조를 보완하여 개선하는 방법입니다.
기존에 위와같이 Vanilla transformer에서는 각 Head가 상호작용하지 않고 서로 독립적으로 Attention을 수행해서 어떻게보면, 같은 작업을 비효율적이게 수행하는 것처럼 느꼈을 겁니다.
그래서 이 Head끼리 서로 상호작용할 수 있는 여지를 주어 성능을 개선한 collaborative multi-head attention이 있습니다. 아래 식에서 모든 head가 동일한 W를 공유하며, mixing vector $m_{i}$로 각 head를 분리합니다.
그 외에도 multi-head with Restricted spans으로 Heads별로 attention을 수행하는 범위(span)을 제한할 수도 있어서, Head별로 다른 context를 관측할 수 있게 할 수 있습니다.
Module-level의 개선 - Positional representation
기존에는 Absolute position을 사용하여 positional encoding을 수행하였습니다.
그렇지만 앞서 얘기 했든, 다른 함수나 규칙을 사용할 수도 있었을 겁니다.
두번쨰로, Relative position을 사용할 수 있는데, 실제 위치보다, 각 전후 input 간의 관계가 더 중요한 경우 relative position을 embedding하는 것이 더 좋을 수 있습니다. (i.e. Music Transformer) 이 relative position representation을 고정하지 않고, 학습 가능한 embedding 정보로 적용할 수도 있습니다.
Architecture-level에서의 개선: recurrent / hierarachical
일반적으로 시퀀스 길이에 대한 self-attention의 2차적 복잡성은 일부 finetuning에서의 down sampling task의 성능을 크게 제한할 수 있습니다. 예를 들어 언어 모델링에서는 일반적으로 장거리 컨텍스트가 필요한 것과 마찬가지로요.
위와같은 Recurrent, hierarachical 한 transformer의 디자인이 성능 향상에 도움을 줄 수 있을겁니다
Applications의 확장 (vision / video)
위와같, NLP 도메인 뿐만 아니라, 이미지나 음성 분야에서 Transformer를 활용한 모델이 SOTA를 한번 찍고, 이에 대한 논문이 폭발적으로 나오게 되었습니다.