핵심 목표 미리 보기

<aside> 💡

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

스킵 커넥션은 ResNet의 핵심 아이디어로, 신경망에 **'지름길'**을 만들어주는 구조입니다.

일반적으로 데이터는 층을 순서대로 하나씩 통과하지만, 스킵 커넥션은 몇 개의 층을 건너뛰어 입력 데이터를 바로 출력 쪽에 더해줍니다.


2. 기울기 소실 (Gradient Vanishing)

기울기 소실은 깊은 신경망에서 학습 신호가 맨 앞까지 전달되지 못하고 중간에 사라져 버리는 현상입니다. 📉

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


3. 배치 정규화 (Batch Normalization)

배치 정규화는 신경망 각 층을 통과하는 데이터의 분포를 일정하게 **'표준화'**시켜주는 작업입니다. 📏

각 층이 처리하기 좋은 형태로 데이터를 계속해서 정돈해준다고 생각하면 쉽습니다. 데이터가 한쪽으로 쏠리거나 너무 퍼지는 것을 막아주기 때문에, 학습 과정이 훨씬 안정적이고 빨라지는 효과가 있습니다.


4. nn.Sequential vs. nn.Module

이 둘은 파이토치(PyTorch)에서 신경망 모델을 만드는 두 가지 방식입니다.


5. 평균 풀링 (Average Pooling)

평균 풀링은 이미지의 특징 맵(Feature Map) 크기를 줄이는 방법 중 하나입니다. 특정 구역(커널)을 정하고, 그 안에 있는 모든 픽셀 값의 평균을 구해 대표값으로 삼습니다.

이는 해당 구역의 특징을 전반적으로 부드럽게 요약하는 효과가 있습니다. (참고로, 가장 큰 값을 대표로 뽑는 방식은 '최대 풀링(Max Pooling)'이라고 합니다.)

</aside>

ResNet

이번 장에서는 스킵 커넥션을 사용하는 CNN 모델인 ResNet 모델을 알아보고 직접 만들어 CIFAR-10 데이터를 학습해보겠습니다. ResNet은 스킵 커넥션을 사용해서 VGG에 비해 훨씬 더 많은 층을 쌓습니다. 또한 nn.Module을 이용하여 신경망 내부의 데이터 흐름을 제어합니다.

ResNet은 CNN 중에서 가장 많이 쓰이는 모델입니다. 앞에서 VGG 모델은 층을 많이 쌓으면 기울기 소실 문제가 발생합니다. 그래서 VGG는 합성곱층을 19층 이상 쌓을 수 없었습니다. 하지만 ResNet은 스킵 커넥션(skip connection)을 이용해 기울기 소실 문제를 상당 부분 해결했습니다.

가장 깊은 ResNet 모델은 합성곱층을 100층까지 쌓을 수 있습니다. CNN에서 하나의 층은 곧 한 번의 특징 추출입니다. CNN은 층을 여러 개 쌓아 많은 특징을 확보한 후, 이를 조합해 이미지를 분류합니다. 그렇다면 층이 많으면 많을수록 좋을까요? 옛말에 과유불급, 과한 것은 적은 것만 못하다는 말이 있습니다.

딥러닝에서도 마찬가지로 층을 너무 많이 쌓으면 오히려 성능이 낮아집니다. CNN에서는 층 하나를 거칠 때마다 픽셀 하나가 원본 이미지에서 차지하는 영역이 넓어집니다. 합성곱을 거칠 때마다 이미지 크기가 줄어드니, 특징 맵의 픽셀 하나는 이전 층의 여러 픽셀 정보를 압축한 것이라고 볼 수 있습니다. 따라서 층을 무한정 쌓으면 이미지 전체가 픽셀 하나로 압축되어, 나중에 특징을 조합해 분류할 때 불리하게 작용합니다. 또 다른 부작용으로 기울기 소실이 있습니다.

딥러닝은 모든 파라미터의 협력 과제입니다. 모두가 최선의 결과를 위해 일해준다면 더할 나위 없지만, 항상 문제는 생기기 마련입니다. 오차 역전파를 통해 가중치를 업데이트할 때, 신경망의 앞쪽(입력층에 가까운 쪽)에 올수록 신경망의 뒷쪽(출력층에 가까운 쪽)의 기울기가 누적되어 곱해집니다. 만약 뒤쪽 기울기들이 0에 가까울 정도로 작다면 역전파되는 값이 점점 0에 가까워지고, 반대로 값이 너무 크면 역전파되는 값이 점점 커집니다.

기울기 소실 이미지

0__cmRuu8tLhZfPeJR.gif

학자들은 이 문제를 어떻게 해결했을까요? 다음 그림은 ResNet의 기본 구조입니다.

image.png

dense-block.webp

기울기 소실 문제 를 해결 하는 데 스킵 커넥션 을 사용 합니다 . 스킵 커넥션 은 자기 자신 을 미분 하면 1 이 나오기 때문에 신경망 의 출력 부분 에 입력 을 더하는 방식 으로 기울기 를 최소 1 로 확 보 하는 기법 입니다 . 그림 을 보면 합성 곱 되기 전의 입력 이 최종 적인 신경망 의 출력 과 더 해 집니다 . 다시 말하면 출력 $H ( x ) = F ( x ) + x$ 가 됩니 다 . 이렇게 입력 값 $x$ 가 합성 곱층 을 건너 뛰고 출력 에 더 해지 기 때문에 이런 구조 를 스킵 커넥션 이라고 부릅니다 . ● $F ( x )$는 은닉층 을 거친 이후 의 출력 을 과 더 합니다 .

스킵 커넥션 을 이용하는 또 다른 이유로 는 학습 이 쉬워 진다 는 겁니다 . 그림 에서 최적화 해야 하 는 함수 는$H ( x ) = F ( x ) + x$입니다 . 다른 관점 에서 보면 $F ( x ) = H ( x ) -x$가 되며 $H ( x ) -x$ 는 신경망 의 출력 과 입력 의 차 를 의미 합니다 . 스킵 커넥션 이 없는 학습 은 H ( x ) 의 최적화 였습니 다 . ResNet 의 학습 은 $F ( x )$ ****의 최소화 입니다 . x 는 입력 값 이기 때문에 고정 된 값 이므로 , H ( x ) 와 x 의 차이 를 최소화 합니다 . H ( x ) 와 x 의 차이 를 최소화 한다는 것은 H ( x ) 와 x 를 비슷하게 , 즉 F ( x ) 를 0 으로 만드는 겁니다 . 쉽게 말하자면 기존 의 학습 은 알 수 없는 지점 인 최적화 점 을 향해 갔다고 하면 ResNet 은 0 이라는 뚜렷한 목표가 생긴 겁니다 . 애매 모호한 지시 보다는 명확한 지시 가 알기 쉽듯 , 학습 도 목표가 생기면 쉬워 지는 겁니다 .

스킵 커넥션 ( skip connections )

은닉층 을 거치지 않은 입력 값 을 은닉 층 의 출력값 과 더하는 구조