일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- cs231n
- 딥러닝
- dropout
- Baekjoon
- Transformer
- do it! 알고리즘 코딩테스트: c++편
- Multi-Head Attention
- Machine Learning
- SQLD
- assignment2
- RNN
- CNN
- BFS
- Positional Encoding
- CPP
- Adam
- Alexnet
- marchine learning
- Algorithm
- deep learning
- C++
- Regularization
- Optimization
- DFS
- mask r-cnn
- computer vision
- 밑바닥부터 시작하는 딥러닝2
- Python
- 밑바닥부터 시작하는 딥러닝
- assignment1
- Today
- Total
newhaneul
[Seoul National Univ: Computer Vision] Lecture 13. Transformers 2 본문
[Seoul National Univ: Computer Vision] Lecture 13. Transformers 2
뉴하늘 2025. 6. 8. 14:07본 포스팅은 서울대학교 이준석 교수님의 M3224.000100 Machine Learning for Visual Understanding을 수강하고 공부한 내용을 정리하기 위한 포스팅입니다.
https://www.youtube.com/watch?v=AsH4HRWMY7E&list=PL0E_1UqNACXBhqjwBzFQ88YXWotXrKRG-&index=13
1. Bidirectional Encoder Representations from Transformers(BERT, 2018)
BERT는 사전학습 기반 자연어 처리 모델이다. Transformer Encoder 블록만 사용하며, 양방향(Bidirectional) attention을 수행하여 양쪽 문맥을 모두 고려한다. 기존의 단방향 모델들과는 다르게 완전히 양방향적인 문맥 정보를 학습하여 문장의 의미를 더 정확히 파악할 수 있다.
BERT의 Input sequence는 총 두 개의 문장으로 구성되어 있고, Token Embeddings, Segment Embeddings, Position Embeddings의 합이다.
1. Token Embedding
- 각 단어를 사전 학습된 Embedding vector로 변환한다.
- [CLS]: Classification 등의 출력으로 사용
- [SEP]: 문장의 끝 또는 두 문장 사이를 구분
2. Segment Embedding
- 현재 Token이 어떤 문장(Sentence A or B)에 속하는지 알려주는 Embedding
- Training task 2인 NSP(Next Sentence Prediction)에서 문장 구분 정보를 반영하기 위해 도입
3. Position Embedding
- 해당 단어의 위치 정보를 학습된 벡터로 표현
Training task 1: Masked Language Modeling(MLM)
입력 문장에서 임의의 단어를 hyperparameter인 Masking만큼의 [MASK]로 가리고, 문맥을 고려하여 해당 위치의 원래 단어를 예측하는 사전학습 방식이다.
Training task 2: Next Sentence Prediction(NSP)
입력되는 문장 2개를 50% 확률로 연결된 문장을 입력하거나 혹은 연결되지 않은 문장을 입력하여 두 문장이 연속되는 문장인지 무작위로 뽑은 문장인지를 예측한다. 이 방식은 문장 간 관계 학습에 도움을 주기 위해 사용한 사전학습 방식이지만, 이후에 NSP는 불필요하다고 판단하여 다른 사람들에게 제거되었다.
2. ViT(Vision Transformer, 2021)
ViT(Vision Transformer)는 자연어 처리(NLP)에서 사용된 Transformer 구조를 이미지 처리에 적용한 이미지 분류 모델이다. Transformer가 sequence를 입력받고 word embedding을 진행해 vector로 변환하는 것처럼 이미지도 패치 단위의 토큰으로 분할한뒤 Linear Projection을 통해 D차원 vector로 embedding한다.
ViT Architecture
1. Input Image를 Patch로 분할
2. Patch Embedding
- 각 patch에 대해 Linear Projection을 통해 D차원 vector로 embedding
3. [CLS] Token 추가
- BERT와 마찬가지로 [CLS] 토큰을 맨 앞에 추가하여 전체 이미지 표현을 학습하도록 한다.
4. Positional Embedding
- 위치 정보를 추가하기 위해 모든 토큰에 Positional Embedding을 더한다.
5. Transformer Encoder
- Layer Normalization
- Multi-Head Attention(MSA)
- Residual Connection
- Layer Normalization
- Multilayer Perceptron(MLP) + GELU Activation function
- Residual Connection
- L x
6. Classification Head
- 최종 출력 중 [CLS] 토큰에 해당하는 vector를 Classifier에 통과시켜 Classification 진행
ViT(Vision Transformer, 2021): Experiments and Discussion
ViT는 작은 데이터셋에서는 CNN보다 성능이 안좋지만, 큰 데이터셋에서 CNN보다 뛰어난 성능을 보인다. 그 이유는 CNN에서 사용하는 Inductive bias(spatial locality, positional invariance) 같은 기본적인 가정을 하지 않고 오로지 데이터만으로 학습을 진행하기 때문이다. 그리고 큰 데이터셋일수록 Transformer가 CNN보다 global한 영역까지 잘 고려하기 때문에 그 효과가 잘 나타날 수 있게 된다.
ViT(Vision Transformer, 2021): Position Embeddings
ViT의 Positional Embedding 간의 similarity를 색상으로 표현한 Headmap을 보면 어떤 공간 정보를 자동으로 학습하는지 이해할 수 있다. 서로 가까운 patch인 경우, 같은 행이거나 같은 열인 경우에 서로 비슷한 embedding을 갖는 경향이 있다.
3. DeiT(Data-efficient image Transformers, 2021)
DeiT는 ViT의 학습 비효율성을 개선한 모델이다. ImageNet 수준의 데이터만으로도 Vision Transformer를 학습할 수 있도록 설계한 것이 특징이다.
DeiT은 CNN teacher의 지식을 Transformer student가 학습하도록 하는 Distillation 구조인 것이 핵심이다. CNN teacher로부터 간접 inductive bias를 얻고, CNN tearch와 Transformer student의 softmax 확률 분포 간의 KL Divergence를 최소화한다. 즉, 두 모델의 확률적 예측이 비슷해지도록 한다.
*Knowlege Distillation(지식 증류): 기계 학습에서 지식 증류는 큰 모델에서 작은 모델로 지식을 전달하는 프로세스를 의미한다.
DeiT(Data-efficient image Transformers, 2021): Architecture
ViT Architecture에 [DIST] 토큰을 추가한다. [CLS] 토큰은 label prediction 용도로, [DIST] 토큰은 teacher signal을 반영하기 위한 용도로 사용하고 두 토큰 모두 Self-Attention을 통과한다.
Distillation Methods
1. Soft-Label Distillation
- Teacher와 Student의 확률 분포(softmax된 logit) 간의 KL Divergence를 최소화
- 즉, 두 모델의 확률 분포가 비슷해지도록 한다.
2. Hard-Label Distillation
- Teacher softmax의 argmax 값을 실제 label처럼 사용하여 student의 argmax와 비교한다.
- 즉, Student는 ground-truth와 teacher prediction을 모두 따르게 된다.
실제로는 Hard Distillation이 Soft Distillation보다 더 좋은 성능을 띤다고 한다. 그 이유는 Soft Distillation은 분포 전체를 학습하기 때문에 정보가 많지만, Hard Distillation은 더 명확한 지도를 제공하기 때문에 더 좋은 성능을 지닌다고 해석할 수 있다. 또한 [CLS] 토큰을 사용하는 것 보다 Dist 토큰의 표현 학습이 더 분류 성능이 뛰어나다.
+) Hard Distillation과 Soft Distillation을 동시에 사용하는 것은 안되는가?
위의 질문은 블로그를 작성하면서 든 나의 생각이다. 실제로 일부 연구에서는 이 두 가지의 Distillation을 결합하여 성능을 향상시키기도 하지만, 세 가지 Loss의 가중치를 중요도에 따라 다르게 설정해야 하므로 더 복잡해지는 단점이 있다고 한다. 따라서 추가함으로서 얻을 수 있는 이득이 복잡성 증가보다 적다면 사용하지 않는 것이 나은 것 같다.
학습을 마치게 되면 Transformer student가 CNN teacher보다 더 높은 성능을 갖게 된다. 그 이유로는 Transformer가 CNN보다 더 멀리 있는 patch까지도 고려하는 유연한 모델이기 때문이다.
Issues with Vanilla ViT Model
ViT에는 두 가지 문제점이 남아있다. 앞으로 공부할 모델은 이 ViT Model의 문제점을 개선하는데에 초점이 맞춰져 있다.
- Inductive bias가 없어서 생기는 막대한 계산 비용
- 고정된 크기의 patch 사용
4. Swin Transformer(2021)
Swin Transformer는 4가지 아이디어로 ViT의 연산 비용 문제를 해결하면서도 CNN처럼 유연하고 계층적인 구조를 갖는 Vision Transformer 모델이다.
Idea 1: Inductive Bias Reintroduced
- Self-Attention을 전체 이미지가 아니라 작은 윈도우 내에서만 계산하는 Local Window Attention 도입한다.
Idea 2: Hierarchical Structure
- 고정된 크기의 patch를 사용하지 않고, 단계적으로 patch들을 점차 확장시킨다.
Idea 3: Shifted Window (Swin) Partitioning
- 윈도우 별로 Attention을 진행하게 되면 윈도우 경계에서 생기는 정보 단절 문제를 해결하고자 도입한다.
- 블록마다 윈도우를 이동시켜 서로 다른 토큰들도 상호작용이 가능하도록 한다.
Idea 4: Relative Position Bias
- Swin Transformer에서는 윈도우 내부에서 Attention을 진행하기 때문에 위치 해석이 복잡해지는데, 이를 상대 위치로 단순화한다.
Idea 1: Inductive Bias Reintroduced
Inductive bias 효과를 얻기 위해 전체 이미지가 아닌 설정한 윈도우 크기 내에서 Self-Attention을 진행한다. window 내에서 자기 자신의 patch를 query라고 하면, 그 윈도우 내의 다른 patch들을 key와 value로 사용한다.
Idea 2: Hierarchical Structure
고정된 크기의 patch를 사용하는 것이 아니라 단계적으로 patch를 합쳐 나가면서 다양한 크기의 정보를 얻을 수 있게 된다. Patch Merging Layer를 지나게 되면, 기존의 patch size는 2배가 되므로, patch 개수를 의미하는 H와 W는 1/2배가 되고 C은 2배가 된다. 즉, 공간 해상도(H, W)는 절반으로 감소되고, 채널 수(C)는 두 배 증가한다.
- 먼저 인접 patch(C-dim)를 하나의 그룹으로 합치기 위해 concat한다.
- 그 후 4C-dim의 vector에 대해 Linear Projection을 진행하고 최종적으로 원하는 dim으로 변환(보통 2C-dim)한다.
Idea 3: Shifted Window (Swin) Partitioning
윈도우 기반 self-attention은 윈도우의 경계에서 연결이 단절되는 문제가 있다. 이를 해결하기 위해 윈도우를 이동시키는 방법을 사용한다.
- 현재 윈도우 기준에서 다음 Layer의 윈도우를 M/2만큼 평행 이동
- 일부 패치가 존재하지 않는 경계의 경우에는 Masking 처리를 진행하거나, 윈도우 경계를 넘어가는 패치 조합으로 새로운 윈도우를 재구성한다.
Swin Transformer: Architecture
0. Swin Block
Swin Transformer Block은 W-MSA와 SW-MSA가 묶여있기 때문에 항상 짝수 배 만큼 반복한다.
- Layer Normalization(LN)
- Window based Multi Self-Attention(W-MSA)
- Residual Connection + Multi Layer Perceptron(MLP)
- Shifted Window based Multi Self-Attention(SW-MSA)
- Residual Connection + Multi Layer Perceptron(MLP)
1. Patch Partition
- 입력 이미지를 patch로 분할하고, Linear Embedding으로 C-dim으로 projection한다.
2. Stage 1: Swin Block x 2
- Window based Multi Self-Attention(W-MSA) + MLP
- Shifted Window Based Multi Self-Attention(SW-MSA) + MLP
3. Stage 2~4: Patch Merging + Swin Block 반복
(1) Patch Merging
- patch concat → Linear Layer
(2) Swin Transformer Block
- Window based Multi Self-Attention(W-MSA) + MLP → Shifted Window Based Multi Self-Attention(SW-MSA) + MLP
Idea 4: Relative Position Bias
기존 Transformer와는 달리 Swin Transformer는 Window based Self-Attention을 사용하기 때문에 window 내부 위치에만 의미가 있고, global 위치는 무의미하다. 따라서 window 내에서의 위치 정보를 추가하는 Positional Encoding이 필요하다.
아이디어로는 각 쌍의 query와 key 간의 상대적 위치에 따라 bias를 더해준다. 즉, window 내에서의 상대적 위치에 따라 bias를 더한다. 이 bias는 학습 가능한 값이며, attention score에 직접 더해진다.
- B: 상대 위치에 따른 bias
- i, j: query, key 위치 index (within window)
- i - j: 상대적 위치
윈도우 크기를 M x M이라고 했을 때 가능한 모든 쌍의 상대 위치는 (2M - 1)^2개이다.
x축 | −M+1∼M−1 | 2M−1 |
y축 | −M+1∼M−1 | 2M−1 |
전체 | 이 조합의 수 | (2M - 1)^2 |
Swin Transformer: Time Complexity Analysis
Swin Transformer는 Transformer의 연산량을 줄이기 위해 Window based Self-Attention을 사용한다. 기존의 Multi head Self-Attention의 Time complexity는 아래와 같다. 우선 MSA와 W-MSA 모두 공유하는 complexity 항이 존재한다.
입력 이미지에 patch embedding을 진행하게 되면,
가 되고, Query, Key, Value, Output 모두 동일한 차원 C-dim을 갖도록 Linear Projection을 진행하기 때문에 아래와 같은 Time complexity를 갖게 된다.
즉, 입력 데이터를 C-dim vector로 embedding하고, 각 토큰 vector를 C x C의 weight로 Linear Projection을 진행한 뒤 토큰 개수만큼 hw 반복하게 되면 4hwC^2이라는 공통 항을 갖게 된다.
1. Multi head Self-Attention: Time Complexity
아래의 Time Complexity 항은 Attention value를 계산하면서 생긴 값이다.
- Attention score: Query와 Key의 Dot-product(hwC)
- Attention value: Attention coefficient와 가중합(hwC + hwC)
- 이 과정을 hw개의 Query만큼 진행 (2hwC x hw)
2. Swin Window-Multi head Self-Attention: Time Complexity
아래의 Time Complexity 항도 마찬가지로 Attention value를 계산하면서 생긴 값이다.
- Attention score: Query와 Key의 Dot-product(M^2C)
- Attention value: Attention coefficient와 가중합(M^2C + M^2C)
- 이 과정을 hw개의 window만큼 진행(2M^2C * hw)
정리해보면 두 Multi head Self-Attention의 Time Complexity의 두 번째 항이 아래와 같이 바뀌게 된다. 이때 M^2는 전체 patch 개수인 hw보다 매우 작은 값이기 때문에 계산량이 크게 줄어들게 된다.
- Query/Key/Value 생성은 어디서든 동일하므로 Swin에서도 시간 이득은 없음
→ 이는 구조적 한계 - 하지만 Attention Score 연산에서 Swin은 N^2 → N 수준으로 연산량을 줄이게 된다
→ 실제 전체 계산량에서 이 항이 가장 크므로 Swin의 효율성 핵심 포인트
5. CvT(Convolutional Vision Transformer, 2021)
CvT는 Convolution과 Transformer의 장점을 결합한 구조이다. CNN의 inductive bias와 Transformer의 global receptive field를 모두 사용한다.
1. Convolutional Token Embedding
- ViT는 patch를 flatten 후 Linear projection을 통해 C-dim Token으로 변환하였다.
- CvT는 patch를 flatten 후 Convolution layer를 이용해 Token을 추출한다.
2. convolutional projection
- 일반 Multi head Self-Attention에서는 Q, K, V가 Linear로 계산되었다.
- CvT는 이 Q, K, V를 계산할 때 Conv 연산을 도입한다. 일반적으로 stride = 1
이처럼 CvT는 Linear 연산이 아니라 Conv 연산을 진행하면서 ViT의 유연성과 CNN의 효율성을 융합하였다.
3. Squeezed Convolutional projection
- Key와 Value를 만들 때는 stride > 1을 사용하여 공간 해상도를 줄인다.
- 즉, K, V의 dim을 낮춤으로써 Attention 계산량이 감소된다.(downsampling)
CvT(Convolutional Vision Transformer): Architecture
기존의 ViT의 patch embedding과 달리 overlapping patches도 처리 가능하다.(if stride < kernel size)
Convolutional Transformer Block
- Convolutional Projection
- Multi head Self-Attention
- Residual Connection
- Layer Norm
- MLP + Residual Connection
CvT는 stride를 조절하여 해상도를 줄이는 downsampling을 진행하고, 채널 수는 늘리는 계층 구조이다.
6. Transformer-based Video Models: ViViT(Video Vision Transformer)
ViViT는 Transformer 기반 비디오 인식 모델이다. 기존 비디오 모델들은 시간 차원 처리를 위해 Convoutional 3D을 사용하였다. ViViT는 Transformer로 전체 시공간 정보를 한번에 학습하고자 한다.
ViT에서 했던 것처럼 Video에 단순한 방법으로 적용하게 되면, 각 프레임을 시간 정보를 포함한 n x n x n patches로 분할한 다음 Transformer Encoder를 적용하면 된다. 하지만 이 경우에는 Attention의 Time Complexity가 n^6 이 되어 비효율적이다.
Time Complexity를 줄이는 간단한 아이디어로 비디오의 전체 프레임을 사용하지 않고, 균일한 간격으로 몇 개의 프레임만 선택하는 방법이 있다. 혹은 몇 개의 프레임을 같은 patch(tublet)로 분할한 뒤 token으로 만드는 Tublet Embedding이 있다.
1. Tublet Embedding
- 비디오를 t x h x w 크기의 3D patch(tublet) 단위로 분할한다.
- 각 tublet을 flatten하여 Linear projection을 진행하고 token sequence로 변환한다.
- 변환한 token에 spatial-temporal 위치 정보를 담는 positional embedding을 추가한다.
2. Factorized Encoder
- Spatial → Temporal 순서로 attention 분리
- 각 frame들에 ViT를 진행한다.(Spatial Transformer Encoder)
- Spatial Transformer Encoder를 거쳐서 나온 frame들의 [CLS]에 Temporal Transformer Encoder를 진행한다.
3. Factorized Self-Attention
- Transformer Block 안에서 Spatial Self Attention → Temporal Self-Attention → MLP으로 진행
- Spatial Self-Attention에서는 각 시간 프레임마다 독립적으로 수행되고, 모든 patch들 사이에서 spatial attention을 수행한다.
- Temporal Self-Attention에서는 각 공간 위치에 대해 시간 축으로 attention을 수행한다. 즉, 같은 위치의 patch가 시간에 따라 어떻게 변하는지를 학습한다.
4. Factorized Dot-Product Attention
- Attention head를 Spaital Head와 Temporal Head로 분리하는 구조이다.
- Spatial Attention과 Temporal Attention 결과를 concat 한 후 Linear 연산을 하여 출력 dim으로 변환한다.
ViViT(Video Vision Transformer): Experiments and Discussion
가장 성능이 높은 모델은 단순한 방법을 사용했던 Spatio-temproal이다. 하지만 효율성을 고려하여 보면, Factorized Encoder 모델이 가장 좋다.
7. Transformer-based Video Models: TimeSFormer(2021)
TimeSFormer는 spatial과 temporal 차원을 다양한 방식으로 Self-Attention하는 5가지의 비디오 transformer 모델을 제안하였다. 비디오 데이터셋 특성상 사용할 수 있는 데이터 양이 많지 않기 때문에 5가지 모델의 성능이 거의 비슷하다.
(1) Space Attention
- ViT와 동일
(2) Joint Space-Time Attention
- ViViT Mode 1와 유사
(3) Divided Space-Time Attention
- ViViT Model 3와 유사
(4) Sparse Local Global Attention
- Local과 Global을 순서대로 Attention하는 구조
(5) Axial Attention
- 같은 시간, 너비, 높이 축을 대상으로 Attention하는 구조
8. Transformer-based Video Models: MViT(Multiscale Vision Transformers, 2021)
MViT는 고정된 resolution과 embedding dimension으로 모든 layer를 처리하던 ViT 방식과 달리, 계층적으로 스케일이 변하는 feature representation을 사용한다. CvT의 경우에는 Convolution의 stride를 사용하여 scale을 조절하였다면, MViT는 Pooling 연산을 사용하여 scale을 조절한다. 이로 인해 계산량이 감소시킬 수 있다.
MViT의 성능을 보면 ViViT이나 TimeSformer와 비교해보면 계산 비용이 크게 줄었고, 성능은 약간 더 좋아졌다. CNN 모델들과 비교해봐도 CNN의 가장 높은 성능을 보였던 X3D 모델보다 더 좋은 성능을 보였다.
Further Readings