Loading [MathJax]/extensions/MathMenu.js

CNN1



CNN


Convolution 연산 이해하기

  • 지금까지 배운 MLP는 fully connected. 가중치 행들이 i번째 위치마다 필요해서 i가 커지면 가중치 행렬의 크기가 커지게 됨

    image-20210202134359041

    image-20210202134359041

  • 우리가 이제부터 볼 Convolution 연산은 커널이라는 고정된 가중치 행렬을 사용하여 고정된 커널을 입력벡터에서 옮겨가며 적용

    image-20210202134617666

    image-20210202134617666

  • x라는 입력벡터 상에서 커널사이즈 만큼 움직여 가며 연산


다양한 차원에서의 Convolution


image-20210202164217282

image-20210202164217282

image-20210202135650652

image-20210202135650652

2차원 Convolution 연산

image-20210202155309174

image-20210202155309174

입력을 kernal size에 맞춰서 입력위치에 해당하는 index만큼 옮겨다니면서, 성분곱을 연산하는

2D 이미지 다른 kernel을 적용하여 Convolution filter를 적용하면 kernel에 맞는 특성을 가지는 2D 이미지가 나온다







image-20210202163834784

image-20210202163834784

  • channel이 여러개인 2차원 입력의 경우 2차원 Convolution을 채널 개수만큼 적용한다 (2차원 이미지더라도, RGB가있어서 3 channel)
  • 채널이 여러개인 입력인 경우 커널도 채널의 개수만큼 있어야 한다
  • 채널이 여러개일때는 각커널을 적용한 각각의 채널의 결과를 더해준다

image-20210203133123225

image-20210203133123225



만약 출력의 channel을 늘리고 싶다면???

커널의 개수를 여러개 만들면 된다.

image-20210202163929154

image-20210202163929154

feature map의 채널 숫자를 늘리는 보통 이렇게 많이 사용한다




Convolution 연산의 Backpropagation


  • Convolution연산은 모든 입력데이터에 공통으로 커널이 적용되기 때문에 역전파 계산시에도 convolution이 나오게 된다

Stack of Convolution

image-20210203133602208

image-20210203133602208

MLP때와 마찬가지로 non-linear activation을 사이에 적용했다

연산을 정의하는 Parameter의 숫자가 중요

첫번째 Convolutional filter의 parameter수 : 5*5*3*4 = 300 개

두번째 Convolutional filter의 parameter수 : 5*5*4*10 = 1000개

Convolution NN

  • CNN은 Convolution layer + Pooling layer + fully connected layer
  • Convolution & pooling layer : feature extraction
  • fully connected layer : decision making

점점 뒤의 fully connected layer를 줄이는 추세

reason : parameter의 수

우리가 일반적으로 우리의 모델의 parameter 숫자가 늘어날수록 학습이 어렵고 generalize performace가 떨어진다

따라서 CNN은 parameter수를 줄이는데 집중한다

어떤 뉴럴네트워크에 대해서 parameter숫자를 계산해보자


Stride & Padding

skip



Convolution Arithmatic


image-20210203155819848

image-20210203155819848

우리가 사용하는 kernel을 계산해보면

일단 3*3의 width 와 height이며 kernel의 channel은 입력의 channel과 같아야 하므로 128이다

따라서 하나의 kernel의 size = 3*3*128이다

이제 이 kernel의 갯수를 찾으려면 output의 channel인 64이다

따라서 총 parameter의 개수는 3*3*128*64 = 73728이다

이제 padding과 stride는 parameter 수와는 연관이 없다

ex)image-20210203160420099

image-20210203160420099

사실 alexnet은 network가 2 path로 나누어짐

  1. 일단 첫번째 layer의 kernel = 11x11x3 = 363

    이게 48개 있으므로 parameter개수 = 17424개

    원래는 이제 96짜리 channel을 만들었어야 되는데 2개로 나누어서 48 channel로 만들어줌

    따라서 총 parameter수 = 34848

  2. kernel = 5x5x48 = 1200

    이게 128개 그리고 총 2개 있으니 -> 1200x128x2 = 307k

  3. kernel = 3x3x128 = 1152 이게 2개 -> 2304

    이게 192개 그리고 총 -> 2304x192x2 = 884k

  4. 똑같은 방법 -> 663k

    쭉쭉

    그러다가 Fully connected layer의 parameter 개수

13x13x128x2x2048x2 = 177M

16M

4M

보면 dense layer에서 parameter숫자가 너무 커진다

결국은 parameter를 줄이기 위해서는 convolution layer를 깊게 쌓고 뒤의 dense layer를 최대한 줄이는 방향으로 발전하고 있다

1x1 convolution

image-20210203162452918

image-20210203162452918

여기서 parameter수를 계산해보면 1x1x128x32 = 4096

demension을 줄인다!!!

깊이는 깊어지지만 parameter수를 줄이는 역할을 한다

e.g) bottle neck architecture


Modern Convolutional Neural Networks


  • ILSVRC에서 우승하거나 좋은 성능을 거둔 model들에 대한 parameter 개수, depth 등등


AlexNet


ILSVRC

  • Imagenet Large-Scale Visual Recognition Challenge

  • 1000 different categories

  • over 1 millions images

AlexNet

  • gpu의 성능이 부족해서 한번에 계산이 안되서 2개로 나눠서 따로 training을 시킴

Receptive field : 하나의 kernel이 볼수있는 이미지 level에서의 영역은 커짐, 그러나 parameter가 늘어나게 됨

  • 5 Convolutional layer
  • 3 Dense layer

Key idea

  • use ReLU function (non-linear func, 마지막 slope가 1이라 gradient가 사라지거나 네트워크를 망칠 확률이 적음)

    • preserve properties of linear model

    • overcome the gradient vanishing problem

    • 이전에 많이 활용하던 tanh나 sigmoid는 값이 크면 output의 gradient가 0에 가깝게 나온다

  • GPI implementation (2 GPU)

  • Overlapping Pooling, Local response normalization

  • Data augmentation

  • Dropout

지금 보면 별로 대단한게 아니지만, 그당시에는 혁신적인 방법

일반적인 standard 를 잡았다!


VGGNet


  • Increasing depth with 3x3 convolution filter

  • 1x1 convolution filter

  • Dropout (p=0.5)

  • VFF16,VGG19

Why 3x3????

kernel size가 커지면서 가지는 이점 : Receptive field가 커진다

ex)

3x3을 2번 하게 되면 output의 1개의 값은 input의 5x5를 보게된다 -> 이게 바로 Receptive field

3x3을 3번 하게 되면 output의 1개의 값은 input의 6x6을 보게된다

따라서 3x3을 2개 사용하는 것과, 5x5를 1개 사용하는 것은 receptive field의 관점에서는 같다

따라서 이둘의 parameter의 개수를 비교해 보면 (chaneel : 128)

3x3 2개 : 3x3x128x128x2 = 294k

5x5 1개 : 5x5x128x128 = 409k

따라서 3x3 2개를 쓰는게 parameter의 숫자 감소 측면에서 이득이다

왜이런일이 일어날까?

사실상 3x3x3 = 27, 6x6 = 36 | 3x3 = 9, 5x5 = 25 이런 맥락이다

뒤의 대부분을보면 kernel은 7x7을 벗어나지 않는다


GoogLeNet


image-20210203180018567

image-20210203180018567

보면 전체 network 안에 작은 network 구조들이 반복되고 있다 (network in network)

  • Inception block 활용

image-20210203180125687

image-20210203180125687

하나의 입력에 대해서 여러개의 receptive field를 가지는 filter를 거치고 이들을 concatenation

하지만 그보다 중요한게 중간중간에 추가로 들어간 1x1 Conv

/image-20210203180311444

/image-20210203180311444

  1. 3x3x128x128 = 147456
  2. 1x1x128x32 = 4096, 3x3x32x128 = 36864 ->합은 : 40960

parameter 수가 1/4로 줄었다 —-> 사용하는게 이득이다!!!

과연 AlexNet,VGGNet, GoogLeNet 중 parameter수가 작은것은?

  1. AlexNet(8 layer) : 60M
  2. VGGNet(19-layer) : 110M
  3. GoogLeNet(22 layer) : 4M


ResNet

  • Deeper neural networks are hard to train
  • Overfitting is usually caused by an excessive number of parameters

Identity map

image-20210203182236058

image-20210203182236058

image-20210203182359483

image-20210203182359483

x와 output의 차원을 맞춰주기 위해서 1x1 convolution으로 사용하는것

  • Convolution 연산과 batch norm의 순서??????
  • 더 자세한 ResNet의 구조????

Bottleneck architecture

3x3의 연산을 하기 전에 channel 수를 줄이게 되면 parameter의 숫자를 줄일수 있지 않을까?

image-20210203183155786

image-20210203183155786


DenseNet


  • ResNet을 바라보게 되면 그냥 두개의 값을 더하지 말고 concatnate시키면 되지 않을까?
  • 계속 concatnate하면 channel이 기하급수적으로 커지기 때문에 이를 해결하기 위해 중간에 1x1 conv를 해줌

Author

jo-member

Posted on

2021-02-03

Updated on

2021-07-12

Licensed under

Comments