TT Lab
요금제

한국어

시작하기
블로그

블로그

ResNet: 잔차 연결이 깊은 망을 학습 가능하게 만든 이유와 배치 정규화

상태: 초안 (2026-10-13), 일부 실측. 4절의 실험은 노트북 CPU(파이썬 3.9, PyTorch 2.8)에서 직접 돌린 값입니다(code/02_residual.py, 약 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. 잔차 연결: 차이만 배우게 하라

그냥 쌓기 vs 잔차 연결 그냥 쌓은 블록 층(가중치 W₁) 층(가중치 W₂) y = F(x) 기울기는 W₂, W₁ 을 차례로 곱하며 지나가야 한다 잔차 블록 층(가중치 W₁) 층(가중치 W₂) + 지름길 (항등) y = x + F(x) ∂y/∂x = 1 + ∂F/∂x 「1」 덕분에 기울기가 지름길로 그대로 내려간다 F 가 0 이면 블록은 아무것도 안 하는 항등 함수다. 깊게 쌓아도 「적어도 얕은 망만큼」에서 출발한다.
그림: 그냥 쌓은 블록과 잔차 블록의 비교. 잔차 블록은 입력을 출력에 더하는 지름길이 있다

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 는 「아무것도 못 배움」.)

읽는 법입니다.

장난감 실험이라 실제 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. 한계

7. 우리 프로젝트와의 연결

다음 글은 해상도를 지키는 구조, U-Net 과 HRNet 입니다. 공처럼 작은 물체의 위치를 화소 단위로 알아야 할 때 1편의 풀링이 왜 문제가 되는지, 어떻게 피하는지 봅니다.

티티 한마디. 깊은 망한테 「전부 새로 그려」 하지 말고 「고칠 것만 말해」 하니까 64층도 배웠어요. 덧셈 하나의 힘이에요.

참고 문헌

로그인하면 좋아요를 누를 수 있습니다

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다