오늘부터 그동안 미뤄놨던 '공부'를 차근차근 해보려한다.
최근 오픈소스 문화의 발전과 클로드 코드의 등장으로 AI 분야의 장벽이 낮아져, 석박사 수준으로 깊이 공부하지 않아도, 실무에서 거의 모든 최신 기술들을 구현할 수 있게 되었다. 실제로 실무에서 LLM, ML을 깊게 활용하고 있고, 최근에는 로컬 모델들을 연구해보고 있어서 한정된 자원에서 모델 경량화를 위한 Quantization같은 고급 기술도 시도해보고 있다.
지금은 이렇게 얕은 이해와 맥락으로 기술을 쓰고 있지만, 앞으로도 이렇게 기술에 대한 이해가 낮다면 엔지니어링 역량에 있어서 분명히 그 벌을 받을 것 같다는 생각이 들었다. 그래서 지금도 많이 늦었지만, 아주 기초부터 차근차근 공부를 다시 시작해보려한다. 학부에서 짧막하게 배웠던 수학들과 머신러닝들의 기억을 되살려서, CNN부터 시작해서 이제는 너무 흔해빠진 기술인 Transformer를 거쳐, 최종적으로 vision이든, ML쪽이든 좀 더 깊게 이해해보려한다.
첫번째로 시작해볼 논문은 Residual Learning Framework 다.
기본적인 아키텍처나, 개념에 대해서 이해해보고, 실험의 결과는 이미 너무 잘 알려져있으니 (@@테스트셋으로 실험해본 결과 성능이 N% 개선되었다 ~) 짧게 요약해보겠다.
https://arxiv.org/pdf/1512.03385
Introduction
Residual Learining은 딥러닝 분야에서 Layer를 더 많이 쌓으면 쌓을수록 성능이 좋아질 것 같지만, 실제로는 성능이 떨어지는 문제를 해결하기 위한 새로운 아키텍처다.

기존의 연구들은 이미지 분류 문제에서 각 feature들이 거친 layer가 깊어질수록 더욱 성능이 오르는 것이 정론이었다. 이와 관련해서 많은 최적화와 연구가 이뤄졌으나, 네트워크의 depth가 증가하면서 정확도가 포화상태에 도달하면 성능이 급격히 떨어지는 현상이 생겼다.
위 그래프만 보면 난 당연히 overfitting이라고 생각했는데 , 이 문제는 overfitting이 아니라, training error에 기반한 것이다. 이게 무슨 말이냐면.
오버피팅은 training error가 낮고 test error가 높은, 즉 학습 데이터에 과적합된 상황이다. 하지만 이 경우는 네트워크가 깊어질수록 학습하는 것 그 자체가 어려워져 학습 데이터 조차도 잘 못맞추는 경우다. 즉, training error가 커지고, test error도 따라서 커지는 상황 인 것이다.
왜 이런 일이 생기나? 에 대해서 LLM에게 물어보니 "네트워크가 깊어질수록 gradient vanishing/exploding 같은 문제가 심해져서 학습이 불안정해집니다. " 라는데.. 여기서 gradient vanishing/exploding 에 대해서 이야기하기 시작하면 너무 산으로 가니, 일단 넘어가겠다.
이 논문에서는 “Residual Learning Framework”를 도입하여 성능 저하 문제를 해결하고 있다.
Residual Learning Framework란. 우리가 학습하고 싶은 원래의 매핑(함수)를 학습하는 것이 아니라, Residual(잔차)를 학습하는 것이다.
왜 잔차를 학습할까?
최적의 매핑이 단순히 항등함수라면. 즉, 입력을 그대로 출력하는 단순한 함수라면, 네트워크가 어떤 복잡한 변화도 하지 않고, 그저 '통과' 시켜야한다. 그런데, 일반적인 신경망 구조상, 층이 여러개가 쌓여있으면 입력은 신경망을 통해 계속 변형되기 떄문에 "아무 변화 없음" 상태를 output으로 뱉으려면, 가중치와 편향이 아~주 정확하게 들어맞아야한다.
예를들면.. ReLU같은 활성화 함수는 음수를 0으로 바꿔버리기 떄문에 조금이라도 양의 가중치를 잘못 줘버리면 항등을 유지하기가 아주 어려워진다.
그런데 반면에 잔차를 학습하면 항등 매핑을 학습하는게 훨씬 쉬워진다. 왜냐하면 ...

또한 shortcut connection 개념이 중요한데, short connection은 입력을 하나 이상의 층을 건너뛰고, 항등 매핑을 수행하는 방식이다. 이게 무슨 말이냐면... 입력된 값이 layer를 거치면서 변화가 생기니, 그걸 다 건너뛰고, stacked layer들의 최종적인 출력이랑만 합쳐주는것이다.

학습과정에서 왜 shortcut connection이 필요하냐면
그런데 실제로 우리가 학습해야하는 최적 함수가 꼭 '항등함수'일 필요가 있는가? 지금까지 이 논문에서 항등함수 처리를 위한 서론을 깔아놓고 시작한 이유는, 항등함수가 모델이 학습을 시작하기에 좋은 reference point(기준점)을 제공하기 때문이다.
Identity Mapping by Shortcuts
이제 본격적으로 Residual Block에 대해서 알아보자. Residual Block은 "입력 그대로 전달하는 shortcut connection"과 "잔차를 학습하는 F(x)"를 합쳐서 출력하는 구조다. 이 논문에서는 두가지 수식을 제시하는데,
1. y = F(x, {Wi}) + x
2. y = F(x, {Wi}) + Wsx
첫번째 방정식은
y = F(x, {Wi}) + x
- x: 블록의 입력
- y: 블록의 출력
- F(x, {Wi}): 학습해야 할 residual 함수.
Residual Block은 입력을 shortcut connection으로 그대로 전달하며, stacked layer에서 학습한 residual F(x)와 더해 최종적인 출력인 y을 만든다. 이 구조는 계산량을 거의 늘리지 않으면서도 plain network와 공정하게 비교할 수 있도록 설계되었다.
두번째는
y = F(x, {Wi}) + Wsx
- x: 블록 입력
- y: 블록 출력
- F(x, {Wi}): 학습해야 할 residual 함수
인데, 첫번재 방정식과의 차이점은, 첫번째 방정식은 F(x)와 x의 차원이 같아야 element-wise addition이 가능하다.

이게 무슨 말이냐면.. Element-wise Addition은 두 벡터를 원소별로 더하는 연산이다. 그런데 예를 들어 F(x)가 길이 3 벡터고, x가 길이 5인 벡터라면 [1,2,3] + [4,5,6,7,8] 이라면 더할 수가 없다. (원소별로 대응시킬 수 없기 때문)
그래서 Projection 이 필요한데, Projection은 차원을 맞추기 위해 사용하는 변환 행렬이다. 보통 Convolution layer에서는 1x1 conv를 사용하는데, 각 위치의 채널을 선형 결합해서 새로운 채널의 수로 바꿔주는 방식이다. (채널은 feature map의 깊이 방향을 의미한다)
Network Architectures
이 논문에서는 plain Network와 Residual Network에서 테스트를 진행했는데, Plain Network란, 단순히 convolution layer들을 차례대로 쌓은 네트워크인 반면에, Residual Network는 shortcut connection을 추가해서 만든 구조다.
이 논문에서의 plain network는 VGGNet에서 영감을 받았다고했는데, VGGNet이란, 작은 3x3 필터를 깊게 쌓아올린 단순하고 규칙적인 구조의 CNN이다. 중간에 2x2 Max Pooling으로 이미지의 가로, 세로 크기를 줄이면서 공간 크기가 커지는 것을 방지하며, 마지막 3개의 fully connected layer와 softmax로 분류를 수행한다.
VGG의 기본 구조를 따르며, 두가지의 간단한 규칙에 따라서 plain network가 디자인되는데,
- 동일한 output feature map size에 대해, layer는 동일한 수의 filter를 갖는다.
- feature map size가 절반 인 경우, layer 당의 time complexity를 보전하기 위해 filter의 수를 2배로 한다.
이게 무슨 말이냐면, 첫번재로, 64x64 크기의 feature map을 처리하는 모든 conv layer는 같은 채널 수를 가지고, feature map 크기가 32x32로 줄어들면 계산량을 유지하기 위해 필터 수를 2배로 늘린다는 것이다. 네트워크의 끝에는 Global Average Pooling(GAP)를 적용해 전체 feature map을 평균내고, 그 결과를 Softmax 활성화가 붙은 1000-way FC layer로 연결해, 클래스 분류를 수행한다.
이 구조는 '연산량이 너무 많고 무겁다' 라는 기존 VGG의 단점을 상쇄할 수 있다.
Residual Network의 경우, 동일한 차원에서는 직접적으로 방정식 1을 사용하고, 차원이 다를 경우 아래의 옵션을 고려한다
- zero entry를 추가로 padding하여 dimension matching 후 identity mapping을 수행한다. (별도의 parameter가 추가되지 않음)
- Eqn.2의 projection shortcut을 dimension matching에 사용한다.
Experiments
이제 필요한 개념들을 이해했으니, 본격적으로 이 논문에서의 실험을 살펴보겠다. 이 논문에서는 imageNet에 대해 다음 두 실험의 결과를 제공한다.
- plain network(simply stack layers)는 depth가 깊어짐에 따라 더 높은 training error를 보이는 것에 반해, 제안한 deep residual network는 쉽게 최적화가 가능함.
- 또한, deep residual network는 아주 깊어진 depth에서 성능의 이득을 가졌으며, 이전에 연구됐던 네트워크에 비해 훨씬 향상된 결과를 보임.
또한, CIFAR-10 dataset에 대해서는 다음 실험의 결과를 제공한다.
- 성능 저하 문제 및 제안하는 방법의 효과가 특정 dataset(ImageNet)에만 국한되지 않음을 보임
- 제안하는 방법의 사용 여부에 따른 layer response의 std 분석
- 1000개 이상의 layer로 이루어진 모델에 대한 실험

1. ImageNet Classification
위 구조를 활용해 실험은 ImageNet 2012 classification dataset에서 plain network와 residual network의 성능을 비교했다. 앞서 이야기했던 것과 같이 plain network는 18 layer, 34 layer plain network는 깊어질수록 학습이 어려워지고 (training error가 증가함) 성능이 떨어졌다. 반면 동일 깊이의 ResNet은 학습이 잘되고, validation error 가 크게 줄어들었다.
하지만 Projection shortcut 옵션의 성능 차이는 미미했다. Shortcut connection의 핵심은 gradient 흐름을 원활하게 해주는 것이다. 즉 학습 과정에서 역전파가 막히지않고 잘 전달되도록 하는 목적이지, 복잡한 표현의 학습 자체를 도와주는 것은 아니다.
따라서 shortcut을 padding으로 구현하든 projection conv로 구현하든 gradient 전달 경로는 확보되므로, 성능 차이는 크지 않았다.
2. CIFAR-10 and Analysis
CIFAR-10 데이터셋에서도 마찬가지로 PlainNet과 달리 ResNet은 레이어가 깊어질수록 성능이 향상했다.
특히 이 실험에서는 ResNet이 residual function 출력이 일반적으로 작고, 깊어질수록 더 작아진다는 것을 보여주는데, 이게 무슨 말이냐면 ResNet은 기본적으로 아주 작은 크기의 '잔차'를 학습하는 방식이다. 즉, identity mapping 을 기본으로 하되, 그 위에 작은 보정값만 누적하는 방식으로 동작한다. 그렇다는 것은 원래의 입력을 최대한 유지한채 필요한 부분만 살짝 수정하는 방식으로 학습하기 때문에 residual 의 출력이 작고 깊어질수록 더 작아진다는 것이다.
'오픈소스' 카테고리의 다른 글
| Openclaw의 os보안 테스트 코드에 Contribute함 (OpenSource Contribute) (0) | 2026.02.08 |
|---|---|
| [오픈소스 분석 5일차] Langchain에서 문서를 로드하고 처리하는 방식 (0) | 2025.11.07 |
| [오픈소스 분석 4일차] LangChain이 API를 관리하는 소스 코드 분석 (0) | 2025.11.04 |
| [오픈소스 분석 3일차] LangChain Agent Core Components (0) | 2025.10.26 |
| [오픈소스 분석 2일차] Langchain 공식문서 톺아보기 (0) | 2025.10.26 |