티스토리 뷰
목차
비전 Task에서 많이 활용되는 ViT(Vision Transformer)를 이해하기 위해선
Attention과 Transformer 개념을 이해하고 있으면 좋다. 같이 한 번 살펴보자
Attention
Attention은 주목 포인트를 찾는 방법이다. NLP 번역 Task에서 시작하여 CV에서는 Image captioning 등에 활용된다.
hard attention과 soft attention으로 구분할 수 있다.
Hard 버전은 0, 1로 attention을 계산하여 feature map을 표현한다. 이때 계산량이 많아 모든 위치에서 다 계산하지 않고 multinoulli 분포에서 sampling하는 방법으로 계산한다.
Soft 버전은 0~1의 float로 attention을 계산하여 feature map을 표현한다.
Self Attention
기존 attention은 (ex. word와 image) input과 output을 활용해 attention을 계산했지만, Self-attention은 input 자체에서 attention을 계산하는 방법으로 Transformer의 핵심이다. 다음 diagram으로 확인할 수 있다.
Input에서 query, key, value를 만들어 query, key로 attention map을 만들고 value가 실제 값의 역할을 하여 matrix multiplication 등의 연산으로 self-attention feature map을 만든다. 다음 예시처럼 Q, K, V를 만들게 된다.
여기서 중요한 것은 다른 것은 고정값이고 Weight matrix인 $W_{query}, W_{key}, W_{value}$만 학습 파라미터가 된다.
Multi-Head Self Attention
Transformer에서는 단순 Self-attention block이 아닌 Multi-Head Self attention 구조로 설계되었다.
attention filter를 여러 개를 만들어 filter의 attention도 계산하여 combination하는 형태가 된다.
CNN에서 Convolution 연산을 하면 filter가 attend 되는 형태와 비슷하다고 보면 된다.
이런 Self Attention 구조의 장점은 멀리 떨어진 지역에 대해서도 관계성이 있으면 바로 학습이 된다는 점이다.
뒤에서도 설명하겠지만 이 부분이 논문에서 주장하는 inductive bias가 CNN보다 적다고 주장하는 부분 중 하나이다.
물론 CNN도 학습을 안하는 것은 아니지만 receptive field가 커야하기에 1x1과 3x3 Conv를 깊게쌓는 구조에서는 바로 학습이 되지는 않는다는 것도 근거가 될 수 있다.
간단하게 Self Attention의 특징에 대해 정리해보면
- input과 output 사이에 global dependencies를 계산
- input sequence 자체만으로 다른 position과의 관계를 학습하여 task에 맞는 representation을 알아낼 수 있다는 점
Transformer
Transformer는 self-attention을 중첩시켜서 만든 architecture이다. attention을 계산하여 relation을 계산하는 과정에서 가중치가 계산되기에 RNN, CNN이 꼭 필요하지는 않다.
참고로 이 모델은 NLP에서 시작된 것으로 대부분 예시는 번역 Task이다.
Architecture는 아래 그림으로 설명이 된다.
Input을 encoder에 통과시켜 word embedding으로 encoder 벡터를 생성한 후 각 decoder에 넣어 target domain에 맞는 output을 생성하는 것이 큰 흐름이다.
encoder-decoder
Encoder의 output이 decoder의 Q, K가 되어 decoder의 target 값 V와 합쳐져 MHA(Multi-Head Attention) Block에 들어가 연산 후 확률 값을 계산하게 된다.
ViT에서는 Encoder를 가져와 적용하므로 Encoder를 중심으로 살펴보겠다.
Q, K, V를 계산할 때 input token을 linear layer를 통과시켜 각각 계산하게 된다. MHA 결과들을 Concat 시켜 Linear Layer 통과 후 output으로 나오게 된다.
위의 예시를 통해 matrix 계산을 하게된다. 여기서 Scaled-dot product Attention이 바로 이 예시처럼 matrix를 활용한 dot product를 통한 연산을 말하는 것이다. 이때 위에서 언급했지만 Backpropagation 시 W만 학습이 진행된다.
Positional Embedding
Self-Attention mechanism은 CNN, RNN과 다르게 order, local 정보를 갖고있지 않다. 따라서 이 정보를 주기위해 input token embedding을(index embedding)을 활용한다. Transformer 에서는 Sin / Cos 함수로 embedding을 만들어 연속함수처럼 설계했다.
그러면 왜 Sin, Cos으로 설계했을까?
단순 counting 1, 2, 3 ... 으로 할 경우 뒤로 갈수록 값이 커져 embedding에서 gradient exploding 문제가 발생할 수 있다.
Normalizing 방법은 있으나 역시나 뒤로 갈수록 값이 1에 가까워지므로 cheating 효과가 나타나 뒷 포지션의 attention 값이 계속 높게 나올 수 있다는 단점이 있다.
그래서 나온 방법은 값을 이진수로 만들어 벡터형태로 구성하는 것이다. 이렇게하면 좋은 대안이 될 수 있으나 이 논문에서는 좀 더 연속적인 함수로 표현하고자 하여 Sin, Cos으로 나타나게 된 것이다. 여기서는 continuous binary vector를 사용한다고 표현한다. 수식은 다음과 같다.
$$ PE_p^{(i)} f(x) = \begin{cases} \sin{\left(\frac{1}{10000^{\frac{2k}{d}}}\right)} & ,if & i = 2k\\ \cos{\left(\frac{1}{10000^{\frac{2k}{d}}}\right)} & ,if & i = 2k+1 \end{cases}$$
$$ p : \ position, i : \ dimension \ index, d : \ total \ dimension \ of \ embedding $$
여기서 Sin / Cos 함수는 주기함수라 중복이 될 수 있기 때문에 주기를 엄청키워서 위의 수식에서도 $\frac{1}{10000}$로 설정하여 중복 가능성을 없앴다.
이제 ViT를 이해하는데 필요한 내용은 정리가 끝났다. 다음 게시글에 ViT에 대해 작성하려고 한다.
참고논문 - https://arxiv.org/abs/1706.03762
'AI' 카테고리의 다른 글
[논문 구현] ViT 살펴보기 3편 - Pytorch 구현 (0) | 2022.08.31 |
---|---|
[논문 리뷰] ViT 살펴보기 2편 - Vision Transformer (0) | 2022.08.31 |
[논문 리뷰 및 구현] MobileNet V3 간단하게 리뷰하고 구현해보기!! (0) | 2022.08.27 |
[논문 리뷰 및 구현] SENet 간단하게 리뷰하고 구현해보자! (0) | 2022.08.27 |
[논문 구현] MobileNet V2 직접 구현해보기!!! (0) | 2022.08.25 |