
📌 Transformer라는 이름을 들어본 적이 있나요? 최근 이미지 분야에서 주목받고 있는 이 기술은 원래 chapgpt 같은 자연어 처리 분야에서 사용되는 구조입니다. 자연어 처리에서 성능이 좋았기 때문에 이걸 비전 쪽에도 적용해보고자 연구한 것이 바로 Vision Transformer입니다.
트랜스포머 아키텍처는 자연어 처리 분야에서 사실상 표준으로 자리잡고 있지만, 컴퓨터 비전에서의 활용은 여전히 제한적입니다. 비전 분야에서는 주로 주의(attention) 메커니즘이 컨볼루션 네트워크와 함께 사용되거나, 컨볼루션 네트워크의 구조를 유지한 채 일부 구성 요소만 대체하는 방식으로 적용되고 있습니다.
그러나 우리는 CNN(컨볼루션 신경망)에 대한 이러한 의존성이 필요하지 않음을 보여줍니다. 대량의 데이터로 사전 훈련을 거친 비전 트랜스포머(ViT)는 뛰어난 성과를 보이며, 훈련에 필요한 계산 자원도 훨씬 적습니다.

먼저 자연어 처리 분야에서 사용되던 기존 트랜스포머의 구조에 대해 알아봅시다.
트랜스포머는 인코더-디코더 구조를 가지고 있으며, 기본적으로 다음 두 부분으로 나뉩니다:
인코더(Encoder): 입력 데이터를 받아들여 Positional Encoding을 수행합니다. 여러 층으로 쌓여 있으며, 각 층은 주의(attention) 메커니즘과 피드포워드 신경망으로 구성됩니다.
디코더(Decoder): 인코더에서 생성된 표현을 받아 최종 출력으로 변환합니다. 인코더와 유사한 구조를 가지지만, 이전 출력 정보를 활용하는 추가적인 주의 메커니즘이 포함됩니다.
그림을 자세히 보시면 Attention의 종류가 3개가 있습니다만, VIT에서는 인코더 부분만 사용하므로 인코더를 중심으로 설명드리겠습니다.

입력으로 들어온 단어의 차원 수를 조절해주는 과정입니다.
입력으로 들어온 문장을 단어마다 token으로 나눈 뒤 Positional Encoding을 해줍니다. 트랜스포머는 입력된 단어들을 순서에 따라 처리하는 것이 아니라, 모든 단어를 동시에 처리합니다. 하지만 언어에 있어서 단어의 위치는 매우 중요합니다.
예를 들어 "나는 사과를 먹었다" 를, "사과는 나를 먹었다" 라고 하면 의미가 완전히 달라지게 됩니다..
따라서 따로 단어의 위치 정보를 더해주는 과정이 필요합니다.

각 토큰 마다 서로 다른 벡터값을 더해줍니다. 해당 수식은 아래와 같습니다.

입력 토큰이 짝수인지 홀수인지에 따라 sin함수와 cos함수를 번갈아가며 더해줍니다. i가 몇번째 토큰인지 나타내며, pos는 해당 토큰안에서 몇번째 차원인지를 나타냅니다.
트랜스포머의 핵심은 자기 주의(self-attention) 메커니즘입니다. 이는 입력의 각 요소가 다른 요소와의 관계를 고려하여 가중치를 부여하는 방식입니다.
앞서 구한 입력 벡터를 통해 Q(쿼리), K(키), V(값) 에 해당하는 가중치와 행렬 연산을 하여 Q, K, V 벡터를 만들어줍니다.
이를 잘 표현한 사진이 있어서 가져와봤습니다.
출처 : https://wikidocs.net/31379

위 그림에서 구한 Q, K, V를 아래 수식과 같이 연산한 것을 Attention이라고 합니다.

여러 개의 주의 메커니즘을 병렬로 처리하는 것을 멀티-헤드 어텐션(multi-head attention)이라 합니다.
라는 문장이 있다고 합시다. <사과 = 그것> 이라고 Attention에서 관계를 학습할 수 있습니다.
하지만 <사과 = 빨간색> 도 맞는 말입니다.
따라서 멀티-헤드 어텐션은 토큰간의 다양한 관계를 학습하도록 도와줍니다.
트랜스포머는 자연어 처리(NLP) 분야에서 널리 사용되는 모델이 되었습니다. 일반적으로 대규모 텍스트 데이터셋에서 사전 학습한 후, 특정 작업에 맞춰 미세 조정하는 방식이 주로 사용됩니다. 트랜스포머는 계산 효율성과 확장성이 뛰어나기 때문에, 100억 개 이상의 매개변수를 가진 대형 모델을 훈련하는 것이 가능해졌습니다.
반면, 컴퓨터 비전 분야에서는 여전히 합성곱 신경망(CNN)이 주로 사용되고 있습니다. NLP의 성공에 자극을 받아 CNN과 자기 주의를 결합하려는 연구들이 진행되고 있으며, 일부 연구는 합성곱을 완전히 대체하기도 했습니다. 그러나 이러한 모델들은 현대 하드웨어에서 효율적으로 작동하지 않는 경우가 많아, 대규모 이미지 인식에서는 여전히 ResNet과 같은 전통적인 아키텍처가 최고 성능을 보이고 있습니다.
우리는 NLP에서의 트랜스포머 성공을 바탕으로, 최소한의 수정만으로 이미지를 처리하는 표준 트랜스포머를 실험해 보았습니다. 이를 위해 이미지를 여러 패치로 나누고, 이 패치들을 선형 임베딩 형태로 트랜스포머에 입력했습니다.
중간 규모의 데이터셋인 ImageNet에서 훈련한 결과, 이 모델은 비슷한 크기의 ResNet보다 몇 퍼센트 낮은 정확도를 기록했습니다. 이러한 결과는 어느 정도 예상되는 부분입니다. 트랜스포머는 CNN의 고유한 특성인 변환 동등성과 지역성을 결여하고 있어, 데이터가 충분하지 않을 경우 일반화 능력이 떨어질 수 있습니다.
하지만 대규모 데이터셋(1400만~3억 이미지)에서 훈련하면 상황이 달라집니다. 우리는 대규모 훈련이 모델의 성능을 높인다는 것을 발견했습니다. 우리의 비전 트랜스포머(ViT)는 충분한 데이터에서 사전 훈련을 받고, 데이터가 적은 작업으로 전이될 때 뛰어난 성능을 발휘합니다. ImageNet-21k 데이터셋이나 JFT-300M 데이터셋에서 훈련한 ViT는 여러 이미지 인식 벤치마크에서 최고 성능에 근접하거나 이를 초과했습니다. 특히, 가장 성능이 좋은 모델은 ImageNet에서 88.55%, ImageNet-ReaL에서 90.72%, CIFAR-100에서 94.55%, VTAB의 19개 작업에서 77.63%의 정확도를 기록했습니다.
Transformer는 앞서 말했던 Attention 매커니즘을 통해 입력의 모든 부분간의 관계를 동시에 고려할 수 있습니다. 이는 이미지의 전역적인 패턴이나 맥락을 이해하는데 큰 도움을 주죠.
또한 병렬처리에 특화되어 있어 훈련속도가 빠르고 더 큰 데이터셋을 효과적으로 학습할 수 있습니다.
위와 같은 장점 덕분에 Transformer를 사용하고 있습니다.
하지만 이는 대규모 데이터셋을 적용했을 경우에만 한정됩니다. 논문에서 말했듯이 ImageNet으로 학습할 경우 ResNet 보다 성능이 좋지 않다고 하죠.
이는 트랜스포머가 CNN의 장점을 가지지 못했기 때문입니다.

CNN은 필터를 통해 feature map을 스캔합니다. 즉 객체가 어느 위치에 있든 동일한 필터가 적용되는 것이죠.따라서 객체의 위치가 달라져도 동일한 패턴 추출합니다.
또한 풀링레이어를 통해 위치 불변성을 높여줍니다. Max pooling의 경우 주변 값 중 가장 큰 값을 선택하는데, 이는 이미지가 조금 움직여도 동일한 결과를 내줄 것 입니다.
합성곱 연산은 지역적인 정보를 강조합니다. CNN은 작은 필터를 사용하여 이미지를 처리하고, 이로 인해 각 층에서 인접한 픽셀 간의 관계를 잘 이해할 수 있습니다. 이 지역적 인식 능력 덕분에 이미지가 이동하더라도 CNN은 변환된 위치에서도 해당 특징을 인식할 수 있습니다.

뒷 내용에서 나오겠지만 위 사진처럼 트랜스포머는 사진을 패치로 패치들 간의 관계를 학습합니다. CNN처럼 합성곱 계산을 하여 픽셀간의 관계를 연산하지 않습니다. 그래서 ResNet보다 좋지 못한 결과가 나온 것이죠.
하지만 대규모 데이터셋을 사용할 경우 이런 문제점을 가지고 있음에도 ResNet의 성능을 뛰어넘을 수 있다고 합니다. 이는 VIT 자체가 패치간의 모든 관계를 고려하는 Attention 구조를 사용하여 파라미터가 매우 많기 때문입니다.

이제 논문의 핵심인, 이미지를 어떻게 트랜스포머 구조에 적용하는지 자세히 알아봅시다.

이미지를 트랜스포머에 입력으로 넣는 과정을 나열하면 다음과 같습니다.
사진에 나온대로 이미지를 패치로 나눕니다.
각 패치를 백터로 임베딩한 뒤 flatten 합니다.
Postion Embedding을 더합니다.

예시를 잘 나타낸 사진이 있어 가져와봤습니다.
입력 이미지의 사이즈는 4X4 이며 채널 수는 2 입니다.
사진에서 패치 사이즈는 2X2이며, 총 4개의 패치가 생성된 걸 볼 수 있습니다.
- (Patch size)
- = 4 (Number of Patch)
- (Flatten)
해당 이미지를 flatten 할 때 채널 수가 2개 이기 때문에 가 나옵니다.
즉 4개의 패치가 생기고, 각 패치당 8개의 벡터가 생긴걸 확인할 수 있습니다.
이를 D크기의 백터로 임베딩하여 차원축소를 합니다.
사진에서는 8차원 벡터를 4차원으로 줄였습니다.
마지막으로 각 Patch들이 인코더에 들어가기 전에 각 패치의 순서를 나타내는 Position Embedding을 더하여 위치 정보를 추가해줍니다.

이 과정을 마친 후, 출력은 Encoder에 입력됩니다. 먼저, Multi-Head Attention을 통해 각 패치 간의 관계를 학습하고, 이어서 MLP를 통과하여 고차원 특성을 추출합니다. 이러한 과정을 여러 Layer에 걸쳐 반복함으로써, 모델은 점점 더 복잡한 패턴과 정보를 학습하게 됩니다.
중간에 두번의 skip connection이 있습니다.
또한 패치를 나누는 과정에서 이미지에 대한 정보가 깨질 수 있습니다. 예를 들어 동그란 모양의 물체가 있을 때, 패치를 나누는 과정에서 패치 안에 원이 일부만 잘려서 포함될 경우 원으로 인식하지 못할 수 있습니다.
예를 들어 4x4 이미지에 2x2사이즈 패치를 만든다면 4개의 패치가 생성되지만,
입력 이미지가 8x8 이면 16개의 패치가 생긴다는 거죠.
즉, 사전 학습 때 패치들의 순서를 학습하던 positional embedding이 소용없게 되는 것 입니다.
이를 해결하기 위해 보간이라는 것을 하는데, 주변 값을 이용해 빈 구간의 값을 채우는 것을 말합니다.
예를 들어 위치 값이 1 -> x -> 3 이런 식으로 빈 공간이 생긴다면 x = 2라고 주변 값을 이용해 맵핑할 수 있습니다.


레이어의 수와 D의 사이즈에 따라 모델을 B, L, H로 나눠 실험을 했습니다.
왼쪽 그래프를 보시면 JFT-300M일 때, 즉 많은 수의 데이터셋으로 학습할 수록 높은 정확도가 나타났습니다.
오른쪽은 ResNet과 비교한 그래프 입니다. 처음에는 성능이 ResNet에 비해 좋지 않다고, 데이터셋이 늘어나자 급격히 정확도가 증가하는 걸 볼 수 있습니다. 300M이 되면 ResNet 보다 좋은 성능을 나타냅니다.