7장에서 우리는 단순 CNN 하나로 MNIST에서 99%에 이르렀다. Conv 하나, Pool 하나, Affine 둘. 이 얕은 구조로도 손글씨 숫자는 거의 다 맞힌다. 그런데 세상의 이미지는 손글씨보다 훨씬 복잡하고, 구분해야 할 대상은 열 개가 아니라 천 개다. 여기서 자연스러운 질문이 나온다 — 층을 더 깊게 쌓으면 더 잘하게 될까? 이 장은 그 “깊게”가 왜 이득인지를 수치로 못 박고, 실제로 깊이를 밀어붙여 세상을 바꾼 대표 아키텍처들의 핵심 아이디어를 하나씩 들여다본다.
이 장은 코드로 무언가를 새로 만드는 장이 아니다. 지금까지 밑바닥부터 세운 부품들 — 합성곱, 풀링, ReLU, 역전파, 옵티마이저 — 이 어떻게 조립되어 거대한 네트워크가 되는지를 조망하는 지도다. 그리고 그 지도의 끝에서, 1장의 넘파이 배열 한 줄에서 여기까지 올라온 여정 전체를 되짚는다. 이 책이 준 것은 특정 모델이 아니라 블랙박스 없이 이해하는 눈이라는 것을, 마지막에 확인한다.
왜 층을 깊게 하는가 — 3×3 세 겹의 산수
“깊게”가 이득이라는 말은 직관적이지만, 그 이득의 정체는 놀랍도록 구체적인 산수로 설명된다. 핵심은 작은 필터를 여러 겹 쌓는 것이, 큰 필터 한 겹보다 유리하다는 것이다. 이를 두 축 — 수용 영역과 매개변수 수 — 에서 수치로 유도한다.
먼저 수용 영역(receptive field). 어떤 출력 뉴런 하나가 원래 입력에서 얼마나 넓은 영역을 “보는가”를 뜻한다. 3×3 합성곱 한 층을 지나면, 출력 한 점은 입력의 3×3 영역을 본다. 여기에 3×3 합성곱을 한 층 더 쌓으면 어떻게 될까. 두 번째 층의 출력 한 점은 첫 번째 층의 3×3 영역을 보는데, 그 3×3 각각이 다시 입력의 3×3을 봤으므로, 겹침을 감안해 세어 보면 두 겹째 출력은 입력의 5×5를 본다. 한 겹 더 쌓아 세 겹이 되면 7×7을 본다. 즉 3×3 세 겹의 수용 영역은 7×7 한 겹과 정확히 같다.
수용 영역의 확장에는 규칙이 있다. 스트라이드 1인 필터를 한 겹 지날 때마다 수용 영역은 각 변이 씩 늘어난다. 3×3이면 겹마다 2씩 커지니, 한 겹 3, 두 겹 5, 세 겹 7 — 앞의 수열이 그래서 나온다. 반대로 7×7 한 겹은 단번에 6을 키워 7에 도달한다. 도착점(7×7)은 같고, 그리로 가는 계단의 수가 다를 뿐이다.
수용 영역이 같다면, 굳이 세 겹으로 쪼갤 이유가 매개변수에 있다. 채널 수를 로 같게 두고 세어 보자. 7×7 필터 한 겹의 매개변수는 채널까지 포함해 이다. 반면 3×3 세 겹은 각 겹이 이고, 세 겹이니 이다.
같은 넓이를 보면서 매개변수는 절반 가까이(27/49 ≈ 55%) 적다. 게다가 세 겹 사이사이에 ReLU가 세 번 끼어들어 비선형성이 세 배로 늘어난다 — 7×7 한 겹은 그 넓은 영역을 단 한 번의 선형 변환으로 뭉뚱그리지만, 3×3 세 겹은 같은 영역을 세 번에 나눠 비선형적으로 접어 넣으므로 더 복잡한 함수를 표현할 수 있다. 매개변수는 줄고, 표현력은 늘고, 학습해야 할 것은 작은 조각들로 분해된다. 이것이 “층을 깊게, 필터는 작게”라는 현대 CNN 설계 철학의 산술적 뿌리다.
판단 기준: 넓은 수용 영역이 필요하면 큰 필터 한 겹 대신 작은 필터(3×3)를 여러 겹 쌓아라 — 같은 시야를 더 적은 매개변수와 더 많은 비선형성으로 얻는다. 함정: “필터가 크면 한 번에 넓게 보니 좋다”는 직관은 매개변수 제곱 증가()와 비선형성 감소를 놓친 것이다. 깊이가 주는 이득은 공짜가 아니라, 뒤에서 볼 기울기 소실이라는 대가를 함께 데려온다.
숫자로 따라가기 ① — 매개변수를 실제 숫자로 세어 본다
대 는 문자라서 아직 손에 잡히지 않는다. VGG 중간쯤에 흔한 채널을 대입해 실제 개수로 굴려 보자. 종이에 그대로 적을 수 있게, 한 겹씩 센다.
먼저 3×3 세 겹. 한 겹의 필터 하나는 개의 가중치를 갖는다(가로 3, 세로 3, 입력 채널 64). 출력도 64채널로 맞추려면 이런 필터가 64개 필요하니, 한 겹의 매개변수는
이고, 세 겹이면
다음 7×7 한 겹. 필터 하나가 개, 그것이 64개니
같은 7×7 시야를 확보하는 데 한쪽은 11만 개, 다른 쪽은 20만 개다. 차이가 약 9만 개, 비율로는 — 앞에서 문자로 얻은 27/49와 정확히 같은 숫자가 실물로 찍힌다. 채널을 512로 키우면 절대 격차는 배로 벌어져(가중치 수는 에 비례한다) 수백만 개 단위의 차이가 된다. 층 하나에서 아낀 9만이 수십 층에 걸쳐 곱으로 쌓이는 것 — 이것이 VGG가 큰 필터를 마다하고 3×3만 고집한 실전적 이유다.
판단 기준: 필터 크기를 고를 때 매개변수는 필터 변의 제곱()에 비례한다는 것을 기억하라 — 7과 3의 제곱 비(49:9)가 그대로 비용 비다. 함정: “세 겹이니 세 배로 늘 것”이라 지레짐작하는 것 — 겹 수는 선형(×3)으로 곱해지지만 필터 변은 제곱으로 곱해지므로, 변을 줄이는 쪽이 겹을 늘리는 것보다 이득이 크다.
ImageNet과 ILSVRC — 딥러닝을 촉발한 무대
깊은 CNN이 실제로 세상을 흔든 사건은 하나의 대회에서 시작됐다. ImageNet은 1400만 장이 넘는 이미지에 사람이 일일이 레이블을 붙인 거대 데이터셋이다. 이 데이터로 매년 열린 이미지 인식 경진대회가 ILSVRC(ImageNet Large Scale Visual Recognition Challenge)다. 참가팀은 1000개 클래스로 이미지를 분류하고, 상위 5개 예측 안에 정답이 없으면 틀린 것으로 세는 top-5 오류율로 순위를 매겼다.
이 대회가 왜 딥러닝을 촉발했는가. 세 조건이 처음으로 한자리에 모였기 때문이다. 첫째, 학습할 것이 충분히 많았다 — 1400만 장은 깊은 네트워크의 수천만 매개변수를 과적합 없이 채울 만한 규모다. 둘째, 그걸 감당할 계산이 준비됐다 — GPU가 행렬곱을 수십 배 빠르게 처리하게 됐다. 셋째, 성능이 공개된 벤치마크로 냉정하게 비교됐다 — 누구의 방법이 몇 퍼센트 나은지가 매년 숫자로 찍혔다. 2012년, 깊은 CNN(AlexNet)이 오류율을 이전 방법 대비 크게 끌어내리며 우승하자, 손으로 특징을 설계하던 컴퓨터 비전의 시대가 사실상 끝났다. 이후 매년 우승 모델은 더 깊어졌고, 오류율은 결국 사람의 인식 수준(약 5%)을 넘어섰다. 우리가 곧 볼 VGG·GoogLeNet·ResNet이 바로 그 계단의 이름들이다.
판단 기준: 딥러닝이 언제 이기는가를 판단할 때 데이터 규모·계산 자원·객관적 벤치마크 세 축을 함께 보라 — 하나라도 없으면 깊은 모델은 실력을 발휘하지 못한다. 함정: “알고리즘만 좋으면 이긴다”는 생각은 ILSVRC의 교훈을 놓친 것이다. 같은 CNN 아이디어가 데이터와 GPU가 갖춰지기 전엔 수십 년간 잠들어 있었다.
VGG — 작은 필터를 우직하게 반복하다
VGG는 앞 절의 “3×3 세 겹” 철학을 가장 순수하게 밀어붙인 아키텍처다. 구조가 놀랍도록 단순하다 — 3×3 합성곱과 2×2 풀링, 오직 이 둘만 규칙적으로 반복한다. 큰 필터도, 특별한 트릭도 없다. 3×3 합성곱을 두세 겹 쌓아 수용 영역을 넓히고, 풀링으로 공간을 절반으로 줄이고, 다시 3×3을 쌓고 — 이 블록을 계속 반복해 16층 혹은 19층까지 깊이를 올린다. 층이 깊어질수록 채널 수는 64, 128, 256, 512로 배씩 늘려, 공간이 줄어드는 만큼 채널이 두꺼워지며 정보량을 유지한다.
VGG의 미덕은 그 단조로움 자체다. 모든 합성곱이 3×3으로 통일돼 있어 설계가 한눈에 읽히고, 어디를 깊게 하고 어디서 채널을 늘릴지가 규칙으로 명확하다. “작은 필터를 우직하게 겹쳐 쌓으면 큰 필터의 시야를 더 싸게 얻는다”는 앞 절의 산수를, 네트워크 전체를 관통하는 설계 원리로 승격시킨 것이 VGG다. 구조가 단순해 다른 과제에 그대로 가져다 쓰기 좋았고, 그래서 오랫동안 특징 추출기의 표준 골격으로 사랑받았다.
판단 기준: 구조를 단순하고 규칙적으로 유지하고 싶다면 필터 크기를 3×3으로 통일하고 깊이와 채널만 조절하라 — 설계 공간이 좁아져 튜닝과 재사용이 쉬워진다. 함정: VGG를 무작정 더 깊게 늘리면 어느 지점부터 학습이 오히려 나빠진다 — 단순 반복만으로는 뒤에 볼 기울기 소실의 벽을 넘지 못한다.
GoogLeNet — 세로로 깊게, 가로로도 넓게
VGG가 층을 세로로만 쌓았다면, GoogLeNet은 한 지점에서 네트워크를 가로로 넓히는 발상을 더했다. 그 단위가 인셉션(Inception) 모듈이다. 같은 입력에 대해 1×1, 3×3, 5×5 합성곱과 풀링을 동시에 적용한 뒤, 그 출력들을 채널 방향으로 이어 붙인다. 왜 여러 크기를 한꺼번에 쓰는가 — 이미지 속 의미 있는 패턴의 크기가 제각각이기 때문이다. 작은 필터는 세밀한 조각을, 큰 필터는 넓은 구조를 잡는다. 어느 크기가 맞을지 미리 정하는 대신, 여러 크기를 나란히 두고 네트워크가 스스로 유용한 것을 골라 쓰게 한다.
문제는 비용이다. 5×5 합성곱을 두꺼운 채널 위에서 그대로 돌리면 매개변수와 연산이 폭발한다. GoogLeNet은 이를 1×1 합성곱으로 푼다. 1×1 필터는 공간적으로는 한 점만 보지만, 채널 방향으로는 전부를 훑어 섞는다 — 즉 각 위치에서 채널들을 선형 결합해 채널 수를 줄이는 병목(bottleneck) 역할을 한다. 예컨대 256채널 입력을 1×1로 64채널로 눌러 놓고 그 위에 5×5를 적용하면, 5×5가 처리할 채널이 4분의 1로 줄어 연산이 극적으로 싸진다. 넓게 펼치되(가로 확장), 그 전에 1×1로 채널을 좁혀 비용을 감당한다 — 이 두 아이디어의 결합이 GoogLeNet을 깊고 넓으면서도 가볍게 만들었다.
판단 기준: 서로 다른 크기의 패턴을 함께 잡고 싶으면 여러 필터 크기를 병렬로 두고, 비용이 문제면 1×1 합성곱으로 채널을 먼저 줄여라 — 가로 확장과 병목은 짝으로 쓴다. 함정: 1×1 합성곱을 “아무것도 안 하는 필터”로 오해하는 것 — 공간은 한 점이지만 채널 차원에서는 완전연결처럼 채널을 섞고 압축하는, 계산 효율의 핵심 장치다.
ResNet — 스킵 연결이 기울기 소실을 푸는 이유
깊이를 밀어붙이면 어느 순간 역설이 나타난다. 층을 더 쌓았는데 학습 오차가 오히려 늘어난다. 표현력이 부족해서가 아니다 — 더 깊은 망은 얕은 망을 포함하니 최소한 같아야 하는데도, 실제로는 학습이 안 된다. 원인은 **기울기 소실(vanishing gradient)**이다. [[5장]]에서 봤듯 역전파는 각 층의 국소 미분을 뒤에서 앞으로 곱해 온다(미분과 연쇄 법칙이 낯설면 먼저 [[수학부록2]]를 보고 오면 좋다). 층이 수십 겹이면 1보다 작은 미분이 수십 번 곱해져, 앞쪽 층에 도달할 즈음 기울기가 0에 가깝게 사그라든다. 앞쪽 층은 학습 신호를 못 받아 사실상 얼어붙는다.
ResNet은 이를 스킵 연결(skip connection) 하나로 푼다. 몇 개 층을 묶은 블록의 출력에, 그 블록의 입력을 그대로 더한다. 블록이 학습하는 변환을 라 하면, 블록의 최종 출력은 가 아니라
가 된다. 입력 가 층들을 건너뛰어(skip) 출력에 지름길로 합류하는 것이다. 이 덧셈 하나가 왜 기울기 소실을 푸는가 — 여기서 [[5장]]의 덧셈 노드 역전파가 정확히 맞물린다. 5장에서 덧셈 노드의 국소 미분은 1이라, 위에서 내려온 미분을 곱하지 않고 두 갈래로 그대로 흘려보낸다고 유도했다. 의 역전파를 그 규칙으로 읽어 보자. 위에서 손실의 미분 가 내려오면, 덧셈 노드는 이것을 두 경로로 그대로 나눈다.
앞 항은 블록 를 거꾸로 통과하며 여러 국소 미분이 곱해진 — 소실될 수 있는 — 경로다. 그런데 뒤 항을 보라. 덧셈 노드가 만든 항등 경로를 따라 가 아무 것에도 곱해지지 않고 로 그대로 앞층에 도달한다. 블록 내부의 미분이 아무리 작아져도, 이 지름길이 기울기의 하한을 떠받쳐 준다. 그래서 수십·수백 층을 쌓아도 앞쪽 층까지 학습 신호가 마르지 않고 흐른다. 순전파에서 하나가 복사되면 역전파에서 합산된다던 5장의 짝 관계가, 여기서는 반대로 “순전파의 덧셈이 역전파의 기울기 분배”로 나타난 것이다 — 같은 덧셈 노드의 성질이 초深 네트워크를 학습 가능하게 만든 열쇠다.
관점을 바꾸면, 블록은 이제 출력 전체를 밑바닥부터 만들 필요가 없다. 입력 는 지름길로 이미 확보돼 있으니, 블록은 입력에 더할 차이(잔차, residual) 만 학습하면 된다. 그래서 이름이 잔차 학습(residual learning)이다. 아무것도 안 바꾸는 게 최선이면 를 0으로 학습하면 되니, 층을 더 쌓아도 최소한 손해는 안 보는 구조가 보장된다. ResNet은 이 스킵 연결로 152층을 학습해 ILSVRC에서 사람의 인식 수준을 넘어섰다.
판단 기준: 아주 깊은 망에서 앞쪽 층이 학습되지 않으면 스킵 연결로 항등 경로를 만들어 기울기가 곱셈을 우회하게 하라 — 덧셈 노드는 미분을 로 그대로 통과시킨다. 함정: 스킵 연결을 “그냥 지름길”로만 이해하면 절반만 본 것이다. 핵심은 순전파의 지름길이 아니라, 그 지름길이 만드는 역전파의 소실 없는 항등 미분 경로에 있다.
숫자로 따라가기 ② — 스킵 연결이 기울기를 살리는 것을 손으로 본다
기울기 소실도, 그것이 풀리는 것도, 숫자로 굴리면 눈으로 보인다. 극단적으로 단순화해 층마다 국소 미분이 딱 0.5씩이라고 하자(1보다 작으니 소실이 일어나는 상황이다). 위 손실에서 흘러 나온 기울기를 1로 잡고, 이것이 10개 층을 거꾸로 통과한다고 보자.
스킵 없는 보통 망. 한 층을 거꾸로 지날 때마다 국소 미분 0.5가 곱해진다. 그러니 10층을 지나면
앞쪽 층에 도달한 기울기는 약 0.001 — 시작값의 1000분의 1이다. 이 값으로 가중치를 갱신하면 사실상 제자리다. 층을 20개로 늘리면 , 거의 0이다. 곱셈이 소실을 만드는 것이 이렇게 눈에 보인다.
스킵 연결이 있는 망. 이제 블록마다 의 항등 경로가 있다. 덧셈 노드는 미분을 로 그대로 통과시키므로, 각 블록의 역전파 미분은 “를 통과한 0.5”와 “지름길로 온 1”이 더해진 값이 된다.
한 블록을 지날 때마다 0.5가 아니라 최소 1은 보장된 채로 흐른다. 10블록을 지나도
이 값이 커지는 것 자체가 중요한 게 아니라(실제로는 정규화가 눌러 준다), 핵심은 곱해지는 인자가 0.5에서 1 이상으로 바뀌었다는 것이다. 지름길의 이 매 층 기울기의 바닥을 1로 떠받쳐, 아무리 곱해도 0으로 사그라들지 않는다. 스킵 없는 쪽이 0.001로 죽는 그 자리에서, 스킵 있는 쪽은 기울기가 살아 앞층까지 도달한다. 종이에 과 두 숫자만 적어 나란히 두면, ResNet이 왜 152층을 학습할 수 있었는지가 한눈에 들어온다.
판단 기준: 깊은 망에서 학습이 멈춘 듯하면 앞쪽 층에 도달하는 기울기 크기를 의심하라 — 층당 국소 미분이 1보다 작으면 그 거듭제곱만큼 신호가 죽는다. 함정: 이 예의 1.5를 문자 그대로 “기울기가 커지니 좋다”로 받아들이는 것 — 요점은 값의 크기가 아니라, 덧셈이 만든 덕에 곱셈의 소실을 우회한다는 데 있다. 실제 망에서는 배치 정규화가 그 크기를 안정 범위로 눌러 준다.
학습을 빠르게 — GPU·분산·연산 정밀도
깊은 망을 학습시키려면 막대한 연산을 감당해야 한다. 그 부담을 세 방향에서 던다. 첫째는 GPU다. 딥러닝 연산의 대부분은 im2col로 펼친 뒤의 거대한 행렬곱이다(7장에서 합성곱을 행렬곱으로 바꾼 그 변환을 떠올리면 된다). GPU는 수천 개의 코어로 이런 대규모 병렬 곱셈에 특화돼 있어, 같은 학습을 CPU 대비 수십 배 빠르게 끝낸다. 밑바닥 구현에서 우리가 루프를 배열 연산으로 접었던 이유가, 하드웨어 층위에서 이렇게 보상받는다.
둘째는 분산 학습이다. 한 GPU로도 며칠 걸리는 학습을, 여러 GPU·여러 대의 기계에 데이터와 연산을 쪼개 나눠 동시에 돌려 시간을 줄인다. 각 일꾼이 자기 몫의 기울기를 계산하고 그것을 모아 파라미터를 갱신하는 식이다. 셋째는 연산 정밀도 낮추기다. 신경망은 놀랍도록 둔감해서, 파라미터를 32비트 부동소수점 대신 16비트로, 때로는 더 낮은 비트로 표현해도 인식 성능이 거의 안 떨어진다. 비트를 줄이면 메모리와 데이터 전송량, 연산량이 함께 줄어 학습과 추론이 빨라진다 — 특히 모바일 기기처럼 자원이 빠듯한 곳에서 값지다.
판단 기준: 학습이 느리면 병목이 연산(→GPU·정밀도 축소)인지 규모(→분산)인지 먼저 가려라 — 잘못된 축을 최적화하면 노력이 헛돈다. 함정: 정밀도를 무작정 낮추면 손실이 미세하게 흔들리다 어느 지점에서 학습이 불안정해진다 — 어디까지 줄여도 되는지는 과제마다 확인해야 하는 경험적 경계다.
딥러닝의 활용 — 분류 너머의 지도
이미지를 한 장씩 분류하는 것은 시작일 뿐이다. 같은 CNN 골격 위에서 딥러닝이 뻗어 나간 방향들을 넓게 조망한다.
**사물 검출(object detection)**은 “이미지에 무엇이 있는가”를 넘어 “그것이 어디에 있는가”까지 답한다. R-CNN 계열은 이미지에서 사물이 있을 법한 후보 영역을 뽑고, 각 영역을 CNN으로 분류해 위치와 종류를 함께 낸다. 분류기를 이미지의 여러 부분에 적용하는 셈이다.
**분할(segmentation)**은 더 촘촘하다. 이미지의 픽셀 하나하나를 어떤 사물에 속하는지로 분류한다. FCN(Fully Convolutional Network)은 신경망을 완전연결 없이 합성곱만으로 구성해, 입력 이미지를 통째로 받아 픽셀별 분류 지도를 한 번에 출력한다. 완전연결을 걷어내 공간 정보를 끝까지 유지한 것이 열쇠다.
**사진 캡션(image captioning)**은 이미지를 보고 그 내용을 문장으로 서술한다. 이미지를 CNN으로 이해하고, 그 특징을 문장을 생성하는 순환 신경망(RNN)에 넘긴다 — 시각과 언어라는 두 양식을 잇는 멀티모달의 초입이다.
생성 쪽으로 가면 더 흥미롭다. **화풍 변환(style transfer)**은 한 사진의 내용에 다른 그림의 화풍을 입혀, 내 사진을 고흐가 그린 듯 바꾼다. 내용을 담은 특징과 화풍을 담은 특징을 분리해 재조합하는 발상이다. 한 걸음 더 나아가 GAN(생성적 적대 신경망)은 진짜 같은 이미지를 아예 처음부터 만들어 낸다 — 이미지를 만드는 생성자와 그 진위를 가리는 판별자를 서로 겨루게 해, 판별자를 속일 만큼 진짜 같은 이미지를 생성자가 학습하게 하는 구조다(이 책은 여기까지를 예고로 남긴다).
마지막으로 강화학습이다. 정답 레이블 대신 행동에 따르는 보상으로 학습한다. DQN은 게임 화면을 CNN으로 읽어 어떤 조작이 미래 보상을 최대화할지를 배워, 사람의 개입 없이 여러 비디오 게임을 사람 수준 이상으로 플레이했다 — 인식을 넘어 스스로 행동을 결정하는 데까지 CNN이 쓰인 것이다.
판단 기준: 새 과제를 만나면 “무엇을 어떤 형태로 출력해야 하는가”부터 정하라 — 한 레이블(분류)인지, 위치까지(검출)인지, 픽셀별(분할)인지, 문장(캡션)인지, 이미지(생성)인지, 행동(강화학습)인지가 골격의 뒷단 설계를 결정한다. 함정: 이 모든 응용이 완전히 다른 기술로 보이지만, 밑에는 우리가 밑바닥부터 세운 합성곱·역전파·경사하강이 그대로 깔려 있다 — 새로워 보이는 것에 겁먹기 전에 익숙한 부품으로 분해해 보라.
전이학습과 데이터 증강 — 실전의 두 지렛대
깊은 망은 수백만 장을 먹어야 실력이 나오는데, 현실의 과제는 대개 그만한 데이터가 없다. 이 간극을 메우는 두 실전 기법이 있다.
**전이학습(transfer learning)**은 ImageNet 같은 대규모 데이터로 이미 학습된 망을 가져와, 내 과제에 맞게 마지막 부분만 다시 학습시키는 것이다. 7장 끝에서 봤듯 CNN의 앞쪽 층은 엣지·질감처럼 어느 이미지에나 통하는 저수준 특징을 잡는다 — 이건 과제가 바뀌어도 대부분 그대로 쓸 만하다. 그래서 앞쪽 층의 학습된 가중치는 얼려 두고(또는 살짝만 조정하고), 과제에 특화된 뒤쪽 분류기만 내 소량 데이터로 학습한다. 처음부터 배우는 대신 남이 오래 배운 것을 물려받으니, 적은 데이터로도 빠르게 높은 정확도에 이른다.
**데이터 증강(data augmentation)**은 가진 이미지를 인위적으로 부풀린다. 한 장을 조금 회전하고, 좌우로 뒤집고, 일부를 잘라 내고, 밝기를 바꾸면 — 사람 눈엔 같은 사물이지만 네트워크엔 새로운 학습 샘플이 된다. “같은 개는 몇 도 돌아가도 개”라는 불변성을 데이터로 주입하는 셈이라, 과적합을 줄이고 일반화를 끌어올린다. 데이터가 부족할수록 이 값싼 뻥튀기의 효과가 크다.
판단 기준: 데이터가 부족하면 처음부터 학습하지 말고 전이학습으로 시작하고, 그 위에 데이터 증강으로 샘플을 불려라 — 이 둘이 소량 데이터 실전의 기본기다. 함정: 데이터 증강을 아무 변형이나 마구 넣으면 오히려 해롭다 — 숫자 6을 180도 뒤집으면 9가 되듯, 과제의 의미를 깨뜨리는 변형은 잘못된 불변성을 가르친다. 변형은 반드시 레이블을 보존하는 것으로 고른다.
밑바닥에서 여기까지 — 책을 닫으며
이제 온 길을 되짚는다. 1장에서 우리의 유일한 무기는 넘파이 배열 하나였다. 원소별 산술과 브로드캐스트, 그게 전부였다. 2장에서 그 배열로 퍼셉트론을 만들어 AND·OR를 가중치의 선택으로 구현하고, XOR에서 단층의 한계를 만나 “층을 쌓으면 표현력이 는다”는 첫 씨앗을 심었다. 3장에서 계단 함수를 매끄러운 활성화 함수로 바꿔 신경망의 순전파를 행렬곱으로 흘려보냈고, 학습된 가중치로 MNIST를 인식했다 — 다만 가중치는 아직 남에게 받은 것이었다.
4장에서 비로소 신경망이 스스로 배우기 시작했다. 손실 함수를 정하고, 그것을 미분해 기울기를 얻고, 기울기의 반대로 내려가자 손실이 줄었다. 하지만 수치 미분은 옳되 느렸다. 5장 — 이 책의 심장 — 에서 오차역전파로 그 병목을 부쉈다. 계산 그래프와 연쇄 법칙으로, 순전파 한 번·역전파 한 번에 모든 기울기를 동시에 얻었다. 곱셈·덧셈 노드에서 시작해 Affine의 전치를 shape로 유도하고 Softmax-with-Loss가 로 떨어지는 것을 확인했던 그 계층들이, 오늘 8장에서 ResNet의 스킵 연결을 이해하는 도구로 그대로 되돌아왔다. 6장에서 그 엔진 위에 옵티마이저·초깃값·배치 정규화·드롭아웃을 얹어 학습을 잘 굴리는 법을 배웠고, 7장에서 형상을 지키는 합성곱과 im2col로 CNN을 세웠다.
그리고 8장, 우리는 그 CNN을 깊게 밀어붙이면 무엇이 이득이고 무엇이 대가인지를 산수로 확인했고, 세상을 바꾼 아키텍처들이 실은 우리가 만든 부품들의 영리한 조립임을 보았다. VGG는 우리가 세운 3×3 합성곱의 반복이고, ResNet의 스킵 연결은 우리가 [[5장]]에서 유도한 덧셈 노드의 역전파다. 어느 것도 마법이 아니었다.
이 책이 준 것은 특정 모델이나 프레임워크 사용법이 아니다. 남이 만든 라이브러리의 fit()을 호출하면 손실이 내려가는 것을, 이제 우리는 그 안에서 무슨 일이 일어나는지 알고 본다. Conv2D 한 줄 뒤에 im2col과 행렬곱이 돌고 있음을, ReLU 뒤에 순전파 마스크로 기울기를 차단하는 backward가 있음을, .backward() 한 번에 연쇄 법칙이 뒤에서 앞으로 미분을 곱해 옴을 안다. 이것이 밑바닥부터 시작한 값이다 — 딥러닝을 블랙박스 없이 이해하는 눈. 앞으로 어떤 새 아키텍처를 만나든, 그것을 두려운 마법이 아니라 익숙한 부품의 새로운 배열로 분해해 볼 수 있다. 그 눈을 손에 쥐었다면, 이 책은 제 할 일을 다 했다.
정리 — 깊이가 연 것과 그 값
- 작은 필터를 여러 겹 쌓으면 큰 필터 한 겹과 같은 수용 영역을(3×3 세 겹 = 7×7 한 겹) 더 적은 매개변수( vs )와 더 많은 비선형성으로 얻는다 — 면 11만 개 대 20만 개로 실제 격차가 찍힌다. “깊게, 작게”가 현대 CNN 설계의 산술적 뿌리다.
- ImageNet·ILSVRC는 대규모 데이터·GPU·객관적 벤치마크 세 조건을 한자리에 모아 딥러닝을 촉발했다. 이후 우승 모델은 매년 깊어져 사람의 인식 수준을 넘어섰다.
- VGG는 3×3 합성곱과 2×2 풀링만 규칙적으로 반복해 단순함으로 깊이를 얻었고, GoogLeNet은 여러 필터 크기를 가로로 병렬(인셉션)하되 1×1 병목으로 비용을 눌렀다.
- ResNet의 스킵 연결 는,
[[5장]]덧셈 노드가 미분을 로 그대로 통과시키는 성질 덕에 기울기가 곱셈을 우회하는 항등 경로를 만든다 — 로 죽던 기울기가 지름길 덕에 살아나, 이것이 초深 네트워크의 기울기 소실을 푸는 열쇠다. - 학습 고속화는 GPU(대규모 행렬곱 병렬화)·분산 학습(연산 분할)·연산 정밀도 축소(비트 줄이기) 세 축으로 이뤄진다.
- 사물 검출(R-CNN)·분할(FCN)·사진 캡션·화풍 변환·GAN·강화학습(DQN)까지, 다양한 응용은 모두 밑바닥의 합성곱·역전파·경사하강 위에 서 있다. 전이학습과 데이터 증강은 데이터가 부족한 실전을 떠받치는 두 지렛대다.
- 1장의 넘파이 배열에서 8장의 초深 CNN까지, 이 책이 남긴 것은 모델이 아니라 딥러닝을 블랙박스 없이 분해해 이해하는 눈이다.