[DL] 6. 인공 신경망이 깊어질 때 발생하는 고질적 문제 (gradient vanishing & overfitting)

2024. 3. 19. 13:41ML/DL

인공 신경망을 무턱대고 깊게 만들면 크게 3가지 문제점이 발생한다.

1. Vanishing gradient (기울기 손실)

2. Overfitting (과적합)

3. loss landscape의 non-convexity 증가

 

1. Vanishing Gradient

layer가 많으면 입력층에 가까워질수록 미분이 점점 작아져 소멸된다.

 

이런 현상이 일어나는 대표적인 원인은 바로 sigmoid 함수다.

sigmoid 함수의 최대 기울기는 1/4이다.

역전파 시 전달되는 미분값에 꾸준히 1/4을 곱하기 때문에 점점 기울기가 소멸되는 것이다.

 

직관적으로 sigmoid 함수는 "입력이 출력에게 줄 수 있는 영향력이 최대 1/4"이다.

sigmoid 함수를 활성화 함수로 채택할 경우, 입력층 가중치가 첫 은닉층 출력에 줄 수 있는 영향력이 최대 1/4이고,

두번째 은닉층 출력에 줄 수 있는 영향력이 최대 1/16이 된다.

층을 거칠수록 줄 수 있는 영향력이 기하급수적으로 감소한다.

그러면, 입력층 가중치를 아무리 변화를 해봤자 loss에 영향을 거의 주지 못하기 때문에 학습이 거의 진행되지 않는다.

 

결론, 입력층에 가까워질수록 학습(=update)이 점점 이루어지지 않는다. 

 

모델 앞단에서 학습되지 않은 가중치가 신호($\approx$입력) 정보를 망쳐놓아 뒤에서 손 쓸 방법이 없다. underfitting 발생!


Vanishing Gradient 해결 방법 1: ReLU (Rectified Linear Unit)

ReLU는 linear function을 다음과 같이 정재한 함수다.

$$\text{ReLU}(x) = \begin{cases} x, & \mbox{ if } x > 0 \\ 0, & \mbox{ if } x \le 0 \end{cases}$$

 

양수인 경우 기울기가 1이기 때문에 활성화 함수에 의해서 기울기가 감소하는 상황은 발생하지 않는다.

물론, 음수면 사라지지만, 여러 개의 (해당 노드에서 다음 층 노드로 가는) path 중 양수가 존재하면 기울기는 손실되지 않는다.

즉, 층 별로 노드 개수가 많을수록 기울기 손실 가능성은 줄어든다.

 

이처럼, ReLU는 기울기 손실 문제를 해결해 여러 곳에서 sigmoid보다 학습이 더 잘됨을 보였다.

이로 인해, ReLU 자매품이 많이 생겨났다.

 

Vanishing Gradient 해결 방법 2: Batch Normalization & Layer Normalization

가중치 초기화 때 활성화값이 특정 부근에 쏠리면, 기울기 손실이 발생한다고 설명한 바 있다.

예를 들어, 활성화 함수가 ReLU 함수인 경우, 가중합이 음수에 쏠리면 기울기 손실이 발생한다.

 

위 문제는 "activations(=가중합, weighted sum)을 다음과 같이 고르게 재배치시켜" 해결할 수 있다.

$$\mu = {1 \over n} \sum_{i=1}^n x_{i}, \quad \sigma^2 = {1 \over n} (x_{i} - \mu)^2$$

$$\widehat x_{i} = {x_{i} - \mu \over \sqrt{\sigma^2 + \epsilon}} \rightarrow \widehat y_{i} = \gamma \hat x_{i} + \beta$$

 

$\gamma$(=scale)와 $\beta$(=shift)는 activations을 어디 중심으로 얼만큼 분산시킬 것인지 정하는 역할을 한다.

상황에 따라 적절한 normalization 방법(어디를 중심으로 얼만큼 분산시킬지)이 다르기 때문이다.

 

예를 들어, $\widehat x = {x - \mu \over \sigma}$ 방식으로 normalize하면,

ReLU는 non-linearity를 유지하지만, 절반 정도의 기울기 손실이 발생한다.

sigmoid는 기울기 손실을 방지하지만, non-linearity를 잃어간다.

 

이처럼, 상황에 따라 적절한 normalization 방법(어디를 중심으로 얼만큼 분산시킬지)이 다를 수 있다.

그러므로, 그에 맞는 적절한 normalization 방법($\gamma, \beta$)을 학습으로 찾아야 하며, 이를 학습으로 찾을 것이다.

다시 말해, non-linearity를 얼마나 유지할지, 기울기 손실을 얼마나 방지할지 사이의 trade-off를 학습으로 찾을 것이다.

 

추가로, BN의 자매품인 LN(=Layer Normalization)이 있다.

BN은 각 node(=dimension)의 batch activations 분포를 normalize하는 것인 반면,

LN은 각 layer의 node activations(=해당 layer에 속한 모든 node의 activations)분포를 normalize 하는 것이다.

그렇기 때문에, BN는 node마다 파라미터$(\gamma, \beta)$가 두 개 추가되는 반면, LN는 layer마다 파라미터$(\gamma, \beta)$가 두 개 추가된다.

수식으로 표현하면 다음과 같다.

 

BN: $j$번째 노드의 batch activations 분포$(x_{1j}, x_{2j}, \cdots, x_{nj})$ normalize$(\widehat y_{1j}, \widehat y_{2j}, \cdots, \widehat y_{nj})$

$$\mu_j = {1 \over n} \sum_{i=1}^n x_{ij}, \quad \sigma_j^2 = {1 \over n} (x_{ij} - \mu_j)^2$$

$$\widehat x_{ij} = {x_{ij} - \mu_j \over \sqrt{\sigma_j^2 + \epsilon}} \rightarrow \widehat y_{ij} = \gamma_j \hat x_{ij} + \beta_j$$

LN: 개별 layer의 노드 activations 분포$(x_{i1}, x_{i2}, \cdots, x_{im})$ normalize$(\widehat y_{i1}, \widehat y_{i2}, \cdots, \widehat y_{im})$ 

$$\mu_i = {1 \over n} \sum_{j=1}^m x_{ij}, \quad \sigma_i^2 = {1 \over m} (x_{ij} - \mu_i)^2$$

$$\widehat x_{ij} = {x_{ij} - \mu_i \over \sqrt{\sigma_i^2 + \epsilon}} \rightarrow \widehat y_{ij} = \gamma \hat x_{ij} + \beta$$

 

결론, BN와 LN는 non-linearity를 얼마나 유지할지, 기울기 손실을 얼마나 방지할지 사이의 trade-off를 $\gamma$와 $\beta$로 학습한다.


2. Loss landscape의 non-convexity 증가 & 해결 방법: skip-connection

Resnet(Deep Residual Learning for Image Recognition) 논문에서 ReLU와 BN로 기울기 손실 문제를 해결했음에도 불구하고 층을 높게 쌓으면 학습이 안되는 즉, underfitting이 발생하는 실험 결과를 관찰했다.

그 이유가 정확히 무엇인지 찾지 못했지만, 이를 skip-connection으로 어느 정도 해결했다.

skip-connection은 다음과 같이 입력($x_\text{in}$)이 layer($F$)를 건너뛰어 출력($f(x_\text{in})$)과 더해지는 구조($f(x_\text{in})+x_\text{in}$)를 일컫는다.

 

이후, Visualizing the loss landscape of neural nets "Advances in neural information processing systems 31 (2018) 논문에서 해당 의문에 관해 다음과 같이 주장했다.

 

층을 높게 쌓을수록 loss landscape의 non-convexity가 증가하기 때문에, 기울기가 하단까지 잘 전달되어도 학습이 안될 수 있다. 즉, underfitting이 발생할 수 있다.

이때, skip-connection를 모델에 추가해본 결과, loss landscape의 non-convexity를 감소한다 즉, loss landscape가 부드러워진다고 주장한다.

 

결론, ReLU와 BN로 기울기 손실 문제를 해결해도, loss landscape가 보다 복잡해져 학습이 안될 수 있이며, 이는 skip-connection으로 어느 정도 해소할 수 있다.

 

추가로, skip-connection은 상류에 있는 기울기를 하류로 그대로 보내기 때문에, 기울기 손실을 방지하는 역할도 수행한다고 볼 수 있다.


3. Overfitting

DNN은 입출력 간의 매우 복잡한 관계를 학습할 수 있는 매우 뛰어난 모델이다.

그렇기 때문에, 데이터가 부족하면 모델은 훈련 데이터의 노이즈나 우연한 패턴(=학습 데이터에 너무 편향된 패턴=암기 수준의 패턴)까지 학습해 실제 데이터에 존재하지 않은 복잡한 관계를 찾아 과대 적합을 발생시켜 일반화 성능을 저하시킬 수 있다.

 

여기서 말하는 과대 적합(=overfitting)은 모델이 학습 데이터셋에만 지나치게 최적화된 상태를 의미한다.

쉽게 말해, 학습 데이터의 성능만 매우 좋은데 테스트 데이터의 성능은 좋지 않은 상태다.

예상하셨다시피, 이 현상은 대표적으로 두 가지 원인에 의해 발생한다.

1. 모델이 매우 복잡한 경우, 2. 데이터셋이 작고 중복성이 높은 경우

 

Overfitting 해결 방법 1: 모델 단순화 (or 경량화)

모델을 매우 복잡하게 즉, 입출력 간의 관계를 복잡하게 생각해 과대 적합이 발생했을 수 있기 때문에,

입출력 간의 관계를 단순하게 만들어 모델을 단순화한다.

Overfitting 해결 방법 2: data augmentation

다양한 데이터를 더 수집하는 것이 가장 좋은 방법이긴 하지만,

그게 어렵다면 "기존 데이터를 인위적으로 조작해 약간의 변화를 주어 새로운 데이터를 생성"하는 방식으로 데이터 개수를 늘린다.

Overfitting 해결 방법 3: Dropout

Dropout은 "스텝마다 무작위로 노드를 일시적으로 drop(=제거)시키는 것"을 의미한다. (참고로, 각 노드는 $p$ 확률로 drop 여부가 결정된다.)

모델에 dropout을 적용한다는 것은 스텝마다 해당 모델에서 "얇은 모델(=thinned model)"을 sampling 하는 것과 같다.

더 나아가, dropout으로 모델을 학습시키는 것은 "가중치를 광범위하게 공유하는 $2^n$개의 thinned model을 동시에 학습시키는 것"과 동일하다고 볼 수 있다. 

 

만약 해당 노드의 dropout 확률이 $p$라면, 추론 때 해당 노드와 연결된 상단 파라미터에 $p$를 곱하여 $2^n$개의 thinned model의 평균 예측값과 매우 유사해 예측값을 가지도록 할 것이다.

 

눈치채셨듯이, dropout은 유사 앙상블 기법이다. 양상블 기법이란 "개별적으로 학습시킨 여러 모델의 출력을 평균내어 사용하는 방식"이다.

앙상블 기법은 여러 모델을 결합함으로써 개별 모델의 편향(=overfitting 방향)가 서로 상쇄되어 overfitting을 완화시킨다.


break-up co-adaptation

딥러닝에서 co-adaptation은 서로 다른 노드까리 상관 관계(=종속 관계)가 있을 때를 의미한다.

 

노드(=패턴)의 업데이트가 다른 노드(=패턴)의 실수(=오차)를 보완하는 방식으로 진행될 수 있고, 이로 인해 서로 의존적인(=종속적인) 관계를 가질 수 있다. 쉽게 말해, 각각의 패턴 역할 경계가 모호하다. (=각 패턴(=노드)의 역할 분담이 정확히 이루어지지 않고 있다.)

Dropout은 무작위로 노드(=패턴)를 drop할 수 있기 때문에, 노드가 다른 노드에 의존하는(=종속하는) 것을 방지해, 독자적인 패턴을 찾도록 유도할 것이다. 즉, 각각의 패턴 역할 경계가 분명하다. (=각 패턴(=노드)의 역할 분담이 정확히 이루어지고 있다.)

 

위 그림에서 볼 수 있듯이, dropout을 적용하면 역할 분담이 정확히 이루어지는 것을 확인할 수 있다. 다시 말해, co-adapation가 없어지는 것을 확인할 수 있다. 그리고, 아마 이것이 generalization-gap을 줄여주는 주요 요인일 것으로 추측된다.

 

추가로, Dropout의 자매품인 Dropconnect이 있으며, 이는 노드가 아닌 connections(=edge)를 drop하는 것이다.

 

 

모델이 특정 weight만 학습시키거나, 특정 weight에만 의존하는 경우(특정 노드의 값이 타 노드의 값보다 중요한 경우)가 생길 수 있으며, 이는 overfitting 발생 확률을 높인다.

dropout과 dropconnect은 overfitting을 방지하기 위해, "무작위로 노드 혹은 엣지를 drop해 모든 weight를 골고루 학습시켜 각자 독자적인 역할을 찾아 주는 기법"으로 해석할 수 있다.

Overfitting 해결 방법 4: Regularization (or weight decay)

일반적으로, 쓸데없이 가중치가 크면 overfitting이 발생할 확률이 높아진다.

학습 데이터셋에 지나치게 최적화되면 학습 데이터셋에 너무 편향된 패턴에 쓸데없이 높은 가중치를 부여할 확률이 높기 때문이다.

 

이를 위해, loss 함수에 regularization($\lVert \mathbf w \rVert_p^p$)을 추가해 "가중치가 쓸데없이 커지는 것"을 방지할 것이다.

$$L + \lambda \lVert \mathbf w \rVert_p^p$$

$\lambda$는 가중치 감소에 얼마나 큰 비중을 줄 것인지 조절하는 regularization의 hyper-parameter다. 

 

처음에는 $L$이 줄어드는데 방향에 집중하다가(=빨간선), 어느 정도 $L$이 줄어들었으면 $L$이 너무 커지지 않은 선에서 $\lVert \mathbf w \rVert_p^p$을 줄이는데 집중하는 것(=파란선)이 일반적인 학습 진행 과정이다.

 

그리고, $\lVert \mathbf w \rVert_p^p$ 중 $L1$-norm($\lVert \mathbf w \rVert_1^1$)과 $L2$-norm($\lVert \mathbf w \rVert_2^2$을 가장 많이 사용한다. 

$L1$-norm은 모든 가중치가 동일한 패널티를 가진다. 즉, 의미 없는 connection(=weight)을 없애는 효과가 있다. 반대로 말해, 중요한 connection(=weight)만 살린다. 

$L2$-norm은 가중치가 클수록 패널티가 커진다. 즉, 가중치 크기를 비슷하게 만드는 효과가 있다. 다른 말로, 최대한 많은 가중치를 활용하려고 한다.

 

regularization($L + \lambda \lVert \mathbf w \rVert_p^p$)은 prior distribution $p(\theta)$이다.

prior distribution $p(\theta)$가 정규 분포를 따른다고 가정하면, $\underset{\theta}{\text{argmax }}p(\theta)$을 $L2$-norm($\lVert \mathbf w \rVert_2^2$)으로 표현할 수 있다. 

뿐만 아니라, $p(\theta)$가 Laplace 분포를 따르다고 가정하면, $\underset{\theta}{\text{argmax }} p(\theta)$을 $L1$-norm($\lVert \mathbf w \rVert$)으로 표현할 수 있다.

 

그렇기 때문에, $L + \lambda \lVert \mathbf w \rVert_p^p$을 MAP(Maximize A Posteriori)로 바라볼 수 있다.

 

prior distribution가 $p(\theta)$이고 likelihood function가 $p(\mathbf x|\theta)$일 때 posteriori distribution $p(\theta|\mathbf x)$는 다음과 같이 전개된다.

$$\underset{\theta}{\text{argmax }} p(\theta|\mathbf x) = \underset{\theta}{\text{argmax }} {p(\mathbf x|\theta) p(\theta) \over p(\mathbf x)} = \underset{\theta}{\text{argmax }} p(\mathbf x|\theta) p(\theta) \quad (\text{because } p(\mathbf x) \text{ is not a function of } \theta)$$

$$\hat \theta = \underset{\theta}{\text{argmax }} p(\mathbf x|\theta) p(\theta)$$

$$\hat \theta = \underset{\theta}{\text{argmax }} \prod_{i=1}^n p(x_i|\theta) p(\theta)$$

$$\hat \theta = \underset{\theta}{\text{argmin }} -\log \sum_{i=1}^n p(x_i|\theta) + -\log p(\theta) = \underset{\mathbf w}{\text{argmax }} L + \lambda \lVert \mathbf w \rVert_p^p$$

 

(참고로, 잘못된 사전 정보 $p(\theta)$는 오히려 추정 성능에 악영향을 주기 때문에, 상황에 적절히 파악하여 그에 맞는 $p(\theta)$ 분포를 가설로 세워야 한다.)