머신러닝 & 딥러닝/딥러닝

[AI 기초 다지기] 스탠포드 대학 딥러닝 기초(2) - Optimization: Stochastic Gradient Descent & Backpropagation, Intuitions

Haru_29 2024. 11. 5. 20:54

Optimization: Stochastic Gradient Descent

 

1. 개요

머신러닝에서 최적화는 모델의 성능을 향상시키는 핵심 과정입니다. 이 글에서는 이미지 분류 문제를 예시로 들어 최적화 과정을 설명하겠습니다.

 

핵심 구성요소

  1. 점수 함수(Score Function): 입력 이미지를 클래스 점수로 매핑 (예: 선형 함수)
    • f(xi,W) = Wxi
  2. 손실 함수(Loss Function): 예측값과 실제값의 차이를 측정
    L = (1/N) * ∑i∑j≠yi[max(0,f(xi;W)j−f(xi;W)yi+1)] + αR(W)
  3. 최적화(Optimization): 손실 함수를 최소화하는 매개변수 W를 찾는 과정

 

2. 손실 함수 시각화

  • 고차원 공간에서 정의되는 손실 함수
  • CIFAR-10의 경우: 가중치 행렬 W는 [10 x 3073] 크기 (30,730개 매개변수)
  • 1차원 또는 2차원 단면으로 시각화 가능

 

3. 최적화 전략

 

3.1 무작위 탐색(Random Search)

bestloss = float("inf")
for num in range(1000):
    W = np.random.randn(10, 3073) * 0.0001
    loss = L(X_train, Y_train, W)
    if loss < bestloss:
        bestloss = loss
        bestW = W
  • 장점: 구현이 간단함
  • 단점: 비효율적이고 성능이 좋지 않음

 

3.2 지역 무작위 탐색(Random Local Search)

  • 현재 위치에서 무작위 방향으로 작은 스텝
  • 더 나은 결과를 얻을 경우에만 이동

 

3.3 경사하강법(Gradient Descent)

  • 그래디언트(기울기) 방향으로 이동
  • 수치적 방법과 해석적 방법으로 계산 가능

 

수치적 그래디언트 계산

df(x)/dx = lim(h→0) [f(x+h) - f(x)] / h
 

미니배치 경사하강법

while True:
    data_batch = sample_training_data(data, 256)
    weights_grad = evaluate_gradient(loss_fun, data_batch, weights)
    weights += - step_size * weights_grad

 

4. 주요 고려사항

 

4.1 학습률(Step Size) 선택

  • 너무 작으면: 안정적이지만 느린 학습
  • 너무 크면: 빠른 학습이 가능하지만 발산 위험

 

4.2 배치 크기 선정

  • 일반적으로 32, 64, 128 등 2의 제곱수 사용
  • 메모리 제약과 계산 효율성 고려

 

5. 결론

  • 최적화는 반복적인 개선 과정
  • 그래디언트는 가장 가파른 하강 방향을 제시
  • 실제 구현에서는 해석적 그래디언트 사용 + 수치적 검증
  • 미니배치 처리로 계산 효율성 향상

 

 

Backpropagation, Intuitions

 

1. 역전파란?

역전파는 체인룰(연쇄법칙)을 재귀적으로 적용하여 그래디언트를 계산하는 방법입니다. 신경망을 이해하고 개발하는데 필수적인 개념입니다.

 

핵심 문제

  • 입력 벡터 x가 주어졌을 때 함수 f(x)의 그래디언트 ∇f(x)를 계산하는 것
  • 신경망에서 f는 손실 함수(L)이고, x는 훈련 데이터와 가중치로 구성

 

2. 단순 표현식과 그래디언트 해석

기본 연산의 편미분

1. 곱셈: f(x,y) = xy

∂f/∂x = y
∂f/∂y = x

2. 덧셈: f(x,y) = x + y

 
∂f/∂x = 1 ∂f/∂y = 1

3. max 연산: f(x,y) = max(x,y)

∂f/∂x = 1 (x >= y인 경우) ∂f/∂y = 1 (y >= x인 경우)

 

3. 복합 표현식과 연쇄법칙

예제: f(x,y,z) = (x+y)z

# 순전파
q = x + y
f = q * z

# 역전파
dfdz = q      # df/dz
dfdq = z      # df/dq
dqdx = 1.0    # dq/dx
dqdy = 1.0    # dq/dy
dfdx = dfdq * dqdx  # 연쇄법칙
dfdy = dfdq * dqdy  # 연쇄법칙

 

4. 시그모이드 함수 예제

시그모이드 뉴런의 수식

f(w,x) = 1 / (1 + e^-(w0x0 + w1x1 + w2))

시그모이드 함수의 미분

σ(x) = 1 / (1 + e^-x)
dσ(x)/dx = σ(x)(1 - σ(x))

 

5. 실전 역전파: 단계별 계산

주요 원칙

  1. 순전파 값 캐싱
  2. 분기점에서 그래디언트 더하기
  3. 모듈화된 계산

기본 연산자의 역전파 패턴

  1. 덧셈 게이트
    • 입력으로 그래디언트를 동일하게 분배
  2. max 게이트
    • 더 큰 값을 가진 입력으로만 그래디언트 전달
  3. 곱셈 게이트
    • 입력값을 서로 바꾸고 그래디언트와 곱함

 

6. 벡터화된 연산의 그래디언트

행렬 곱셈의 그래디언트

# 순전파
W = np.random.randn(5, 10)
X = np.random.randn(10, 3)
D = W.dot(X)

# 역전파
dD = np.random.randn(*D.shape)
dW = dD.dot(X.T)
dX = W.T.dot(dD)

 

실용적인 팁

  1. 차원 분석을 활용한 그래디언트 계산
  2. 작은 예제로 시작하여 일반화
  3. 계산을 단계별로 나누어 처리
  4. 중간 결과 저장하여 재사용

 

결론

  • 역전파는 신경망 학습의 핵심 메커니즘
  • 복잡한 함수를 단순한 연산으로 분해하여 처리
  • 실제 구현에서는 모듈화와 벡터화가 중요
  • 직관적 이해와 실용적 구현 능력이 모두 필요