밑바닥부터 시작하는 딥러닝 - 4

Shin·2022년 4월 11일
0

Machine Learning

목록 보기
5/6

Chapter 7 합성곱 신경망(CNN)

전체 구조

지금까지 본 신경망은 인접하는 계층의 모든 뉴런과 결합되어 있었다
이를 '완전연결'이라고 하며, 완전히 연결된 계층을 'Affine 계층'이라는 이름으로 구현했다

다음은 층이 5개인 완전연결 신경망이다
Affine 계층 뒤에 활성화 함수를 갖는 ReLU 계층(혹은 Sigmoid 계층)이 이어진다
5번째 층은 소프트맥스 계층에서 최종 결과(확률)를 출력합니다.

CNN에서는 새로운 '합성곱 계층'과 '풀링 계층'이 추가된다
CNN의 계층은 'Conv-ReLU-(Pooling)' 흐름으로 연결된다
또한 기존에 쓰던 'Affine-ReLU'구성과 'Affine-Softmax' 조합을 그대로 사용할 수 있다

합성곱 계층

완전연결 계층은 '데이터의 형상이 무시'된다는 단점이 있다
예를 들어 (1, 28, 28)인 이미지를 1줄로 세운 784개의 데이터를 Affine 계층에 입력했다

이미지는 3차원 형상이며, 가까운 픽셀은 값이 비슷하거나, RGB 채널은 서로 밀접하게 관련되어 있거나, 거리가 먼 픽셀은 연관이 없는 등, 3차원 속에서 의미를 갖는 본질적인 패턴이 숨어있다
그러나 완전연결 계층은 모든 입력 데이터를 동등한 뉴런으로 취급하여 형상에 담긴 정보를 살릴 수 없다

하지만 합성곱 계층은 형상을 유지한다
그래서 CNN에서는 이미지처럼 형상을 가진 데이터를 제대로 이해할 수 있다

CNN에서는 합성곱 계층의 입출력 데이터를 '특징 맵(feature map)'라고 한다
각각 입력 특징 맵, 출력 특징 맵으로 나뉜다

합성곱 계층에서는 '합성곱 연산'을 처리한다
합성곱 연산은 이미지 처리에서 말하는 '필터 연산'에 해당한다

위 그림을 보면 합성곱 연산은 입력 데이터에 필터를 적용한다
입력은 (4, 4), 필터(커널)은 (3, 3), 출력은 (2, 2)가 된다

합성곱 연산은 필터의 '윈도우'를 일정 간격으로 이동해가며 입력 데이터에 적용한다
입력과 필터에 대응하는 원소끼리 곱한 후 그 총합을 구한다(이 계산을 '단일 곱셈-누산'이라 함)
그리고 그 결과를 출력의 해당 장소에 저장한다

완전연결 신경망에는 가중치 매개변수와 편향이 존재하는데, CNN에서는 필터의 매개변수가 그동안의 '가중치'에 해당한다
그리고 편향도 존재하는데 그림과 같이 필터를 적용한 후 데이터에 더해진다


합성곱 연산을 수행하기 전 입력데이터의 주변을 특정 값(예컨대 0)으로 채우기도 하는데 이를 '패딩'이라 한다

크기가 (4, 4)인 입력 데이터에 패딩이 추가되어 (6, 6)이 된다
이 입력에 (3, 3) 크기의 필터를 걸면 (4, 4) 크기의 출력 데이터가 생성된다
패딩은 2나 3등 원하는 정수로 설정할 수 있다
이는 합성곱 연산에서 출력의 크기가 줄어드는 걸 방지할 수 있다

필처를 적용하는 위치의 간격을 '스트라이드'라고 한다
스트라이드를 2로 하면 필터를 적용하는 윈도우가 두 칸씩 이동한다

스트라이드를 2로 하니 출력은 (3, 3)이 된다
이처럼 스트라이드를 키우면 출력 크기는 작아지며, 패딩을 크게 하면 출력 크기가 커진다
위 식은 출력 크기를 계산하는 식이다
입력 크기를 (H, W), 필터 크기를 (FH, FW), 출력 크기를 (OH, OW), 패딩을 P, 스트라이드를 S라 하면, 출력 크기는 다음 식으로 계산된다

단 식의 결과가 정수로 나눠떨어지는 값이어야 한다
딥러닝 프레임워크 중에는 값이 딱 나눠떨어지지 않을 때는 가까운 정수로 반올림하는 등, 특별히 에러를 내지 않고 진행하도록 구현하는 경우도 존재한다

다음 그림은 3차원 데이터 합성곱 연산의 예이다
2차원과 비교하면, 길이 방향(채널 방향)으로 특징 맵이 늘어났다
채널쪽으로 특징 맵이 여러 개 있다면 입력 데이터와 필터의 합성곱 연산을 채널마다 수행하고, 그 결과를 더해서 하나의 출력을 얻는다

3차원 합성곱 연산에서 주의할 점은 입력 데이터의 채널 수와 필터의 수가 같아야 한다
한편 필터 자체의 크기는 원하는 값으로 설정할 수 있다(단, 모든 채널의 필터가 같은 크기여야 함)

3차원 합성곱 연산은 데이터와 필터를 직육면체 블록이라고 생각하면 쉽다
채널 수 C, 높이 H, 너비 W인 데이터의 형상은 (C, H, W)로 쓰며, 필터도 (C, FH, FW)로 사용한다

이 예에서 출력 데이터는 한 장의 특징 맵으로, 채널이 1개인 특징 맵이다
합성곱 연산의 출력으로 다수의 채널을 내보내려면 필터(가중치)를 다수 사용하는 방법이 있다
그림과 같이 필터를 FN개 적용하면 출력 맵도 FN개가 생성된다
그리고 그 FN개의 맵을 모으면 형상이 (FN, OH, OW)인 블록이 완성된다
이 완성된 블록을 다음 계층으로 넘기겠다는 것이 CNN의 처리 흐름이다

그런 이유로 필터의 가중치 데이터는 4차원 데이터이며 (출력 채널 수, 입력 채널 수, 높이, 너비)순으로 쓴다
다음은 여러 필터를 적용한 합성곱 연산에 편향을 더한 모습이다
편향은 채널 하나에 값 하나씩으로 구성된다
이 예에서 편향의 형상은 (FN, 1, 1)이다

신경망 처리처럼 합성곱 연산도 배치 처리를 지원한다
각 계층을 흐르는 데이터의 차원을 하나 늘려 4차원 데이터로 저장한다(데이터 수, 채널 수, 높이, 너비)
다음 그림은 데이터가 N개일 때 배치 처리를 구현한 모습이다

각 데이터의 선두에 배치용 차원을 추가했다
이처럼 데이터는 4차원 형상을 가진 채 각 계층을 타고 흐른다
여기서 주의할 점은 신경망에 4차원 데이터가 하나 흐를 때마다 데이터 N개에 대한 합성곱 연산이 이뤄진다는 것이다

풀링 계층

풀링은 세로 가로 방향의 공간을 줄이는 연산이다
2 X 2 '최대 풀링'을 스트라이드 2로 처리하는 순서이다
최대 풀링은 최댓값을 구하는 연산으로, '2 X 2'는 대상 영역의 크기를 뜻한다
즉 2 X 2 크기의 영역에서 가장 큰 원소를 하나 꺼낸다
일반적으로 풀링의 윈도우 크기와 스트라이드는 같은 값으러 설정하는 것이 보통이다

풀링 계층은 다음과 같은 특징을 가진다

  • 학습해야 할 매개변수가 없다
    - 풀링은 대상 영역에서 최댓값이나 평균을 취하는 명확한 처리이므로 학습할 것이 없다

  • 채널 수가 변하지 않는다
    - 풀링 연산은 입력 데이터의 채널 수 그대로 출력 데이터로 내보낸다

  • 입력의 변화에 영향을 적게 받는다
    - 입력 데이터의 차이를 풀링이 흡수해 사라진다


합성곱/풀링 계층 구현하기

CNN은 기본적으로 4차원 데이터를 다룬다
합성곱 연산을 곧이곧대로 구현하려면 for문을 겹겹이 써야된다
이런 성능이 떨어지는 단점을 해결하기 위해 'im2col'이라는 편의 함수를 사용한다

im2col은 입력 데이터를 필터링하기 좋게 전개하는 함수다
위 그림과 같이 3차원 입력 데이터에 im2col을 적용하면 2차원 행렬로 바꾼다
이 전개를 필터를 적용하는 모든 영역에서 수행한다

위 그림에선 보기 좋게 스트라이드를 크게 잡아 필터의 적용 영역이 겹치지 않게 했지만, 실제 상황에선 영역이 겹치는 경우가 대부분이다
필터 적용 영역이 겹치게 되면 원소 수가 많아지기 때문에 메모리를 더 많이 소비한다는 단점이 있다
하지만 컴퓨터는 행렬을 묶어서 계산하는 데 탁월하기 때문에 문제를 선형 대수 라이브러리를 활용해 효율을 높일 수 있다

im2col로 입력 데이터를 전개한 다음에는 합성곱 계층의 필터를 1열로 전개하고, 두 행렬의 곱을 계산한다
이는 완전연결 계층의 Affine 꼐층에서 한 것과 거의 같다

위 방식으로 출력한 결과는 2차원 행렬이다
CNN은 데이터를 4차원 배열로 저장하므로 2차원인 출력 데이터를 4차원으로 변형한다

합성곱 계층

합성곱 계층은 필터, 편향, 스트라이드, 패딩을 인수로 받아 초기화한다

입력 데이터를 im2col로 전개하고 필터도 reshape을 사용해 2차원 배열로 전개한다
그리고 이렇게 전개한 두 행렬의 곱을 구한다

이때 reshape에 -1을 지정했는데, 다차원 배열의 원소 수가 변환 후에도 똑같이 유지되도록 적절히 묶는다
예를 들어 (10, 3, 5, 5) 형상을 한 다차원 배열 W의 원소 수는 750다
이 배열에 reshape(10, -1)을 호출하면 750개의 원소를 10묶음으로, 즉 형상이 (10, 75)인 배열로 만들어준다

다음으로 forward 구현의 마지막에서는 출력 데이터를 적절한 형상으로 바꿔준다
이때 넘파이의 transpose 함수를 사용하는더, 이는 다차원 배열의 축 순서를 바꿔주는 함수다

이상이 합성곱 계층의 forward 구현이다
im2col로 전개한 덕분에 완전연결 계층의 Affine 계층과 거의 똑같이 구현할 수 있었다

풀링 계층

풀링 계층 구현도 합성곱 계층과 마찬가지로 im2col을 사용해 입력 데이터를 전개하지만, 합성곱 계층과 다르게 채널 쪽이 독립적이다
전개 후, 전개한 행렬에서 행별 최댓값을 구하고 적절한 형상으로 성형하기만 하면 된다

이상 풀링 계층의 forward 처리 흐름이다

즉, 풀링 계층은 3단계로 진행된다

  1. 입력 데이터를 전개한다
  2. 행별 최댓값을 구한다
  3. 적절한 모양으로 성형한다

CNN 시각화하기

다음 그림은 MNIST 데이터셋으로 CNN 학습을 진행했을 때 학습 전 후 가중치를 비교한 것이다

학습 전 필터는 무작위로 초기화되고 있어 흑백의 정도에 규칙성이 없다
한편, 학습을 마친 필터는 규칙성 있는 이미지가 되었다
흰색에서 검은색으로 점차 변화하는 필터와 덩어리(블롭)가 진 필터 등, 규칙을 띄는 필터로 바뀌었다

오른쪽과 같이 규칙성이 있는 필터는 에지(색상이 바뀐 경계선)와 블롭(국소적 덩어리진 영역) 등을 본다
가령 왼쪽 절반이 흰색이고 오른쪽 절반이 검은색인 필터는 세로 방향의 에지에 반응하는 필터다
다음 그림은 학습된 필터 2개를 선택하여 입력 이미지에 합성곱 처리를 한 결과로 '필터 1'은 세로 에지에 반응하며 '필터 2'는 가로 에지에 반응하는 것을 알 수 있다

이처럼 합성곱 계층의 필터는 에지나 블롭 등의 원시적인 정보를 추출할 수 있다

1번째 층의 합성곱 계층에서는 에지나 블롭 등의 저수준 정보가 추출된다
계층이 깊어질수록 추출되는 정보(강하게 반응하는 뉴런)는 더 추상화된다는 것을 알 수 있다

이 네트워크 구조는 AlexNet이라 하는데, 합성곱 계층과 풀링 계층을 여러 겹 쌓고, 마지막으로 완전연결 계층을 거쳐 결과를 출력하는 구조다
블록으로 나타낸 것은 중간 데이터이며, 그 중간 데이터에 합성곱 연산을 연속해서 적용한다

딥러닝은 합성곱 계층을 여러 겹 쌓으면, 층이 깊어지면서 더 복잡해지고 추상화된 정보가 추출된다
처음 층은 단순한 에지에 반응하고, 이어서 텍스처에 반응하고, 더 복잡한 사물의 일부에 반응하도록 변화한다
즉, 층이 깊어지면서 뉴런이 반응하는 대상이 단순한 모양에서 '고급'정보로 변화해간다
다시 말하면 사물의 '의미'를 이해하도록 변화하는 것이다

대표적인 CNN

LeNet

LeNet은 합성곱 계층과 풀링 계층을 반복하고, 마지막으로 완전연결 계층을 거치면서 결과를 출력한다

LeNet는 현재의 CNN과 몇가지 차이점이 있다
LeNet는 시그모이드 함수를 사용하는 데 반해, 현재는 ReLU를 사용한다
LeNet은 서브샘플링을 하여 중간 데이터의 크기를 줄이지만 현재는 최대 풀링이 주류이다

AlexNet

AlexNet은 합성곱 계층과 풀링 계층을 거듭하며 마지막으로 완전연결 계층을 거쳐 결과를 출력하는 면에서 LeNet에서 큰 구조가 바뀌지 않았다
하지만 다음과 같은 변화를 주었다

  • 활성화 함수로 ReLU를 이용
  • Local Response Normalization(LRN)이라는 국소적 정규화를 실시하는 계층 이용
  • 드롭아웃을 사용

0개의 댓글