15 minute read

cs231n

일반 신경망은 큰 이미지에 대해 잘 확장되지 못한다.

일반 신경망의 첫 번째 히든 레이어의 완전 연결된 단일 뉴런은 cifar10 이미지(32x32x3)의 입력을 받는 경우 32x32x3으로 3072개의 가중치를 가지게 된다. 나름 관리할 수 있는 파라미터의 수로 보일지 모르지만 이런 완전 연결 구조는 더 큰 이미지에 대해 확장하지 못할 것은 자명하다. 예를 들어 이미지가 약 200x200x3으로 더 큰 크기라면 뉴런은 200x200x3 = 120,000 개의 가중치를 가지게 된다. 거기에 더해 우리는 그러한 뉴런을 여러 개 가지고 싶을 것이므로 파라미터는 빠르게 늘어날 것이다. 확실히, full connectivity는 낭비가 심하고 많은 수의 파라미터로 인해 빠르게 오버피팅으로 이어질 것이다.

뉴런의 3D volume

CNN은 입력이 이미지로 구성되어 있다는 것을 활용하여 보다 합리적인 방식으로 아키텍처를 제안한다. 특히 일반 신경망과 달리 ConvNet의 레이어는 width, height, depth 3차원으로 이루어져 있다. 여기서 depth는 네트워크의 총 레이어 수를 말한다. 예를 들어 CIFAR-10 이미지의 입력은 activation의 입력 볼륨이며 볼륨의 크기는 32x32x3(width, height, depth) 이다. 곧 살펴보겠지만, 한 레이어의 뉴런은 모든 뉴런이 완전히 연결된 방식이 아니라 그 앞 레이어의 작은 영역에만 연결된다. 또한 CIFAR-10의 경우 최종 출력 레이어의 크기는 1x1x10이 되는데, 이는 ConvNet 아키텍처가 끝날 때까지 이미지를 class score의 단일 벡터로 줄이기 때문이다.

image

왼쪽: 일반 3계층 신경망.

오른쪽: 뉴런을 3차원으로 배열하는 ConvNet. ConvNet의 모든 레이어는 3D 입력 볼륨을 activation 뉴런의 3D 출력볼륨으로 만든다. 빨간색 입력 레이어가 이미지이다.


Layers used to build ConvNets

CIFAR-10의 classication을 위한 ConvNet 아키텍처

  • INPUT - CONV - RELU - POOL - FC
    • 입력 = \( 32 \times 32 \times 3 \)
    • 컨볼루션 레이어 = \( 32 \times 32 \times 12 \) (필터가 12개)
    • ReLU = \( 32 \times 32 \times 12 \)
    • POOL = \( 16 \times 16 \times 12 \)
    • FC = \( 1 \times 1 \times 10 \) 크기의 볼륨 생성 (classification에 필요한 카테고리 수 만큼 마지막 뉴런 개수가 필요)


인간의 뇌에 대한 지식이 필요없는 개요와 직관 cnn_result

  • conv 레이어의 파라미터는 학습 가능한 필터 세트로 구성된다.
  • 모든 필터는 공간적으로 작은 공간성(너비, 높이)을 가진다. 하지만 입력 볼륨의 full depth에 따라 확장된다. 예를 들어 일반적인 ConvNet의 첫 번째 레이어는 5x5x3 크기를 가질 수 있다. 즉, 너비와 높이는 5픽셀, 이미지 컬러 채널로 인한 3depth.
  • 포워드 패스 동안 입력 볼륨의 너비와 높이에 걸쳐 각 필터를 슬라이드(더 정확하게는 convolution) 하고 필터의 항목과 임의의 위치의 입력간의 내적을 계산한다.
  • 입력 볼륨의 너비와 높이를 따라 필터를 슬라이드하면 모든 공간 위치에서 해당 필터의 응답을 제공하는 2차원 activation map이 생성된다.
  • 직관적으로 네트워크는 첫 번째 레이어에서는 어떤 방향의 edge 또는 어떤 색상의 뭉치처럼 필터가 본 몇몇의 시각적 특징 발견하며, 네트워크의 상위 레이어에서는 전체 honeycomb(벌집) 또는 바퀴 모양과같은 패턴을 발견할 때 활성화되는 필터를 학습한다.
  • 이제 각 Conv 레이어(예 12개의 필터)마다 필터의 집합을 가지고 있으며 각 필터는 별도의 2차원 activation map을 생성한다. 이러한 활성화맵을 깊이 차원을 따라 쌓아 출력 볼륨을 생성한다.

Local Connectivity

이미지와 같은 고차원 입력을 처리할 때, 위에서 살펴본 것처럼 뉴런을 이전 볼륨의 모든 뉴런에 연결하는 것은 비현실적이다. 그 대신, 입력 볼륨에서 국소적인 영역으로만 각 뉴런을 연결할 것이다. 이 연결의 공간적 범위(width, height)는 뉴런의 receptive field라고 불리는 하이퍼파라미터이다 (필터 크기만큼).

  • 즉, 한 뉴런은 필터의 가로 세로 크기만큼의 영역을 수용한다는 의미에서 receptive field라고 한다.
  • 깊이 축을 따르는 connection의 범위는 언제나 입력 볼륨의 depth와 같다. 이 공간 차원(width, height)과 depth 차원을 처리하는 방식에서 이러한 비대칭성은 다시 강조할만큼 중요하다. 각 뉴런이 연결되는 것은 2d space(width, height)로 국소적이지만 언제나 입력 볼륨의 전체 depth를 따라 항상 가득 차 있다. (아래의 왼쪽 이미지 확인. 이는 5x5x3의 필터가 5개 있음을 나타낸다.)


예시1 예를 들어 입력 볼륨이 32x32x3의 크기를 가진다고 가정한다 (CIFAR-10 RGB 이미지처럼). receptive filed(또는 filter size)는 5x5인 경우, Conv Layer에서 각 뉴런은 입력 볼륨에서 5x5x3의 가중치 영역을 가지며 5x5x3 = 75의 가중치( 그리고 +1 bias 파라미터)를 가진다. 깊이 축을 따라 연결되는 범위는 입력 볼륨의 깊이이기 때문에 3이어야만 한다.

  • 위 내용이 솔직히 어렵게 설명되있다고 생각하는데 다시 설명하자면 이렇다.
  • 컨볼루션 연산을 수행하려면 input 채널 수와 filter의 채널 수는 무조건 같아야 계산이 된다.
  • 그렇기에 CIFAR10 입력 이미지에 대해 컨볼루션을 수행하기 위해서는 필터 크기가 5x5x3이 되야 한다.
  • 우리는 그럼 이 필터가 하나의 블록처럼 직육면체의 형태를 가질 것을 예상할 수 있는데, 이 직육면체 형태의 필터 블록에는 1개의 bias 파라미터가 매번 붙어있다.


예시2 입력 볼륨을 16x16x20으로 가정한다. 그러면 예시로 3x3의 receptive filed 크기를 사용하면 컨볼루션 레이어에서 모든 뉴런은 입력 볼륨에 총합 3x3x20 = 180 연결을 가진다. 다시 말하지만, 연결은 2D 공간에서 local (3x3)이지만, 입력 깊이 20을 따라 꽉 차있다.

image

왼쪽: 빨간색은 입력 볼륨(32x32x3 cifar-10)의 예시 및 첫 번째 컨볼루셔널 레이어에서 뉴런의 볼륨 예시이다.

  • 컨볼루셔널 레이어에서 Convlayer에서 각 뉴런은 공간적으로 입력 볼륨의 국소적인 영역, 지역적인 영역으로 연결되지만 입력 볼륨의 깊이(즉 색상 채널)에는 모두 연결된다.
  • 여러 개의 뉴런(예시 이미지는 5개)이 깊이를 따라 나열되어 있으며 모두 입력 영역에 대해 같은 부분을 보고 있다. 5개의 뉴런의 열로 이어진 선은 가중치를 뜻하지 않는다. 즉, 이 5개의 뉴런들은 같은 가중치를 공유하지 않으며, 5개의 각 뉴런들은 서로 다른 필터로 계산된 결과이다.
  • 단지 뉴런들이 같은 receptive field(width, height)와 입력 볼륨의 깊이에 연결되있거나 입력 이미지에 국소적인 영역만을 바라보고 있음을 나타낸다.
  • 즉, 위 이미지의 뉴런 5개는 같은 receptive field를 공유하지만 같은 가중치를 공유하는 것은 아니다. (각 뉴런들은 서로 다른 필터로 계산되었으니까)

오른쪽: 일반적인 신경망 처럼 뉴런은 그대로 유지되며 여전히 비선형성을 따르는 입력과 뉴런의 가중치로 내적을 계산하지만, 뉴런의 연결은 공간이 국소적으로 제한된다.


Spatial arrangement

지금까지 컨볼루션 레이어에서 각 뉴런과 입력 볼륨의 연결에 대해 설명했지만 출력 볼륨에 얼마나 많은 연결이 있는지 또는 어떻게 그들이 정렬되어있는지에 대해서는 아직 설명하지 않았다. 다음 세 개의 파라미터는 출력 볼륨의 사이즈를 조절한다. depth, stride, zero-padding 이 세 가지 파라미터에 대해 얘기해보자.

  1. 첫 째, 출력 볼륨의 depth는 하이퍼파라미터로, 입력에서 각각 다른 것을 찾기위해 학습하는 필터의 수에 해당한다. 예를 들어, 첫 번째 컨볼루셔널 레이어가 입력을 원본 이미지로 받은 다음, 깊이 차원을 따라 있는 서로 다른 뉴런들이 다양한 방향의 엣지의 존재나 색상의 덩어리가 있을 경우 활성화될 수 있다. 입력의 동일한 영역을 모두 보고 있는 뉴런의 집합을 depth column(fibre라는 용어를 사용하기도 함)이라 부른다.

  2. 두 번째로, 우리는 필터를 슬라이드하는 stride를 지정해야 한다. stride가 1이면 한 번에 한 픽셀씩 이동한다. stride가 2라면 (또는 드물게 3이나 그 이상이라면) 필터를 슬라이드 할 때 필터가 한 번에 2픽셀씩 건너뛴다. 이렇게 하면 공간적으로 더 작은 출력 볼륨을 생성한다.

  3. 곧 보게 되겠지만, 때로는 입력 볼륨을 테두리 주위에 0으로 채우는 것이 편리할 때가 있다. 이 zero-padding의 크기는 하이퍼파라미터이다. zero-padding의 좋은 특징은 출력 볼륨의 공간적 크기를 제어할 수 있다는 것이다. (가장 일반적으로는 입력 볼륨의 공간 크기를 정확히 유지하여 입력 및 출력 너비와 높이가 동일하도록 하는데 사용하게 될 것이다.)

우리는 입력 볼륨 크기(W), receptive filed의 크기(F), stride(S) 그리고 zero-padding의 크기(P)의 함수로 출력 볼륨의 공간 크기를 계산할 수 있다. 얼마나 많은 뉴런이 fit한지를 계산하는 올바른 공식은 \((W - F + 2P) / S+1 \)이다. 예를 들어 7x7 입력과 stride가 1이고 padding이 0인 3x3 필터의 경우 5x5 출력을 얻게 된다. stride가 2라면 3x3 출력을 얻게된다. 그림 예시를 하나 더 살펴보자.

image

이 예에서는 하나의 공간 차원(x축)만 있으며, 하나의 뉴런은 \(F=3\)의 수용 영역 크기를 가지고 있고 입력 크기 \(W=5\), zero padding \(P=1\)이다.

왼쪽: 뉴런은 S=1의 보폭으로 입력을 가로지르며 \( (5-3+2)/1+1 = 5 \) 이다.

오른쪽: 뉴런은 stirde를 2로 사용하여 출력 크기가 \( (5-3+2)/2+1 = 3 \) 이다. \(S=3\)은 볼륨 전체에 깔끔하게 맞지 않기 때문에 사용할 수 없다는 것을 알 수 있다. 방정식의 측면에서 이는 \( (5-3+2)=4 \)이기에 \(3\)으로 나눌 수 없다는 것이 결정된다. 뉴런의 가중치는 해당 예시에서 \( [1,0,-1] \) 이며 우측 최상단에 있다. 그리고 bias는 0이다. 이 가중치들은 모든 노란 뉴런들을 가로지르며 공유된다(아래 parameter sharing 확인).

제로 패딩 사용

일반적으로 s=1 일 때, 제로 패딩을 \( P=(F-1/2) \)로 설정하면 입력 볼륨과 출력 볼륨이 공간적으로 동일한 크기를 갖도록 보장한다. 이러한 방식으로 제로 패딩을 사용하는 것은 매우 일반적이며, 자세한 이유는 ConvNet 아키텍처에 대해 자세히 설명할 때 설명한다.

stride에 대한 제약 조건

spatial arrangement 하이퍼파라미터는 상호 제약이 있다는 점을 다시 한 번 유의하자. 예를 들어 입력의 크기가 w=10이고 제로 패딩이 사용되지 않고 P=0이며 필터 크기가 F=3인 경우 (W-F+2P)/S+1 = (10-3+0)2+1 = 4.5, 즉 정수가 아니므로 stride=2를 사용할 수 없으므로 뉴런이 입력 전체에 깔끔하고 대칭적으로 적합하지 않다는 것을 나타낸다. 따라서 이 하이퍼파라미터 설정은 유요하지 않은 것으로 간주되며, ConvNet 라이브러리는 예외를 던지거나 나머지를 제로 패딩하여 맞추거나 입력을 잘라내어 맞추는 등의 방법을 사용할 수 있다. ConvNet 아키텍처 섹션에서 살펴보겠지만 모든 치수가 ‘잘 맞도록’ convnet의 크기를 적절하게 조정하는 것을 골치 아픈 일이 될 수 있겠지만, 제로 패딩과 몇 가지 설계 지침을 사용하면 크게 완화할 수 있다.

실제 예시

이미지넷 챌린지에서 \( 227 \times 227 \times 3 \) 의 이미지가 입력됨. \(F=11, \space S=4, \space P=0\)으로 \((227-11)/4+1=55\)가 나오며 컨볼루션 레이어의 깊이는 \(K=96\)을 가지기에 컨볼루션 레이어의 출력 볼륨은 \(55 \times 55 \times 96\)의 크기를 가진다. \(55 \times 55 \times 96\)에 해당하는 각각의 뉴런은 입력 볼륨에서 \(11 \times 11 \times 3\) 크기로 연결되었다. 또한 각 깊이 열의 \(96\)개 뉴런은 모두 입력의 동일한 \(11 \times 11 \times 3\)영역에 연결된다.

파라미터 공유

컨볼루션 레이어에서는 파라미터 공유 방식을 사용하여 파라미터의 수를 제어한다. 위의 실제 예시를 사용하여 첫 번째 컨볼루션 레이어에 55x55x96 = 290,400개의 뉴런이 있고 각 뉴런에는 11x11x3=363개의 가중치와 1개의 바이어스가 있음을 알 수 있다. 이를 모두 합치면 ConvNet의 첫 번째 레이어에만 290,400 * 364 = 105,705,600개의 파라미터가 추가된다. 분명히 이 숫자는 매우 높다.

한 가지 합리적인 가정을 통해 매개변수의 수를 크게 줄일 수 있다는 것이 밝혀졌다.

  • 어떤 공간 위치(x,y)에서 계산하는 데 하나의 특징이 유용하다면, 다른 위치 (x2,y2)에서 계산하는데도 유용해야 한다는 것이다. 즉, 깊이의 단일 2차원 슬라이스를 깊이 슬라이스로 표시하면(예: 크기 [55x55x96]의 볼륨에는 각각 크기 [55x55]의 96개의 깊이 슬라이스가 있음), 각 깊이 슬라이스의 뉴런이 동일한 가중치와 바이어스를 사용하도록 제한할 수 있다.
  • 즉, 각 depth내의 뉴런들이 같은 가중치와 편향을 가지도록 제한하는 것이다. (한 depth에 있는 모든 뉴런들이 모두 같은 가중치와 편향을 가지도록 제한)
  • 이 파라미터 공유 방식을 사용하면 예제의 첫 번쨰 Conv레이어에는 이제 96개의 고유 가중치 세트(각 깊이 슬라이스당 하나씩)만 있으므로 총 96x11x11x3 - 34,848개의 고유 가중치 또는 34,944개의 파라미터(+96개의 바이어스)가 된다.
  • 그러니까 55x55x96x11x11x3 = 105,705,600의 숫자를 96x11x11x3로 줄인 것이다.
  • 실제로 역전파 시 볼륨의 모든 뉴런은 가중치에 대한 기울기를 계산하지만, 이러한 기울기는 각 깊이 슬라이스에 걸쳐 합산되며 슬라이스당 하나의 가중치 세트만 업데이트 된다.

단일 깊이 슬라이스의 모든 뉴런들이 같은 가중치 벡터(필터)를 사용한다면, 각 깊이 슬라이스에서 Conv 레이어의 순방향 전파는 뉴런 가중치와 입력 볼륨의 컨볼루션으로 계산될 수 있다(따라서 convolutional layer).

위 내용을 알기 쉽게 다시 작성해보자.

우선 뉴런이라는 용어는 일반적으로 가중치 또는 학습 가능한 파라미터를 가지지만 위에서는 신경망의 출력 유닛을 가리키기는 의미로 사용되기도 하였다. 그래서 피처맵을 뉴런이라고 표현하였지만 피처맵 자체는 학습 가능한 파라미터는 아니고 단지 커널과의 연산결과이다.

우선 입력 이미지는 227x227x3이고, 필터 크기 F=11, 스트라이드 S=4, 제로 패딩 P=0으로 출력 크기를 계산하면 55가 나온다. 그리고 입력 이미지가 3채널이므로 필터의 크기는 깊이까지 포함하여 11x11x3가 된다. 그리고 컨볼루션 레이어의 깊이는 K=96을 가지기에 55x55x96가 컨볼루션 레이어의 출력 볼륨이 된다. 여기서 컨볼루션 레이어의 출력 볼륨 55x55x96의 각 뉴런들은 입력 볼륨의 11x11x3 크기와 서로 매핑된다(receptive field(filter size)). CNN의 필터는 학습 가능한 파라미터로, 여기서는 11x11x3의 형태를 가진다. 즉, 가중치의 개수가 11x11x3=363만큼 있으며, 필터는 bias를 하나 씩 가지고 있으므로 1을 더하여 총 364개의 파라미터를 가진다. 첫 번째 컨볼루션 레이어에 대해서만 파라미터 개수를 계산해보자면 55x55x96 = 290,400에 363개의 가중치를 더해 105,705,600개의 파라미터가 나온다.

image

Krizhevsky 등이 학습한 예제 필터. 여기에 표시된 96개의 필터는 각각 [11x11x3] 크기이며 각 필터는 하나의 깊이 슬라이스에서 55x55 뉴런에 의해 공유됩니다. 매개변수 공유 가정은 상대적으로 타당합니다. 이미지의 일부 위치에서 수평 가장자리 감지가 중요한 경우 이미지의 변환 불변 구조로 인해 다른 위치에서도 직관적으로 유용해야 합니다. 따라서 Conv 레이어 출력 볼륨의 55x55 개별 위치에서 수평 에지를 감지하기 위해 다시 학습할 필요가 없습니다.

때로는 매개변수 공유 가정이 이해가 되지 않을 수도 있습니다. 이것은 특히 ConvNet에 대한 입력 이미지가 특정 중심 구조를 가지고 있는 경우입니다. 예를 들어 이미지의 한쪽에서 다른 쪽과 완전히 다른 기능을 학습해야 합니다. 하나의 실질적인 예는 입력이 이미지의 중앙에 있는 얼굴인 경우입니다. 다른 눈 특정 또는 머리카락 특정 기능이 다른 공간 위치에서 학습될 수 있고 학습되어야 한다고 예상할 수 있습니다. 이 경우 매개변수 공유 체계를 완화하고 대신 단순히 로컬 연결 계층이라고 부르는 것이 일반적입니다.


1. CNN 개요

a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way


59954intro to CNN

CNN은 Convolutional Neural Network의 약자이다. 말 그대로 convoultional한 layer들로 구성된 neural network이다.

Network Structure(Layerd structure)

CNN은 다음 레이어들로 구성된다.

  • Covolution Layer
  • Pooling(subsampling) Layer
  • Fully-Connected Layer

pooling이 subsampling의 한 일종이라고 얘기하는데 이 내용에 대해 간략히 추가할 예정이다.


CNN의 흐름

CNN의 전체 흐름은 다음과 같다.

  • input으로 행렬 형태의 이미지가 주어진다.
  • Convolution 수행
    • Convolution feature maps이 결과물로 나온다.
  • Subsampling 수행
    • 이미지 안에서 더 작은 영역을 얻는 것이다.
    • 이미지의 크기, 공간적인 정보를 줄임.


CNN은 요약하면 Convolution + Subsampling + Full Connection(Fully connected layer, Dense layer)의 과정을 거쳐 classfy를 수행한다.

  • Convolutionsubsamplingfeature extraction을 해준다.
    • 즉, 이미지 그 자체로 전체를 보는 것이 아니라 중요한 feature를 뽑는다.
    • 사람이 고양이를 인식한다면, 고양이의 귀, 손, 눈이라는 각각의 feature를 보고 조합하여 인식하기에, 이와 같은 역할을 할 수 있도록 feature extraction을 하는 것이다.
    • 그래서 Convolution이든 subsampling이든 나온 결과는 feature(특징)이다.
    • 마지막으로 특징을 조합한 것들을 인식하기 위해 Fully connected layer를 사용하여 classfy를 수행한다.

Neuron의 타입

CNN에서의 뉴런은 총 세 가지 타입이 있다.

  • Convolution
  • Subsampling(pooling)
  • Fully connected

image 피처맵에서 각각의 픽셀들은 제 각각 뉴런의 역할을 한다. 뒤에 convolution과 같은 각 연산들이 나오겠지만, convolution과 pooling연산을 통해 나온 feature하나가 neuron으로 취급된다.



2. Convoluion layer란

Conv layer의 parameter는 학습 가능한 filter들로 구성되어 있다. 모든 필터는 보통 작은 사이즈를 가지고 있지만(폭과 높이에 따라 크기가 결정되어, 커질 수도 있음), 입력 volume의 전체 깊이에 걸쳐 확장된다.

image 동빈나, U-Net 설명 중 ppt

  • 예를 들어 ConvNet의 첫 번째 레이어 필터의 크기가 5x5x3이고 forward pass동안 입력 볼륨의 너비와 높이에 따라 각 필터를 슬라이드하며 임의의 위치에서 필터의 항목와 입력 사이의 dot product를 계산한다.
  • 입력 볼륨의 폭과 높이에 따라 slide를 수행하면 모든 공간 위치에서 해당 필터의 응답을 제공하는 2-dimension activation map(위 이미지 처럼 28x28x1의 3채널 형태도 가능)이 생성된다. 즉, 32x32x3의 input이 있고 5x5x3의 필터가 있으면 결과는 28x28x1이 크기의 피처맵이 나온다.
  • 직관적으로 network는 초기 레이어에서 특정 방향의 가장자리나 특정 생상의 얼룩과 같은 시각적 특징을 볼 때 활성화되는 필터를 학습하고, 이 feature가 후속 레이어에게 전달되어 나중에는 전체 벌집이나 바퀴 모양의 패턴을 학습하게 된다.
  • 이제 각 Conv 레이어에 전체 필터 세트(예 12개의 필터)가 있고, 각 필터는 별도의 2차원 activation map을 생성한다.
  • 이러한 활성화 맵을 깊이 차원을 따라 스택처럼 쌓고 출력 볼륨을 생성한다.

CNN은 기존의 handcrafed desing filter 대신 학습을 통해 feature를 찾을 수 있다.

Local Connectivity

이미지와 같은 고차원 입력을 처리할 때, MLP처럼 뉴런을 이전 볼륨의 모든 뉴런에 연결하는 것을 비현실적이다. 대신 각 뉴런을 입력 볼륨의 로컬 영역에만 연결한다. 이 연결의 공간적 범위는 receptive field라고 하는 하이퍼파라미터이다(필터 크기에 해당). 깊이 축을 따른 연결의 범위는 항상 입력 볼륨의 깊이와 같다.

공간 차원(너비 및 높이)과 깊이 차원을 처리하는 방식에서 이러한 asymmentry를 다시 한 번 강조하는 것이 중요하다.

  • 연결은 2D공간(너비와 높이를 따라)에서 로컬이지만 입력 볼륨의 전체 깊이를 따라 항상 가득 차 있다.
  • 즉,

예시1

입력 볼륨의 사이즈가 [32x32x3]이며, receptive field(or filter size)는 5x5인 경우

  • Conv Layer의 각 뉴런은 입력 볼륨의 [5x5x3] 영역만큼 가중치를 가지며, 총 가중치는 [553] = 75개(+1 바이어스 파라미터)가 된다. 깊이 축을 따라 연결되는 범위는 입력 볼륨의 깊이이므로 3이어야 한다.

예시2

입력 볼륨의 크기가 [16x16x20]이라고 가정한다. 그런 다음 수용 필드 크기를 3x3으로 사용하면 Conv Layer의 모든 뉴런은 3320 = 180개의 연결을 갖게된다. 다시 말하지만, 연결은 2D 공간(3x3)에서는 로컬이지만, 입력 깊이(20)를 따라 가득 차 있다.

Receptive filed

depthcol

  • 빨간색으로 표시된 것은 입력 볼륨 (32x32x3 CIFAR-10이미지)와 첫 번째 컨볼루션 레이어에 있는 뉴런의 볼륨이다.
  • 컨볼루션 레이어의 각 뉴런은 공간적으로는 입력 볼륨의 로컬 영역에만 연결되지만, 전체 깊이(모든 색상 채널)에는 연결된다.
  • 이미지에서 5개 뉴런의 열은 weight를 뜻하지 않고, 뉴련이 입력 볼륨의 동일한 receptive field에 연결되어 있음을 나타낸다. (즉, 동일한 receptive field를 공유하지만, 동일한 가중치는 아니다.)
    • 5개의 뉴런은 동일한 가중치를 공유하지 않으며 5개의 서로 다른 필터와 연결되어 있음.
  • 이런 receptive field의 feature는 cetner location과 kernel size로 결정된다.

image

  • 즉, receptive filed필드는 위 예시에서는 5개의 필터에서 뽑힌 각각의 뉴런으로 이루어진다.


neuron_model

  • Neural Netwrok의 뉴런은 여전히 입력과 가중치의 dot product에 non-linearity 더하여 계산한다. 하지만 연결이 국소적으로 제한된 것이다.

Receptive Field of the Units

image

그림 9.4: convolution netwrok의 더 깊은 layer에 있는 유닛의 receptive field는 shallow layer에 있는 유닛의 receptive field보다 크다. 이 효과는 네트워크에 stride convolution 또는 pooling과 같은 구조적 특징이 포함된 경우 증가한다. 즉, 컨볼루션 네트워크에서 직접 연결은 매우 드물지만 더 깊은 계층의 유닛은 입력 이미지의 전부 또는 대부분에 간접적으로 연결될 수 있다.

또 다른 참고그림 image



3. 왜 Fully Connected Layer만으로 충분하지 않았을까

CNN을 사용하지 않는다면, 이미지를 학습하기 위해 이미지를 flatten시켜 데이터를 입력으로 넣게 된다. 즉, MNIST 데이터로 예시를 들자면, MNIST 데이터는(28, 28, 1) shape를 가지고 있는데 이를 입력층에 넣어주기 위해 데이터를 1차원으로 펼쳐 이미지 한개를 \( (784 \times 1) \) shape로 만들어 1차원 벡터로 바꿔주어야 했다.

\( (28 \times 28 \times 1) \)을 \( (784 \times 1) \)로 바꿈

문제점

1차원 벡터로 데이터를 넣어주게 되면 가장 큰 문제는 공간적인 정보가 무시된다는 것이다. 이미지에서는 공간적으로 가까운 픽셀은 값이 비슷하거나, 거리가 먼 픽셀은 관련이 없는 등 여러 정보들이 포함되어 있지만, 1차원 데이터로 표현하게 되면 이러한 정보들은 사라지게 된다.

image

  • 자동차 이미지가 있다고 하면 이미지를 데이터를 펼쳐서 입력층에 넣게된다.
  • 자동차의 창문을 인식하는 것이 목적이라고 했을 때, 입력된 데이터에서 창문을 나타내는 weight의 위치는 한정되있을 것인데, 이것을 신경망 전체에서 특징을 살릴 수 있을지도 의문이다.
  • 당연히 자동차가 어디있을지도 모르기에 Fully Connected Layer만으로는 충분하지 않았다.


CNN의 장점

Local Invariance

국소적으로 비슷하다, 국소적으로 차이가 없다는 뜻이다.

동일한 convolutional filter가 전체 이미지를 모두 돌아다니기에, 찾고 싶은 물체가 이미지의 어디에 있는지는 중요하지 않은 것이다.

Composionality

맨 위의 이미지가 composionality를 의미하는 것이다. 위 이미지처럼 레이어로 계층을 쌓는 것에서 물체 인식의 강점을 가질 수 있다.

Parameter sharing

동일한 필터를 이미지의 여러 위치에 적용함으로 동일한 패턴이 이미지의 다른 부분에서 발생하면 이를 식별할 수 있게 해준다. cnn에서 사용되는 모든 피렅가 동일한 가중치 세트를 공유한다.

만약 필터의 개수가 96개라면 출력에도 96개의 depth slice(피처맵의 개수)가 존재한다. 그러나 FCL처럼 뉴런의 총 개수(55x55x96)만큼 필요한 것이 아니라, 각 depth slice당 하나의 파라미터만 사용하므로 96개면된다. 그래서 CNN의 총 파라미터 수는 96 x (11 x 11 x 3 + 1) = 34,944개가된다.

  • 필터의 크기 = 11x11
  • 필터의 채널 = 3
  • 출력 피처맵 개수 = 96

cs231n에서 파라미터 쉐어링 찾아보고 정리하면 완료될 듯.

컨볼루션 레이어에서는 파라미터 공유 방식을 사용하여 파라미터의 수를 제어한다.


cs231n의 locanl connectivity, spatial arrangement, paramether sharing 읽고 정리 후 CNN포스팅 전체적으로 수정할 필요 있음.

Alexnet

  • 227x227x3 크기의 이미지를 input으로 받음.
  • 첫 번째 conv 레이어에서는 receptive field 크기를 \( F=11\)로, stride를 \( S=4 \)로 그리고 zero-padding 이므로 \( P=0 \)으로 뉴런을 사용한다.

파라미터 공유 전략은 컨볼루션 레이어에서 파라미터 수를 조정하기 위해 사용된다. 위의 Real-World example을 사용하자면, 첫 번째 Conv 레이어에 55x55x96 = 290,400 뉴런이 있고 각각의 뉴런에는 11 x 11 x 3 = 363의 웨이트와 바이어스 1개가 있는 것을 확인 가능하다.



CNN의 연산

Convolution

수학적으로 컨볼루션은 두 행렬의 요소별 곱의 합이다. 우리는 필터 y행렬을 사용하여 이미지 x행렬에 convolution 연산을 적용하여 결과 z를 얻는 식으로 사용한다.

그래서 convolution에서는 어떤 효과가 있는 것인가?

  • 내가 가지고 있는 convolutional filter모양과 지금 convolution을 하는 위치의 픽셀들이 얼마나 비슷한지를 나타낸다.
  • 이게 비슷하면 response(convolutional featuremap)에 그 위치에 있는 픽셀값들이 많이 높게 나올 것이고, 다르면 낮게 나올 것이다.
  • 물론 주어진 데이터를 통해서 convolutional filter의 모양은 학습을 한다. 어떤 convolutional filter의 모양을 가졌을 때 가장 성능이 좋은지 학습을 하고,

필터를 가지고 이미지를 슬라이딩하면서 공간적으로 내적을 수행한다. 필터의 각 값(w)와 이에 해당하는 이미지의 픽셀을 곱해주는데, 기본적으로 이는 w^{T}x + b의 형태로도 표현할 수 있고 내적과 같은 형태가 나온다

필터의 모든 요소를 가지고 내적을 수행하게 되면 하나의 겂을 얻게된다. 그리고 계속 슬라이딩한다. conv 연산을 수행하는 값들을 다시 output activation map에 해당하는 위치에 저장한다.

image

Pooling

image

image

파라미터 개수 계산법

Kernel Size x Kernel Size x Input Channel x Output channel





참고자료

https://gaussian37.github.io/dl-concept-covolution_operation/
논문으로 짚어보는 딥러닝의 맥
https://excelsior-cjh.tistory.com/180
https://lynnshin.tistory.com/7
cs231n
https://chacha95.github.io/2018-12-02-Deeplearning3/
Deep learning - Ian Goodfellow, et al.

Categories:

Updated: