핸즈 온 머신러닝 (Hands-On Machine Learning with Scikit-Learn & TensorFlow) / 오렐리앙 제론 지음 , 박해선 옮김

을 읽고, 추후 기억을 되살릴 수 있게끔 나만의 방법으로 내용을 리뷰한다. 따라서 리뷰의 내용 별 비중이 주관적일 수 있다.

 

챕터 13. 합성곱 신경망

convolutional neural network (CNN)은 대뇌의 시각 피질 연구로부터 시작되었고 이미지 검색 서비스, 자율 주행 자동차, 영상 자동 분류 시스템 등 시각 분야에 큰 기여를 했으며 그 외에도 음성 인식이나 자연어 처리 같은 작업에도 많이 사용된다.

 

13.1 시각 피질의 구조

시각 피질 안의 많은 뉴런이 작은 local receptive field를 가져, 시야의 일부 범위 안에 있는 시각 자극에만 반응하는 것을 알게 되었다. 또한 같은 local receptive field를 가지는 뉴런에 대해서도 어떤 뉴런은 수평선의 이미지, 어떤 뉴런은 다른 각도의 선분에 반응한다는 점을 보였다. 큰 수용장을 가져서 저수준 패턴이 조합된 더 복잡한 패턴에 반응하는 뉴런도 존재한다. 이런 연구는 CNN으로 진화하였고, convolution layer와 pooling layer에 대해 알아본다. (이미지 인식 문제에 완전 연결 층 심층 신경망을 사용하면 모델의 크기가 너무 커지므로 CNN을 사용한다.)

 

13.2 합성곱층

CNN에서 가장 중요한 요소는 합성곱층 (convolutional layer)이다. 합성곱층의 뉴런은 모든 입력에 연결되는 것이 아니라, local receptive field 안에 있는 픽셀에만 연결된다. 이러한 합성곱층이 여러 개 쌓인 계층적 구조는 실제 이미지에서도 볼 수 있으므로 이미지 인식에 잘 작동하게 된다.

 

receptive field의 크기를 f_h, f_w라 한다면 (i, j)의 뉴런은 이전 층의 (i, j) ~ (i + f_h -1 , j + f_w -1) 에 연결되므로 크기가 점점 작아지게 되는데, 이를 막기 위해 입력 데이터의 가장자리에 0을 추가하는 것을 zero padding 이라고 한다.

 

local receptive field 간의 거리를 1이 아니라 다른 값으로 하는 것도 가능한데, 이 때의 거리를 stride라고 한다. 스트라이드를 s_h, s_w라 한다면 (i, j)의 뉴런은 이전층의 (i * s_h, j * s_w) ~ (i * s_h + f_h -1, j * s_w + f_w - 1)에 연결된다.

 

13.2.1 필터

뉴런의 가중치는 local receptive field 크기의 작은 이미지로 표현될 수 있는데, 이를 filter 혹은 convolution kernel이라 부른다. 같은 filter를 모든 이미지에 걸쳐 stride 만큼 이동하며 적용하면 이미지의 영역을 강조하는 feature map을 만든다.

 

13.2.2 여러 개의 특성 맵 쌓기

하나의 convolutional layer에는 여러 개의 feature map이 있다. 또한 입력층에도 channel 이 여러 개 존재하여 서브층으로 구분되기도 한다. (RGB 등). 이를 수식으로 정리해보자.

 

합성곱층 l에 있는 feature map k의 (i,j)에 위치한 뉴런은 (l-1) 합성곱층에 있는 모든 특성 맵에서 입력을 받는다. 이 때 (i * s_h, j * s_w) ~ (i * s_h + f_h -1, j * s_w + f_w - 1) 뉴런의 출력에 연결된다. 이를 가중치까지 포함하여 생각한다면

 

z_i,j,k = b_k + sigma (u, v, k') (x_i',j',k' * w_u,v,k',k)

 

이 때 z는 l층의 출력이고 x는 (l-1)층의 출력이며 w는 가중치이다. b_k는 filter k에 대한 bias, u,v,k'은 각각 0부터 f_h-1, f_w-1, f'_n' -1까지 이다.

 

13.2.3 텐서플로 구현

각 입력 이미지는 [높이, 너비, 채널] 3D tensor로 표현되므로 미니배치는 [미니배치 크기, 높이, 너비, 채널] 4D tensor로 표현된다. 합성곱층의 가중치는 [f_h, f_w, f_n', f_n] 4D tensor로 표현된다. 편향은 [f_n] 1D tensor로 표현된다. tensorflow에서 합성곱층을 표현하기 위해서는 tf.nn.conv2d를 이용하면 된다. 필터 생성을 조금 더 자동화하려면tf.layers.conv2d() 를 이용하면 변수를 랜덤하게 초기화하여 제공해준다.

 

이 때 padding parameter에는 'VALID'와 'SAME' 이 있는데, VALID는 패딩 없이 버림을 통해 진행하는 것이고 SAME은 나누어 올림한 크기의 출력을 제공하기 위해 입력층에 zero padding을 진행한다. 예를 들어 입력의 크기가 13이고 local receptive field의 너비가 6, stride가 5라면 VALID의 경우 [0 ~ 5], [5 ~ 10] 에 대해 합성곱층이 생기고 SAME의 경우 입력층의 데이터에 0를 3개 padding하여 [0 ~ 5], [5 ~ 10], [10 ~ 15]에 대해 합성곱층이 생긴다.

 

https://www.tensorflow.org/api_docs/python/tf/nn/conv2d

 

tf.nn.conv2d  |  TensorFlow Core r2.1

See Stable See Nightly Computes a 2-D convolution given 4-D input and filters tensors. View aliases Compat aliases for migration See Migration guide for more details. tf.compat.v2.nn.conv2d tf.nn.conv2d( input, filters, strides, padding, data_format='NHWC'

www.tensorflow.org

 

https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2D

 

tf.keras.layers.Conv2D  |  TensorFlow Core r2.1

See Stable See Nightly Class Conv2D 2D convolution layer (e.g. spatial convolution over images). View aliases Main aliases tf.keras.layers.Convolution2D Compat aliases for migration See Migration guide for more details. tf.compat.v1.keras.layers.Conv2D, tf

www.tensorflow.org

13.2.4 메모리 요구사항

훈련시에는 역방향 계산을 위하여 정방향 계산의 모든 값을 필요로 하기 때문에 더 많은 양의 RAM을 필요로 한다. stride 1의 (5, 5) filter와 SAME 패딩을 사용해 (150, 100) 크기의 feature map 200개를 만드는 합성곱층을 생각해보자.

 

입력이 (150, 100) RGB 이미지라면 파라미터 수는 (5 * 5 * 3 + 1) * 200 = 15200 개이다. (완전 연결 층이라면 150 * 100 * 3 * 150 * 100 개)

 

또한 실수 곱셈은 feature map 마다 (5 * 5 * 3 * 150 * 100 * 200) = 2.25억 회 이루어진다. 2.25억개의 32bit 소수는 약 11.4MB이다.

 

하지만 예측을 만들때에는 각 층에 대해 입력과 출력 값만 가지고 있으면 되므로 연속된 두 개의 층에서 필요로하는 만큼의 RAM만 필요하다. 만약 훈련시 메모리가 부족하다면 미니배치 크기를 줄이거나, 스트라이드를 사용하거나, 몇 개 층을 제거하거나, 16비트 부동소수를 사용할 수 있다.

 

13.3 풀링층

pooling layer는 계산량과 메모리 사용량, 과대적합의 위험, 파라미터 수를 줄이는 subsample을 만드는 것이다. 예를 들어 max pooling layer의 경우에는 pooling kernel의 가장 큰 입력값이 출력되며 비슷한 원리로 적용되는 average pooling layer도 있다. tensorflow에서는 tf.nn.max_pool 혹은 avg_pool 함수를 사용하면 된다. 마찬가지로 조금 더 자동화 되어있는 tf.layers.max_pooling2d(), tf.layers.average_pooling2d() 함수가 있다.

 

13.4 CNN 구조

CNN은 주로 합성곱층과 풀링층을 번갈아 쌓는 형태로 이루어 진다. 따라서 이미지 크기는 점점 작아지고 feature map은 점점 깊어진다. 마지막에 완전 연결층과 softmax층 등을 적용하여 확률을 추정한다.

위에서 언급한 기술들을 조합하여 ILSVRC 이미지넷 대회의 top-5 에러율을 감소시킨 네 가지 모델을 알아보자.

 

13.4.1 LeNet-5

종류 특성 맵 크기 커널 크기 스트라이드 활성화 함수
출력 완전 연결 - 10 - - RBF
F6 완전 연결 - 84 - - tanh
C5 합성곱 120 (1, 1) (5, 5) 1 tanh
S4 평균 풀링 16 (5, 5) (2, 2) 2 tanh
C3 합성곱 16 (10, 10) (5, 5) 1 tanh
S2 평균 풀링 6 (14, 14) (2, 2) 2 tanh
C1 합성곱 6 (28, 28) (5, 5) 1 tanh
입력 입력 1 (32, 32) - - -

 

- (28, 28) 이미지를 제로 패딩 및 정규화 하여 주입하고, 그 이후로 패딩하지 않아 크기가 점점 줄어든다.

- 평균 풀링에 학습 계수가 주로 없지만, LeNet-5 모델에는 평균 적용 후 각 특성 맵에 곱해지는 계수를 학습한다.

- C3의 대부분 뉴런은 S2의 특성맵 6개 중 3개 혹은 4개에만 적용된다.

- 출력층은 softmax가 아니라 RBF로, 입력 벡터와 가중치 벡터 사이의 유클리디안 거리를 출력하여 RBF 활성화 함수를 적용한다.

 

13.4.2 AlexNet

종류 특성 맵 크기 커널 크기 스트라이드 패딩 활성화 함수
출력 완전 연결 - 1000 - - - Softmax
F9 완전 연결 - 4096 - - - ReLU
F8 완전 연결 - 4096 - - - ReLU
C7 합성곱 256 (13, 13) (3, 3) 1 SAME ReLU
C6 합성곱 384 (13, 13) (3, 3) 1 SMAE ReLU
C5 합성곱 384 (13, 13) (3, 3) 1 SAME ReLU
S4 최대 풀링 256 (13, 13) (3, 3) 2 VALID -
C3 합성곱 256 (27, 27) (5, 5) 1 SAME ReLU
S2 최대 풀링 96 (27, 27) (3, 3) 2 VALID -
C1 합성곱 96 (55, 55) (11, 11) 4 SAME ReLU
입력 입력 3 (RGB) (224, 224) - - - -

2012년 이미지넷 대회에서 17% Top-5 에러율로 우승한 AlexNet이다. 과대적합을 줄이기 위해 F8, F9에 50% 드롭아웃을 적용하고 훈련 이미지를 이동하거나 뒤집고 조명을 바꾸는 등 데이터를 증식하였다.

 

C1층과 C3층의 ReLU 단계 이후에 LRN (local response normalization)을 적용하였는데, 특정 특성 맵에서 강하게 활성화 된 뉴런이 주변 층의 같은 위치 뉴런을 억제하는 형태이다(생물학적 뉴런에서 관측). 이는 특성 맵들을 구분되게 하여 일반화 성능을 향상시킨다.

 

13.4.3 GoogLeNet

2014 대회에서 Top-5 에러율을 7%이하로 낮춘 구글 리서치의 GoogLeNet이다. 인셉션 모듈이라는 서브 네트워크를 가지고 있는 것이 대표적 특징이다. 인셉션 모듈은, 입력을 4번 복사하여 네 개의 다른 층에 주입된다. 이 층은 (1, 1) 커널, (3, 3) 커널, (5, 5) 커널의 합성곱과 최대 풀링으로 이루어진다. 인셉션 모듈의 (1, 1) 커널의 의미는 다음과 같다.

 

- 입력보다 더 적은 특성 맵을 출력하여 차원을 줄이는 bottleneck layer의 역할을 담당한다.

- 합성곱층의 쌍이 더 복잡한 패턴을 감지할 수 있는 한 개의 강력한 합성곱층처럼 작동한다.

 

모델의 정확한 정의는 더 잘 설명된 다른 글을 참조하는 것이 좋겠다.

 

13.4.4 ResNet

2015 ILSVRC 대회를 우승한 Residual Network이다. 152개 층으로 구성된 깊은 CNN을 사용해 3.6% 이하의 top-5 에러율을 기록했다. 핵심 요소는 skip connection인데, 목적함수 h(x)를 훈련하는 대신 h(x) - x를 학습하게 했다. 이를 residual learning 이라고 한다.

 

일반적인 신경망을 초기화할 때는 가중치가 0에 가깝기 떄문에 네트워크도 0에 가까운 값을 출력하지만, 스킵 연결을 추가하면 입력과 같은 값을 출력한다. 스킵 연결을 많이 추가하면 일부 층이 아직 학습되지 않았더라도 훈련을 시작할 수 있다. 입력 신호가 전체 네트워크에 손쉽게 영향을 미치는 것이다.

 

ResNet-152는 세 개의 합성곱층을 사용한다. 병목층처럼 작동하는 64개 특성 맵의 (1, 1) 합성곱층, 64개 특성맵의 (3, 3)층, 원본 깊이를 복원하는 256개 특성 맵의 (1, 1) 합성곱층.

 

이를 256개 RU 3개, 512개 RU 8개, 1024개 RU 36개, 2048개 RU 3개 배치하여 총 (3+8+36+3) * 3 + 2개의 층으로 이루어져있다.

 

마찬가지로 정확한 정의는 더 잘 설명된 다른 글을 참조하는 것이 좋겠다.

 

그 외에 VGGNet, Inception-v4 등의 모델이 있다.

 

+ Recent posts