Gradient Descent Algorithm

chelseey·2025년 4월 25일

Step size α (학습률)

  • 학습률이 너무 작으면
    매 반복마다 이동 폭이 작아, 최솟값 도달에 너무 오래 걸림

  • 학습률이 적절하면
    매 반복마다 충분히 크게 이동하되
    최솟값을 지나치지 않아 빠르고 안정적으로 수렴

  • 학습률이 너무 크면
    한 번에 너무 크게 이동해 최솟값을 뛰어넘고 반대쪽으로 튕겨 나와,
    오히려 오차가 증가하거나 발산

Batch gradient descent

손실 함수 J(θ)를 최소화하기 위해 매 반복마다
전체 훈련 샘플을 사용해 파라미터를 한 번에 갱신하는 방법

Stochastic gradient descent (SGD)

매번 전체 데이터 m개를 모두 사용하지 않고
1개씩 샘플을 뽑아 파라미터를 갱신하는 방법

sample에서 random하게 1개를 선택

Mini-batch SGD

학습 데이터를 b개씩 묶음(mini batch)으로 나누고,
각 미니배치마다 gradient를 계산해 파라미터를 갱신하는 방법

  • SGD보다 gradient 추정이 덜 요동침

  • Batch-GD보다는 적은 연산으로
    더 자주 파라미터를 갱신하기 때문에 비교적 빠르게 수렴

Limitation : Local Optimum

  • Local Optimum
    주변에서는 최솟값이지만 전역 최솟값보다는 높음
  • Global Optimum
    전체 영역에서 가장 낮은 곳(진짜 최솟값)

Critical point(임계점)
θJ(θ)=0\nabla_\theta J(\theta) = 0 지점(평탄한 지역)에서는
기울기가 0이라 더 내려갈 방향을 찾을 수 없음
→ 이 지점이 꼭 global minimum이 아닐 수 있음

Some ideas to avoid local minimum

Method of momentum

이전 스텝에서 움직인 방향과 크기를 기억해 뒀다가,
일관된 방향으로는 더 세게 밀어 주고,
갑작스런 기울기 변화(잡음)에는 덜 민감하도록 갱신하는 기법

관성(속도) 변수 vtv_t 정의

vt={g1,t=1,ρvt1+(1ρ)gt,t>1.v_t = \begin{cases} g_1, & t = 1, \\ \rho v_{t-1} + (1 - \rho) g_t, & t > 1. \end{cases}

gt=θJ(θt1)g_t = \nabla_\theta J(\theta_{t-1}) : t번째 스텝의 관측된(현재) 기울기
ρ[0,1)ρ∈[0,1) : 과거 속도를 얼마나 유지할지 결정하는 smoothing factor

→ 지나온 기울기를 물리적 관성처럼 기억해 두었다가,
지금 기울기와 합쳐서 파라미터를 업데이트

vt=ρkvtk+(1ρ)[gt+ρgt1++ρk1gtk+1]v_t = \rho^k v_{t-k} + (1 - \rho) [g_t + \rho g_{t-1} + \cdots + \rho^{k-1} g_{t-k+1}]

파라미터 업데이트

θt=θt1αvt,\theta_t = \theta_{t-1} - \alpha v_t,

momentum의 효과

  • 곡률이 높은 축(steep 방향)에서
    과거 기울기를 계속 누적해 더 크게 이동 → 진동 완화
  • 완만한 축(flat 방향)에서
    누적된 관성 덕분에 속도가 붙어서 더 빠르게 수렴

Nesterov Momentum

현재 위치(θₜ)가 아니라
관성을 더해 미리 이동한 위치(θₜ + ρ·vₜ)에서 기울기를 계산

관성을 더해 이동위치(lookahead)에서 기울기를 구하기 때문에,

  • 경사가 바뀌는 지점(최솟값 직전 등)을 좀 더 정확히 포착
  • 관성의 과도한 관성화(over-shoot)를 줄여 빠르게 수렴

overshoot : 과도한 관성으로 최솟값을 지나쳐버리는 것

파라미터 업데이트

vρvtαJ(θt+ρvt)v \leftarrow \rho v_t - \alpha \nabla J(\theta_t + \rho v_t)
θθ+v\theta \leftarrow \theta + v

per-parameter adaptive learning rates

각 파라미터(θₖ)마다 학습률(α)을 자동으로 조절해 주는 기법

AdaGrad

각 파라미터별로 지금까지의 그래디언트 제곱합을 누적(accumulate)

sksk+(gk)2s_k \leftarrow s_k + (g_k)^2
  • gradient가 자주 크게 튀는 방향의 학습률을 작게,
  • 거의 변동이 없는 방향의 학습률을 크게 조정

단점 :
→ 제곱합이 계속 누적되며 분모가 계속 커져서, 학습률이 결국 거의 0에 수렴
→ 더 이상 학습 못 함

RMSProp

AdaGrad 의 학습률이 무한히 작아지는 문제를 해결하기 위해
과거 그래디언트 제곱합을 최신 값에 더 큰 가중치(weight)를 두고 오래된 값은 지수적으로 작아지게 계산

  • 매 스텝마다 현재 그래디언트 제곱 gt2g_t^2 를 계산하고,
  • 이전까지 유지하던 평균값 st1s_{t−1}을 감쇠 계수 β만큼 보존한 뒤,
  • 새로 들어온 값에는 (1−β)만큼 가중치를 줘서 더함
    st=βst1+(1β)gt2s_t = \beta s_{t-1} + (1 - \beta) g_t^2

Adam (Adaptive Moment Estimation)

RMSProp + momentum

Learning rate scheduling

학습률을 점진적으로 감소시켜야함

  • 초반 빠른 수렴
    학습 초반엔 큰 학습률(α)이 모델을 빠르게 좋은 영역으로 이동시킴
  • 후반 미세 조정
    학습이 진행될수록 학습률이 너무 크면 발산하거나 진동(oscillation)

학습률을 시간 t에 따라 조정하는 스케줄링 함수

  • 지수 감쇠 (Exponential decay)

    α(t)=α0ekt\alpha(t) = \alpha_0 e^{-kt}

    매 스텝(epoch)마다 ekte^{-kt}만큼 곱해 감소
    k가 크면 빠른 감쇠, 작으면 완만한 감쇠

  • 역시간 감쇠 (Inverse time decay)

    α(t)=α01+kt\alpha(t) = \frac{\alpha_0}{1 + kt}

    시간이 지날수록 분모가 커져 학습률이 점진적으로 작아짐
    후반부엔 매우 완만한 감소 곡선

Some optimization in regression to avoid overfitting

• 모델 복잡도
특성(feature)의 개수가 늘어나면,
그만큼 회귀모델의 파라미터(회귀 계수) 수도 증가
→ 파라미터 수가 많아지면 모델은 더 복잡해짐

과적합을 방지하기 위한 최적화 기법

Reduce number of features

모델에 넣는 입력 변수(feature)의 개수를 줄여서,
학습해야 할 파라미터 수를 감소시킴

정규화 (Regularization)

모든 특성을 유지하되, 회귀 계수(θ)의 크기에 패널티를 줘서
불필요하게 큰 값으로 학습되는 것을 억제

노이즈에 덜 민감 → 일반화 성능 향상

J(θ)=12mi=1m(hθ(x(i))y(i))2MSE+λ2mj=1nθj2L2 패널티J(\theta) = \frac{1}{2m} \underbrace{\sum_{i=1}^{m} (h_\theta(x^{(i)}) - y^{(i)})^2}_{\text{MSE}} + \frac{\lambda}{2m} \underbrace{\sum_{j=1}^{n} \theta_j^2}_{\text{L2 패널티}}

λ (regularization parameter):
크면 → 계수값을 더 강하게 억제 → 모델이 단순해짐
작으면 → 패널티 약화 → 일반 회귀와 비슷

0개의 댓글