본문 바로가기

DATA SCIENCE/Study

[Computer Vision] CNN vs ViT

- 컴퓨터 비전에서 가장 많이 비교되고 있는 두 방법론이며, 실질적으로 두 가지를 섞어서 사용하기도 하지만 본질적으로 어떤 차이가 있을까?

 

- 가장 많이 언급되는 사항이 CNN은 inductive bias가 크다는 것이고, ViT는 이로부터 비교적 자유롭다는 것이다.
  다소 모호한 내용인데, 간단히 말해 CNN은 특정 window size의 kernel, padding, dilation을 이용해 각기 다른 사이즈로 Embedding하는 것은 가능해도, 본질적으로 대상 객체와 가까이 있는 것에 편향된다는 것. 반면 ViT는 기본적으로 하나의 이미지를 여러 장의 Patch로 분할한 뒤, 각각의 Patched Image에 대한 Attention Score로 각각의 이미지에 대한 맥락적 가중치를 고려하게 되기 때문에 멀리 있는 다른 객체와의 관계가 더 크게 반영될 수 있다는 것.

 

- 예를 들어, 바다 위에 배가 그려진 그림이 미술관에 걸려있다고 가정해보자. 매우 사실적으로 그려진 그림 혹은 사진이라면 CNN을 통해 해당 사진 안의 배가 진짜 배가 아니라는 것을 구분하는 것은 매우 어려운 문제가 될 것이다. 만약 그것이 가능해지려면 이미지 한 장이 통째로 하나의 embedding vector가 되도록 하거나 여러 객체를 복합적으로 찾아낸 뒤, 이를 다시 GNN을 통한 지식 추출을 함으로써 해결할 수 있으나 매우 번거로운 일이다.

반면 Transformer는 가까운 바다 그림 혹은 사진보다 멀리 떨어진 액자의 프레임이라거나 미술관의 접근금지 줄, 전시된 다른 그림들, 관객에 대한 정보를 바탕으로 해당 그림이 진짜가 아니라는 것을 비교적 쉽게 판단할 수 있다.

(그 외에도 Attention Score 연산을 통해 각 패치 이미지에 대한 embedding을 병렬적으로 수행함으로써 CNN보다 파라미터 수 대비 빠르게 연산될 수 있다거나 하는 등의 기술적 장점 또한 존재한다.)

 

- 반대로 이러한 Transformer도 여러 한계 부분이 있는데, 대표적인 것이 하나의 Patched Image 내에 하나의 고유한 객체가 담기지 않았을 경우이다. 즉, 지나치게 inductive bias가 무시됨으로써 발생한 문제이다. 예를 들어 길다란 도마뱀과 뱀이 한 장의 이미지에 걸쳐 여러 마리가 섞여있다고 했을 때, transformer는 이를 여러 장의 이미지로 나누는 과정에서 뱀의 꼬리와 도마뱀의 꼬리를 나누고, 가장 중요한 판단의 근거가 될 도마뱀의 몸통이나 다리 부분을 각기 다른 패치로 나눠가져갈 수도 있다. 이는 ViT를 구현하는 과정에서 Patch된 이미지들을 각기 한 줄의 문장 혹은 핵심 단어에 비유해 진행됨으로써 발생한 문제인데, 이를 해결하기 위해 하나의 이미지를 Crop&Shift, 혹은 여기에 더해 padding을 함으로써 한 장의 이미지에서 다양한 Patched Image를 출력할 수 있으며, 이 과정에서 마치 augmentation과 같은 결과가 만들어지기에 보다 많은 데이터를 요구하는 Transformer의 한계를 극복할 수 있다.

 

- 이러한 Transformer의 장점은 그 안의 복잡한 네트워크 구조가 아닌 Attention Score와 이를 활용하는 Multi-Head 구조에서 기인하는데, 'Vision Transformer Adapter for Dense Predictions' 논문을 살펴보면 Transformer 구조를 적용하되, 그 안의 네트워크는 별도의 파라미터가 존재하지 않는 Pooling만을 적용한 경우에도 기존 ViT 모델들 이상의 성능을 확인할 수 있었다고 한다.

 

- 다시 여기에서 CNN의 반격이 시작되는데, 바로 기존 CNN의 한계를 극복하기 위한 ConVEXT? 가 제안되었다고 하는데. 아직 이 논문은 읽어보지 못했으므로 다음 기회에...

'DATA SCIENCE > Study' 카테고리의 다른 글

Inductive Bias에 관하여...  (0) 2022.11.29
[BentoML 1.x] 1편 : BentoML 시작  (0) 2022.06.24
Docker : npm install error  (0) 2022.05.02
WSL에서 Docker 사용  (0) 2022.05.01
PYTHON Interface Option : argv와 flags, 그리고 argparse  (0) 2022.03.08