10 minute read

LesNet 이전의 문제들

2012년에 8개의 레이어로 구성된 AlexNet이 등장한 이후 신경만의 깊이는 점점 더 깊어졌다. VGGNet은 19개, GoogLeNet은 22개 레이어를 가졌다. 하지만 더 깊이 학습할 수록 문제에 직면했다. 그중 가장 큰 문제는 Vanishing Gradient 문제와 Degradation 문제이다.

Vanishing Gradient

Vanishing Gradient(기울기 소멸)은 역전파(Backpropagation) 과정에서 모델의 가중치를 업데이트하기 위한 기울기가 입력층 쪽 레이어로 이동할수록 점점 작아져 0으로 수렴하는 현상이다.

먼저 위 설명에서 나오는 모든 단어들을 정리해본다.

가중치(w)는 신경망의 각 레이어에서 입력 데이터에 곱해지는 매개변수이다. 모델의 변환을 수행하는 주체이다.

순전파(Forward Propagation)은 입려 데이터 x가 각 레이어의 가중치 w와 비션형 활성화 함수 f를 거치며 최종 출력값 $\hat{y}$ 을 만들어내는 과정이다.

단일 레이어 신경망에서는 입력값 x에, 가중치 x를 곱하고, 편향(Bias) b를 더하고, 활성화 함수 f를 적용하여 최종적으로 $\hat{y}$ 을 구한다.

\[\hat{y} = f(w \cdot x + b)\]

즉 순전파는 위 단일레이어 신경망에서 일어나는 “데이터가 입력에서 출력방향으로 흘러가며 예측값 $\hat{y}$ 을 계산하는 행위” 이다.

손실(Loss) L은 순전파를 통해서 나온 출력값 $\hat{y}$ 과 실제 정답 y 사이의 오차를 계산한 값이다.

기울기(Gradient) 는 손실 L을 특정 가중치 w로 편미분한 값이다. 가중치를 어느 방향으로 얼마만큼 수정해야 손실이 줄어드는지를 나타낸다.

\[\nabla L(w) = \left( \frac{\partial L}{\partial w_1}, \frac{\partial L}{\partial w_2}, \dots, \frac{\partial L}{\partial w_n} \right)\]

역전파(Backpropagation)은 출력층에서 계산된 손실 L로부터 출발하여 미분의 체인 룰(연쇄법칙)을 적용해서 입력층 방향으로 거꾸로 이동하며 각 레이어 가중치의 기울기를 계산하는 과정이다.

역전파는 순전파의 반대 개념이 아니다. 순전파의 오차를 바탕으로 각 가중치를 수정하기 위해 미분값(기울기)를 역추적하는 과정이다.

위에서 언급한 손실 L을 줄이기 위한 가중치 w를 스스로 수정하는 것을 의미한다. 순전파를 통해 입력값과 최종정답을 비교해서 Loss(얼마나 틀렸는지)를 알아내면 어느 가중치를 얼마나 수정해야 오차가 줄어드는지를 알아내는 과정이 역전파이다. 각 가중치가 오차에 미친 영향 기울기 $\nabla L(w)$ 을 구하기 위해서 출력층부터 시작해 입력층 방향으로 거꾸로 미분값을 계산해 돌아오는 과정이 역전파이다.

다시 본론으로 돌아와서 Vanishing Gradient 문제, 즉 기울기 소멸 문제는 역전파 과정에서 모델의 가중치를 업데이트할 때 출력층에서 계산된 기울기(Gradient, $\nabla L(w)$) 가 입력층 방향으로 거꾸로 전달되는 과정에서 점차 0으로 수렴하여 사라지는 현상이다.

이로 인해서 입력층과 가까운 초기 레이어들의 가중치가 거의 수정되지 않아, 모델의 깊이를 깊게 쌓았음에도 불구하고 제대로 된 학습이 불가능해진다.

더 자세히 보자.

역전파는 곱셈의 연속이다. 출력층에서 계산한 손실L에서 시작하여 입력층 방향으로 지나가는 모든 레이어의 미분값을 거꾸로 곱해나가는 과정이다. 마지막 첫번째 레이어의 가중치를 수정하기 위한 기울기 계산식은

\[\text{최종 기울기} = (\text{손실 미분값}) \times (\text{레이어 } N \text{ 미분값}) \times \cdots \times (\text{레이어 } 1 \text{ 미분값})\]

이다.

이 수식의 이해하기 위해서는 순전파를 수식을 봐야한다. 아래는 순전파를 통해 손실 L이 나오는 과정이다.
레이어 1: $h_1 = f_1(x \cdot w_1)$
레이어 2: $h_2 = f_2(h_1 \cdot w_2)$
$\cdots$
레이어 N (출력): $h_N = f_N(h_{N-1} \cdot w_N)$
이며 손실 계산법은 $L = \text{Loss}(h_N, y)$이므로,

$L = \text{Loss}(f_N(f_{N-1}(\cdots f_1(x \cdot w_1)\cdots)))$ 이다.

그렇다면 역전파는 최종 손실L에 대해 각 레이어의 가중치w와 편향b이 얼마나 영향을 미쳤는지 기울기(grdient)를 구하는 과정이므로

우리가 구하려는 최종 기울기는 첫번째 가중치 $w_1$이 미세하게 변할 때, 손실 $L$이 얼마나 변하는가?”를 나타내는 $\frac{\partial L}{\partial w_1}$ 를 통해서 구할 수 있다.

위 순전파를 통해 구한 손실L을 $w_1$으로 미분하려면, 미분의 연쇄 법칙(합성함수 미분)에 의해 중간 단계의 변화율(미분값)들을 순서대로 곱해야만 한다.

첫 번째 레이어 가중치의 기울기($\frac{\partial L}{\partial w_1}$)는 다음과 같다.

\[\frac{\partial L}{\partial w_1} = \frac{\partial L}{\partial h_N} \times \frac{\partial h_N}{\partial h_{N-1}} \times \frac{\partial h_{N-1}}{\partial h_{N-2}} \times \cdots \times \frac{\partial h_2}{\partial h_1} \times \frac{\partial h_1}{\partial w_1}\]

이것을 다시 쉽게 정의하면 다음과 같다.

\[\frac{\partial L}{\partial w_1} = (\text{손실 미분값}) \times (\text{레이어 } N \text{ 미분값}) \times (\text{레이어 } N-1 \text{ 미분값}) \times \cdots \times (\text{레이어 } 1 \text{ 미분값})\]

위 식에서 레이어k의 미분값 하나를 쪼개서 보면 다음과 같다.

\[\frac{\partial h}{\partial x} = f'(w \cdot x) \cdot w\]

즉, 레이어의 미분값은 (1)활성화 함수의 미분값 $f’(w \cdot x)$ 과 (2)가중치 $w$ 이 두 개의 곱이다.

첫번째, $f’(w \cdot x)$ 같은 경우 활성화 함수의 미분값인데 기본 활성화 함수인 sigmoid를 예로 들면 함수 식은

\[f(x) = \frac{1}{1 + e^{-x}}\]

인데 이것을 미분하면 항상 $0$과 $1$ 사이의 소수만 나오기 때문이다.

두번째, 가중치w 같은경우 순전파 과정에서 입력값x에 가중치w를 곱하는 시점에서 w를 큰수로 설정하고 레이어를 여러개 통과시키면, 나중에 출력값이 엄청 커지게 된다. 초기 가중치를 0근처의 작은 무작위 소수로 설정한다.

이 두가지 이유 때문에 두 수를 곱하는 레이어의 미분값는 당연히 1보다 작을 수 밖에 없고, 이 레이어의 미분값 여러개를 곱하면 최종 기울기는 0으로 수렴하게 된다.

이전에 AlexNet에서 위 첫번째(활성화 함수의 미분값)를 해결하기 위해 sigmoid나 tanh 대신 ReLU를 도입해서 당시 8개의 레이어 수준에서 Vanishing Gradient 문제를 완화시켰지만, 추후 VGG, GoogLeNet처럼 레이어가 깊어지면서 다시 기울기 문제가 다시 생겼다. 위 두번째 이유인 가중치w가 1보다 작기 때문이다. 레이어가 8개 수준이면 괜찮을지 몰라도, 레이어가 깊어질수록 1보다 작은 w가 계속 곱해지기 때문에 0으로 수렴하게 된다. (그렇다고 w를 1 이상으로 하면 기울기가 무한대로 가는 문제가 있다.) 또한 ReLU 특성상 특정 노드에 들어오는 입력값X가 음수가 되면 그 함수값이 0이 되기 때문에 학습이 진행되지 않는 문제가 있다.

Degradation

LesNet 등장 이전 가장 큰 문제인 Vanishing Gradient 문제와 Degradation 문제에 대해서 이번에는 Degradation에 대해서 알아본다.

Degradation(성능 저하) 문제는 신경망의 깊이 즉, 레이어 수를 늘렸을 때 과적합(Overfitting)과 최적화(Optimization) 실패로 인해서 학습 오차(Training Error)와 테스트 오차 둘다 악화되는 현상이다.

다시 말하면 과적합은 학습 데이터 오차가 0에 가깝게 줄어들지만 평가 데이터 오차는 커지는 현상이다. 반면 Degradation(성능 저하)는 학습 데이터 오차 자체가 레이어가 얕은 모델보다 더 높게 나타나는 현상이다.

\[y = f(W \cdot x + b)\]

위 수식은 기존 레이어 구조이다. 여기서 입력 x가 들어왔을때 출력y가 아무 변함없이 그대로 x가 되는 상황을 만들어야 하는 상황에서 f 즉 비선형 활성화 함수(e.g. ReLU) 구조 특성상 가중치w와 편향b를 조절해서 정확히 y = x 라는 출력을 만들기가 매우 어렵기 때문에 결국 레이어들이 입력 신호 x를 그대로 통과시키지 못하고, 점점 레이어마다 신호를 조금씩 찌그러뜨리고 변형시키게 된다. 즉 순전파 과정에서 정보가 계속 왜곡되다 보니, 신경망의 최종 출력값 $\hat{y}$은 정답 $y$와의 상관관계를 잃어버리게 된다.

더 자세하게 설명하면,

손실 함수 $L(W)$는 모든 가중치 값($W$)의 조합에 따라 오차(Loss)가 얼마가 나오는가를 나타내는 함수이므로 가중치w를 조금 바꾸면 오차L도 일정하게 증가하거나 완만하게 감소한다. 가중치 값 변화와 오차 값 변화 사이의 관계가 예측이 가능해진다. 하지만 레이어가 계속 쌓이게 되면서 가중치 하나가 미세하게 변한 가중치를 수십 번 연속으로 곱하므로 최종 출력값과 오차L이 크게 달라진다.

또한 경사하강법이 최적의 가중치를 찾지 못하게 Degradation 문제가 발생한다.

경사하강법(Gradient Descent)는 현재 가중치 위치에서 오차L를 가장 빠르게 줄이는 방향을 계산하여 가중치를 이동시키는 알고리즘이다.

이때 정상적인 신경망에서는 현재 위치에서 기울기를 계산하는데, 이 기울기가 현재 위치뿐 아니라 멀리 있는 최적의 지점까지 가는 전체적인 오차 감소 방향과 일치한다. 그래서 공식대로 가중치를 계속 수정해 나가면 매 단계마다 오차가 계속 줄어들어 손실이 최소가 된다.

하지만 깊은 레이어로 인해서 오차 값이 들쑥날쑥해지면서 현재 위치에서 순간적인 미분값만 연산에 사용하기 때문에 전체 가중치 공간에서 어디가 제일 오차가 낮은 지점인지 계산할 수 없게 되고, 막상 구한 기울기가 잠깐 오차가 줄어드는 방향일 수 있게 되며, 또는 가중치가 증가시키고 이후 다시 감소하면서 제자리 걸음을 반복하는 경우가 생긴다.

Residual Connection으로 해결

위 문제들을 ResNet 연구진들은 레이어 연산을 두개의 경로로 나누는 Residual Connection 방법을 도입하여 해결했다.

기존 신경망은 $y = F(x)$ 구조였지만, ResNet은 원본 입력 x를 그대로 더해주는 $y = F(x) + x$ 구조를 사용한 방법이다.

위 수식 구조는 아래 두 가지로 위 문제들을 해결하였다.

(1) $y = x$ 를 잘 해낸다. 아까 위에 Degradation 문제에서 입력 x가 들어왔을때 출력y가 아무 변함없이 그대로 x가 되는 상황을 만들어야 하는 상황에서 f 즉 비선형 활성화 함수 구조 특성상 가중치w와 편향b를 조절해서 정확히 y = x 라는 출력을 만들기가 매우 어렵기 때문에 결국 레이어들이 입력 신호 x를 그대로 통과시키지 못하고, 점점 레이어마다 신호를 조금씩 찌그러뜨리고 변형시키게 되는 문제가 있었다. 하지만 ResNet 구조에서 내부 가중치 연산 $F(x)$를 $0$으로 수렴시키기만 하면 연산 결과가 즉시 $y = 0 + x = x$가 되기 때문에 매우 쉬워진다.

(2) 역전파 시 기울기 신호를 직접 보존한다. $y = F(x) + x$ 연산을 입력 $x$에 대해 미분하면 $\frac{\partial y}{\partial x} = \frac{\partial F(x)}{\partial x} + 1$ 이 된다. 역전파 과정에서 연쇄 법칙(합성함수 미분)에 의해 곱셈이 반복될 때 $\frac{\partial F(x)}{\partial x}$ 가 $0$이 되더라도 뒤에 붙은 $+1$ 이라는 상수가 항상 유지되기 때문에 기울기가 손실되지 않고 초기 레이어까지 직접 전달된다.

image

추가 효과들

ResNet-152는 VGG-19보다 약 8배 깊지만, 총 연산량(FLOPs)과 파라미터(가중치) 개수는 오히려 더 적다.

그 이유는 Bottleneck Block 덕분이다.

합성곱 신경망에서 채널(Feature Map) 수가 많을때 3 x 3 합성곱 연산을 직접 적용하면 많은 연산량이 소모되는데, Bottleneck Block 는 1 x 1 합성곱 연산을 앞뒤로 활용하여 연산량을 대폭 줄이기 때문이다.

먼저 1 x 1 합성곱을 통해 입력의 채널 수를 작은 크기로 압척(차원 축소)하고, 채널 수가 줄어든 상태에서 3 x 3 합성곱을 적용하여 공간적 특징을 추출한다. 그러면 연산이 작은 채널 공간에서 이루어지므로 연산량이 감소하게 된다. 마지막으로 다시 1 x 1 합성곱을 사용하여 채널 수를 원래의 높은 수치로 복원(차원 확장)을 한다.

위 Bottleneck Block 구조 덕분에 연산은 줄이면서 더 깊은 레이어를 구성할 수 있다.

ResNet의 한계점

다만 한계점도 존재한다.

첫번째로 레이어 깊이 설정에 대한 기준이 부족했다. ResNet 논문에서는 ImageNet 데이터셋에 대해서 152개 레이어가 최적임을 실첨을 통해 확인했지만, 데이터 크기나 연산 자원에 따라 몇 개의 레이어를 쌓아야 하는지에 대한 공식을 제시하지 못해 결국 실험해봐야 알았다.

두번째로 깊은 모델은 많은 연산 자원과 대용량 데이터셋을 필요로 하며, 데이터가 부족할 경우 과적합 위험이 있다.

ResNet v2

특히 ResNet 아키텍처는 Skip Connection(특정 레이어를 건너뛰어 입력값을 연산없이 뒤쪽 레이어로 바로 전달하는 경로) 직후 비선형 활성화 함수(e.g. ReLU)를 배치하는 것이 특히 깊은 레이어에서 신호 전파를 여전히 방해할 수 있다는 문제가 있다. 이후 ResNet 연구진은 ResNet v2를 만들었다.

ResNet v2에서는 $F(x) + x$ 를 한 직후에는 아무것도 건드리지 않고 그냥 내버려두는 방식이다. (ReLU로 씌우지 않음.) 즉, 더하기 직후의 ReLU를 지워버림으로써 원본 신호 x가 아무런 방해(손상) 없이 다음 레이어로 깨끗하게 통과할 수 있게 된다.

Skip Connection x에 어떤 연산도 개입하지 않아 신호가 훼손 없이 순전파, 역전파를 수행하게 된다. <- 이것을 순수 항등 매핑(Pure Identity Mapping)이라고 한다.

수식으로 보자면 다음과 같다.

ResNet v1 같은경우 출력 = $\text{ReLU}( F(x) + x )$ 이다.

$x$를 아무리 손대지 않고 깨끗하게 보내줬어도, 마지막에 $\text{ReLU}$가 $F(x) + x$ 전체를 감싸고 있어서 음수 부분이 나오면 0으로 깎아버리고 결국 원본 $x$까지 잘려나가며 손상된다.

ResNet v2 같은 경우 출력 = $F(x) + x$ 이다.

더한 직후에 아무런 함수도 씌우지 않기 때문에, 원본 $x$는 깎이거나 왜곡되는 일 없이 $F(x) + x$ 형태 그대로 다음 레이어로 깨끗하게 전달된다.

이때 F(x) 안에는 합성곱(Conv) -> BN -> ReLU 과정이 들어가있는 형태이다.

그래서 ResNet v1 같은 경우

\[\text{ReLU}\Big(\underbrace{\text{ReLU}\Big(\text{BN}\big(\text{Conv}(x)\big)\Big)}_{F(x)} + x\Big)\]

인데, v2 같은 경우는 맨 바깥쪽 ReLU를 없애고, 연산 순서를 BN -> ReLU -> Conv 순으로 바꾸었다.

\[\text{v2 연산식: } \text{Conv}\Big(\text{ReLU}\big(\text{BN}(x)\big)\Big) + x\]

그래서 위 식이 되었고, 배치 정규화(BN)가 합성곱 연산 바로 직전에 위치하게 된다.

배치 정규화 BN은 전체 데이터가 아니라 학습 시 무작위로 섞이는 작은 데이터 묶음(미니 배치) 단위로 데이터의 평균과 분산을 구해 값을 정규화하는것인데, 이때 어떤 데이터들이 이 미니 배치에 들어가느냐에 따라 매번 계산되는 평균과 분산이 조금씩 달라지게 된다. 이로인해서 정규화된 값에는 매 학습 단계마다 미세한 오차(노이즈) 가 포함되게 된다.

ResNet v1에서는 합성곱 연산을 먼저 수행한 후에 배치 정규화를 적용했기 때문에, 합성곱 레이어 자체는 이전 레이어에서 덧셈과 활성화 함수를 거치며 정돈되지 않은 데이터를 직접 입력받았다.

하지만 ResNet v2에서는 합성곱 연산을 수행하기 바로 직전에 배치 정규화가 위치하기 때문에 모든 합성곱 레이어가 연산을 시작하는 순간, 평균 0과 분산 1로 일정하게 정돈되었으면서도 미니배치 단위의 미세한 노이즈가 직접 섞인 입력값을 받게 된다.

합성곱 레이어의 가중치(파라미터)들이 학습할 때, 항상 똑같은 패턴의 데이터만 보는 것이 아니라 매번 정규화된 상태에서 약간의 노이즈가 섞인 데이터를 입력받아 학습하게 되기 때문에 모델의 가중치들은 특정 훈련 데이터의 미세한 특징이나 잔여 값에 과도하게 적응(과적합)하지 못하게 되는 효과를 얻게 된다. <- 이것을 Regularization 효과라고 한다.

dense prediction 확장

또한 ResNet v2는 이미지 분류(Image Classification)의 성능을 높이는 것에서 그치지 않고, Dilated Convolution과 identity initialization 등의 기법을 결합하여 이미지 내 모든 픽셀 단위로 정밀한 예측을 수행하는 Dense Prediction(밀집 예측)(e.g. Object Detection, Semantic Segmentation 등) 에서도 높은 성능을 보였다.

Dilated Convolution

Dilated Convolution은 기존 합성곱 필터의 원소들 사이에 일정한 간격을 비워두고 연산을 수행하는 기법이다.

일반적인 3 x 3 합성곱 필터는 입력 데이터의 연속된 3 x 3 격자 픽셀을 직접 참조하여 곱셈 연산을 수행한다. 이때 dilated convolution은 dilation rate 라는 수치에 따라 필터 원소 간의 거리를 넓힌다.

dilation late가 1일 때는 일반 3 x 3 커널과 동일하지만, dilation late가 2로 설정하면 필터 원소 사이에 칸을 하나씩 비워 5 x 5 크기의 공간 영역에 걸쳐 연산을 적용한다. dilation late 를 4로 올리면 9 x 9 크기의 공간 영역을 참조하게 된다.

dilated convolution의 장점은 첫번째로 실제 계산에 참여하는 가중치(파라미터)의 개수를 여전히 9개(3 x 3)로 고정되므로 연산량과 메모리 사용량이 늘어나지 않는다는 점이고, 두번째로 입력 데이터의 해상도를 줄이는 pooling이나 stride 연산을 사용하지 않고도 모델이 한 번에 참조하는 연산 범위를 크게 확장할 수 있다.

참고로 Stride는 합성곱 필터(커널)가 이미지를 훑으며 이동할 때 몇 간씩 건너뛰며 움직일 지를 나타내는 이동 간격이며, pooling은 일정 영역 안에서 가장 대표적인 값 하나만 뽑아내어 데이터 크기를 줄이는 축소 연산이다. (e.g. max pooling은 지정된 영역안에서 가장 큰 값 하나만 남기고 나머지를 버림. <- 가장 강한 특징만 남김.)

따라서 픽셀의 정밀한 위치 정보와 원본 해상도를 유지해야 하는 세그멘테이션 과제에서 매우 유용하게 활용한다.

Identity Initialization

identity initialization은 가중치 필터의 초기 숫자들을 특정한 방식으로 설정하여 학습 시작 직후 레이어의 출력을 입력값과 똑같이 만들어 주는 기법이다.

보통 신경망을 처음 학습시킬 때는 가중치 수치들을 임의의 난수로 채워 넣는데, dilated convolution 레이어 처럼 연산 범위가 넓은 레이어를 수십 개 연속으로 쌓은 상태에서 난수로 학습을 시작하면 문제가 발생한다. 첫 순전파 연산부터 입력 데이터 수치들이 엉뚱한 숫자로 뒤섞이고, 이에 따라 역전파 과정에서 전달되는 기울기 수치도 상쇄되거나 마비되어 가중치가 제대로 업데이트되지 않는다.

identity initialization은 가중치 행렬을 설정할 때 자신과 동일한 위치의 채널로 연결되는 수치만 1로 두고 나머지 수치는 모두 0으로 설정한다. 이 설정으로 인해 첫 연산 실행 시 각 레이어의 출력값은 $1 \times x + 0 = x$가 된다. 즉, 가중치 필터를 통과하더라도 입력 신호 x가 아무런 변경 없이 그대로 다음 레이어로 복사되어 전달된다.

이렇게 초기 설정을 해두면 수십 개의 dilated convolution 레이어를 통과하더라도 초기 순전파 신호가 왜곡되지 않으며, 역전파 시에 기울기 신호 역시 차단되지 않고 초기 레이어까지 안정적으로 전달된다.

결과적으로 각 레이어는 입력 데이터 전체를 처음부터 새로 만드는 연산을 배울 필요 없이 x라는 기본값에 조금씩 더해지거나 빼져야 할 미세한 오차 수치(Residual)만 경사하강법으로 수정해 나가면 되므로 깊은 연산 구조에서도 학습이 정체되지 않고 안정적으로 수렴하게 된다.

Tags:

Categories:

Updated:

Leave a comment