-
ResNet(Residual Network)의 깊이 있는 이해AI 2026. 2. 5. 07:25
딥러닝에서 층(Layer)이 깊어지면 더 복잡한 특성을 학습할 수 있다고 기대하지만, 실제로는 Degradation Problem(성능 저하 문제)이 발생합니다. 이는 Overfitting 때문이 아니라, 네트워크가 너무 깊어지면서 최적화(Optimization)가 어려워지기 때문입니다.
ResNet은 2015년 CVPR에서 발표된 "Deep Residual Learning for Image Recognition" 논문을 통해 이 문제를 해결하며, 152층이라는 파격적인 깊이로 ILSVRC 우승을 차지했습니다.
깊어질수록 멍청해지는 모델?: The Degradation Problem
딥러닝의 상식으로는 층이 깊어질수록 모델의 표현력(Representational Power)이 좋아져서 성능이 올라가야 합니다. 하지만 실제 실험 결과, 일정 깊이를 넘어서면 정확도가 포화(Saturate)되다가 급격히 떨어지는 현상이 발견되었습니다. 이를 Degradation Problem(성능 저하 문제)이라고 부릅니다.
과적합(Overfitting)과의 결정적 차이
가장 많이 오해하는 부분입니다. 하지만 Degradation은 과적합과는 원인이 완전히 다릅니다.
- Overfitting: 훈련 데이터(Train)는 너무 잘 맞추는데, 테스트 데이터(Test)에서만 성능이 떨어지는 현상. (모델이 너무 똑똑해서 정답을 외워버림)
- Degradation: 훈련 데이터(Train)조차 제대로 학습하지 못해 성능이 떨어지는 현상. 즉, 모델이 너무 공부를 못해서 기초적인 문제도 못 푸는 상태가 되는 것입니다.
왜 이런 문제가 발생할까? (Optimization Difficulty)
이론적으로는 층이 깊어질수록 얕은 모델보다 성능이 나쁠 수가 없습니다. 왜냐하면, 깊은 모델의 앞부분을 얕은 모델과 똑같이 만들고, 뒷부분 레이어들을 항등 함수(Identity Mapping, 입력 그대로를 출력)로만 채워도 최소한 얕은 모델만큼의 성능은 나와야 하기 때문입니다.
하지만 실제 학습(Optimization) 과정에서는 다음 두 가지 문제로 인해 '항등 함수'조차 학습하지 못합니다.
- 기울기 저하(Degration problem): 순전파과정에서 정보의 손실이 있어서, 역전파에서 제대로된 기울기를 구할수 없다.나쁜 정보 전달($F$) → 나쁜 피드백(Bad Gradient)"의 악순환.
- 기울기 소실/폭주 (Vanishing/Exploding Gradients): 층이 너무 깊어지면 역전파되는 미분값이 앞쪽으로 오면서 너무 작아지거나 너무 커져서, 앞쪽 레이어의 가중치가 제대로 업데이트되지 않습니다. 활성화 함수($ReLU$), 배치 정규화($BN$), 가중치 초기화($He$)로 상당 부분 해결 가능.
- 복잡한 매핑의 한계: 수많은 비선형 레이어(ReLU 등)를 통과하면서 데이터의 원본 정보가 왜곡됩니다. 모델 입장에서는 "아무것도 하지 말고 원본을 그대로 전달해($H(x)=x$)"라는 명령조차 수행하기 벅찬 복잡한 연산이 되어버리는 것입니다.
실험 결과가 증명하는 문제
ResNet 논문(2015)에서 제시한 위 그래프를 보면 충격적입니다.
- 20층 모델보다 56층 모델의 에러율이 훈련(Train)과 테스트(Test) 모두에서 높게 나타납니다.
- 이는 레이어가 깊어질수록 우리가 가진 최적화 도구(SGD 등)로 모델을 학습시키는 데 한계가 왔음을 극명하게 보여줍니다.
핵심 아이디어: Residual Learning (잔차 학습)
기존 신경망이 입력 $x$를 받아 직접적인 출력 $H(x)$를 학습하려 했다면, ResNet은 "잔차(Residual)를 학습하자"는 발상의 전환을 제안합니다.
그러니까, 차이가 없는것은 안배우고, 차이가 있는것만 배우겠다라는 뜻입니다. 즉 정보를 강화하는 역할입니다.
우리가 학습하고자 하는 최적의 함수를 $H(x)$라고 합시다.
- 기존 방식: $H(x)$를 직접 학습.
- ResNet 방식: $H(x) = F(x) + x$라고 가정하고, $F(x) := H(x) - x$를 학습.
여기서 $F(x)$를 잔차(Residual)라고 부릅니다. 결과적으로 출력은 잔차에 입력값 $x$를 더한 형태가 되며, 이를 Skip Connection 또는 Shortcut Connection이라고 합니다.

깊게 들어가는 '잔차(Residual)'의 정체
왜 이름이 '잔차' 학습일까요? 그리고 왜 $F(x)$를 배우는 것이 $H(x)$를 배우는 것보다 압도적으로 유리할까요?
잔차(Residual)'란 통계학에서 예측값과 실제값의 차이를 의미합니다. ResNet에서도 같은 논리가 적용됩니다.
- 우리가 최종적으로 얻고 싶은 최적의 결과(정답)를 $H(x)$라고 합시다.
- 현재 우리가 이미 가지고 있는 입력값은 $x$입니다.
- 이때, 정답에 도달하기 위해 현재 값($x$)에서 더 수정해야 할 차이인 $H(x) - x$를 $F(x)$라고 정의합니다.
- 결국 모델은 "정답($H(x)$)을 처음부터 만드는 게 아니라, 현재 값에서 부족한 나머지($F(x)$)만 채우는 법"을 배우게 됩니다.
공식: $F(x) = H(x) - x$ $\rightarrow$ $H(x) = F(x) + x$
왜 $F(x)$를 학습하는 게 더 쉬울까?
앞서 언급한 Degradation Problem의 핵심은 "아무것도 안 하는 항등 함수($H(x)=x$)를 만드는 것조차 어렵다"는 것이었습니다.
- 기존 방식: $H(x)$가 $x$와 똑같아지려면, 수많은 레이어의 가중치($W$)를 아주 정교하게 조정해서 입력이 출력까지 왜곡 없이 도달하게 해야 합니다. 이는 마치 진흙으로 정교한 복제본을 빚는 것만큼 어렵습니다.
- ResNet 방식: $H(x) = F(x) + x$ 구조에서는 $F(x)$만 0으로 만들면 자동으로 $H(x) = x$가 됩니다. 딥러닝에서 가중치를 0으로 만드는 것은 매우 쉽습니다. 즉, "아무것도 안 할 거면 그냥 0을 더해!"라는 기본 옵션을 깔아준 셈입니다.
기울기(Gradient)의 고속도로: Skip Connection
잔차 학습의 마법은 학습(역전파) 단계에서 빛을 발합니다. 출력값을 미분해 보면 그 이유가 명확해집니다.
$$\frac{\partial (F(x) + x)}{\partial x} = \frac{\partial F(x)}{\partial x} + 1$$
여기서 핵심은 뒤에 붙은 $+1$ 입니다.
기존 방식에서는 층을 거칠수록 미분값이 계속 곱해져서 0에 수렴(Gradient Vanishing)해버리지만, ResNet은 잔차의 미분값이 아무리 작아져도 최소한 1이라는 값이 살아남아 앞쪽 레이어까지 학습 신호를 강력하게 전달합니다.
Residual Connection
잔차 연결($F(x) + x$)을 하려면 수학적으로 $F(x)$와 $x$의 텐서 크기(차원)가 반드시 같아야 합니다. 하지만 네트워크가 깊어지는 과정에서 채널 수를 늘리거나 이미지 크기를 줄여야 할 때가 있죠. 이때 ResNet이 사용하는 두 가지 전략을 정리해 드립니다.
동일한 차원 간의 연결 (Identity Shortcut)
가장 기본이 되는 연결입니다. 입력 $x$와 출력 $F(x)$의 가로, 세로(Feature Map Size) 및 채널 수(Depth)가 완벽히 일치할 때 사용합니다.
- 특징: 어떠한 추가 연산이나 파라미터가 필요 없습니다. 그냥 있는 그대로의 $x$를 더해줍니다.
- 장점: 파라미터가 0개이며, 연산량도 거의 늘어나지 않습니다. 모델이 무거워지지 않으면서 깊게 쌓을 수 있는 비결입니다.
서로 다른 차원 간의 연결 (Projection Shortcut)
네트워크의 중간중간, 특징을 더 많이 뽑기 위해 채널 수를 2배로 늘리거나(예: 64 $\rightarrow$ 128), 연산 효율을 위해 가로·세로 크기를 절반으로 줄일 때(Stride=2 사용) 발생합니다. 이때는 단순 더하기가 불가능하므로 $x$의 모양을 $F(x)$에 맞춰주는 작업이 필요합니다.
논문에서는 이를 해결하기 위해 $1 \times 1$ Convolution을 사용하며, 이를 Projection Shortcut이라고 부릅니다.
원본 x의가 채널(차원)64, 가로세로(공간크기) 32 x 32 이라면, 어떻게 차원을 맞추나?
- 채널 수가 다를 때
- $1 \times 1$ Conv를 사용해 $x$의 채널 수를 $F(x)$와 똑같이 맞춰줍니다.
- 필터(Filter)의 개수를 128개로 설정
- 공간 크기(가로·세로)가 다를 때
- $F(x)$ 에서 공간축소가 일어났다면 똑같이 맞추어 줍니다.
- Stride=2를 주어서 $1 \times 1$ Conv를 사용하여 $x$의 크기를 절반으로 줄여줍니다.
이를 수식으로 표현하면 아래와 같습니다.
$$y = F(x, \{W_i\}) + W_sx$$
- $F(x, \{W_i\})$: 가중치 층을 통과하며 변형된 데이터입니다. (예: 채널이 64에서 128로 늘어남)
- $x$: 아무것도 거치지 않고 넘어온 원본 입력입니다. (여전히 채널이 64임)
- $W_s$: 여기서 $W_s$는 단순한 상수가 아니라 선형 변환 행렬(Linear Transformation Matrix)입니다.
$$W_s=(n+k)\times n$$
이 수식은 선형대수학의 행렬 곱셈 규칙인 $(M \times N) \times (N \times 1) = (M \times 1)$ 원리를 따릅니다.
$(\text{변환 행렬}) \times (\text{입력 데이터}) = (\text{변환된 데이터})$
64차원을 128로 바꾸고 싶으면
- $N$ (입력 차원): 현재 가지고 있는 데이터 $x$의 차원인 64입니다.
- $M$ (목표 차원): 최종적으로 맞추고 싶은 차원인 128입니다
- 결과: $(128 \times 64) \times (64 \times 1) = (128 \times 1)$
$n$과 $k$를 사용한 수식으로 정리하면
- $n$: 입력 $x$의 원래 차원(채널 수)입니다. 64
- $k$: 증가시키고 싶은 차원의 양입니다. 128 - 64 = 64
- $(n+k)$: 최종적으로 맞춰야 할 목표 차원($F(x)$의 채널 수)입니다. 128
Stride=2가 포함된 최종 모습
여기에 만약 공간 축소(Stride=2)까지 수식에 억지로 반영해본다면, 결과물인 $y$의 좌표 $(i, j)$는 원본의 $(2i, 2j)$ 좌표 값을 가져오게 됩니다.
$$[W_s x]_{(i, j)} = W_s \times x_{(2i, 2j)}$$- 왼쪽 ($i, j$): 결과물(16x16)의 좌표
- 오른쪽 ($2i, 2j$): 원본(32x32)에서 두 칸씩 건너뛰며 가져오는 좌표
연산 효율의 끝판왕: Bottleneck Layer
ResNet-50 이상의 깊은 모델에서 일반적인 $3 \times 3 \to 3 \times 3$ 구조를 그대로 쓰면 연산량이 기하급수적으로 폭발합니다. 이를 해결하기 위해 채널을 조였다가 푸는 '병목(Bottleneck)' 구조가 도입되었습니다.
왜 굳이 3번으로 나눠서 연산할까?
핵심은 "$3 \times 3$ 연산을 수행할 때 채널 수를 미리 줄여놓는 것"입니다.
단계 연산 역할 채널 변화 (예시: 256) Step 1 $1 \times 1$ Conv Dimension Reduction (압축) $256 \to 64$ Step 2 $3 \times 3$ Conv Spatial Feature Extraction (학습) $64 \to 64$ Step 3 $1 \times 1$ Conv Dimension Restoration (복구) $64 \to 256$ - Step1: $1 \times 1$ Conv: 정보의 농충, 다이이트 그 이상의 전략
단순히 몸집을 줄이는 것을 넘어, 뒤에 올 고강도 연산을 위해 데이터를 '정제'하는 아주 중요한 단계입니다.- 역할: 채널 압축 (Dimension Reduction) 및 정보 요약
- 방법: 입력 채널(예: 256)보다 훨씬 적은 수의 필터(예: 64)를 사용하여 $1 \times 1$ 연산을 수행합니다.
- 왜 하필 $1 \times 1$인가? 공간 정보 보존: 가로·세로 크기를 건드리지 않고 오직 '깊이(채널)' 방향으로만 연산하므로, 이미지의 위치 정보는 그대로 둔 채 특징들만 골라낼 수 있습니다.
- 최소 비용 최대 효율: $3 \times 3$ 필터에 비해 파라미터 수가 1/9 수준입니다. 가장 적은 연산량으로 채널을 조절할 수 있는 최적의 도구입니다.
- 핵심 설계 의도 (정보의 증류): 단순히 채널을 버리는 게 아닙니다. 256개의 특징 중 서로 관련 있는 정보들을 선형 결합(Linear Combination)하여 64개의 핵심 특징으로 '압축'하는 것입니다.
- 이 과정에서 불필요한 노이즈는 걸러지고, 다음 층에서 유의미하게 쓰일 핵심 정보만 농축됩니다.
- 비유: 원두를 에스프레소로 추출하는 과정
- 256g의 방대한 원두(원본 데이터)를 그대로 씹어 먹으려면(3x3 연산) 턱이 너무 아픕니다.
- Step 1은 이 원두에서 가장 맛있는 성분만 뽑아내어 진한 에스프레소 한 잔(64채널)으로 농축하는 과정입니다. 양은 줄었지만, 핵심적인 향과 맛(정보)은 그대로 담겨 있습니다.
- Step2: $3 \times 3$ Conv : "가벼워진 몸으로 수행하는 핵심 훈련"
- 역할: 실질적인 특징 추출(Feature Extraction) 공간 연산을 수행합니다.
- 왜 $3 \times 3$인가? $1 \times 1$은 자기 자리만 보지만, $3 \times 3$은 주변 픽셀들을 함께 보며 선, 모양, 질감 같은 '공간 정보'를 파악합니다.
- 핵심 효율성: 만약 256채널에서 $3 \times 3$ 연산을 했다면 연산량이 어마어마했겠지만, 64채널로 줄어든 상태이기에 연산 부담이 1/4 이하로 줄어듭니다.덕분에 모델은 똑같은 연산 자원으로 더 핵심적인 공간 특징만 쏙쏙 뽑아낼 수 있게 됩니다.
- 비유: 몸무게를 100kg에서 60kg로 줄인 운동선수가 훨씬 민첩하게 기술 훈련을 소화하는 것과 같습니다
- Step3: $1 \times 1$ Conv : "훈련된 결과를 더 넓은 세상으로 복구"
핵심 특징을 다 뽑았다면, 이제 다시 원래의 모습(혹은 더 큰 모습)으로 되돌려 놓을 차례입니다.- 역할: 채널 확장(Dimension Restoration).
- 방법: $1 \times 1$ 필터를 다시 256개(혹은 그 이상)로 늘려서 연산합니다.
- 왜 다시 늘리나요?
- 잔차 연결(Shortcut) 때문: 지름길로 넘어온 원본 $x$가 256채널이라면, 더하기($+$)를 하기 위해 $F(x)$의 결과도 256채널이어야 합니다.
- 정보의 풍부함: 줄여놓았던 특징들을 다시 넓게 펼치면서, 뽑아낸 정보들을 조합해 더 풍부하고 고차원적인 정보를 생성합니다.
- 비유: 고강도 훈련을 마친 선수가 경기장에 나설 때, 다시 당당하게 어깨를 펴고(채널 확장) 원래의 포지션으로 복귀하는 과정입니다.
ResNet 모델구조
레즈넷(ResNet)의 전체 구조를 뜯어보면, 단순히 잔차 블록(Residual Block)을 무작정 쌓은 것이 아니라 '입력 줄기(Stem)'로 시작해서 '4개의 스테이지(Stage)'로 이어지는 체계적인 설계를 가지고 있습니다.

입력 줄기 (Input Stem): "거대한 정보를 정제하는 입구"
이미지 데이터가 모델에 처음 들어오면, 가장 먼저 만나는 층입니다. 원본 이미지(보통 224x224)는 너무 크고 채널은 3개(RGB)뿐이라서, 초반에 해상도는 확 줄이고 특징은 뽑아내는 '전처리'가 필요합니다.
- 구성 요소: $7 \times 7$ Convolution ($Stride=2$), BatchNorm, ReLU, $3 \times 3$ Max Pooling ($Stride=2$).
- 역할: $7 \times 7$의 넓은 시야로 이미지의 굵직한 특징을 훑습니다.
- 두 번의 $Stride=2$ 연산을 거치며 입력 이미지 크기를 1/4로 압축합니다 (224 $\rightarrow$ 56).
- 결과: (3, 224, 224)의 이미지가 (64, 56, 56)의 특징 맵(Feature Map)으로 변신하여 스테이지로 전달됩니다.
스테이지 (Stages): "추상화가 깊어지는 4단계 과정"
레즈넷은 보통 4개의 스테이지로 구성됩니다. 각 스테이지는 여러 개의 Residual Block이 모여 있으며, 뒤로 갈수록 "더 좁게 보지만 더 깊게 이해하는" 과정입니다.
스테이지 해상도 (공간 크기) 채널 수 (깊이) 주요 역할 Stage 1 56 x 56 64 (또는 256) 기본적인 선과 색감 파악 Stage 2 28 x 28 128 (또는 512) 복잡한 텍스처와 패턴 학습 Stage 3 14 x 14 256 (또는 1024) 물체의 부분적인 형태(눈, 코 등) 인지 Stage 4 7 x 7 512 (또는 2048) 물체의 전체적인 형체 및 정체 파악 Bottleneck 구조(ResNet-50 이상) 기준 수치입니다.
스테이지 전이의 핵심 (Projection Shortcut의 위치)
여기서 우리가 이전에 공부한 $W_s$가 등장합니다!
- Stage 1에서 Stage 2로 넘어가는 지점처럼 스테이지가 바뀔 때, 해상도는 절반($Stride=2$)이 되고 채널은 2배로 늘어납니다.
- 이때 모양이 달라져서 더하기가 안 되는 문제를 해결하기 위해 각 스테이지의 첫 번째 블록에서 $1 \times 1$ Conv(Projection Shortcut)를 사용하는 것입니다.
출력부 (Output Layer): "최종 판단"
4개의 스테이지를 모두 통과하면 데이터는 (512, 7, 7)채널, 가로, 세로 같은 입체 덩어리가 되어 있습니다.
- Global Average Pooling (GAP): 7x7의 공간 정보를 싹 다 평균 내서 채널당 숫자 1개로 만듭니다. (이제 (512, 1, 1)이 됨)
- Fully Connected (FC) Layer: 마지막으로 512개의 숫자를 조합해 "이 사진은 98% 확률로 강아지입니다"라고 결론을 내립니다.
각 스테이지는 똑같은 잔차 블록(Residual Block)을 여러 번 반복해서 쌓아 만듭니다. ResNet의 숫자가 커질수록(50, 101, 152) 이 블록의 반복 횟수가 늘어나며 모델이 깊어집니다.
주요 모델별 블록 배치(반복 횟수) 비교
모델명 총 레이어 수 Stage 1 (res2) Stage 2 (res3) Stage 3 (res4) Stage 4 (res5) ResNet-50 50층 3번 4번 6번 3번 ResNet-101 101층 3번 4번 23번 3번 ResNet-152 152층 3번 8번 36번 3번 - 특징 (Stage 3의 편중): 표를 보면 아시겠지만, 모델이 깊어질 때 다른 스테이지는 거의 건드리지 않고 Stage 3(물체의 부분적 형태를 인지하는 단계)의 블록 수만 기하급수적으로 늘립니다.
- 이유: 이미지의 고차원적인 특징(Context)을 본격적으로 추출하고 정제하는 데 가장 많은 연산 자원과 파라미터를 몰아주는 것이 성능 향상에 가장 유리하기 때문입니다.
요약: 데이터의 흐름도
- Stem: "너무 큰데? 일단 1/4로 줄이고 특징 좀 뽑아봐."
- Stage 1~4: "점점 작게 줄이면서(Stride=2), 정보는 깊게 쌓자(Channel 2배)."
- Shortcut: "스테이지 바뀔 때 모양 안 맞으면 $W_s$ 출동시켜!"
- Output: "다 훑었으니 평균 내서 최종 정답 맞히자."
'AI' 카테고리의 다른 글
사전학습(Pre-training)의 핵심 (0) 2026.02.06 이미지 인식의 진화: AlexNet에서 VGG16, 그리고 1x1 Conv의 마법까지 (0) 2026.02.05 클래스 활성화 맵(Class Activation Map, CAM) (0) 2026.02.04 CNN 필터는 어떻게 '스스로' 진화하는가? (역전파와 두 가지 가중치) (0) 2026.02.04 이미지 인식의 핵심, CNN(합성곱 신경망) (0) 2026.02.03