move84

머신러닝: 기울기 소실 문제 본문

머신러닝

머신러닝: 기울기 소실 문제

move84 2025. 4. 14. 22:45
반응형

기울기 소실(Vanishing Gradient) 문제는 심층 신경망 학습 시 발생하는 대표적인 어려움 중 하나이다. 이 문제는 신경망의 깊이가 깊어질수록, 초기 레이어에서 학습이 제대로 이루어지지 않아 전체 모델의 성능 저하를 야기한다. 본 포스트에서는 기울기 소실 문제의 원인과 해결 방안에 대해 자세히 알아본다.


🤔 기울기 소실 문제란?
기울기 소실 문제는 신경망의 역전파 과정에서 발생한다. 역전파는 손실 함수의 기울기를 계산하여 각 레이어의 가중치를 업데이트하는 과정인데, 기울기가 뒤쪽 레이어에서 앞쪽 레이어로 전달될 때 점차 작아지는 현상을 말한다. 특히 활성화 함수로 시그모이드(Sigmoid)나 하이퍼볼릭 탄젠트(Tanh) 함수를 사용하는 경우, 입력값이 특정 범위에서 벗어나면 기울기가 0에 가까워져 기울기 소실이 더욱 심화된다.


😫 기울기 소실의 원인
기울기 소실의 주요 원인은 다음과 같다.

  1. 활성화 함수: 시그모이드(Sigmoid) 함수는 입력값이 매우 크거나 작을 때 기울기가 0에 가까워진다. 예를 들어, 시그모이드 함수의 미분 값은 최대 0.25이므로, 여러 레이어를 거치면서 기울기가 계속 곱해지면 급격히 작아진다.
  2. 깊은 신경망 구조: 신경망의 레이어가 깊어질수록 기울기가 여러 번 곱해지면서 소실될 가능성이 커진다. 각 레이어에서 기울기가 조금씩 감소하더라도, 레이어가 많아지면 전체적인 기울기 감소는 매우 커진다.
  3. 잘못된 초기 가중치: 초기 가중치가 너무 크거나 작은 경우, 활성화 함수의 출력값이 포화되어 기울기 소실을 유발할 수 있다.

💡 기울기 소실 해결 방안

  1. ReLU (Rectified Linear Unit) 활성화 함수 사용: ReLU 함수는 입력값이 0보다 작으면 0을 출력하고, 0보다 크면 입력값을 그대로 출력한다. ReLU 함수의 미분 값은 0 또는 1이므로, 기울기 소실 문제를 완화할 수 있다. 하지만 ReLU 함수도 입력값이 음수일 때 기울기가 0이 되는 Dying ReLU 문제가 발생할 수 있다.
  2. Leaky ReLU, Parametric ReLU (PReLU) 사용: Leaky ReLU와 PReLU는 ReLU 함수의 Dying ReLU 문제를 해결하기 위해 제안되었다. Leaky ReLU는 입력값이 음수일 때 아주 작은 기울기를 가지도록 설계되었고, PReLU는 음수 영역에서의 기울기를 학습 가능한 파라미터로 설정한다.
  3. 배치 정규화 (Batch Normalization): 배치 정규화는 각 레이어의 입력값을 평균이 0, 분산이 1이 되도록 정규화하는 기법이다. 이를 통해 기울기가 너무 커지거나 작아지는 것을 방지하고, 학습 속도를 향상시킬 수 있다. 배치 정규화는 각 미니 배치(mini-batch) 단위로 평균과 분산을 계산하여 정규화를 수행한다.
  4. Skip Connection (Residual Connection): Skip Connection은 ResNet에서 제안된 기법으로, 특정 레이어의 입력을 몇 개의 레이어를 건너뛰어 더 깊은 레이어에 직접 전달하는 방식이다. 이를 통해 기울기가 소실되지 않고 효과적으로 전달될 수 있도록 돕는다.
  5. 올바른 가중치 초기화: Xavier 초기화나 He 초기화와 같은 방법을 사용하여 초기 가중치를 적절하게 설정하면, 기울기 소실 문제를 완화할 수 있다. Xavier 초기화는 입력과 출력의 크기를 고려하여 가중치를 초기화하고, He 초기화는 ReLU 함수를 사용하는 경우에 적합하도록 설계되었다.

import numpy as np

# Sigmoid 함수
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# Sigmoid 함수 미분
def sigmoid_derivative(x):
    return sigmoid(x) * (1 - sigmoid(x))

# ReLU 함수
def relu(x):
    return np.maximum(0, x)

# ReLU 함수 미분
def relu_derivative(x):
    return np.where(x > 0, 1, 0)

# 예시: 시그모이드 함수를 사용한 신경망 레이어의 기울기 소실 확인
input_value = np.array([5.0])  # 큰 입력값
output_value = sigmoid(input_value)
derivative_value = sigmoid_derivative(input_value)

print(f"입력값: {input_value}")
print(f"시그모이드 출력값: {output_value}")
print(f"시그모이드 미분값: {derivative_value}")

# 예시: ReLU 함수를 사용한 경우
input_value = np.array([-1.0, 0.0, 1.0])
output_value = relu(input_value)
derivative_value = relu_derivative(input_value)

print(f"입력값: {input_value}")
print(f"ReLU 출력값: {output_value}")
print(f"ReLU 미분값: {derivative_value}")

코드 설명:

  • sigmoid(x): 시그모이드 함수를 구현한다.
  • sigmoid_derivative(x): 시그모이드 함수의 미분을 구현한다. 시그모이드 함수의 미분은 입력값이 클 때 0에 가까워지는 것을 확인할 수 있다.
  • relu(x): ReLU 함수를 구현한다.
  • relu_derivative(x): ReLU 함수의 미분을 구현한다. ReLU 함수의 미분은 입력값이 0보다 클 때 1, 0보다 작거나 같을 때 0이 된다.

본 포스트에서는 기울기 소실 문제의 원인과 해결 방안에 대해 살펴보았다. ReLU 활성화 함수, 배치 정규화, Skip Connection 등의 기법을 사용하여 기울기 소실 문제를 효과적으로 해결하고, 심층 신경망의 학습 성능을 향상시킬 수 있다.


주요 용어 정리

  • 기울기 소실 (Vanishing Gradient): 역전파 과정에서 기울기가 점차 작아지는 현상
  • ReLU (Rectified Linear Unit): 0보다 작은 값을 0으로 만들고, 0보다 큰 값은 그대로 출력하는 활성화 함수
  • 배치 정규화 (Batch Normalization): 각 레이어의 입력값을 정규화하는 기법
  • Skip Connection (Residual Connection): 레이어를 건너뛰어 입력을 전달하는 방식
  • Xavier 초기화 (Xavier Initialization): 입력과 출력 크기를 고려한 가중치 초기화 방법
  • He 초기화 (He Initialization): ReLU 함수에 적합한 가중치 초기화 방법
반응형