안 쓰던 블로그

CNN(convolutional neural network - 합성곱 신경망) 본문

머신러닝/머신러닝

CNN(convolutional neural network - 합성곱 신경망)

proqk 2021. 4. 8. 16:25
반응형

케라스 창시자에게 배우는 딥러닝 - 5장을 요약 정리한 글입니다.


컨브넷(convnet)또는 합성곱 신경망이라고 불리는 CNN에 대해서 공부한다.

합성곱 신경망에 대해 하기 전에, 완전 연결망과의 차이를 한 번 짚고 간다. 

 

완전 연결 네트워크(Fully connected network)과의 차이

완전 연결 네트워크는 densely connected 밀집 연결이라고도 한다. 같은 테스트 데이터에서 완전 연결된 모델보다 간단한 컨브넷이 더 잘 작동한다. 왜 그럴까?

바로 완전 연결 층과 합성곱 층 사이의 차이 때문에 그렇다. Dense 층은 입력 특성 공간에 있는 전역 패턴(예: MNIST 숫자 이미지에서 모든 픽셀에 걸친 패턴)을 학습하지만 합성곱 층은 지역 패턴(예: 숫자 이미지의 작은 특징들)을 학습한다. 이미지일 경우 윈도우로 입력에서 패턴을 찾는다.

 

이런 특징은 컨브넷에 두 가지 성질을 제공한다.

1. 학습된 패턴은 평행 이동 불변성을 가진다.

컨브넷이 이미지의 특정 부분에서서 어떤 패턴을 학습했다면 다른 부분에서도 이 패턴을 인식할 수 있다. 완전 연결 네트워크에서는 새로운 위치에 나타난 것은 새로운 패턴으로 학습해야 한다. 이 성질 때문에 컨브넷이 이미지를 효율적으로 처리하게 된다. (그리고 사실, 근본적으로 우리가 보는 세상은 평행 이동을 했다고 인식이 완전히 달라지지 않는다)

 

2. 컨브넷은 패턴의 공간적 계층 구조를 학습할 수 있다.

첫 번째 합성곱 층이 에지 같은 작은 지역 패턴을 학습하고, 두 번째 합성곱 층은 첫 번째 층의 특성으로 구성된 더 큰 패턴을 학습한다. 이런 방식으로 컨브넷은 복잡하고 추상적인 시각적인 개념을 효과적으로 학습할 수 있다.

예를 들자면 개가 있으면 첫 번째 층에서는 개의 눈, 코, 귀의 모서리같은 작은 구성 요소를 만들고, 다음 층에서는 그런 구성요소를 모아 눈, 코, 귀 구성 요소가 된다. 최종적으로 dog이라는 결과를 도출할 수 있으며, 이것이 시각적인 구성 요소가 공간적인 계층 구조를 구성한다는 의미이다.

(그리고 여기서도 사실 근본적으로 우리가 보는 세상도 공간적인 계층 구조를 가진다)

 

합성곱 연산

합성곱 연산은 특성 맵feature map이라고 부르는 3D 텐서에 적용된다. 이 텐서는 2개의 공간 축(높이와 너비)과 깊이 축(채널 축이라고도 한다)으로 구성된다. RGB 이미지는 3개의 컬러 채널(빨/녹/파)을 가지므로 깊이 축의 차원은 3이다. MNIST 숫자처럼 흑백 이미지는 깊이 축의 차원이 1(회색 톤)이다. 합성곱 연산은 입력 특성 맵에서 작은 패치들을 추출하고, 이런 모든 패치에 같은 변환을 적용하여 출력 특성 맵을 만든다.

 

출력 특성 맵도 높이와 너비를 가진 3D 텐서이다. 그런데 출력 텐서의 깊이는 층의 매개변수로 결정되기 때문에 상황에 따라 다르다. 깊이 축은 RGB 입력처럼 특정 컬러를 의미하지 않고, 대신 일종의 필터를 의미한다. 필터는 입력 데이터의 어떤 특성을 인코딩하는데, 예를 들어서 하나의 필터가 '입력에 얼굴이 있는지'를 인코딩 할 수 있는 식이다.

MNIST 예제로 보면 첫 번째 합성곱 층이 (28,28,1)크기의 특성 맵을 입력으로 받아 (26,26,32)크기의 특성 맵을 출력한다. 즉 이 경우 입력에 대해 32개의 필터를 적용한다는 것이다.

 

합성곱의 파라미터

핵심적인 2개의 파라미터로 정의할 수 있다.

1. 입력으로부터 뽑아낼 패치의 크기

전형적으로 3x3이나 5x5 크기를 사용한다.

 

2. 특성 맵의 출력 깊이

합성곱으로 계산할 필터의 수이다. 예를 들어 깊이 32로 시작해서 깊이 64로 끝난다.

 

케라스의 Conv2D 층에서 이 파라미터는 Conv2D(ouput_depth, (window_height, window_width))처럼 첫 번째와 두 번째 매개변수로 전달된다.

 

합성곱 작동 방식

3D 입력 특성 맵 위를 3x3또는 5x5크기의 윈도우가 슬라이딩 하면서 모든 위치에서 3D 특성 패치((window_height, window_width, input_depth)의 크기)를 추출하는 방식으로 작동한다.

이런 3D 패치는 (output_depth, )크기의 1D 벡터로 변환된다. -> 합성곱 커널(합성곱 층의 필터를 하나의 행렬로 합친 것)

변환된 모든 벡터는 (height, width, output_depth)크기의 3D 특성 맵으로 재구성된다.

 

3x3 윈도우를 사용하는 과정을 정리하면 이렇다. 

1. 입력 깊이x너비x높이 형식의 입력 특성 맵(3D)

2. 1번을 입력 패치 여러 개로 조각조각 나눔(3D)

3. 패치를 커널과의 점곱(내적)으로 출력 깊이를 가진 벡터로 변환(1D)

4. 출력 깊이x너비x높이 형식의 출력 특성 맵으로  재구성(3D)

 

출력 높이와 너비는 입력의 높이와 너비와 다를 수 있다. (패딩이나 스트라이드 사용 여부에 따라 다름)

 

패딩과 스트라이드

패딩

패딩은 말 그대로 의미 없는 값을 붙여서 크기를 맞추는 것이다.

예를 들어 5x5 크기의 특성 맵에 3x3 크기인 윈도우를 맞추려고 한다면 출력 특성 맵은 3x3 크기가 될 것이다. 여기서 입력과 동일한 높이와 너비를 가진 출력 특성 맵을 얻고 싶다면 패딩을 사용할 수 있다. 패딩은 입력 특성 맵의 가장자리에 적절한 개수의 행과 열을 추가한다. 그렇게 3x3 윈도우를 패딩을 통해 5x5 윈도우로 만들 수 있다.

 

Conv2D 층에서 패딩은 padding 매개변수로 설정할 수 있고, 2개의 값이 필요하다. valid는 패딩을 사용하지 않고 윈도우를 놓을 수 있는 위치만 사용한다는 의미이다. same은 입력과 동일한 높이와 너비를 가진 출력을 만들기 위해 패딩한다는 의미이다. 기본값은 valid이다.

 

스트라이드

스트라이드는 합성곱의 파라미터로 두 번의 연속적인 윈도우 사이즈의 거리이다. 스트라이드의 기본값은 1이지만 1보다 큰 스트라이드 합성곱도 가능하다. (아래 그림)

이 그림은 5x5 크기의 패딩없는 입력에 스트라이드 2를 사용한 3x3 크기의 윈도우로 합성곱하여 추출한 패치이다.

스트라이드 2를 사용했다는 것은 특성 맵의 너비와 높이가 2의 배수로 다운샘플링 되었다는 의미이다.

 

특성 맵을 다운샘플링하기 위해 스트라이드 말고 최대 풀링 연산을 사용하기도 한다.

 

최대 풀링 연산

특성 맵의 크기가 MaxPooling2D 층마다 절반씩 줄어들고 있다. 이렇듯 강제적으로 특성 맵을 다운샘플링하는 것이 최대 풀링의 역할이다. 최대 풀링은 입력 특성 맵에서 윈도우 크기에 맞는 패치를 추출하고 각 채널별로 최댓값을 출력한다. 합성곱과 개념적으로 비슷하지만 추출한 패치에 학습된 선형 변환(합성곱 커널)을 적용하는 대신 하드코딩된 최댓값 추출 연산을 사용한다. 합성곱과 가장 큰 차이점은 최대 풀링은 보통 2x2 윈도우와 스트라드 2를 사용하여 특성 맵을 절반 크기로 다운샘플링한다. 반면 합성곱은 전형적으로 3x3 윈도우와 스트라이드 1을 사용한다.

 

<다운 샘플링을 하는 이유?>

이렇게 다운 샘플링을 하는 이유는 바로 처리할 특성 맵의 가중치 개수를 줄이기 위해서이다. 모델이 합성곱으로만 이루어져 있다면 큰 이미지를 통짜로 분석하겠다고 하는 말인데, 이 3D(axbxc)만큼의 원소를 가진 특성 맵이 여러 층 올라가면 기하급수적으로 커진다. 마지막에 컨브넷을 펼친 후(1D로 만든 후) Dense 층과 연결하면 몇백만 개의 가중치 파라미터는 금방 넘어버린다. 작은 모델 치고는 너무 많은 가중치이며 심한 과대적합이 일어나기 때문에 사이즈를 줄여야 한다.

또 다른 이유로는 큰 이미지를 통짜로 분석하기 때문에, 만약 숫자 이미지라면 실제 숫자가 있는 위치가 아닌 곳은 거의 아무 정보도 갖지 않는다. 초기 입력에 대한 정보가 아주 적어 분류를 학습하기에 충분하지 않다. 그래서 다운샘플링은 꼭 필요하며, conv2D+MaxPooling2D는 세트처럼 사용된다.

 

<스트라이드와 최대 풀링>

헷갈리기 쉬운 부분이 있다면, 스트라이드랑 최대 풀링 연산은 이미지를 다운샘플링하는 가법인데, 다운 샘플링을 하겠다는 말은 '이미지를 자르거나 줄이는 변형을 가한다'는 말이 아니다. 나는 처음 이 개념을 접했을 때는 그림판에서 이미지를 줄이거나 잘라내 듯이 작게 만드는 건가 했다. 하지만 다운샘플링의 보다 정확한 의미는 '화질을 떨군다=흐릿하게 만든다' 이다. 스트라이드는 한 마디로 윈도우 슬라이딩을 얼만큼 이동할 것인가? 의 개념이다. 최대 풀링 연산은 2x2 윈도우를 스트라이드 2를 사용하여(윈도우를 2칸씩 움직이며) 특성 맵을 줄인다.

 

예를 들어 4x4짜리 특성 맵이 있으면, 최대 풀링 연산은 2x2윈도우를 2칸씩 움직인다. 즉, 위에 그림처럼 되며 사이즈는 절반이 된다.

 

 

예를 들어 12x12짜리 특성 맵이 있으면, 합성곱 연산은 3x3윈도우를 1칸씩 움직인다. 즉, 위의 그림처럼 3x3윈도우가 움직이며, 마지막에 남는 부분이 있다면 버린다.

 

위의 모델 구조에서 처음에 26x26사이즈였던 특성 맵이 maxpooling2D로 가니까 절반이 되었다.

13x13사이즈였던 특성 맵이 conv2D로 가니까 13을 3칸씩 묶어서 총 11개가 나오므로 11x11이 되었다. 이런 느낌이다.

반응형
Comments