본문 바로가기

코딩공부/패스트캠퍼스 AI 부트캠프

Computer Vision 모델 발전 과정

기본적인 모델의 구조는 위 이미지와 같다.
이미지에서 feature를 얻기위해서 Backbone을 통과한다. 이를 통해 Feature map을 얻고 해당 Feature map을 Encoder를 통과하고 Decoder를 통과하면서 task를 수행하는 구조로 간다.
이때 어떤 모델을 Backbone을 하지, Encoder로 할지, Decoder로 할지는 task에 따라 data에 따라 다르다.

모델 발전 과정

backbone은 이미지에서 feature map을 구하기 위해 사용하는 것을 말한다. 좋은 모델일 수록 feature map으로 표현된 이미지에 특성들이 잘 녹여 있으면서 적은 파라미터를 가지고 빠른 학습속도를 보장하는 것이 좋다. 특히, 엄청 유명했던 Image Classification Competition인 ILSVRC 대회에서 엄청난 backbone 모델들이 소개되었다.

( CNN )  AlexNet (2012)--> VGG(2014) --> ResNet(2015) --> EfficientNet(2019) -->
( Transformer )Vit(2020) --> Swin(2021)

 

AlexNet(2012)

CNN을 적용해서 ILSVRC 대회에서 인상적인 성능 향상을 보여준 모델이다.
CNN은 1989년에 최초로 소개 되었지만 해당 모델을 적용해서 이렇게 성능을 향상시킨 것을 보여준 것은 AlexNet이 최초이다.
AlexNet은 기본적인 CNN을 쌓아 만든 단순한 구조이며 11 x 11 크기의 필터와 5x5 크기의 필터를 사용했다.
Alex는 단순 사람이름을 따서 작명 한것으로 큰 의미는 없다.

추가적으로 Overlaping Pooling을 사용하여 Lateral Inhibition 문제를 완화했다.

VGG(2014)

VGG는 AlexNet의 깊이가 너무 얕아 설명력이 약한 점을 지적했다.
이러한 점은 VGG가 나오기 전에도 있었고 이러한 문제를 해결하고자 레이어를 깊게 쌓는 시도들은 많이 있었다.
하지만 레이어를 깊게 쌓으면 파라미터 수가 증가하고 이에따라 학습 속도도 현저히 느려지는 문제를 직면했다.

이를 해결하기 위해서 VGG는 3 X 3 필터를 사용했다.

3 x 3 필터를 3개 쌓으면 7 x 7 필터를 사용해서 나타는는 Receptive Field 와 같다. 그러나 파라미터수는 49개에서 27개로 줄일 수 있다. 따라서 VGG는 레이어를 깊게 쌓으면서도 파라미터 수를 줄이는 방법을 제시했다.
실제로 레이어가 깊어지니 non-linearities 가 올라가 표현력이 더 풍부해 졌고 그에 따라 성능도 향상했다.

ResNet(2015)

혁면적인 모델이다. 누가 ResNet을 물어보면 Skip Connection(Residual Connection), Bottleneck Layer, Batch Normalization 이라고 대답하면 된다. 특히 Skip Connection은 아직도 거의 모든 모델에 적용되고 있다. 그 유명한 Transformer에서도 Skip Connection이 적용되어 있다.

VGG모델은 레이어를 깊게 쌓을 수록 설명력이 풍부해져서 성능이 올라감을 증명했다.
그래서 이후 모델들은 계속 계속 레이어를 깊게 쌓아만 갔다.
하지만 레이어를 쌓을 수록 오히려 성능이 나빠지는 결과를 얻었다.
그 이유는 Gradient Vanishing 문제였다. 레이어가 깊어 갈 수록 초반의 Weight 값이 전혀 학습을 안되는 현상이다.
ResNet은 이러한 문제지를 지적하고 이를 해결하고자 Skip Connection(Residual Connection)을 제안 했다.

처음의 데이터를 잃어버리는 것이 문제이니 그냥 Weight를 뛰어 넘어 원본 값을 더해주는 방법이 Skip Connection 이다.
이러한 방법을 적용하면 Weight 값은 더 이상 예측값 자체를 학습하는 것이 아니라 잔차를 학습하게 된다.
잔차는 예측값에 비해 비교적 작은 값이므로 작은 weight 값만 변화를 주면 되어서 깊은 모델이 학습하기에 용이했다.

하지만 학습이 용이해졌더라도 문제가 있다.
레이어가 깊어지면서 학습해야할 파라미터의 수가 너무 많아 졌다는 것이다.
이를 해결하기 위해서 ResNet은 Bottlenect Layer 를 사용했다.

핵심은 1 x 1 필터를 추가적으로 사용해서 데이터의 차원의 수를 줄인다는 것이다. 
차원수가 줄어들면 자연스럽게 학습해야할 파라미터 또한 줄어든다.

위 그림에서 보면 3x3 필터만 사용한 모델은 12 x 12 x 256 크기의 데이터를 학습하기 위해서 589824개의 파라미터를 학습해야하지만
1x1 필터를 추가하여 bottleneck을 추가한 모델은 163840개의 파라미터만 학습하면 된다.


마지막으로 Batch Normalization을 추가해서 데이터의 편향을 줄여주어 일반화 성능에 큰 영향을 미쳤다.
또한 Scale 과 Shift를 통해 학습가능한 파라미터를 추가하면서 표현력을 늘렸다.

Efficient Net(2019)

레이어를 맘껏 쌓아도 Gradient Vanishing 문제도 해결되고 학습 파라미터 수도 어느정도 완화 시킬 수 있었다. 이러한 환경에서 많은 모델들이 무작정 크기를 키우기 시작했지만 모델 크기에 비해 성능의 향상 폭은 너무 적었다. 이를 해결하고자 제시한 것이 바로 Efficient net이다.

Efficient Net의 가장 핵심적인 아이디어는 Compound Scaling이다.

간단하게 말해서 그저 모델의 크기만 키우면 안되고 모델의 깊이, 넓이, 해상도를 적절한 비율로 함께 향상 시켜야한다.
그리고 Efficient Net은 그 3가지에 해당하는 가장 적절한 비율의 공식을 제안함에 의미가 컸다.

또한 Efficient Net은 MBConv Block을 제안 하여 학습해야할 파라미터 수를 줄이는 방법을 제안했다.



Vit(2020)

2017년도에 transformer가 처음으로 세상에 소개되면서 인공지능 분야에 많은 변화가 일어났다.
transformer 이전까지는 CV분야가 활발히 연구 되어졌다면 transformer 가 등장하면서 NLP 분야가 더욱 주목 받기 시작한다.
이러한 기조 속에서 CV분야에서도 transformer를 적용해서 문제를 해결하려는 시도들이 등장한다.
그것들 중 하나가 바로 Vit 모델이다.

CNN 모델을 사용하여 Feature map을 얻었을 때 해결 할 수 없는 몇가지 문제가 존재했다.
첫째로 멀리 떨어진 두 물체에 대한 context 학습이 어려웠다.
두번째로 이미지 내 여러 물체간의 상관관계를 학습시키기 어려웠다.
이러한 문제를 잘 해결해 냈던 구조가 바로 transformer 이고 Vit 또한 transformer를 사용하여 이러한 문제를 해결하려고 시도한 모델이다.


Vit모델이 이미지 Feature map을 얻는 과정은 다음과 같다.
1. Patching -> 2. Linear Projection -> 3.[CLS] token & Position Embedding -> 4.Transformer -> 5. MLP Head

1~3 까지의 과정은 Transformer에 넣기 위한 작업이다.
이미지를 토큰화(patching) 하고 차원을 조절(Linear Projection)하고 토큰화 하면서 부서진 위치 정보를 넣어주는(Position Embedding)는 과정이다. 이러한 과정을 거쳐야 드디어 transformer의 입력으로 알맞은 형태가 만들어 진다.

이후 Transformer에 넣어서 Transformer의 결과를 Task에 따라 가공하는 MLP Head 를 거치는 것이다.

Vit는 성능향상 부분에서는 큰 효과가 없었다. 하지만 이전에 이미지에 Transformer를 적용하고 하는 시도들은 성능이 나빠지는 경우가 많았는데 그러한 시도들과 비교해보면 성공적으로 CV분야에 Transformer를 적용하는 방법을 제시했다는 것에 큰 의미가 있다.

Swin(2021)

Vit에서 발전된 모델.