밑바닥부터 시작하는 딥러닝 Chapter 7
합성곱 신경망 (CNN)
이번 장은 합성곱 신경망이 주제이다. 합성곱 신경망은 음성, 이미지 데이터 인식 등 다양한 분야에서 사용된다. 특히 이미지 인식 분야에서 CNN은 신경망의 기초 중의 기초로 반드시 알고 넘어가야 한다.
CNN의 구조
CNN과 기존의 Affine 계층은 상당히 유사하다. 결국 이전 층의 결과값을 다음 층의 입력으로 넣으면서 해당 노드와 입력의 유사도를 측정하는 일인 것이다. 다만 Affine 계층에서는 위치적인 정보를 고려하지 않고 단순히 주어진 행렬을 내적을 통해 결과값을 도출했다. 하지만 CNN에서는 위치적인 정보를 고려하기 위해 필터라는 window 개념의 가중치를 사용하게 된다.
CNN으로 이루어진 네트워크에서는 Affine 대신 Conv라는 합성곱 계층이 추가된다. 여기에 추가적으로 Pooling 계층도 추가된다. 또 출력층에 가까운 은닉층에서는 Affine과 ReLU가 그대로 사용되는 것도 확인할 수 있다.
합성곱 계층
CNN에서는 패딩(padding)과 스트라이드(stride) 등 CNN에 사용되는 고유한 기법들이 있다. 또 완전연결층과 다르게 데이터가 3차원 데이터처럼 입체적인 데이터가 흐른다.
완전연결층에서는 2,3차원의 데이터가 입력으로 들어오더라도 1차원으로 만들어줘야 하기 때문에 데이터의 형상이 무시된다. 하지만 합성곱 계층에서는 3,4차원의 데이터가 입력으로 들어오면 그대로 형상을 유지하면서 다음층으로 결과를 내뱉는다.
CNN이 완전연결층보다 위치적으로 정보를 잘 담는 이유는 다음과 같다.
보통 이미지 데이터는 중요한 정보를 담고 있는 정보의 근처에 비슷한 수준의 정보가 담겨있을 가능성이 높다. 즉, 거리에 따른 중요한 픽셀이 몰려있을 수 있고, RGB의 값이 서로 밀접하게 연관되어 있을 수도 있다.
CNN에서는 합성곱 계층의 입출력 데이터를 특징 맵(Feature Map)이라고 부른다.
합성곱 연산
합성곱 연산은 아래 그림과 같이 데이터에 커널(필터)을 투영하여 곱과 합으로 결과값을 도출한다.
합성곱 연산에는 위 그림에서 나타나는 투영한 결과의 합 뿐만 아니라 편향값도 존재한다. 편향값은 한 특징 맵에 대해서 동일하게 적용된다.
패딩 (Padding)
패딩은 입력 데이터를 어떤 값으로 감싸는 것을 의미한다. 대체로 합성곱 연산을 진행하면 출력 데이터의 모양은 입력 데이터의 모양보다 작아지는데, 이 과정을 깊은 CNN에서 수행한다면 결국은 1x1의 크기가 되어 더이상 합성곱 연산을 할 수 없게 될 수도 있다. 때문에 Padding으로 기존의 데이터를 크게 만들고 거기에 합성곱 연산을 통해 기존보다 큰 결과 데이터 shape을 얻을 수 있다.
스트라이드 (Stride)
stride는 필터가 이미지를 거칠 때 몇 칸만큼 이동할 것인지 결정하는 하이퍼 파라미터이다.
3차원 데이터의 합성곱 연산
3차원 데이터를 CNN에 넣는다면, 필터(커널)는 입력 데이터의 채널 수 만큼 채널 수를 맞춰줘야 한다.
위 그림처럼 3차원 데이터가 들어오면 filter는 그에 맞춰 채널 수가 입력 데이터를 따라가야한다. 또 filter의 개수는 다음 결과값의 채널 수를 의미하게 된다.
위 그림처럼 블록으로 생각하면 좀 더 이해하기 편하다.
여기서 1개만을 생각했던 데이터를 배치 처리하여 생각하면 아래 그림과 같이 생각해볼 수 있다.
데이터의 개수와 채널 수, 높이, 너비를 중심으로 shape를 고려하면서 흐름을 이해하면 이해하기 편하다.
풀링 계층 (Pooling)
Pooling 계층에서는 입력 데이터를 축약하는 효과가 있다. 풀링에는 최대 풀링 (max pooling), 평균 풀링 (average pooling)이 있는데 이미지 인식 분야에서는 대체로 최대 풀링을 자주 사용한다.
- 풀링층은 기능이 이미 정해져있기 때문에 학습할 매개변수가 없다.
- 또 채널 수가 입력 데이터의 특징맵만큼 내보내기 때문에 입력 데이터와 풀링 층을 지난 출력 데이터의 채널 수는 항상 동일하다.
- 풀링 층은 기능이 동일하기 때문에 입력 데이터가 조금 변해도 강건한 출력을 보인다.
CNN의 특징
Convolutional 층, 합성곱 연산 층을 시각화해보면 가중치들이 어떻게 나타나는지 볼 수 있다. 가중치를 시각화해보면 처음 학습하기 전에는 픽셀들이 자유분방하고 랜덤하게 나열되어 있는 것을 볼 수 있다. 하지만 학습하면서 무언가 일정한 규칙이 있는 것처럼 픽셀들이 나열된다.
필터의 의미
이런 이유는 필터의 픽셀들이 나열된 방식에 따라 이미지의 어떤 성분을 추출할지 결정되기 때문인데, 아래의 그림을 참고해보자.
위 그림에서 필터 1은 왼쪽과 오른쪽, 필터 2는 위와 아래로 픽셀들이 흑백으로 나뉜 것을 볼 수 있다. 필터 1은 이미지를 투영했을 때 왼쪽은 값이 작게 오른쪽은 크게 나올 것이므로 vertical한 엣지에 반응하고, 필터 2는 이미지를 투영했을 때 아래는 값이 작게, 위는 값이 크게 나올 것이므로 horizontal한 엣지에 반응할 것임을 알 수 있다.
추출 정보의 의미
필터 (가중치) 뿐만 아니라 CNN의 추출 정보를 확인해보면 필터에 의해 어떤 정보가 추출됐는지도 확인할 수 있다. 추출된 정보를 시각화해보면 아래처럼 규칙이 보인다.
위 그림처럼 처음 컨볼루션 층을 통과한 결과 데이터에서는 단순한 엣지나 점이 추출된 것을 확인할 수 있고 그 다음 층들에서는 어떤 패턴같은 것들을 관찰할 수 있다. 점점 뒤로 갈수록 이미지에 가까운 특징들이 보이고 추상화되는 것까지 관찰할 수 있다.
결론적으로 CNN 네트워크에서는 다음과 같은 특징이 있다.
- 입력층과 가까운 은닉층에서의 추출값은 단순한 엣지나 점들이 관찰된다.
- 그 다음 층에서는 패턴이나 텍스쳐에 반응하게 되고
- 출력층에 가까워질 수록 추출값은 더 복잡하고 추상화된 고급 정보로 변화해간다.
- 결국 CNN 네트워크는 컴퓨터가 사물의 의미를 이해할 수 있도록 학습을 통해 변화해나가는 것이다.
정리
- CNN은 지금까지의 완전연결 계층 네트워크에 합성곱 계층과 풀링 계층을 새로 추가한다.
- 합성곱 계층과 풀링 계층은 im2col(이미지를 행렬로 전개하는 함수)을 이용하면 간단하고 효율적으로 구현할 수 있다.
- CNN을 시각화해보면 계층이 깊어질수록 고급 정보가 추출되는 모습을 확인할 수 있다.
- 대표적인 CNN에는 LeNet과 AlexNet이 있다.
- 딥러닝의 발전에는 빅 데이터와 GPU가 크게 기여했다.
im2col 함수는 대개 딥러닝 프레임워크에서 지원하는 Conv 메서드에 포함된 좀 더 low level의 메서드이다. im2col은 3,4차원의 데이터(이미지 등)을 마치 Affine 계층에서 내적을 통해 결과값을 출력하는 것처럼 간단하게 연산을 도와주는 함수이다.