2024.07.01
경사하강법을 공부합니다.
- 미분
- 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구
함수 f의 주어진 점 (x, f(x)) 에서의 접선의 기울기를 구함
- 미분
1
2
3
4
import sympy as sym
from sympy.abc import x
sym.diff(sym.poly(x**2 + 2*x + 3), x)
미분값을 빼면 경사하강법(gradient descent) => 함수값의 극소값의 위치를 구하고 극값에 도달하면 움직임을 멈춤
1
2
3
4
5
6
# 경사하강법 pseudo-code
var = init
grad = gradient(var)
while(abs(grad) > eps):
var = var - lr * grad
grad = gradient(var)
변수가 벡터인 다변수 함수의 경우, 편미분(partial differentiation) 사용
1
2
3
4
5
# i번째 방향에서의 변화율만 계산
import sympy as sym
from sympy.abc import x, y
sym.diff(sym.poly(x**2 + 2*x*y + 3) + sym.cos(x + 2*y), x)
즉, 각 변수 별로 편미분을 계산한 그레디언트 벡터를 사용함
-> 기차원 공간에서 벡터에 적용되는 경사하강법 사용
1
2
3
4
5
6
7
8
# 경사하강법 알고리즘 pseudo-code
# gradient: 그레디언트 벡터 계산 함수
# init: 시작점, lr: 학습률, eps: 알고리즘 종료조건
var = init
grad = gradient(var)
while(norm(grad) > eps):
var = var - lr * grad
grad = gradient(var)
무어-펜로즈 역행렬 이용 x => 경사하강법 이용하게 되면 선형모델이 아닌 다른 모델에도 이용 가능
목적식을 최소화 즉, \(L_2 norm = ||y - Xβ||_2\) 이를 최소화 하는 β 찾아야 함
- 경사하강법 기반 선형회귀 알고리즘
- 역행렬을 이용하지 않고 회귀계수 계산
1
2
3
4
5
for t in range(T):
error = y - X @ beta
grad = - transpose(X) @ error
beta = beta - lr * grad
# 학습률 lr, 학습횟수 T가 중요한 하이퍼파라미터
- 선형회귀
- 적절한 학습률과 학습횟수를 선택했을 때 수렴이 부장되어 있음 (미분가능, 회귀계수 β에 대해 convex한 함수이기 때문)
- 비선형회귀
- 목적식이 nonconvex할 수 있기 때문에 수렴이 항상 보장 x
- 확률적 경사하강법(stochastic gradient descent_SGD)
- 모든 데이터x, 데이터 일부(Mini-Batch) 활용해 업데이트
즉, 연산자원을 더 효율적으로 활용
볼록이 아닌(nonconvex) 목적식 => SGD를 통해 최적화(머신러닝 학습에 경사하강법보다 더 효율적)
따라서, 미니배치로 데이터를 쪼개면 병렬 연산이 가능해져 하드웨어 한계를 극복 가능할 수 있음
네이버 boostcourse의 인공지능 기초 다지기 강의를 참조함
This post is licensed under CC BY 4.0 by the author.