https://huangdi.tistory.com/12
대부분의 내용 참고
ANN과 CNN이 특별히 다른 점은
CNN에는 합성곱 계층 Convolutional layer과 풀링 계층 Pooling layer 이 새롭게 등장한다는 점이다.
지금까지 본 신경망은 입접하는 계층의 모든 뉴런과 결합되어 있다. 완전 연결 fully-connected라고 하고, 완전히 연결된 계층을 Affine 계층이라고 한다.(다층 퍼셉트론과 비슷한 개념)
완전연결 신경망은 Affine 계층 뒤에 활성화 함수를 같은 ReLU/Sigmoid 계층이 이어져 있다.
CNN에서는 앞서 말했던 새로운 층인 '합성곱 계층 Conv'과 풀링계층 Pooling'이 추가된다. 그리고 출력에 가까운 층에서는 이전 신경망과 같이 'Affine-Softmax' 조합을 그대로 사용한다.
완전연결 계층을 사용하면 데이터의 형상이 무시된다.
입력 데이터가 이미지인 경우를 예로 들어보자.
이미지는 통상 세로, 가로, 채널(색상 rgb값)의 3차원 데이터 형상으로 공간적 정보를 담고 있다. 완전연결 계층에 입력할 때 3차원 데이터를 평평한 1차원 데이터로 평탄화하여 각 계층을 지나게 한다. 따라서 3차원 속의 의미를 갖은 본질적 패턴은 무시하게 되고 모든 입력 데이터를 같은 차원의 뉴런으로 취급하여 형상에 담긴 정보를 살릴 수 없는 것이다.
앞서 설명한 것 처럼 CNN은 입력데이터로 받은 3차원의 데이터를 그대로 다음 계층으로 전달하기 때문에 올바른 성능을 보일 수 있는 것이다.
CNN에서는 합성곱 계층의 입출력 데이터를 특정 맵 feature map이라고 한다. 합성곱 계층의 입력 데이터를 입력 특징 맵 input feature map, 출력 데이터를 출력 특징 맵 output feature map이라고 한다.
합성곱 계층에서는 합성곱 연산을 처리한다. 합성곱 연산은 이미지 처리에서 말하는 필터 연산을 가리킨다.
여기서 알아야 하는 주요 단어는 필터(커널), 윈도우(Window), 단일 곱샘-누산(fused multiply-add, FMA)정도가 있다.
합성곱 연산에서는 입력 데이터에 필터를 적용한다.
위 그림의 경우 데이터와 필터의 형상을 (높이Height, 너비Width)로 표현할 때, 입력은 (4, 4), 필터는 (3, 3), 출력은 (2, 2)로 표기할 수 있다.
합성곱 연산은 위 그림 처럼 핕러의 윈도우를 일정 간격으로 이동해가며 입력 데이터에 적용한다. 입력롸 필터에서 대응하는 원소까라 곱하고 그 총합을 구한다. 이 계산을 단일 곱샘-누산이라 한다.
합성곱 연산 수행 전 입력 데이터 주변을을 특정 값 (예를 들어 0)으로 채우는 것을 패딩이라 한다.
'
패딩은 주로 출력 크기를 조정할 목적으로 사용한다. 합성곱 연산을 거칠 때마다 출력 크기가 줄어들어서 어느 순간 1이 될 수 있개 되면 더 이상 합성곱 연산을 적용할 수 없기 때문에, 이런 상황을 방지하기 위해 패딩을 사용한다.
필터를 적용하는 위치의 간격을 스트라이드라고 한다. 위에서 살펴본 모든 예에선 스트라이드가 1이었다. 스트라이드가 2인 합성곱 연산의 예로 다음의 그림을 들 수 있다.
스트라이드를 2로 두면 필터를 적용하는 윈도우가 두 칸씩 이동한다. 보시다시피 스트라이드르 키우면 출력의 크기가 작아진다.
출력의 크기를 조정하는 패딩, 스트라이드 사이의 관계식을 정의할 수 있다.
출력크기 (OH, OW)는 아래 식과 같다. OH와 OW는 항상 정수로 나눠떨어지도록 변수를 조정해야 한다.
딥러닝 프레임워크 중에서는 정수가 안될 경우 반올림을 하거나 에러를 내지 않고 진행하도록 구현하기도 한다.
이미지와 같은 입력 데이터의 경우는 세로, 가로에 채널까지 고려한 3차원 데이터를 가진다.
이제부터는 3차원 데이터의 합성곱 연산을 알아보자.
채널 방향으로 특정 맵(입출력 데이터)이 여러 개 존재하는 경우에는 입력 데이터와 필터의 합성곱 연산을 채널마다 수행하고, 그 결과를 더해서 하나의 출력을 얻으면 된다. 아래의 예를 통해 직관적으로 이해할 수 있다.
3차원 합성곱 연산에서는 입력 데이터의 채널 수와 필터의 채널 수가 반드시 같아야 한다. 그리고 필터의 모든 채널 크기가 같아야 한다. 필터 크기는 임의로 설정 가능하다.
3차원 합성곱 연산은 데이터와 필터를 직육면체 블록이라 생각하면 계산하기 더 쉽다. 3차원 데이터를 다차원 배열로 나타낼 때는 (채널, 높이, 너비) 순서로 쓰겠다. 데이터의 형상은 (C, H ,W)로 쓰고, 필터의 형상은 (C, FH, FW)로 쓴다.
위의 예에서는 출력 데이터가 한 장의 특징 맵으로 채널이 1개입니다. 출력 채널을 여러개로 늘리고 싶다면?
합성곱 연산의 출력으로 다수의 채널을 내보내려면 필터(가중치)를 다수 사용하면 된다.
필터를 FN개 적용하면 출력 맵도 FN개 생성된다. 이렇게 출력 데이터를 (FN, OH, OW)의 3차원 형태로 만들면 다음 계층에서도 3차원 합성곱을 수행할 수 있다.
필터의 가중치 데이터는 4차원 데이터로 (출력 채널의 수, 입력 채널의 수, 높이, 너비) 순으로 쓴다.
이 경우에 편향을 더하려면 (FN, 1, 1)의 편향 데이터를 더해주면 된다. 채널 하나 당 편향 값 하나씩 구성한다.
배치(Batch): 모델의 가중치를 한번 업데이트시킬 때 사용되는 샘플들의 묶음
완전연결 신경망에서 입력 데이터를 한 덩어리로 묶어 배치로 처리하여 처리 효율을 높인다. 합성곱 연산에서도 배치 처리를 지원한다.
각 계층을 흐르는 데이터의 차원을 하나 늘려 4차원 데이터로 저장한다.
각 데이터의 맨 앞에 배치용 차원을 추가하면 4차원 형상을 가진 채 각 계층을 타고 흐른다. 신경망에 4차원 데이터가 하나 흐를 때마다 데이터 N개에 대한 합성곱 연산이 일어나니, N회 분의 처리를 한 번에 수행하는 거라고 볼 수 있다.
풀링은 세로, 가로 방향의 공간을 줄이는 연산이다.
아래의 예는 2 x 2 최대 풀링을 스트라이드 2로 처리하는 순서를 도식화한 것이다.
풀링에는 크게 2가지 연산 방법이 있다
풀링의 윈도우 크기와 스트라이드는 같은 값으로 설정하는 것이 보통이다.
예를 들어 윈도우가 3 x 3이면 스트라이드는 3으로 설정한다.