08.1 더 깊게

신경망에 관해 그동안 많은 것을 배웠습니다. 신경망을 구성하는 다양한 계층과 학습에 효과적인 기술, 영상 분야에 특히 유효한 CNN과 매개변수 최적화 기법 등이 떠오를 겁니다. 이들 모두가 딥러닝에서 중요한 기술입니다. 이번 절에서는 그동안 배운 기술을 집약하고 심층 신경망을 만들어 MNIST 데이터셋의 손글씨 숫자 인식에 도전하려 합니다.

8.1.1 더 깊은 신경망으로

거두절미하고, 이번 절에서는 [그림 8-1]과 같이 구성된 CNN을 만들고자 합니다(이 신경망은 다음 절에서 설명하는 VGG 신경망을 참고하였습니다).

그림 8-1 손글씨 숫자를 인식하는 심층 CNN

그림 8-1

척 보아도 지금까지 구현한 신경망보다 층이 깊습니다. 여기에서 사용하는 합성곱 계층은 모두 $3 \times 3$ 크기의 작은 필터로, 층이 깊어지면서 채널 수가 더 늘어나는 것이 특징입니다(합성곱 계층의 채널 수는 앞 계층에서부터 순서대로 $16, 16, 32, 32, 64, 64$로 늘어갑니다). 또 그림과 같이 풀링 계층을 추가하여 중간 데이터의 공간 크기를 점차 줄여갑니다. 그리고 마지막 단의 완전연결 계층에서는 드롭아웃 계층을 사용합니다.

가중치 초깃값으로 He 초깃값을 사용하고, 가중치 매개변수 갱신에는 Adam을 이용합니다. 이상을 정리하면 이 신경망의 특징은 다음과 같습니다.

  • $3 \times 3$의 작은 필터를 사용한 합성곱 계층
  • 활성화 함수는 ReLU
  • 완전연결 계층 뒤에 드롭아웃 계층 사용
  • Adam을 사용해 최적화
  • 가중치 초깃값은 ‘He의 초깃값’

이상의 특징에서 보듯 이 신경망에는 그동안 배운 신경망 기술을 잔뜩 녹였습니다. 그럼 이 신경망을 학습시켜볼까요? 결과부터 말하면 이 신경망의 정확도는 $99.38\%^\ast$가 되겠습니다. 이 정도면 매우 훌륭한 성능이라고 할 수 있죠!

ResNet 잔차 스킵 연결 도로시가 100층이 넘는 거대한 딥러닝 성벽을 기어 올라가는 도중, 지니가 지름길(Skip Connection) 구름 다리를 놓아주어 신호가 절벽을 건너뛰어 안전하게 도달하도록 돕고 있어요.

도로시의 층 깊이 극복 지름길 발견

  • 도로시: “지니! 층을 깊게 쌓을수록 매개변수 수도 줄어들고 복잡한 의미를 단계적으로 배울 수 있어서 좋은데, 50층, 100층을 넘어가니까 뒤로 갈수록 기울기 신호가 점점 소멸해서 학습이 아예 안 돼!”
  • 지니: “그게 바로 기울기 소실 문제란다. 그래서 입력 신호를 아무런 변형 없이 그대로 다음 층으로 건너뛰게 해주는 지름길(Skip Connection) 다리를 놓는 ResNet 기법이 고안되었어. 덕분에 150층이 넘는 초심층 망도 신호 왜곡 없이 거뜬히 훈련할 수 있게 되었지!”

* 최종 정확도에는 얼마간 차이가 날 수 있습니다. 다만, 이번 네트워크에서는 대체로 $99\%$를 넘길 겁니다.

NOTE_ 이 신경망을 구현한 소스 코드는 ch08/deep_convnet.py에, 또 훈련용 코드는 ch08/train_deepnet.py에 준비되어 있습니다. 이들 코드를 사용하여 학습을 직접 시켜봐도 좋습니다만, 심층 신경망을 학습시키는 데는 시간이 오래 걸립니다(아마 반나절은 걸릴 겁니다). 이 책에서는 학습된 가중치 매개변수를 ch08/deep_conv_net_params.pkl 파일에 준비해놨습니다. 이전의 deep_convnet.py는 학습된 매개변수를 읽어 들일 수 있으니 적절히 이용하세요.

이 신경망이 잘못 인식할 확률은 겨우 $0.62\%$입니다. 그럼 실제로 어떤 이미지를 인식하지 못했는지 살펴볼까요. [그림 8-2]는 인식에 실패한 예입니다.

그림 8-2 인식하지 못한 이미지들 : 각 사진의 왼쪽 위는 정답 레이블, 오른쪽 아래는 이 신경망의 추론 결과

그림 8-2

[그림 8-2]의 사진들은 우리 인간도 판단하기 어려운 이미지입니다. 실제로 우리도 똑같이 ‘인식 오류’를 저지르는 이미지가 여럿 포함되어 있지요. 첫 번째 이미지는 ‘0’처럼 보이고(정답은 ‘6’), 두 번째 이미지는 분명히 ‘5’처럼도 보입니다(정답은 ‘3’). 전체적으로 ‘1’과 ‘7’, ‘0’과 ‘6’, ‘3’과 ‘5’의 조합이 헷갈리는데, 이런 예를 보자면 인식을 못 한 것도 이해가 됩니다.

이번의 심층 CNN은 정확도가 높고, 잘못 인식한 이미지들도 인간과 비슷한 인식 오류를 저지르고 있습니다. 이런 점에서도 심층 CNN의 잠재력이 크다는 걸 새삼 느낄 수 있을 거예요.

8.1.2 정확도를 더 높이려면

What is the class of this image? 웹 사이트[32]는 다양한 데이터셋을 대상으로 그동안 논문 등에서 발표한 기법들의 정확도 순위를 정리해두었습니다([그림 8-3]).

그림 8-3 MNIST 데이터셋에 대한 각 기법의 순위(2016년 12월 시점)[32]

그림 8-3

[그림 8-3]의 순위를 보면 ‘Neural Networks’나 ‘Deep’, ‘Convolutional’이라는 키워드가 돋보입니다. 사실 상위권은 대부분 CNN을 기초로 한 기법들이 점령했습니다. 참고로 2016년 10월 현재 MNIST 데이터셋에 대한 정확도 1위는 $99.79\%$ (오류율 $0.21\%$)이며, 이 기법도 CNN을 기초로 했습니다.[33] 다만 이 목록의 기법들이 사용하는 CNN들은 그다지 깊지 않습니다(합성곱 계층 2개에 완전연결 계층 2개 정도인 신경망).

NOTE_ MNIST 데이터셋에 대해서는 층을 아주 깊게 하지 않고도 (현시점에서는) 최고 수준의 결과가 나옵니다. 이는 손글씨 숫자라는 문제가 비교적 단순해서 신경망의 표현력을 극한까지 높일 필요가 없기 때문이라고 생각합니다. 그래서 층을 깊게 해도 혜택이 적다고 할 수 있죠. 반면, 나중에 소개하는 대규모 일반 사물 인식에서는 문제가 훨씬 복잡해지므로 층을 깊게 하면 정확도를 크게 끌어올릴 수 있습니다.

[그림 8-3]의 상위 기법들을 참고하면 정확도를 더 높일 수 있는 기술이나 힌트를 발견할 수 있습니다. 예를 들어 앙상블 학습, 학습률 감소, 데이터 확장 등이 정확도 향상에 공헌하고 있지요. 특히 데이터 확장은 손쉬운 방법이면서도 정확도 개선에 아주 효과적입니다.

데이터 확장data augmentation은 입력 이미지(훈련 이미지)를 알고리즘을 동원해 ‘인위적’으로 확장합니다. [그림 8-4]와 같이 입력 이미지를 회전하거나 세로로 이동하는 등 미세한 변화를 주어 이미지의 개수를 늘리는 것이죠. 이는 데이터가 몇 개 없을 때 특히 효과적인 수단입니다.

그림 8-4 데이터 확장의 예

그림 8-4

데이터 확장은 [그림 8-4] 같은 변형 외에도 다양한 방법으로 이미지를 확장할 수 있습니다. 예를 들어 이미지 일부를 잘라내는 crop이나 좌우를 뒤집는 flip* 등이 있겠죠. 일반적인 이미지에는 밝기 등의 외형 변화나 확대 · 축소 등의 스케일 변화도 효과적입니다. 어쨌든 데이터 확장을 동원해 훈련 이미지의 개수를 늘릴 수 있다면 딥러닝의 인식 수준을 개선할 수 있습니다. 이것은 쉬운 ‘트릭’이라 가볍게 생각할지도 모르지만, 멋진 결과를 가져오는 경우가 많습니다. 이 책에서는 데이터 확장은 구현하지 않습니다만, 보다시피 어렵지 않은 방식이니 흥미가 있는 분은 한 번 도전해보세요.

데이터 아규멘테이션 데이터 확장 지니가 마법 브러시로 하나의 숫자 ‘5’ 카드를 좌우 반전시키고, 각도를 살짝 비틀고, 크기를 키워서 순식간에 10개의 변형 훈련 데이터 카드로 복제해 쏟아내고 있어요.

지니의 데이터 뻥튀기 마법 (Data Augmentation)

  • 지니: “도로시, 데이터가 부족해서 성능이 막힐 때는 원본 이미지에 회전(Rotation), 미세 이동(Shift), 좌우 뒤집기(Flip) 등의 가벼운 기하학적 변형을 주어 데이터 세트의 수량을 수배로 늘려주는 데이터 확장(Data Augmentation) 마법이 아주 유용하단다.”
  • 도로시: “와! 굳이 데이터를 더 수집하지 않고도, 인위적으로 다양한 환경의 모방 변형을 만들어 학습을 시키니까 모델이 훨씬 튼튼해지고 과적합(Overfitting)도 방지되겠네!”

8.1.3 깊게 하는 이유

‘층을 깊게 하는 것’이 왜 중요한가에 대한 이론적인 근거는 아직 많이 부족한 것이 사실입니다. 그래도 지금까지의 연구와 실험 결과를 바탕으로 설명할 수 있는 것은 몇 가지 있습니다(다소 직관적이기는 하지만). 이번 절에서는 ‘층을 깊게 하는 것’의 중요성에 대해서, 이를 뒷받침하는 데이터와 설명을 몇 가지 소개하겠습니다.


* flip은 이미지의 대칭성을 고려하지 않아도 되는 경우에만 쓸 수 있습니다.

우선 층을 깊게 하는 것의 중요성은 ILSVRC로 대표되는 대규모 이미지 인식 대회의 결과에서 파악할 수 있습니다(자세한 내용은 다음 절을 참고하세요). 이 대회에서 최근 상위를 차지한 기법 대부분은 딥러닝 기반이며, 그 경향은 신경망을 더 깊게 만드는 방향으로 가고 있습니다. 층의 깊이에 비례해 정확도가 좋아지는 것이죠.

이어서 층을 깊게 할 때의 이점을 설명하겠습니다. 그 이점 하나는 신경망의 매개변수 수가 줄어든다는 것입니다. 층을 깊게 한 신경망은 깊지 않은 경우보다 적은 매개변수로 같은(혹은 그 이상) 수준의 표현력을 달성할 수 있습니다. 합성곱 연산에서의 필터 크기에 주목해 생각해 보면 쉽게 이해될 겁니다. 예를 하나 볼까요? [그림 8-5]는 $5 \times 5$ 필터로 구성된 합성곱 계층입니다.

그림 8-5 $5 \times 5$ 합성곱 연산의 예

그림 8-5

여기에서 주목할 점은 출력 데이터의 각 노드가 입력 데이터의 어느 영역으로부터 계산되었느냐는 것입니다. 당연하지만 [그림 8-5]의 예에서는 각각의 출력 노드는 입력 데이터의 $5 \times 5$ 크기 영역에서 계산됩니다.

이어서 [그림 8-6]처럼 $3 \times 3$의 합성곱 연산을 2회 반복하는 경우를 생각해봅시다. 이 경우 출력 노드 하나는 중간 데이터의 $3 \times 3$ 영역에서 계산됩니다. 그럼 중간 데이터의 $3 \times 3$ 영역은 그 전 입력 데이터의 어느 영역에서 계산될까요? [그림 8-6]을 잘 보면 $5 \times 5$ 크기의 영역에서 계산되어 나오는 것을 알 수 있지요. 즉, [그림 8-6]의 출력 데이터는 입력 데이터의 $5 \times 5$ 영역을 ‘보고’ 계산하게 됩니다.

그림 8-6 $3 \times 3$의 합성곱 계층을 2회 반복한 예

그림 8-6

$5 \times 5$의 합성곱 연산 1회는 $3 \times 3$의 합성곱 연산을 2회 수행하여 대체할 수 있습니다. 게다가 전자의 매개변수 수가 25개($5 \times 5$)인 반면, 후자는 총 18개($2 \times 3 \times 3$)이며, 매개변수 수는 층을 반복할수록 적어집니다. 그리고 그 개수의 차이는 층이 깊어질수록 커집니다. 예를 들어 $3 \times 3$의 합성곱 연산을 3회 반복하면 매개변수는 모두 27개가 되지만, 같은 크기의 영역을 1회의 합성곱 연산으로 ‘보기’ 위해서는 $7 \times 7$ 크기의 필터, 즉 매개변수 49개가 필요합니다.

NOTE_ 작은 필터를 겹쳐 신경망을 깊게 할 때의 장점은 매개변수 수를 줄여 넓은 수용 영역receptive field을 소화할 수 있다는 데 있습니다(수용 영역은 뉴런에 변화를 일으키는 국소적인 공간 영역입니다). 게다가 층을 거듭하면서 ReLU 등의 활성화 함수를 합성곱 계층 사이에 끼움으로써 신경망의 표현력이 개선됩니다. 이는 활성화 함수가 신경망에 ‘비선형’ 힘을 가하고, 비선형 함수가 겹치면서 더 복잡한 것도 표현할 수 있게 되기 때문입니다.

학습의 효율성도 층을 깊게 하는 것의 이점입니다. 층을 깊게 함으로써 학습 데이터의 양을 줄여학습을 고속으로 수행할 수 있다는 뜻입니다. 이를 (직관적으로) 이해하려면 “7.6 CNN 시각화하기“에서의 설명을 생각하면 좋을 것입니다. 7.6절에서 CNN의 합성곱 계층이 정보를 계층적으로 추출하고 있음을 설명했습니다. 앞단의 합성곱 계층에서는 에지 등의 단순한 패턴에 뉴런이 반응하고 층이 깊어지면서 텍스처와 사물의 일부와 같이 점차 더 복잡한 것에 반응한다고 설명했죠.

그런 네트워크 계층 구조를 기억해두고, ‘개’를 인식하는 문제를 생각해봅시다. 이 문제를 얕은 신경망에서 해결하려면 합성곱 계층은 개의 특징 대부분을 한 번에 ‘이해’해야 합니다. 견종도 다양하고 어느 각도에서 찍은 사진이냐 따라 완전히 다르게 보일 수 있습니다. 그래서 개의 특징을 이해하려면 변화가 풍부하고 많은 학습 데이터가 필요하고, 결과적으로 학습 시간이 오래 걸립니다.

그러나 신경망을 깊게 하면 학습해야 할 문제를 계층적으로 분해할 수 있습니다. 각 층이 학습해야 할 문제를 더 단순한 문제로 대체할 수 있는 것이죠. 예를 들어 처음 층은 에지 학습에 전념하여 적은 학습 데이터로 효율적으로 학습할 수 있습니다. 개가 등장하는 이미지보다 에지를 포함한 이미지는 많고, 에지의 패턴은 개라는 패턴보다 구조가 훨씬 간단하기 때문이죠.

또, 층을 깊게 하면 정보를 계층적으로 전달할 수 있다는 점도 중요합니다. 예를 들어 에지를 추출한 층의 다음 층은 에지 정보를 쓸 수 있고, 더 고도의 패턴을 효과적으로 학습하리라 기대할 수 있습니다. 즉, 층을 깊이 함으로써 각 층이 학습해야 할 문제를 ‘풀기 쉬운 단순한 문제’로 분해할 수 있어 효율적으로 학습하리라 기대할 수 있습니다.

깊은 학습의 붕괴 방지 수로 지니가 심층 신경망 하부에 역전파 기울기가 마르지 않고 안전하게 층 끝까지 순환할 수 있도록 우회 수로 장치(스킵 연결)를 튼튼하게 설계해 작동시키는 모습을 삼총사가 확인하고 있어요.

도로시의 깊은 학습 안정성 소감

  • 도로시: “확실히 층을 깊게 하니까 문제를 계층적으로 쪼개서 단순하게 배울 수 있어 좋지만, 역전파 기울기가 마르지 않게 우회 경로를 지속적으로 대주는 설계가 딥러닝 성공의 핵심구나!”
  • 지니: “그렇단다. 깊게(Deep) 쌓는 힘과, 그 깊이를 감당하는 안정적 설계가 어우러져 비로소 현대 딥러닝의 폭발적인 인지 지능이 완성되는 거란다.”
  • 토토: “왈왈! (파이프 점검하며) 누수 차단 완료다 멍!”

이상이 층을 깊게 하는 것이 왜 중요한가에 대한 보충 설명입니다. 단, 최근 일어나고 있는 층의 심화는 층이 깊어도 제대로 학습할 수 있도록 해주는 새로운 기술과 환경(빅 데이터와 컴퓨터 연산 능력 등)이 뒷받침되어 나타난 현상임을 강조해두고자 합니다.

서브목차