이번 주제는 "경사하강법"을 다루고자 한다.
1. 미분(differentiaion) :변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로 최적화에서 가장 많이 사용하는 기법이다.
$f'(x)=\lim_{h\to0} \frac{f(x+h)-f(x)}{h}$
$f(x)=x^2+2x+3$ =>(미분) $f'(x)=2x+3$
1.1 다음과 같이 파이썬으로도 계산이 가능하다.
import sympy as sym
from sympy.abc import x
sym.diff(sym.poly(x**2+2*x+3),x)
# Poly(2*x+2,x,domain='ZZ')
1.2 미분의 용도
- 미분은 함수 $f$의 주어진 점 $(x,f(x))$에서의 접선의 기울기를 구한다.
- 한 점에서 접선의 기울기를 알면 어느 방향으로 점을 움직여야 함수값이 증가 또는 감소하는 지 알 수 있다.
- 미분값을 빼면 경사하강법(gradient descent)이라 하며 함수의 극솟값의 위치를 구할 때 사용한다.
- 미분값을 더하면 경사상승법(gradient ascent)이라 하며 함수의 극댓값의 위치를 구할 때 사용한다.
- 경사상승/경사하강 방법은 극값에 도달하면 움직임을 멈춘다.
1.3 경사하강법 알고리즘(1)
필요한 입력값은 gradient(미분을 계산하는 함수), init(시작점), lr(학습률), eps(알고리즘 종료조건)
var = init
grad = gradient(var)
while abs(grad>eps):
# 컴퓨터로 계산할 때 미분이 정확히 0이 되는 것은 불가능하므로 eps보다 작을 때 종료하는 조건이 필요하다
var = var - lr*grad
# $x-λf'(x)$을 계산하는 부분. lr은 미분을 통해 업데이트하는 속도를 조절한다.
grad = gradient(var)
# 종료조건이 성립하기 전까지 미분값을 계속 업데이트 한다.
1.4 벡터가 입력인 다변수 함수인 경우 편미분(partial differentiaion)을 사용한다.
$\partial _{x_i}f(x)=\lim_{h\to0} \frac{f(x+he_i)-f(x)}{h}$
※$e_i$는 $i$번째 값만 1이고 나머지는 0인 단위벡터
아래의 수식을 코드로 나타내면 다음과 같다.
$f(x,y) = x^2+2xy+3+cos(x+2y)$
$\partial_xf(x,y)=2x+2y-sin(x+2y)$
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)
# 2*x+2*y - sin(x+2*y)
1.5 각 변수별로 편미분을 계산한 gradient 벡터를 이용하여 경사하강/경사상승법에 사용할 수 있다.
$\nabla f=(\partial_{x_1}f,\partial_{x_2}f, ... ,\partial_{x_d}f)$
즉, $f'(x)$ 대신 벡터 $\nabla f$를 사용하여 변수 $x=(x_i,...,x_d)$를 동시에 업데이트가 가능하다.
1.6 경사하강법 : 알고리즘(2)
필요한 입력값은 gradient(그레디언트 벡터를 계산하는 함수), init(시작점), lr(학습률), eps(알고리즘 종료조건)
위의 알고리즘과 동일하나 벡터는 절댓값이 아닌 노름(norm)을 계산하여 종료조건을 설정한다.
var = init
grad = gradient(var)
while norm(grad)>eps:
# 컴퓨터로 계산할 때 미분이 정확히 0이 되는 것은 불가능하므로 eps보다 작을 때 종료하는 조건이 필요하다
var = var - lr*grad
# $x-λf'(x)$을 계산하는 부분. lr은 미분을 통해 업데이트하는 속도를 조절한다.
grad = gradient(var)
# 종료조건이 성립하기 전까지 미분값을 계속 업데이트 한다.
선형모델이 아닌 다른 모델을 사용하고 일반적인 기계학습 최적화를 시도할 때, 경사하강법 알고리즘을 활용한다고 한다.
2. 경사하강법
2.1 경사하강법 기반 선형회귀 알고리즘
이론적으로 경사하강법은 미분가능하고 볼록(convex)한 함수에 대해선 적절한 학습률과 학습횟수를 선택했을 때 수렴이 보장되어 있다. 특히, 선형회귀의 경우 목적식 $||y-X\beta||_2$은 회귀계수 $\beta$에 대해 볼록함수이기 때문에 알고리즘을 충분히 동작시키면 수렴이 보장된다.
그러나 비선형회귀 문제의 경우 목적식이 볼록하지 않을 수 있기 때문에 항상 수렴이 보장되진 않는다.
(※ 특히, 딥러닝을 사용하는 경우 목적식은 대부분 볼록함수가 아니다.)
3. 확률적 경사하강법(stochastic gradient descent)
- 모든 데이터를 사용해 업데이트하는 대신 데이터 한 개 또는 일부를 활용하여 업데이트하는 방식. 특히, 데이터 일부를 활용하는 것을 mini batch SGD이라고 한다.
- 확률적 경사하강법은 볼록이 아닌(non-convex) 목적식은 SGD를 통해 최적화 할 수 있다.
- SGD는 데이터의 일부를 가지고 파라미터를 업데이트하기 때문에, 연산자원을 좀 더 효율적으로 활용하는 데 도움이 된다.
'BoostCamp AI Tech - U Stage' 카테고리의 다른 글
| BoostCamp AI Tech - Day09 (0) | 2021.01.28 |
|---|---|
| BoostCamp AI Tech - Day08 (0) | 2021.01.27 |
| BoostCamp AI Tech - Day06 (0) | 2021.01.25 |
| BoostCamp AI Tech - Day05 (0) | 2021.01.22 |
| BoostCamp AI Tech - Day04 (0) | 2021.01.21 |
댓글