Company
교육 철학

ResNet 만들기

핵심 목표 미리 보기

1. ResNet과 스킵 커넥션 (Skip Connection)

스킵 커넥션은 ResNet의 핵심 아이디어로, 신경망에 **'지름길'**을 만들어주는 구조입니다.
일반적으로 데이터는 층을 순서대로 하나씩 통과하지만, 스킵 커넥션은 몇 개의 층을 건너뛰어 입력 데이터를 바로 출력 쪽에 더해줍니다.
왜 필요한가요?: 신경망이 너무 깊어지면 오히려 학습이 잘 안되는 문제가 생깁니다. 스킵 커넥션이라는 지름길을 두면, 정보나 기울기(학습 신호)가 소실되지 않고 네트워크 깊숙한 곳까지 잘 전달될 수 있습니다.
ResNet: 바로 이 스킵 커넥션 구조를 활용해서 VGG보다 훨씬 깊은 네트워크를 성공적으로 쌓아 올린 모델입니다.

2. 기울기 소실 (Gradient Vanishing)

기울기 소실은 깊은 신경망에서 학습 신호가 맨 앞까지 전달되지 못하고 중간에 사라져 버리는 현상입니다.
'소문내기 게임'을 생각해보세요. 여러 사람을 거치면서 처음 내용이 점점 변하고 흐려지다가 나중에는 아예 다른 이야기가 되는 것과 비슷합니다. 신경망에서도 층을 거꾸로 거슬러 올라가는 학습 신호(기울기)가 너무 작아져 0에 가까워지면, 앞쪽 층의 가중치들이 업데이트되지 않아 학습이 멈추게 됩니다.

3. 배치 정규화 (Batch Normalization)

배치 정규화는 신경망 각 층을 통과하는 데이터의 분포를 일정하게 **'표준화'**시켜주는 작업입니다.
각 층이 처리하기 좋은 형태로 데이터를 계속해서 정돈해준다고 생각하면 쉽습니다. 데이터가 한쪽으로 쏠리거나 너무 퍼지는 것을 막아주기 때문에, 학습 과정이 훨씬 안정적이고 빨라지는 효과가 있습니다.

4. nn.Sequential vs. nn.Module

이 둘은 파이토치(PyTorch)에서 신경망 모델을 만드는 두 가지 방식입니다.
nn.Sequential: 레고 블록을 순서대로 쭉 쌓는 것과 같습니다. 간단하고 편리하지만, A층에서 C층으로 바로 연결하는 등의 복잡한 구조(예: 스킵 커넥션)는 만들 수 없습니다.
nn.Module: 다양한 레고 부품으로 자유롭게 조립하는 것과 같습니다. 데이터가 흘러가는 방식(forward 메서드)을 직접 설계해야 해서 조금 더 복잡하지만, ResNet의 스킵 커넥션처럼 원하는 어떤 복잡한 구조든 만들 수 있는 유연성을 제공합니다.

5. 평균 풀링 (Average Pooling)

평균 풀링은 이미지의 특징 맵(Feature Map) 크기를 줄이는 방법 중 하나입니다. 특정 구역(커널)을 정하고, 그 안에 있는 모든 픽셀 값의 평균을 구해 대표값으로 삼습니다.
이는 해당 구역의 특징을 전반적으로 부드럽게 요약하는 효과가 있습니다. (참고로, 가장 큰 값을 대표로 뽑는 방식은 '최대 풀링(Max Pooling)'이라고 합니다.)

ResNet

ResNet은 CNN 중에서 가장 많이 쓰이는 모델입니다. 앞에서 VGG 모델은 층을 많이 쌓으면 기울기 소실 문제가 발생합니다. 그래서 VGG는 합성곱층을 19층 이상 쌓을 수 없었습니다. 하지만 ResNet은 스킵 커넥션(skip connection)을 이용해 기울기 소실 문제를 상당 부분 해결했습니다.
가장 깊은 ResNet 모델은 합성곱층을 100층까지 쌓을 수 있습니다. CNN에서 하나의 층은 곧 한 번의 특징 추출입니다. CNN은 층을 여러 개 쌓아 많은 특징을 확보한 후, 이를 조합해 이미지를 분류합니다. 그렇다면 층이 많으면 많을수록 좋을까요? 옛말에 과유불급, 과한 것은 적은 것만 못하다는 말이 있습니다.
딥러닝에서도 마찬가지로 층을 너무 많이 쌓으면 오히려 성능이 낮아집니다. CNN에서는 층 하나를 거칠 때마다 픽셀 하나가 원본 이미지에서 차지하는 영역이 넓어집니다. 합성곱을 거칠 때마다 이미지 크기가 줄어드니, 특징 맵의 픽셀 하나는 이전 층의 여러 픽셀 정보를 압축한 것이라고 볼 수 있습니다. 따라서 층을 무한정 쌓으면 이미지 전체가 픽셀 하나로 압축되어, 나중에 특징을 조합해 분류할 때 불리하게 작용합니다. 또 다른 부작용으로 기울기 소실이 있습니다.
딥러닝은 모든 파라미터의 협력 과제입니다. 모두가 최선의 결과를 위해 일해준다면 더할 나위 없지만, 항상 문제는 생기기 마련입니다. 오차 역전파를 통해 가중치를 업데이트할 때, 신경망의 앞쪽(입력층에 가까운 쪽)에 올수록 신경망의 뒷쪽(출력층에 가까운 쪽)의 기울기가 누적되어 곱해집니다. 만약 뒤쪽 기울기들이 0에 가까울 정도로 작다면 역전파되는 값이 점점 0에 가까워지고, 반대로 값이 너무 크면 역전파되는 값이 점점 커집니다.
학자들은 이 문제를 어떻게 해결했을까요? 다음 그림은 ResNet의 기본 구조입니다.
스킵 커넥션 ( skip connections )
은닉층 을 거치지 않은 입력 값 을 은닉 층 의 출력값 과 더하는 구조
기울기 소실 문제 를 해결 하는 데 스킵 커넥션 을 사용 합니다 . 스킵 커넥션 은 자기 자신 을 미분 하면 1 이 나오기 때문에 신경망 의 출력 부분 에 입력 을 더하는 방식 으로 기울기 를 최소 1 로 확 보 하는 기법 입니다 .
딥러닝 모델이 깊어질수록 흔히 나타나는 문제 중 하나가 바로 기울기 소실(Vanishing Gradient) 입니다. 이 문제를 해결하기 위해 스킵 커넥션(skip connection) 구조가 사용됩니다. 스킵 커넥션은 입력값 x를 그대로 출력단에 더해주는 방식으로, 신경망이 최소한 입력값 자체(즉, 자기 자신)를 전달할 수 있도록 보장해줍니다.
이 덕분에 신경망의 기울기가 1 이상 유지되어, 학습이 안정적으로 진행됩니다. 그림을 보면 입력 x가 합성곱층을 거쳐 얻은 출력 F(x)와 더해져 최종 결과는 다음과 같이 표현됩니다.
H(x)=F(x)+x
즉, 입력 x를 그대로 건너뛰어(skip) 최종 출력에 더해주는 구조이기 때문에 이를 ‘스킵 커넥션’이라고 부릅니다.
장점 • 층을 깊게 쌓을 수 있습니다.
• VGG에 비해 학습이 안정적입니다.
• 기울기 소실 문제를 어느 정도 해결합니다.
단점 • 가중치가 늘어나기 때문에 계산량이 많아집니다.
• VGG에 비해 오버피팅이 일어나기 쉽습니다.
▼ 유용한 곳 • 이미지 분류, 세그멘테이션, 이미지 생성 등 합성곱을 이용하는 모든 곳에서 이용 가능합니다.
• 이미지의 특징을 추출할 때 사용합니다.
• 스킵 커넥션은 이전 은닉층의 정보를 필요로 하는 텍스트 처리에서도 사용할 수 있습니다.

배치 정규화 (batch normalization)

러닝 모델 의 층 이 깊어 지다 보면 각 층 마다 값 의 범위 가 달라지는 경우 가 있습니다 . 모델 을 학 습할 때 모든 데이터 를 한 번 에 이용 하지 않고 , 배치 단위 로 나눠서 학습 하게 되는데 배치 간의 데이터 분 포가 달라서 생기는 현상 입니다 . 배치 정규화 는 이런 분포 의 불균형 을 해결 하는 기법 입니다 . 배치 정규화 층 이 각 층 에서 의 값 의 분포 가 일정 하도록 해줍니다 . 그림 을 보면서 배치 정규화 를 알아 보겠습니다 .

배치 정규화란?

배치 정규화는 신경망 학습 과정에서 각 층을 통과하는 데이터의 분포가 들쭉날쭉 변하지 않도록 일정한 형태로 '표준화'시켜주는 기법입니다.
이미지에서 볼 수 있듯이, **'배치 1, 2, 3'**은 각각 모양(분포)이 다릅니다. 어떤 배치는 평균이 높고, 어떤 배치는 데이터가 넓게 퍼져있죠. 이렇게 제각각인 데이터가 그대로 다음 층으로 전달되면, 신경망이 학습하기 매우 까다로워집니다. 마치 매번 다른 종류의 공을 받아서 던져야 하는 투수와 같아요.
배치 정규화는 이 문제점을 해결하기 위해, 각 배치들을 평균이 0, 분산이 1인 표준 정규분포와 유사한 형태로 바꿔줍니다. 그 결과, 이미지의 오른쪽처럼 모든 배치가 비슷한 분포를 가진 안정적인 출력으로 변환됩니다.

배치 정규화를 왜 사용할까요?

1.
학습 속도 향상 (더 빠른 학습): 각 층에 들어오는 데이터의 분포가 일정해지므로, 신경망이 훨씬 빠르고 안정적으로 학습할 수 있습니다.
2.
기울기 소실/폭주 문제 완화: 데이터 값이 너무 커지거나 작아지는 것을 막아주어, 학습 신호(기울기)가 사라지거나 폭발하는 현상을 줄여줍니다.
3.
규제(Regularization) 효과: 학습 데이터에 약간의 노이즈를 추가하는 것과 비슷한 효과를 주어, 모델이 특정 데이터에만 과도하게 적응하는 **과대적합(Overfitting)**을 방지하는 데 도움이 됩니다.
쉽게 말해, 배치 정규화는 신경망의 각 층마다 **'데이터 정리 도우미'**를 두어, 데이터가 엉망이 되지 않도록 계속해서 정돈해주면서 학습을 돕는 똑똑한 기법이라고 할 수 있습니다.