yg log --graph --oneline --all

Home Stack Notes AboutRSS

ResNet 논문 리뷰 - 잔차 학습으로 심층 신경망을 살리다

작성 · 9분 읽기 · 조회수 —

들어가며

학부연구생으로 들어간 첫 학기에 랩 세미나에서 발표했던 두 번째 논문이 ResNet이었다. 직전에 SVM을 발표하면서 고전적인 ML에서 딥러닝으로 넘어왔고, 이제 본격적으로 심층 신경망을 다뤄보는 첫 논문이었다. 처음에는 심층 모델은 무조건 좋은 거 아닌가? 라는 막연한 인식이 있었는데, ResNet 논문을 읽으면서 그 인식이 깨졌다. 단순히 층만 쌓으면 오히려 성능이 나빠진다. 그걸 어떻게 해결했는지가 ResNet의 핵심이다.

발표 자료 만들면서 정리했던 흐름을 그대로 블로그에 옮겨본다.

Deep Residual Learning for Image Recognition — Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun (CVPR 2016)


Why ResNet? — 심층 신경망이 왜 필요했나

깊게 쌓는 이유

먼저 “왜 깊게 쌓아야 하는가”부터 짚고 가야 한다. 깊은 신경망은 두 가지 이점이 있다:

  • 계층적 표현(Hierarchical representation) — 저층은 점·선·면 같은 저수준 특징을, 심층은 눈·얼굴·표정 같은 고수준 특징을 학습한다
  • 비선형 활성화 함수의 누적 — 층이 깊을수록 ReLU 같은 비선형성이 여러 번 합성되어 더 복잡한 결정 경계를 만들 수 있다

깊게 쌓을 때의 벽

문제는 깊게 쌓으려고 하면 Vanishing/Exploding Gradient가 발생한다는 것이다. 역전파 과정에서 기울기가 0으로 수렴하거나 지수적으로 폭발해서 학습 자체가 불가능해진다.


이전 모델들의 흐름

한 줄 요약

ResNet 직전까지의 CNN 발전사를 한 줄로 정리하면 이렇다:

LeNet → AlexNet → VGGNet → BN & He init → (그래도 안 됨)

각 모델의 기여

모델 핵심 기여
LeNet 합성곱 연산으로 이미지 분석에 새로운 접근을 열었다
AlexNet sigmoid 대신 ReLU를 도입해 치역이 $(0, 1)$에서 $(0, \infty)$로 바뀌어 Vanishing Gradient를 완화. Local Response Normalization도 함께 도입
VGGNet 필터를 전부 3×3으로 통일하고 “depth matters”를 실험적으로 증명. 7×7 한 번 대신 3×3 세 번이 파라미터 수도 적고($49$ vs $27$) ReLU도 더 많이 쓸 수 있다
BN & He init BN은 입력 분포를 정규화해 Exploding Gradient를 완화하고, He init은 ReLU에 맞춘 가중치 초기화로 깊은 네트워크에서도 활성화 분포가 균일해진다

그래도 남은 문제

이렇게까지 했는데도 30층, 50층 이상으로 가면 새로운 문제가 등장한다. Vanishing/Exploding Gradient는 어느 정도 해결됐는데, 그것과는 다른 종류의 문제다.


Degradation Problem — “왜 더 깊은데 더 못해?”

실험에서 발견된 현상

이 부분이 논문의 가장 중요한 출발점이다. 저자들이 실험에서 발견한 현상은 이렇다:

  • 56층 네트워크가 20층 네트워크보다 training error도 더 높고, test error도 더 높았다
  • 이건 과적합(overfitting)이 아니다. 과적합이면 training error는 낮은데 test error만 높아야 한다. training error부터 높다는 건 모델이 그냥 학습 자체를 못 하는 거다

논문의 핵심 주장

논문에서 정확하게 말한 부분은 이거다:

“There exists a solution by construction to the deeper model: the added layers are identity mapping, and the other layers are copied from the learned shallower model. The existence of this constructed solution indicates that a deeper model should produce no higher training error than its shallower counterpart.”

이 문장을 처음 봤을 때 정확히 무슨 말인지 한참 헤맸다. 풀어서 해석하면 이런 의미다:

얕은 네트워크에 새 층을 추가해서 깊게 만들었다고 하자. 그 추가된 층이 만약 $y = x$ (항등 매핑) 이라면, 깊은 모델은 얕은 모델과 정확히 같은 출력을 낸다. 즉 이론적으로는 깊은 모델이 얕은 모델보다 못할 이유가 없다. 그런데 실제로는 더 못한다. 결론: 옵티마이저가 그 해(solution)를 못 찾고 있다.

그러니까 Degradation은 표현력의 문제가 아니라 최적화의 문제라는 게 저자들의 주장이다.

옵티마이저를 바꾸면 안 되나?

여기서 나는 의문이 하나 들었다. “그러면 SGD 말고 Adam을 쓰면 되는 거 아닌가?” — 알아보니 그렇지 않았다. Adam은 초반 수렴은 빠르지만 일반화 성능에서 SGD가 더 낫다는 게 잘 알려진 사실이다. 실제로 2017년 논문 “Improving Generalization Performance by Switching from Adam to SGD” 에서는 초기엔 Adam, 후반엔 SGD로 갈아타는 방식을 제안한다.


What is ResNet? — 가설과 잔차 학습

항등 매핑이 어려운 이유

그러면 옵티마이저가 항등 매핑을 못 찾는 이유는 뭘까?

일반적인 conv-relu 층 $\text{ReLU}(Wx + b)$로는 $y = x$를 표현하기가 어렵다. ReLU는 음수를 다 0으로 잘라버리기 때문에 입력의 음수 성분이 절대적으로 사라진다. 가중치 초기화만으로는 $y = x$를 정확히 재현할 수 없다.

잔차 학습 아이디어

저자들의 아이디어는 단순하다 — 항등 매핑을 구조적으로 강제하자. 그 결과가 잔차 학습(Residual Learning)이다:

\[H(x) = F(x) + x\]

층이 학습해야 하는 건 출력 $H(x)$ 그 자체가 아니라, 입력 대비 잔차 $F(x) = H(x) - x$ 이다. 만약 항등 매핑이 최적이면 $F(x)$를 0으로 만들기만 하면 된다 — 가중치를 0에 가깝게 학습하면 되니까, 이게 훨씬 쉬운 최적화 문제다.


Residual Structure — 식과 그림

잔차 블록의 수식

수식으로 풀어보면 (편의상 bias는 생략):

\[F(x) = W_2 \cdot \text{ReLU}(W_1 x)\] \[H(x) = \text{ReLU}(F(x, W_i) + x)\]

입력과 출력의 차원이 다르면 $x$ 쪽에 선형 사영 $W_s$를 곱해서 차원을 맞춰준다:

\[H(x) = \text{ReLU}(F(x, W_i) + W_s x)\]

이 식은 FCL 기준으로 적었지만 conv 층에도 그대로 적용된다.

Residual Structure - 잔차 블록의 기본 구조

마지막 ReLU는 항등 매핑을 깨지 않나?

여기서 한 가지 의문점이 들었다. 마지막에 ReLU를 또 씌우면 항등 매핑이 깨지지 않나? 맞는 지적이다. 논문 초반 가설이 “추가된 층이 $y = x$라면 성능 저하가 없다”인데, $\text{ReLU}(z_2 + x)$로는 best case인 $y = x$를 정확히 표현할 수 없다.

이 약점은 후속 논문 “Identity Mappings in Deep Residual Networks” (2016)에서 지적되었고, 거기서는 구조를 바꿔서 해결한다:

\[y = \text{ReLU}(\mathcal{F}(x) + x) \;\;\to\;\; y = x + \mathcal{F}(\text{BN}(\text{ReLU}(x)))\]

발표 때 받았던 질문 중 하나가 이 부분이었는데, 후속 논문까지 같이 봐두는 게 좋다.


Residual Block — Basic vs Bottleneck

블록은 두 가지 종류가 있다:

Basic block (ResNet-18, 34)

\[z_1 = \text{ReLU}(\text{Conv}_1 x)\] \[z_2 = \text{ReLU}(\text{BN}_2 \text{Conv}_2(z_1))\] \[y = \text{ReLU}(z_2 + x)\]

Bottleneck block (ResNet-50, 101, 152)

$1 \times 1$ conv로 채널을 줄였다가, $3 \times 3$ conv를 한 다음, 다시 $1 \times 1$ conv로 채널을 늘리는 구조. 파라미터를 줄이면서도 표현력을 유지하기 위한 트릭이다.

Residual Block - Basic block과 Bottleneck block 비교


Network Architectures — 왜 첫 층이 7×7인가

ResNet은 18, 34, 50, 101, 152층 버전이 있다. 모든 버전이 공통적으로 첫 번째 conv 층만 7×7이고 나머지는 다 3×3이다. 처음에는 이게 이상했다. VGGNet에서 3×3이 더 효율적이라고 했는데 왜 첫 층만 7×7로 쓸까?

세 가지 이유가 있다.

1. 짝수 커널의 구조적 문제 회피

7은 홀수다. 6×6이나 8×8 같은 짝수 커널은 연산의 중심점이 모호해서 공간 정보가 왜곡될 수 있다. 홀수 커널은 명확한 중심점이 있어 대칭적인 연산이 가능하고, Same Padding 시 패딩 개수가 소수점 없이 깔끔하게 계산된다.

2. 넓은 수용 영역(Receptive Field) 확보

7×7은 3×3보다 한 번에 훨씬 넓은 영역을 본다. 네트워크 초기 단계에서 이미지의 전반적인 형태·질감·색상 분포 같은 일반적인 맥락을 잡아야 과적합도 막을 수 있다. 9×9, 11×11은 파라미터 대비 성능 증가가 미미하고, 5×5는 영역이 좁아서 7×7이 절충점이다.

3. 첫 conv 연산의 파라미터 효율

이게 가장 결정적이다. RGB 입력은 $224 \times 224 \times 3$이라 채널이 3개뿐이다. 첫 conv의 파라미터 수는 $7 \times 7 \times 3 \times 64 = 9408$로 적다. 반면 만약 중간 층에서 같은 7×7을 쓴다면 입력 채널이 64라서 $7 \times 7 \times 64 \times 64 = 200704$ 개가 된다 — 약 21배 차이. 첫 층은 채널이 적기 때문에 큰 필터를 부담 없이 쓸 수 있는 거다.

위치 입력 채널 파라미터 수
첫 conv (7×7) 3 $7 \times 7 \times 3 \times 64 = 9408$
중간 conv (7×7 가정) 64 $7 \times 7 \times 64 \times 64 = 200704$

Down Sizing — Shortcut의 세 가지 옵션

Residual block에서 입력과 출력의 차원이 다르면(특히 다운샘플링 시) shortcut $x$의 차원을 어떻게 맞출지 결정해야 한다. 논문은 세 가지 옵션을 비교한다:

항목 A B C
Shortcut conv X 다운사이징 시 1×1 항상 1×1
공간 축소 방법 stride=2 Avg Pool 또는 subsample 1×1 Conv with stride=2 1×1 Conv with stride=2
추가 파라미터 없음 다운사이징 projection에서만 모든 블록에서
계산량 매우 작음 적절 매우 큼
성능 실용적, 손해 있음 정확함, 효율 균형 약간 더 나음, 효율 떨어짐

논문에서는 B를 기본으로 채택했다. 50층 이상의 깊은 네트워크에서는 B 옵션이 사용된다.


Avg Pooling + 1000-FCL + Softmax

마지막 단계는 다음과 같다:

  • 마지막 feature map $7 \times 7 \times 2048$에 Average Pooling을 수행하면 각 채널의 전체 평균값 1개만 남는다 → $1 \times 1 \times 2048$
  • Edge나 pattern을 추출하기 위한 Max Pooling보다, 일반화 성능을 위해 Avg Pooling을 사용한다
  • Flatten 없이도 공간 축소와 채널 유지가 한 번에 된다
  • $2048$ → $1000$ (ImageNet 클래스 수) FCL → Softmax로 확률값 출력

Implementation 세부 사항

논문에서 명시한 학습 설정:

  1. 짧은 변을 $(256, 480)$ 사이 무작위 크기로 리사이즈 (aspect ratio 유지)
  2. $224 \times 224$로 crop, 좌우 반전, 평균값 제거
  3. 모든 conv 이후 BN 수행
  4. He 초기화로 conv 필터 초기화
  5. 옵티마이저는 SGD (Adam이 아님 — 일반화 성능 때문)

실험 결과 — Plain vs ResNet

핵심 그래프

논문의 핵심 실험 그래프다:

Plain Network vs ResNet on ImageNet (18-layer vs 34-layer)

Plain Network 쪽 (왼쪽 가설): plain-34가 plain-18보다 training error도 test error도 더 높다. Degradation 현상이 명확히 관찰된다.

ResNet 쪽 (오른쪽 가설): ResNet-34가 ResNet-18보다 두 error 모두 더 낮다. 잔차 학습 도입만으로 깊이의 이점이 살아난다.

ImageNet 분류 결과 (top-5 error)

모델 top-5 error
VGG-16 9.33%
GoogLeNet 9.15%
plain-34 10.02%
ResNet-34 B 7.46%
ResNet-50 6.71%
ResNet-101 6.05%
ResNet-152 5.71% ← VGG-16보다 8배 깊지만 복잡도는 더 낮음

152층이 1위인데 VGG-16(16층)보다 더 가벼운 모델이라는 게 진짜 인상적이다.


헷갈리기 쉬운 포인트

발표 준비하면서, 그리고 발표 후 Q&A에서 헷갈렸던 부분들을 정리해둔다.

1. “Vanishing Gradient랑 Degradation이 같은 거 아닌가?”

다르다. Vanishing/Exploding은 기울기가 0으로 수렴하거나 폭발해서 학습 자체가 안 되는 문제다. BN과 He init으로 어느 정도 해결됐다. Degradation은 그것과는 별개로, 학습은 되는데 깊을수록 더 못하는 현상이다. ResNet이 해결한 건 후자다.

2. “Degradation이 과적합 아니라는 걸 어떻게 확신해?”

과적합이면 training error가 낮아야 한다. 그런데 plain-56은 training error부터 plain-20보다 높다. 모델이 학습 데이터조차 제대로 못 외운다는 뜻이라 과적합이 아니다.

3. “$y = x + F(x)$에서 마지막 ReLU 때문에 진짜 $y = x$가 안 되는데, 그래도 효과가 있는 이유는?”

ReLU($z + x$)는 $y = x$를 정확히 표현하지는 못하지만, $F(x)$를 0에 가깝게 학습하면 $y \approx \text{ReLU}(x)$ ≈ $x$ (음수 성분 제외) 정도는 된다. 완벽한 항등은 아니지만, 일반 conv-relu보다는 항등 매핑에 훨씬 가깝게 갈 수 있다. 후속 논문에서 완벽한 항등 매핑 구조로 개선했다.

4. “Bottleneck block은 왜 깊은 모델에서만 쓰나?”

파라미터 수와 계산량의 trade-off다. ResNet-50 이상은 층 수가 많아 모든 블록을 basic으로 쓰면 파라미터가 폭발한다. 1×1 conv로 채널을 일시적으로 줄여서 3×3 연산의 비용을 낮추고 다시 복원하는 게 bottleneck의 아이디어다. ResNet-18, 34는 깊이가 적당해서 basic block으로 충분하다.

5. “ResNet은 왜 첫 conv에서만 stride=2를 쓰고 maxpool도 또 쓰지?”

$7 \times 7$ stride=2 conv 한 번으로 $224 \to 112$, $3 \times 3$ maxpool stride=2로 $112 \to 56$. 즉 두 단계로 빠르게 다운샘플링을 한다. 입력 해상도가 워낙 크니까 초반에 빠르게 줄여서 이후 연산량을 감당 가능하게 만든 것이다.


정리하며

ResNet의 핵심 통찰은 한 줄로 정리된다 — “깊은 신경망에서 학습이 안 되는 게 표현력 부족 때문이 아니라 최적화 실패 때문이라면, 항등 매핑을 구조적으로 보장해주자.”

이걸 $H(x) = F(x) + x$라는 단순한 식 하나로 구현했고, 결과적으로 152층까지 학습이 가능해졌다. 그리고 이 아이디어는 단순히 이미지 분류에 그치지 않고, 잔차 학습 원리 자체가 다른 심층 모델(객체 탐지, 분할, NLP의 Transformer 등)에도 일반적인 학습 구조로 적용되는 길을 열었다.

지금 내가 보는 ST-GCN의 backbone 안에도 결국 residual connection이 들어가 있다. 모든 깊은 신경망의 근간이 된 논문이라는 말이 과장이 아니다.


참고

  • He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep Residual Learning for Image Recognition. CVPR.
  • He, K., et al. (2016). Identity Mappings in Deep Residual Networks. ECCV. — 후속 논문, ReLU 위치 개선
  • Keskar, N. S., & Socher, R. (2017). Improving Generalization Performance by Switching from Adam to SGD. — 옵티마이저 선택의 근거
  • 본 글의 발표 슬라이드: lab-seminar-2025 / 02_ResNet.pdf