[CS231n]Lecture09-CNN_Architectures

그림 00

LeNet

  • 산업에 아주 성공적으로 적용된 최초의 ConvNet이다.
  • 이미지를 입력으로 받아 Stride = 1인 5x5필터를 거치고 몇 개의 Conv Layer와 Pooling Layer를 거친다. 그리고 마지막 출력 노드 전에 Fully Connected Layer가 붙는다.
  • 엄청 간단한 모델이지만 숫자 인식에서 엄청난 성공을 거두었다.

그림 01

AlexNet

  • 2012년에 등장한 최초의 Large scale CNN이며 Image Classification Benchmark의 우승 모델이다. ConvNet 연구의 부흥을 일으킨 장본인이다. 수년 전까지 대부분의 CNN 아키텍쳐의 베이스 모델로 사용되어 왔다. AlexNet은 다양한 Task의 transfer learning에 많이 사용되었다.
  • AlexNet은 기본적으로 conv - pool - normalization 구조가 2번 반복된다. 그리고 conv layer가 조금 더 붙고 (CONV 3,4,5) 그 뒤에 pooling layer가 있다.(Max POOL3) 그리고 마지막에는 Fully connected layer가 몇 개 붙는다.(FC 6,7,8) 생긴 것만 봐서는 기존의 LeNet과 상당히 유사하며 layer만 늘어 났다고 생각이 들 것이다. AlexNet은 5개의 Conv Layer와 2개의 FC-Layer(마지막 FC Layer 전까지)로 구성된다.
  • 다른 Conv Net의 다이어그램과 유사하긴 하지만 한 가지 차이점이 있다. 모델이 두개로 나누어져서 서로 교차한다는 것이다. AlexNet을 학습할 당시에 3GB GTX850으로 학습시켰다. 그래서 전체 Layer를 GPU에 다 넣을 수 없어서 분산 시켜 넣을 수 밖에 없었다. 각 GPU가 모델의 뉴런과 Feature Map을 반반씩 나눠가진다. Conv 1,2,4,5를 살펴보면 같은 GPU 내에 있는 Feature Map만 사용할 수 있다. 즉, 전체 96개의 feature Map을 볼 수 없다. 그래서 다이어그램을 보면 각 Conv Layer의 Depth가 48인 것이다. Conv 3, FC 6,7,8를 보면 이 Layer들은 이전 계층의 전체 Feature Map과 연결되어 있다. 이 Layer들에서는 GPU간의 통신을 하기 때문에 이전 입력 Layer의 전체 Depth를 전부 가져올 수 있는 것이다.

  • AlexNet 논문의 아키텍쳐와 관련한 조그만 이슈는 그림을 자세히 보면 첫 Layer가 224x224라고 되어 있는데, 실제 입력은 227x227이다.

질문

  • Pooling layer에는 파라미터가 없는가?
    • 파라미터는 우리가 학습시키는 가중치이다. Conv Layer에는 학습할 수 있는 가중치가 있다. 반면 Pooling의 경우에는 가중치가 없고 그저 특정 지역에서 큰 값을 뽑아내는 역할만 한다. 따라서 학습시킬 파라미터가 없는 것이다.
    • 각각의 Layer의 파라미터 사이즈를 계산해 보자!!!!

ZFNet

  • 2013년 우승 모델이며 AlexNet의 하이퍼 파라미터를 개선한 모델이다.
  • AlexNet과 같은 Layer 수이고, 기존의 구조도 같다. 다만, stride size, 필터 수 같은 하이퍼 파라미터를 조절해서 AlexNet의 Error rate를 좀 더 개선시켰다.

앞으로 언급할 두가지 모델은 Batch normalization이 없던 시절이었기 때문에 깊은 모델을 학습시키는 일이 어려웠다. 그렇기에 깊은 모델을 수렴시키기 위해서 각종 테크닉을 사용해야 했다. 먼저, VGG는 초기에 11 Layer이었는 11 Layer가 모델이 잘 수렴하는 한계였기 때문이다. 그리고 나서 11 Layer 중간에 Layer를 무작위로 추가해서 VGG-16, VGG-19를 학습시켰다. GoogLeNet의 경우에는 auxiliary classifiers를 도입하여 단지 네트워크의 초기 Layer에 gradient를 직접 흘려 보내기 위한 수단이었다.(성능을 올리기 위해 도입한것이 아니다! 그리고 Batch Norm이 있다면 굳이 이런식의 테크닉들은 더이상 필요치 않다!!!)

그림 02

VGGNet

  • 훨씬 더 깊어졌고 더 작은 필터를 사용한다. 더 깊게 쌓이므로써 Non-Linearity를 더 추가 할 수 있고 파라미터 수도 더 적어지게 되었다.

    • AlexNet에서는 8개의 Layer -> VGGNet 16~19개의 Layer
    • 3x3필터만 사용 (이웃픽셀을 포함할 수 있는 가장 작은 필터)
      • 이유 : 필터의 크기가 작으면 파라미터의 수가 더 적어서 Depth를 더 키울 수 있다. 3x3 필터를 여러 개 쌓은 것은 결국 7x7 필터를 사용하는 것과 실질적으로 동일한 Receptive Filter를 가지는 것이다.
    • 작은 필터를 유지해 주고 주기적으로 Pooling을 수행하면서 전체 네트워크를 구성하게 된다.
    • fc7 은 4096 사이즈의 Layer인데 아주 좋은 feature representation을 가지고 있는 것으로 알려졌으며 다른 데이터에서도 feature 추출이 잘되며 다른 Task에서도 일반화 능력이 뛰어난 것으로 알려져있다.
  • VGG19의 경우 VGG16과 유사한 아키텍쳐이지만 Conv Layer가 조금 더 추가 되었다. VGG19가 아주 조금 더 좋다. 그러나 보통 VGG16을 더 많이 사용한다. AlexNet에서 처럼 모델 성능을 위해서 앙상블 기법을 사용했다.

질문) 3x3인 Stride가 1인 필터 3개를 쌓게 되면 실질적인 Receptive Field가 어떻게 될까?

  • Receptive Field은 필터가 한번에 볼 수 있는 입력의 Spatial area이다.
  • 첫번째 Layer의 Receptive Field는 3x3이다. 두 번째 Layer의 경우는 각 뉴런이 첫 번째 Layer 출력의 3x3 만큼을 보게 될 것이다. 그리고 3x3 중에 각 사이드는 한 픽셀씩 더 볼 수 있게 된다. 따라서 두번째 Layer의 경우는 실제로 5x5의 receptive filed를 가지게 된다. 3번째 Layer의 경우 2번째 Layer의 3x3을 보게된다. 그리고 이 과정을 피라미드처럼 그려보면 입력 Layer의 7x7을 보게 되는 것이다.따라서 실질적인 Receptive Field는 여기에서 7x7이 된다. 하나의 7x7 필터를 사용하는 것과 동일하다.

질문) 하나의 Conv Layer 내에 여러개의 필터가 존재하는 이유는?

  • 각 필터가 존재하는 이유는 서로 다른 패턴을 인식하기 위해서라고 할 수 있다. 각 필터는 각각의 Feature Map을 만들게 된다.

질문) Localization은 무엇인가?

  • task 중에서 예를 들면 “이미지에 고양이가 있는가?”를 분류하는 것 뿐만 아니라 정확히 고양이가 어디에 있는지 네모박스를 그리는 것이다. Detection은 이미지 내에 다수의 객체가 존재할 수 있다. 그에 반해 localization은 이미지에 객체가 하나만 있다고 가정하고 이미지를 분류하고 추가적으로 네모박스도 쳐야한다.

그림 03

질문) 네트워크가 깊어질수록 Layer의 필터 갯수를 늘려야 하는지?(Channel Depth를 늘려야 하는지)

  • 디자인하기 나름이고 반드시 그럴 필요는 없다. 하지만, 실제로 사람들이 Depth를 많이 늘리는 경우가 많다. Depth를 늘리는 이유 중 하나는 계산량을 일정하게 유지시키기 위해서이다. 왜냐하면 보통 네트워크가 깊어질수록 각 Layer의 입력을 Down sampling하게 된다. 즉, 네트워크를 통해 나가면서 점점 정보를 잃어나가는 현상이 발생될 수 있다는 것이다. 그러므로 Spatial area가 작아질수록 필터의 depth를 조금씩 늘려주게 된다. Width나 Height가 작아지기 때문에 Depth를 늘려도 부담이 없다.

GoogLeNet

  • 2014년 Classification Challenge에서 우승한 모델이다. 22개의 Layer를 가진 깊은 네트워크이다. 가장 중요한 것은 효율적인 계산에 관한 그들의 특별한 관점이 있다는 것과 높은 계산량을 아주 효율적으로 수행하도록 네트워크를 디자인했다는 점이다.
  • “a good local network typology”를 디자인 하고 싶었다. 그리고 “network within a network”라는 개념으로 local topology를 구현했고 이를 쌓아올렸다. Inception module을 여러개 쌓아서 만든다. 또한 파라미터를 줄이기 위해 FC-Layer를 사용하지 않는다. 전체 파라미터 수가 60M인 AlexNet에 비해 GoogLeNet은 전체 파라미터 수가 5M 정도이다.

그림 04

  • Inception Module 내부에는 동일한 입력을 받는 서로 다른 다양한 필터들이 병렬로 존재한다. 이전 Layer의 입력을 받아서 다양한 Conv 연산을 수행 한 후 각 Layer에서 각각의 출력 값들이 나온다. 그 출력들을 모두 Depth 방향으로 합친다.(concatenate) 그렇게 합치면 하나의 tensor로 출력이 결정되고 이 하나의 출력을 다음 레이어로 전달하는 것이다.

질문) 이러한 다양한 연산을 수행하고 이를 하나로 합쳐주는 아주 단순한 방식이 갖는 문제점은 무엇일까?

  • 계산 비용에 문제가 있다. 1x1 conv의 경우 입력에 맞춰 depth는 256이다. 그리고 128개의 필터 하나다. 그리고 128개의 필터 하나 당 28x28 Feature map을 생성하게 될 것이다. 이런식으로 다른 Layer의 출력값을 계산해 보면 다음 그림과 같을 것이다. 참고로 이런 계산이 나온 이유는 spatial dimension을 유지하기 위해서 zero padding을 하였기 때문이다.Stride를 잘 조절해서 Spatial dimension를 유지하면 입력과 출력의 크기는 같게 된다. 즉 28x28은 동일하고 depth가 점점 쌓이게 된다는 것을 의미한다. 그림에서는 최종적으로 28 x 28 x 672 가 된다. Inception module의 입력은 28x28x256 이었으나 출력은 28x28x672이 된 것이다. Spatial dimension은 변하지 않았지만 depth가 엄청나게 불어난 것이다. 연산량이 많다는 것이 문제이며, Pooling Layer는 Depth를 그대로 유지하기 때문에 문제를 악화 시킨다.

  • 위와 같은 문제를 해결하기 위한 key insight bottleneck layer를 이용하는 것이다. Conv 연산을 수행하기에 앞서 입력을 더 낮은 차원으로 보내는 것이다.(depth를 더 낮은 차원으로 projection하는 것) input feature map들 간의 선형 결합(linear combination)이라고 할 수 있다.

그림 05
주요 아이디어는 바로 입력의 depth를 줄이는 것이다.각 Layer의 계산량은 1x1 conv를 통해 줄어든다.

질문) 1x1 Conv를 수행하면 일부 정보손실이 발생하지 않는다?

  • 정보 손실이 발생할 순 있지만 동시에 redundancy가 있는 imput features를 선형결합 한다고 볼 수 있다. 1x1 conv로 선형결합을 하고 non-Linearity(ReLU같은)를 추가하면 네트워크가 더 깊어지는 효과도 있다. 일반적으로 1x1 con를 추가하면 여러모로 도움이 되고 더 잘 동작한다.

그림 06
위의 그림에서 파란색 네모 박스는 추가시킨 보조 분류기(auxiliary classifier)이다. 그 구조는 Average pooling과 1x1 conv가 있고 FC-layer도 몇개 붙는 우리가 알고있는 작은 네트워크들이다. SoftMax로 1000개의 ImageNet class를 구분한다. 또한 네트워크가 깊기 때문애 이곳에서도 loss를 계산하고 추가적인 gradient를 얻을 수 있고 따라서 중간 Layer의 학습을 도울 수 있다.

질문) 보조분류기에서 나온 결과를 최종 분류 결과에 이용할 수 있는가??

  • GoogLeNet 학습 시, 각 보조분류기의 Loss를 모두 합친 평균을 계산한다. 아마도 도움이 될 것이다.

질문) bottleneck layer를 구성할 때 1x1 conv 말고 다른 방법으로 차원을 축소시켜도 되는가??

  • 여기에서 1x1 conv를 쓴 이유는 차원 축소의 효과도 있고 다른 Layer들 처럼 conv Layer이기 때문이다. 차원 축소 과정에서 이전의 feature map과 연관이 있는지 학습하려면 전체 네트워크를 Backprop으로 학습시킬 수 있어야 한다. 네트워크가 엄청 깊은 경우에서는 gradient 신호가 점점 작아지게 되고 결국에는 0에 가깝게 될 수 있다. 그렇기 때문에 보조 분류기를 이용해서 추가적인 gradient 신호를 흘려준다. 이 때 backprop은 각 보조분류기 별로 실행하는 것이 아닌 네트워크 전체가 한번에 작동시킨다.

질문) 각 Layer가 가중치를 공유하는가 아닌가??

  • 모든 Layer를 가중치를 공유하지 않는다.

ResNet

그림 07

  • 2015년도 우승 모델이며, 혁명적으로 네트워크의 깊이가 깊어진 모델이다.(152개의 Layer)
  • residual connection 이라는 방법을 사용한다. residual block들을 쌓아올리는 구조이다.
    • short connection과 residual block이 도입된 모델
  • 모델 Depth가 50이상일 때 Bottleneck Layers를 도입
  • ‘CNN을 깊고 더 깊게 쌓게 되면 어떤 일이 발생할까?’라는 의문에서 부터 시작된다. 예를 들어, VGG에 conv pool Layer를 깊게만 쌓는다고 과연 성ㄴ능이 더 좋아지는 것이 맞는지를 보자면 아니라는 것이다. 다음 그림에서 56-Layer와 20-Layer를 비교해서 설명하고 있다. 우리는 56-Layer는 상대적으로 더 많은 파라미터를 가지고 있기에 20-Layer보다 좀더 overfitting이 일어날 확률이 높다고 생각할 수 있을 것이다. 허나 우리 예상처럼 test error는 56-layer가 더 낮지만 training error 또한 더 낮기에 overfitting이 원인이 아니라는 것을 확실히 알 수 있다.
  • ResNet 저자들아 내린 가설은 더 깊은 모델 학습 시 Optimization에 문제가 생긴다는 것이다. 그렇다면 모델이 더 깊다면 적어도 더 얕은 모델만큼은 성능이 나와야 하지 않는가라는 생각으로 인해 더 얕은 모델의 가중치를 깊은 모델의 일부 Layer에 복사한다. 그리고 나머지 Layer는 identity mapping을 하여 Deeper Model의 학습이 제대로 안되더라도 적어도 shallower Model 만큼의 성능을 보장하게끔 디자인 한다. 이런 아이디어를 모델에 적용시키기 위해 가중치가 없으면 입력을 identity mapping을 시켜 출력으로 내보내는 Skip Connection을 도입하게 된다. 실제 Layer는 변화량(delta)만 학습하면 된다. 입력 X에 대한 잔차(residual)이라고 할 수 있다.

질문) Layer의 출력과 Skip Connection의 출력이 같은 차원인가?

  • 그렇다. 두 경로의 출력 값 모두 같은 차원이다. 일반적으로는 같은 차원이 맞지만, 그렇지 않은 경우에는 Depth-wise padding으로 차원을 맞춰준다.

그림 08

질문) Layer의 출력인 Residual의 의미는 무엇인가?

  • 아래 그림을 보면, 전체 출력 값은 F(x)+X 이고, F(x)는 Layer의 출력 값이다. X는 그저 입력값이다. 왼쪽의 평범한 네트워크는 H(x)를 학습시키고 있지만 아주 깊은 네트워크에서는 H(x)를 학습시키는 것은 너무 어렵다. 그래서 ResNet의 아이디어는 H(x)=F(x)+x이므로 F(x)를 학습시켜보면 어떨까라는 것이다. 즉, H(x)를 직접 배우는 대신에 X에 얼마의 값을 더하고 빼야할까를 배우는 것이 쉬울것이라고 생각한 것이다. 이것은 단지 가설일 뿐이지만 가설이 참이라면 모델의 일부가 학습된 shallow layers이고 나머지 layer들은 identity로 구성되어진 상황에서는 잘 동작할 것이다. 이는 대부분의 layer가 잘 동작하려면 layer의 출력이 identity에 가까워야 할지 모른다는 것을 암시한다. 이 때문에 Identity(Input) + 변화량(delta)만 학습시키면 된다. 예를들어, Output = Input(Identity)이어야만 하는 상황이면 F(x) = 0 이 되면 그만이다. 이는 상대적으로 학습시키기 쉽다고 볼 수 있다.

  • ResNet에서는 Layer의 출력은 입력 + residual block의 출력이다. 우선 residual block의 가중치가 0이면 이 block은 identity mapping을 한다. 이러한 속성으로 모델이 필요없는 Layer를 사용하지 않도록 학습하는데 아주 유용하다. ResNet의 관점에서 L2 Regularization을 해석해 볼 수도 있다. Layer에 L2 Regularization을 추가시키면 L2는 모든 파라미터가 0이 되도록 노력할 것이다. 사실 CNN Architectures의 관점에서 보면 모든 파라미터가 0이면 이상하다. 하지만 ResNet의 관점에서는 파라미터를 0으로 만드려는 속성은 모델이 불필요한 Layer를 사용하지 않도록 해줄 수 있다.