AI

ResNet 설계 아이디어

essdpt 2026. 1. 20. 17:25

이 글은 2015년 ResNet을 발표했던 'Deep Residual Learning for Image Recognition' 라는 논문의 기초적인 내용을 다루고 있습니다. 

DeepCNN은 이미지 분류에 매우 중요한 돌파구가 되었고, 많은 연구가 진행되었어. 그 과정에서 깊이를 깊게 만들면 Gradient Vanishing/Exploding 문제가 발생할 수 있었고, 그건 Normalized Initialization이나 Batch Normalization 등의 기법으로 어느 정도 해결된 것으로 보여. 이제 약간 더 복잡한 challenging image set에 대해서도 높은 성능의 분류가 가능해진 것 같아. 그러다보니 이제 이런 문제가 떠올랐어. "Optimization이 네트워크 layer 하나 더 쌓는 것만큼 쉬운가?", "layer를 더 쌓는 건 문제가 없는데, 그만큼 optimization이 쉬워진 건가?", "이제 우리는, 최적화를 위해서 계층을 더 쌓기만 하면 되나?" 이게 아닐 수 있다는 실험결과가 나왔어. 20층짜리 네트워크와 56층짜리 네트워크의 error 비교인데, 모든 iteration에서 error가 56층 네트워크가 더 높아서, 이건 overfitting문제도 아니고, 그냥 '깊은 신경망에서의 최적화 실패 문제'라고 판단되는 상황이 나와버린 거야. 그래서 우리는, 모든 신경망이 유사하게 쉬운 난이도로 최적화되는 게 아니라고 결론짓게 되었고, 얕은 신경망과 깊은 신경망을 비교하게 되었어. 얕은 신경망에서, 항등함수 계층만 몇 번 추가해서 깊은 신경망이 되게 만든 거지. 항등함수는 입력값을 그대로 출력해주는 함수를 말하고 "identity(x) = x"라고 표현할 수 있겠지. 이 함수를 추가한 건 해 집합에 아무런 영향을 주지 않으니, 나머지 계층이 모두 얕은 계층과 동일하다는 가정 하에, 동일한 해집합을 가질 수 있고, 적어도 같은 해를 찾아가야만 하는 상황이 된 거야. 근데 여기서 깊은 신경망은 동일한 해를 찾아가지 못했고, 최적의 값으로 수렴하지 못했어. 그래서 여기서 나오는 결론은, '깊은 네트워크에서는 존재하는 해를 찾아가지 못하는 최적화 실패 문제가 발생할 수 있다'인 거지.

Residual Layer가 없던 이전까지의 CNN에서는, '원래 우리가 해당 블록에서 학습하길 바랬던 함수(= the desired underlying mapping)'를 H(x)라 불러. 즉, 기존의 일반적인 CNN에서는 '이 몇 개의 layer block은 입력 x를 받아서 어떤 함수 H(x)로 직접 변환시켜야 한다'고 전제하고 있었어. 다시 말해, [Convolution + ReLU + Convolution + ...]의 전체 stack이 하나의 큰 함수를 근사한다고 보는 거야. H(x)는 'desired underlying mapping', 즉 '우리가 원래 이 블록이 학습하길 바랬던 함수'인 거지. H(x)는 그런 점에서 기존 CNN에서도 이미 존재하던 대상이야. 

근데 ResNet은, block(x)=:H(x)였던 기존 방식을, block(x)=:F(x)+x로 바꾼 거야. 블록이 H(x)를 최적화하던 문제에서, F(x)+x를 최적화하는 문제로 바꾼 거야. 이때, 이 문제에서 실제로 최적화를 통해 만들어야 하는 근사 결과물이 x라고 해보자. 즉, identity mapping 그 자체가 optimal mapping이었다고 가정해보자. 그러면, 사실 "아무것도 안 바꾸는 게 최선"인 상황인 거야. 기존 CNN에서는, 여러 층의 convolution+ReLU가 identity mapping을 근사해야 했고, 이건 오히려 '아무것도 안 하는 게 더 어려운 문제'인 상황이 돼. 여러 가중치가 있고, 여러 비선형 함수가 있는 상황에서는, 그런 게 더 어려운 거지. 근데 Residual 구조에서는? F(x)를 0으로 만들어주면 F(x)+x=x라서 쉬운 문제가 되는 거야. 해당 네트워크가 기본 입력값에서 얼마나 벗어나게 학습을 시키는지만 보면 되는 거지. 이게 '잔차문제'라는 거야. 잔차를 0으로 만드는 거니까. x가 이미 shortcut으로 제공된 시점에서, 기존 CNN보다 우월성이 있는 거지. 아, 그렇다고 물론 F(x)+x를 최적화하는 문제가 F(x)=0을 만드는 문제와 동일하다고 말하는 건 아니야. 어디까지나 극한적 상황에 대한 가정이니까. 단지, F(x)가, '기존의 입력을 얼마나 바꿔서 결과를 만드는지'를 표현하는 함수로 바라보게 되었다는 점이 핵심인 거지. 얼마나 변형시켜야 옳은 모델인지는 상황에 따라 다르긴 하고. 

여기서 오해하면 안 되는 것? Degradation Problem은 전체 손실 자체를 위로 올리는 문제가 아니다. 단지, 깊이가 깊어지면 optimization 난이도가 올라간다는 것이다. flat region이 증가하고, poorly conditioned curvature가 생기고, gradient가 의미없는 방향으로 흐르기 쉬워지고, identity-like 해가 '얇고 찾기 어려운 manifold'로 존재하는 것이다. Identity mapping에서는, 함수공간에 포함관계가 생긴다. 20층과 56층을 다시 비교해보자. 20층이 모두 이전 모델과 동일하고, 나머지 36층은 모두 identity layer라면, 이론적으로 항상 20층 모델의 구성가능한 해를 56층이 무조건 포함하게 된다. 그래서, 이런 경우에 global optimum value 자체가 더 나빠질 이유는 없다. 이건 함수공간 자체가 더 나빠졌다는 뜻인데, 이는 identity mapping의 논리와 정면으로 충돌한다. 절대 아니다. 하지만 실제 실험에서는 training error와 test error가 둘 다 56층이 훨씬 높다. 이 말은, optimizer가 global optimum에 도달하지 못했다는 것으로밖에 해석할 수 없다. 손실함수 자체가 위로 올라간 것이 아닌, 손실함수의 지형이 더 험해진 것이다. Degradation Problem이란, 깊은 네트워크에서도 동일하거나 더 좋은 최솟값이 존재함에도 불구하고, SGD 기반 최적화가 그 지점에 도달하지 못하는 현상을 일컫는 말이다. 

이러한 관점에서 ResNet 논문이 주장하는 바의 핵심은? "shortcut connection을 추가함으로써 loss function의 landscape를 easier to optimize한 상태로 변화시킬 수 있다"이다. shortcut connection을 추가함으로써 같은 objective function을 다른 parameterization에서(= 다른 좌표계에서) 최적화되게 바꾸는 것이다. 그 결과로, optimizer가 바라보는 loss landscape의 모양이 달라지게 된다. (= optimizer가 보는 loss surface가 달라진다.)