Day to_day

GoogleNet (InceptionNet) 빠르게 핵심만! 본문

Deep Learning

GoogleNet (InceptionNet) 빠르게 핵심만!

m_inglet 2024. 4. 22. 00:26
728x90
반응형

들어가며

VGG를 알아봤으니 GoogleNet도 빼먹을 수가 없다. 빠르게 정리하고 넘어가 보도록 하겠다!

이 내용은 혁펜하임님의 Legend 13 강의를 재구성 한 것입니다. 

 

GoogleNet 특징

일단 특징을 먼저 정리하면서 기억해야 할 것을 위주로 정리해 봤다.

 

  1. 여러 크기의 필터를 사용

    • VGGNet 3x3 필터를 두 번 통과시켜 5x5 필터와 같은 receptive field를 얻은 반면, Inception Net은 여러 사이즈의 conv layer를 통화시키면서 입력 이미지에 대해서 서로 다른 크기의 패턴 및 특징을 캡처할 수 있도록 돕는 역할을 했다.
  2. 각 레이어를 병렬로 연결

    • 여러 필터에서 얻은 feature map을 depth 방향으로 concatenate를 시켰다. 그러면서 다양한 추상화 수준의 정보를 동시에 추출할 수 있다.
  3. 1x1 컨볼루션 레이어

    • Inception 모델은 1x1 크기의 컨볼루션 필터를 사용하면서 차원 축소를 하는 역할을 한다. 이로 인해 계산 효율성이 VGGnet에 비해 10배 이상의 훨씬 적은 파라미터 수로 계산할 수 있었다.
  4. Auxiliary Classifier

    • 모델은 중간 레이어에 보조 분류기(Auxiliary Classifier)를 추가해 네트워크의 vanishing gradient 문제를 완화시켰다.
  5. GoogleNet 구조

    • GoogleNet이라고도 불리며 깊이와 너비를 효과적으로 관리하여 높은 정확도를 얻어 ImageNet 분류 대회에서 2014년도에 우승을 차지하였다.

 

 

GoogleNet 아키텍처

 

 

GoogleNet의 아키텍처를 살펴보면 크게 3가지 요소를 가진 것을 볼 수 있다.

초기 레이어에 해당하는 stem, 이 아키텍처의 핵심인 Inception, 깊어진 구조로 인한 gradient vanishing을 막기 위해 중간 중간에 위치한 Auxiliary classifier가 있다. 하나씩 자세히 보겠다.

 

 

Stem

  • 각 레이어에 아래 숫자는 커널 사이즈와 stride를 의미한다. 예를 들어, 3x3+1는 커널 사이즈 3x3에 stride 1이라는 것을 뜻한다.
  • S: Same 혹은 딱 반으로 떨어지게 되도록 padding을 한다는 의미
  • V: Valid padding을 0으로 하겠다는 의미
  • Local Response Normalization(LRN)

    • AlexNet에서 처음 제안된 것이고 주변 픽셀에 대한 반응을 정규화 하여 성능을 향상하는 데 사용되었다.
    • 그런데 Batch Normalization과 같은 더 나은 정규화 기술이 있어서 요즘엔 잘 사용하지 않는다.

 

Auxiliary classifier

Auxiliary classifier은 위에서도 계속 말했듯이 깊어진 모델의 gradient vanishing 문제를 막기 위해 나온 개념이다.
그래서 layer 중간에 auxiliary classifier가 위치하여 중간 위치의 정보를 잃지 않고 추가적으로 역전파를 일으키는 역할을 한다.

그럼에도 가장 마지막에 gradient가 더 중요하기 때문에 0.3의 비율로 곱해주어 지나치게 영향을 주는 것을 막았다.

training에서만 이렇게 사용했고, inference 단계에서는 없애고 실행했다고 한다.

 

  • Loss = out_loss + 0.3*(aux1_loss+aux2_loss)

 

 

Inception

결국 GoogleNet의 아이디어의 시작은 신경망은 깊게하여 성능은 높이고 싶은데 파라미터 수가 많아지면 계산량도 많아지고 또 데이터가 충분하게 있지 않다면 과적합의 위험성도 있다는 것에서 시작되었다.

그래서 Inception을 통해서 해결하였다. 그림으로 먼저 보는 게 직관적으로 이해하기 쉬울 것 같다.

 

Inception module, naive version

 

위의 그림은 naive Inception으로 초기 모델이다. 다른 크기의 필터로부터 나온 결과를 병렬적으로 추출한 뒤 concat 하여 사용한다. 그러나 이 경우엔 5x5 필터가 많아질 수록 연산량이 많아진다는 것과 채널을 유지하는 pooling layer의 특성으로 인해 filter의 결과와 pooling의 결과를 concat 하면 계속해서 채널 수가 늘어난다는 것에 한계가 있다.

 

Inception module with dimension reductions

그래서 논문에서는 1x1 convolution을 이용해 이 문제를 해결하였다.

  • 논문에서는 inception module stride를 모두 1로 고정하고 padding을 적절히 조절했다
  • 한 가지 예시를 들어 1x1 convolution이 먼저 위치해야 파라미터 수가 많이 줄어드는지 알아보겠다.
  • 192 채널 수에서 128 채널 수로 변한다고 할 때 3x3 필터를 통과하는 파라미터 수는 128x192x3x3일 것이다.
  • 그러나 1x1 필터를 이용해 채널 수(192 → 96)를 줄인 다음 다시 원하는 채널 수(96 → 128)로 늘리는 방법을 택할 수 있다. 채널 수는 192 → 96 → 128로 변하고 파라미터 수는 더 줄어들 것이다(96x192x1x1 + 128x96x3x3)
  • 1x1 convolution의 위치가 왜 뒤쪽이 아닌 앞쪽인지에 대해선 파라미터를 직접 계산해 보는 게 좋을 것 같다.

그래서 다시 Inception 모듈을 정리하자면,

다양한 크기의 필터를 통해 다양한 특징을 추출하여 병렬적으로 연산을 수행하였고, 차원을 축소하여 연산량을 줄이기 위해서 1x1 convoluutional layer를 사용하였다.

 

 

마지막 Classifier

 

위의 그림은 예측 결과가 나오는 모델의 끝 부분이다.

최종 Classifier 이전에 average pooling layer가 사용되었는데, 이는 GAP(Global Average Pooling)이 적용된 것이다. 이전 layer에서 추출된 feature map을 각각 평균하여 1차원 벡터로 변환한다. 이는 최종적으로 이미지 분류를 위한 softmax  layer와 연결하기 위해서이다.

 

 

전체 구조

전체 구조를 표로 나타낸 것이다. 여기서 #3x3 reduce, #5x5 reduce 열은 필터에 붙은 1x1 convolution을 의미한다.

그리고 pool proj 열은 max pooling layer 뒤에 오는 1x1 필터의 채널 수를 의미한다.

 

 

추가

  • 144개로 crop 했다는 의미는 이미지 하나를 144개의 이미지로 변형시킨 다음 144*7=1008개의 출력을 평균내서 최종 분류를 수행했다는 것이다. (일종의 TTA를 수행했다고 할 수 있다)

 

💡 TTA(Test Time Augmentation)

TTA(Test Time Augmentation)는 컴퓨터 비전에서 사용되는 일종의 앙상블 기술인데 쉽게 말하면 주어진 입력 이미지에 대해 여러 가지 변환(증강)을 적용하고, 각 변환된 이미지에 대해 모델의 예측을 평균 또는 결합하여 최종 예측을 얻는 방법이다.

일반적으로 train 데이터셋에는 다양한 augmentation(회전, 이동, 확대/축소, 반전 등)이 적용되어 있다. 하지만 테스트 시에는 보통 원본 이미지만 사용된다. 이때, TTA를 사용하면 train 할 때와 유사한 변환을 테스트 시에도 적용하여 모델의 성능을 향상할 수 있다.

TTA를 사용하면 모델이 입력 이미지에 대한 다양한 변화에 대응할 수 있기 때문에 더 강건하고 일반화되도록 만들 수 있다. 특히 데이터가 제한된 경우에는 TTA가 유용할 수 있다.

728x90
반응형
BIG
Comments