상태: 초안 (2026-10-13), 일부 실측. 4절의 실험은 노트북 CPU(파이썬 3.9, PyTorch 2.8)에서 직접 돌린 값입니다(
code/02_residual.py, 약 7분). 논문 수치는 원문을 열어 조건과 함께 옮겼습니다. 작성 규칙: 실측 데이터가 기본이고, 못 잰 것은 「미실측」으로 표시합니다.
목차
- 1. 깊이의 역설
- 2. 잔차 연결: 차이만 배우게 하라
- 3. 배치 정규화
- 4. 직접 해 보기: 그냥 쌓기 vs 잔차, 정규화 유무
- 5. 논문 수치
- 6. 한계
- 7. 우리 프로젝트와의 연결
- 참고 문헌
1. 깊이의 역설
1편의 AlexNet 은 8층이었습니다. 층을 더 쌓으면 더 복잡한 무늬를 배울 수 있으니 더 좋아져야 할 것 같습니다. 그런데 2015년 He 등은 반대 현상을 보고합니다. 합성곱을 그냥 쌓은 망(plain)에서 ImageNet 검증 top-1 오류(조각 10개 평균)가 이랬습니다.
| 망 | 18층 | 34층 |
|---|---|---|
| 그냥 쌓은 망 | 27.94% | 28.54%(더 나쁨) |
| ResNet(잔차 연결) | 27.88% | 25.03% |
(논문 표 2.) 중요한 점은 34층 plain 이 학습 오류도 18층보다 높았다는 것입니다. 시험에서만 나쁘면 과적합(외우기)이지만, 학습 데이터에서도 나쁘다면 「최적화가 안 되는 것」입니다.
이상한 일입니다. 34층 망은 18층 망을 흉내 낼 수 있습니다. 18층을 그대로 복사하고 나머지 16층을 「입력을 그대로 내보내는 층(항등 함수)」으로 만들면 되니까요. 그러니 깊은 망은 적어도 얕은 망만큼은 해야 합니다. 그런데 경사 하강으로는 그 해를 찾지 못했습니다. 여러 층의 비선형 변환이 정확히 항등 함수가 되도록 가중치를 맞추는 일은 생각보다 어렵습니다.
2. 잔차 연결: 차이만 배우게 하라
ResNet 의 생각은 한 줄입니다. 블록이 출력 H(x) 전체를 배우게 하지 말고, 입력에 더할 차이 F(x) = H(x) − x 만 배우게 합니다.
그냥 쌓은 블록: y = F(x)
잔차 블록: y = x + F(x) (F = 합성곱 두세 층)
이렇게 하면 항등 함수가 쉬워집니다. F 의 가중치를 0 근처로 두기만 하면 y = x 입니다. 깊게 쌓아도 「필요 없는 블록은 아무것도 안 하는」 상태에서 출발할 수 있습니다. 지름길(skip connection)은 계산이 덧셈 하나라서 파라미터도 시간도 거의 더하지 않습니다.
기울기의 흐름
역전파에서 무슨 일이 생기는지 보면 이 설계가 왜 통하는지 더 분명해집니다. 그냥 쌓은 망에서 앞쪽 층의 기울기는 뒤쪽 층들의 미분을 곱해서 얻습니다. 곱하는 값들이 1보다 조금씩 작으면 기울기가 0 으로 사라지고(소실), 조금씩 크면 폭발합니다.
잔차 블록을 L 개 쌓으면 같은 저자들의 후속 논문(Identity Mappings, 2016)이 보인 대로 이렇게 됩니다.
x_L = x_l + Σ_{i=l..L-1} F(x_i)
∂E/∂x_l = ∂E/∂x_L · ( 1 + ∂/∂x_l Σ F(x_i) )
괄호 안의 1 이 핵심입니다. 손실의 기울기 ∂E/∂x_L 이 어떤 가중치도 거치지 않고 앞쪽 층까지 그대로 전달됩니다. 두 번째 항이 미니배치 전체에서 정확히 −1 이 될 가능성은 낮으니, 가중치가 아무리 작아도 기울기가 사라지지 않는다고 논문은 설명합니다. 곱셈의 사슬이 덧셈의 사슬로 바뀐 것입니다.
이 논문은 덧셈 뒤에 활성화 함수를 두지 않는 「사전 활성화」 순서(정규화 → ReLU → 합성곱)로 지름길을 완전히 깨끗하게 만들어, CIFAR-10 에서 1001층 망을 학습해 오류 4.62% 를 냈습니다(미니배치 64, 5회의 중앙값. 미니배치 128 이면 4.92%). 같은 깊이의 원래 순서 ResNet 은 7.61% 였습니다.
3. 배치 정규화
ResNet 의 블록에는 합성곱마다 배치 정규화(Batch Normalization, BN)가 붙습니다. 미니배치 안에서 채널마다 평균을 빼고 표준편차로 나눈 뒤, 학습하는 두 숫자(γ, β)로 다시 늘이고 옮깁니다.
x̂ = (x − 배치평균) / √(배치분산 + ε)
y = γ · x̂ + β
추론 때는 배치 통계 대신 학습 중에 모아 둔 이동 평균을 씁니다.
원래 논문의 설명(2015). Ioffe·Szegedy 는 학습 중에 앞 층의 가중치가 바뀌면 뒤 층이 받는 입력의 분포가 계속 바뀌고(「내부 공변량 이동」), 그래서 학습률을 작게 써야 한다고 보았습니다. 정규화로 분포를 고정하면 큰 학습률을 쓸 수 있다는 것입니다. 효과는 컸습니다. 같은 정확도(검증 72.2%)에 도달하는 데 Inception 은 3,100만 걸음, BN 을 넣은 판은 210만 걸음이 들었습니다(논문의 「14배 적은 걸음」). BN 망 6개 앙상블은 ImageNet 검증 top-5 오류 4.9%, 시험 4.82% 였습니다.
나중 연구의 설명(2018). Santurkar 등은 BN 의 효과가 분포 안정과는 별 관계가 없다고 반박했습니다. BN 층 뒤에 일부러 시간에 따라 바뀌는 잡음을 넣어 분포를 흔들어도 성능이 거의 같았고, BN 이 내부 공변량 이동을 줄이지 않을 수도 있다는 측정도 냈습니다. 대신 BN 이 손실 지형을 매끄럽게 만들어(손실과 기울기의 립시츠 성질 개선) 기울기가 더 믿을 만한 방향을 가리키게 한다는 것을 이론과 실험으로 보였습니다.
「왜 되는가」에 대한 설명이 나중에 바뀐 좋은 예입니다. 실무의 결론은 같습니다. BN 은 큰 학습률과 깊은 망의 학습을 쉽게 해 줍니다. 다만 아래 실험처럼 BN 만으로 깊이 문제가 풀리지는 않습니다.
4. 직접 해 보기: 그냥 쌓기 vs 잔차, 정규화 유무
합성곱 대신 폭 32 의 완전 연결층으로 줄인 장난감 실험입니다. 2차원 점을 두 소용돌이로 가르는 분류 과제(점 512개)를 SGD+모멘텀으로 500걸음 학습했습니다. 망마다 학습률 0.01·0.03·0.1 중 가장 좋은 것을 골랐고(한 학습률로 고정하면 어느 망에 유리한 값을 골랐느냐가 결론을 정하기 때문입니다), 씨앗 3개의 중앙값입니다. 잔차 블록은 두 번째 층 가중치를 0 으로 시작해 처음에는 항등 함수가 되게 했습니다.
| 망 | 깊이 | 시작 순간 첫 층 기울기 | 최종 손실 | 학습 정확도 |
|---|---|---|---|---|
| 그냥 쌓기 | 4 | 3.1×10⁻² | 0.000 | 1.000 |
| 그냥 쌓기 | 16 | 1.2×10⁻² | 0.028 | 0.996 |
| 그냥 쌓기 | 64 | 9.5×10⁻³ | 0.692 | 0.520 |
| 잔차 | 4 | 3.2×10⁻² | 0.000 | 1.000 |
| 잔차 | 16 | 4.1×10⁻² | 0.577 | 0.855 |
| 잔차 | 64 | 3.5×10⁻² | 0.692 | 0.520 |
| 그냥 쌓기 + BN | 4 | 3.4×10⁻¹ | 0.000 | 1.000 |
| 그냥 쌓기 + BN | 16 | 1.4 | 0.000 | 1.000 |
| 그냥 쌓기 + BN | 64 | 1.1×10⁴ | 0.489 | 0.588 |
| 잔차 + BN | 4 | 3.2×10⁻² | 0.000 | 1.000 |
| 잔차 + BN | 16 | 4.1×10⁻² | 0.000 | 1.000 |
| 잔차 + BN | 64 | 3.5×10⁻² | 0.000 | 1.000 |
(실측 2026-10-13, 노트북 CPU. 정확도 0.5 는 동전 던지기 수준. 손실 0.692 ≈ ln 2 는 「아무것도 못 배움」.)
읽는 법입니다.
- 그냥 쌓은 64층은 학습되지 않았습니다. 이 실험에서는 He 초기화 덕분에 기울기가 아주 작아지지는 않았지만(첫 층 기울기 4층의 약 1/3), 그래도 손실이 내려가지 않았습니다. 「기울기 소실」만으로는 설명되지 않는 최적화의 어려움, 곧 1절의 역설입니다.
- BN 을 붙여도 그냥 쌓은 64층은 실패했고, 첫 층 기울기가 1만 배로 폭발했습니다. 깊은 plain 망에서 BN 이 오히려 기울기를 키운다는 것은 이후 이론 연구들이 지적한 현상과 같은 방향입니다(이 글에서는 그 연구를 따로 확인하지 않았습니다).
- 잔차 + BN 은 4·16·64층 모두 정확도 1.000 이었고, 시작 순간 기울기도 깊이와 상관없이 비슷했습니다. 지름길이 기울기의 크기를 깊이와 떼어 놓은 것입니다.
- 정규화 없는 잔차는 16층부터 불안정했습니다. 학습 곡선을 보면 손실이 내려가다가 갑자기 튀어 올라 0.69 에 멈추는 일이 있었습니다(씨앗 0, 학습률 0.03). 지름길로 더해지는 값이 층마다 쌓여 활성값이 커지기 때문으로 보입니다. 실제 ResNet 이 BN 과 함께 쓰이는 이유를 보여 주는 결과입니다.
장난감 실험이라 실제 ImageNet 규모로 일반화할 수는 없습니다. 다만 「깊이 + 지름길 + 정규화」의 역할 분담은 논문과 같은 방향입니다.
5. 논문 수치
| 항목 | 값(논문) | 조건 |
|---|---|---|
| ILSVRC 2015 분류 1위 | top-5 오류 3.57% | ImageNet 시험 서버, 깊이가 다른 6개 모델 앙상블 |
| ResNet-152 한 모델 | top-5 4.49% | 검증셋 |
| 계산량 | ResNet-152 113억 FLOPs, VGG-19 196억 | 곱셈-덧셈 기준 |
| CIFAR-10 | 110층 6.43%(5회 중 최고, 평균 6.61), 1202층 7.93% | 1202층은 학습 오류 0.1% 미만 — 과적합 |
| COCO 검출 | mAP@[.5,.95] 21.2 → 27.2(상대 28%) | Faster R-CNN 의 몸통을 VGG-16 → ResNet-101, COCO 검증셋 |
152층이 VGG-19(19층)보다 계산이 적은 것은 병목 블록 덕분입니다. 1×1 합성곱으로 채널을 줄이고, 3×3 으로 계산한 뒤, 1×1 로 다시 늘립니다. 비싼 3×3 이 적은 채널에서만 돌아갑니다. ResNet-50/101/152 가 이 블록을 씁니다.
마지막 줄은 이 글의 범위를 넘는 의미가 있습니다. 분류용으로 학습한 몸통(backbone)을 검출기에 끼우는 것만으로 검출이 크게 좋아졌습니다. 이후 거의 모든 검출·분할 모델(5·6·8편)이 ResNet 계열 몸통에서 출발합니다.
6. 한계
- 깊이만으로 끝없이 좋아지지는 않는다. CIFAR-10 의 1202층은 110층보다 나빴습니다. 학습은 됐지만(학습 오류 0.1% 미만) 작은 데이터에 비해 망이 너무 컸습니다.
- BN 은 배치에 기댄다. 배치 평균·분산을 쓰므로 배치가 작으면 통계가 흔들립니다. 큰 그림을 써서 GPU 한 장에 몇 장밖에 못 올리는 검출·분할에서 문제가 되고, 그래서 그룹 정규화·층 정규화 같은 대안이 쓰입니다. 7편의 트랜스포머는 층 정규화를 씁니다.
- 추론과 학습의 동작이 다르다. 학습 때는 배치 통계, 추론 때는 이동 평균을 씁니다. 모드 전환을 잊으면 같은 그림에 다른 답이 나옵니다(실무에서 흔한 실수).
7. 우리 프로젝트와의 연결
- 지름길은 이제 어디에나 있습니다. TT Score 공 찾기의 HRNet 계열 몸통도 잔차 블록을 쌓아 만들고, 9–11편의 SAM 이 쓰는 트랜스포머 블록도 「x + 어텐션(x)」, 「x + MLP(x)」 꼴의 잔차 연결입니다.
- 작은 모델에도 의미가 있습니다. 4절 실험처럼 지름길은 깊이와 상관없이 학습을 안정시키므로, 파라미터 150만 개 남짓한 공 찾기 모델도 층을 충분히 쌓을 수 있습니다.
다음 글은 해상도를 지키는 구조, U-Net 과 HRNet 입니다. 공처럼 작은 물체의 위치를 화소 단위로 알아야 할 때 1편의 풀링이 왜 문제가 되는지, 어떻게 피하는지 봅니다.
티티 한마디. 깊은 망한테 「전부 새로 그려」 하지 말고 「고칠 것만 말해」 하니까 64층도 배웠어요. 덧셈 하나의 힘이에요.
참고 문헌
- He, K., Zhang, X., Ren, S., Sun, J. (2016). Deep Residual Learning for Image Recognition. CVPR 2016. https://arxiv.org/abs/1512.03385
- He, K., Zhang, X., Ren, S., Sun, J. (2016). Identity Mappings in Deep Residual Networks. ECCV 2016. https://arxiv.org/abs/1603.05027
- Ioffe, S., Szegedy, C. (2015). Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. ICML 2015. https://arxiv.org/abs/1502.03167
- Santurkar, S., Tsipras, D., Ilyas, A., Madry, A. (2018). How Does Batch Normalization Help Optimization? NeurIPS 2018. https://arxiv.org/abs/1805.11604
- 예제 코드와 출력: 이 폴더의
code/02_residual.py,code/02_residual.out.txt