Convolution Neural Network(1)

합성곱 연산과 이미지 필터

아날로그 신호처리

  • 아날로그 신호처리는 선형이고 시불변인 시스템에 의존해서 개발이 되게 되는데, Noise가 있는 입력이 들어왔을 때 넣어주면 Noise가 제거된 출력이 나오는 이런 시스템을 모두 LTI system이라고 부른다. 디지털 신호가 아닌 아날로그 신호로부터 LTI system이 정의되어있다. 선형이라는 것은 대부분 알고 있듯이 선형대수에서 나오는 linearity를 만족시키면 되는 것이고, 시불변이라는 의미는 시간이 지나도 동일한 결과를 내보내준다는 의미이다. 확률과정에서 step에 영향을 받지 않는다라고 보면 좋을 것 같다. 사람은 대표적으로 LTI 시스템이 아닌 시스템이다.

Dirac 델타 함수

  • 수학적으로는 엄밀하진 않지만, 공학에선 많이 사용한다. 왼쪽의 삼각형을 모든 구간에 대해 전부해준다면 값은 1이 될 것이다. 여기서 $h\to\infty$가 되면, Dirac 델타 함수가 된다.
    • 시간 t=0만 임의의 값을 갖고, 나머지 구간은 0을 갖는다.
    • 모든 구간에서 적분한 값이 1

임펄스 응답

합성곱 연산

  • convolution을 한다는 것은 임의의 두 함수 중 한 함수를 좌우로 뒤집고 이동시키면서 두함수의 곱을 적분하여 계산한다.

합성곱 연산과 LTI 시스템

이차원 신호와 흑백 이미지

이차원 신호와 컬러 이미지

영상의 합성곱 계산
합성곱 계산 animation

잡음 제거 필터

미분 필터

  • vertical Sobel Filter가 왜 미분 필터이냐고 의문이 든다면, 1차원 신호를 data로 생각하고 앞서 했었던 수치 미분을 떠올려 보자. 그렇다면, 단숨에 이해가 갔을 것이다. 지금은 vertical Sobel Filter이므로 가로의 Edge는 추출하지 못한 것을 확인할 수 있다. 그에 반해 세로 성분들은 잘 검출된 것을 확인 할 수 있다. 만일 위의 필터를 90도 rotate해주게되면 가로로 미분하는 horizonal Sobel Filter가 되어 위의 결과와는 반대의 결과를 보여줄 것이다.

합성곱 계층

곱에서 합성곱으로

  • 입력이 이제는 영상으로 여러개 들어오게 되어 각각의 입력층의 뉴런 하나 하나가 channel이라고 불린다. 필터 가중치는 보통 3x3, 5x5, 7x7등을 주로 사용한다. 2D signal과 2D signal을 곱(element-wise product or Hadamard product)해야하므로 합성곱을 사용한다.

전결합 계층

합성곱 계층

  • $kernel_{Height} \times kernel_{Width} \times channel_{in} \times channel_{out}$ 만큼의 parameter가 필요하다. filter는 $Channel_{in} \times Channel_{out}$개 만큼 있을 것이다.

합성곱 계층의 의미

  • kernel(Filter)에 나타나는 모양과 유사한 모양을 한 위치가 높은 값으로 나타나게 된다.

기본적인 합성곱 신경망

합성곱 신경망의 기본 구조

합성곱 계층

  • stride요소를 넣지 않으면, 합성곱 계층에서는 영상의 크기는 그대로이며, 영상의 채널 수가 달라진다.
  • kernel(filter)가 돌아다니면서 포착하는 형태이기 때문에 공간적인 특징이 있고, 따라서 Feature Map이라고 한다.

풀링 계층

Pooling Layers

  • classification에서는 Max Pooling이 주로 잘 먹힌다!

평탄화
-Convolutional Layer와 FC Layer를 연결해주기 위해 필요하다

전결합 계층

그러면 왜 이런 구조를 쓰나?

  • 먼저, 맨 처음 언급했던 머신러닝과 딥러닝의 가장 큰 차이는 사람이 feature를 넣어주느냐 그렇지 않느냐의 차이라고 했다. 크게 보면 위의 그래프에서 합성곱 계층과 활성함수의 과정을 N번 반복하는 것은 shallowNN의 input으로 넣어 줄 Feature를 뽑는 과정이라고 직관적으로 이해할 수 있다.

  • 앞의 합성곱 계층에서 activation function 까지를 계속해서 진행 할수록 Feature Map의 크기(width와 height)는 Kernel과 Pooling에 의해서 줄어들고 channel(depth)는 늘어나게 될 것이다. 또한 처음부터 끝까지 동일한 크기의 kernel(Filter)을 사용한다고 가정한다면, 영상에서 더 넓은 영역을 커버하는 효과를 주는 것과 동일하다.

Receptive Field

  • 그래서 Feature Map을 한번 뽑을 때마다 Pooling을 해주면서 처음에는 좁은 영역을 점점 더 넓은 영역을 본다. 점점 더 넓은 영역을 본다는 의미는 Pooling을 함으로써 결국에는 더 넓은 범위를 대표하는 값들을 가진 2-D Matrix인 Feature Map이 될 것이기 때문이다.

LeNet-5

  • 98년도의 르쿤 교수님의 LeNet-5는 pooling 대신 subsampling을 사용하여 같은 Feature Map의 크기를 줄여주었다.

VGG-16

합성곱 신경망의 심화 이해

합성곱 게층의 필요성

  • 간단히 생각하면 $kernel_{height} \times kernel_{width} \times Channel_{in} \times Channel_{out}$ 만큼 어마어마하게 많은 Parameter가 필요하므로 계산해야 할 Parameter가 상대적으로 적은 FC Layer로 하는 것이 더 좋은 방법이지 않을까라고 생각하시는 분들이 있을 것이다. 허나, 그것은 잘못된 생각이다. Convolutional Layer를 사용하기 때문에 우리가 Image를 처리할 수 있는 것이다. FC Layer를 사용하게 되면 오히려 계산해야 할 Parameter의 개수가 어마어마하게 늘어난다.$(Height_{in} \times Width_{in} \times Channel_{in}) \times (Height_{out} \times Width_{out} \times C_{out})$ 얼핏 보기엔 비슷해보이겠지만, 예를 들어보자. 입력으로 RGB channel을 갖는 1024 * 1024 image를 받는다면, FC Layer를 사용한다면, $(1024 \times 1024 \times 16) \times (1024 \times 1024 \times 32)$이지만 Convolutional Layer를 사용하고 $3 \times 3$ kernel을 사용한다면 $(3 \times 3 \times 16 \times 32)$로 훨씬 적은 연산을 한다. 이러한 이유로 우리가 영상을 입력으로 하는 것은 절대로 FC Layer를 통해 해결할 수 없다.

전결합 계층의 수학적 표현

합성곱 계층의 수학적 표현

  • 위에서 W는 kernel들을 $C_{in} \times C_{out}$ Matrix로 이루어진 tensor이다. 즉, $W_{i,j}$들이 각각의 kernel을 나타내고 $X_{i}$와 convolution operation을 해주므로 편향은 FC Layer와 동일하게 channel 1개마다 1개씩 존재한다.

Padding의 필요성

Padding

  • 위의 그림의 예를 보면 kernel size가 $3 = 2N+1$이므로 입력에 상하좌우 1개의 Zero-Padding을 해준 것이다.

Stride

  • Stride를 하는 것은 결과를 미리 Convolution을 Full로 다 연산을 한 다음에 하나씩 Subsample하는 것과 동일한 결과를 가져온다. 그러므로 다 연산한 후에 subsampling을 하면 연산은 다하지만 결국엔 버리는 값이 생기기 때문에 Stride를 사용한다.

합성곱 계층의 특징

  • 학습 초반에는 위쪽의 Feature Map들 처럼 좁은 범위의 Feature들을 추출하지만, 학습의 후반 부에는 넓은 범위의 Feature들을 학습한다.

Batch Normalization(배치 정규화)

일반 경사 하강법(vanilla Gradient Descent)

  • 일반 경사 하강법의 경우, Gradient를 한번 업데이트 하기 위해 모든 학습 데이터를 사용한다. 하지만 데이터가 엄청나게 많다면?? 그렇다면 Gradient를 업데이트하는데 오랜시간이 소요될 것이다. 그렇다면 SGD는??!! Stochastic은???

확률적 경사 하강법(Stochastic Gradient Descent)

미니 배치 학습법

  • Epoch마다 데이터 순서를 섞어주기도 하는 이유는 random성을 더 강하게 해주기 위해서이다.

internal Covariate Shift

  • 이런 현상을 해결하기 위한 것이 batch normalization이다.

배치 정규화(Batch Normalization)

학습단계(Training Phase)

  • 또한, 동일한 scale과 동일한 zero-mean을 가지게 되기 때문에 학습률 결정에 유리하다 말의 의미는 학습을 할 때 더 scale이 큰 경우에는 학습이 많이 되고, scale이 작으면 학습이 적게 되는 문제가 발생할 수 있다. 학습률을 너무 크게 할 경우 Gradient가 크게 나오는 곳에 Gradient exploding이 발생할 수가 있고, 반대로 학습률을 너무 작게 할 경우 Gradient Vanishing이 발생되서 학습이 안되는 곳이 발생되는 문제가 있는데 Normalization을 해주게 되면 모든 각각의 계층들이 동일한 scale로 학습되기 때문에 학습률 결정에 유리하다는 것이다.
    (미분을 할때 입력에 대해서 출력값이 커지게 되면, Gradient값도 커질 것이다.)

  • 각각의 batch를 normalization하면, 말 그대로 normalization이 된 것이므로 모수가 $\mu=0, \sigma^2=1$인 gaussian distribution을 갖게 될 것이다. 그런데 activation함수는 LeRu를 사용한다면 0미만인 것들은 모조리 0값으로 반환될것이다. 이미 연산을 해놓은 값들을 연산 하기 전이 아닌 연산후에 0으로 만들어 의미 없게 만드는 것 보다 그렇게 0으로 반환되는 개수를 조절하기 위해 추가 스케일링 계수인 $\gamma$와 $\beta$를 만들고, 역전파 알고리즘으로 학습시켜준다.

추론 단계(Inference Phase)

  • 학습과정에서 이동평균을 구해놓는데, 최근 N개에 대한 이동평균을 사용한다. 최근 N개만 사용하고 그 전에 것들은 자연스럽게 날라가기 때문에 최근 N개가 충분한 sample이 아닐 경우$\mu$,$\sigma$가 적절하지 않게 결정되는 문제가 있는데 이런 상황을 해결하는 것은 지수평균을 사용한다.

심화 합성곱 신경망

합성곱 신경망

GoogLeNet

GoogLeNet(Inception)

  • 2014년도에 GoogLeNet과 VGG-19가 나왔는데, GoogLeNet이 에러율이 좀 더 낮고 층이 더 깊은 것을 알 수 있다. GoogLeNet이 좀 더 복잡해서 VGG가 더 많이 알려져 있지만, 다양한 스킬들을 공부하려면 GoogLeNet을 조금 살펴보는 것도 좋을 것이다.

GoogLeNet의 구조

  • Let's Go Deeper and Deeper라는 모토를 가지고 만들어진 것과 같이 좀더 hidden_layer가 깊어진 것을 알 수 있다.

Inception 모듈(naive version)

  • 1x1, 3x3, 5x5의 feature들을 다 나누어서 학습한다. 즉, 다양한 크기의 Filter들이 잘 학습된다. 또한 3x3 Max pooling 같은 경우는 convolution Layer를 거치지않고도 단순히 max pooling을 통한 후에도 다음 단계에서 의미있는 feature로 작동된다는 것을 보여주었다!!

Inception 모듈(dimension reductions)

  • naive 한 Inception 모듈 구조에서 먼저 단순히 1x1 conv를 통과시켜 동일한 channel 영역(Receptive Field)을 가져가면서도 channel을 줄여 연산량을 줄여 주는 구조인 Bottleneck를 구현하고 있다.

Bottleneck 구조

추가 분류기 사용

  • 맨 마지막 출력층에서만 inference를 한다면 Input에 가까운 층일수록 점점 더 Vanishing Gradient문제로 인해 학습이 저하 될 것을 우려하여 중간 feature들로도 classification을 하도록 하였다.

GoogLeNet 중간 요약

  • Inception 구조
  • Battleneck 구조
  • 중간 중간에 inference

Residual Network

Residual Network(ResNet)

  • 이제는 거의 일반적이고, 기본구조로 많이 사용하는 구조이다.

ResNet의 구조

Skip Connection

  • 왼쪽 구조에서 표현가능한 것은 오른쪽 구조인 Residual 구조에서도 표현 가능함이 증명 되어 있다. 직관적으로 봤을때는 Feature를 뽑아서 이전 Feature와 더한 다는 것이 잘 이해가 안갈 수 도 있겠지만, 이런식으로 했을때도 좌측의 일반적인 Conv Layer의 구조와 수학적으로 동치를 이룬다는 것을 알고 있자.

Identity Mapping
-

Pre-Activation_00

  • 맨 왼쪽이 Original ResidualNN의 구조이고 가운데가 Pre-Activation을 사용하는 구조이다.

Pre-Activation_01

Densely Connected ConvNets(DenseNet)

Densely Connected ConvNets

  • 간단히 말하자면, 모든 Layer들이 다 연결되어 있는 구조라고 할 수 있다.

DenseNet 구조

  • 처음에 일반적인 Conv Layer를 통해 Feature Map을 만들고 그런 뒤에 Dense Block을 이용해서 다른 모든 Conv Layer들과 Dense하게 연결시켜준다. 그 다음 Conv Layer를 이용해서 channel 개수를 조정해주고, Max Pooling을 이용해서 영상크기를 줄여준다. 이런 과정을 여러번 반복해서 Feature를 추출한 후, 맨 마지막은 FC Layer로 구성해주었다.

  • 위의 구조에서 Dense Block들이 residual block으로 바뀐다면 ResNet인 것이다. Pre-Activation구조를 사용한다는 것이 ResNet을 계승하고 있는다는 것을 알 수 있는 명확한 내용이다.

Dense Block

  • 위의 그림을 설명하자면, 먼저 입력으로 3X3XChannel의 Feature map이 만들어지면 그것을 현재 Growth rate가 4이므로 3X3XChannelX4로 Feature map을 새롭게 만들어 주게 된다. 그 후 또다른 Convolution Layer를 통해 새로이 만들어진 Feature map은 3X3X4X4가 될 것이다. 왜냐하면 input channel은 이전의 만들어진 Feature map이 output channel의 수를 4로 정했기 때문에 4이고 output channel은 만들기 나름이지만 처음부터 4로 고정시켜 놓았다는 가정을 해보자. 그렇다면 이제 이 두개의 Feature map을 concatenate해보면 3X3XChannelX4 + 3X3X4X4 = 3X3X(Channel+4)X4 가 될 것이다. 이렇게 그 뒤의 Dense Block 내의 모든 convolution Layer가 진행될 때마다 해주면 위의 그림과 같이 될 것이며 결국 이전 Feature map들을 누적하는 의미라는 것을 알 수 있다.

Bottleneck 구조

  • 위의 그림에서 C:처음 입력된 channel의 수, k:growth rate, l:몇번째 까지 Growth를 했는지를 의미한다. $C_{Bottle neck}$은 (C+K*l)이 커졌을 때를 대비해 줄이기위한 목적으로 곱해주는 것이다.

DensNet의 구현