미분을 어디에 쓸까?
미분은 함수 f의 주어진 점(x,f(x))에서의 접선의 기울기를 구한다.
한 점에서 접선의 기울기를 알면 어느 방향으로 점을 움직여야 함수값이 증가/감소하는지 알 수 있다.
- 미분값을 더하면 경사상승법(gradient ascent)이라 하며, 함수의 극대값의 위치를 구할 때 사용한다.
- 주어진 함수를 최대화시킬 때는 경사상승법을 사용한다.
- 미분값을 빼면 경사하강법(gradient descent)이라 하며, 함수의 극소값의 위치를 구할 때 사용한다.
- 주어진 함수를 최소화할 때는 경사하강법을 사용한다.
경사상승/경사하강 방법은 극값에 도달하면 움직임을 멈춘다.
극값에서는 미분값이 0이므로 더이상 update가 안되기 때문에 목적함수 최적화가 자동으로 끝나게 된다.
경사하강법: 알고리즘
var = init
grad = gradient(var)
while(abs(grad) > eps):
var = var - lr * grad
grad = gradient(var)
- 컴퓨터로 계산할 때 미분이 정확히 0이 되는 것은 불가능하기 때문에,
eps보다 작을 때 종료하는 조건이 필요하다.
var = var - lr * grad : x−λf(x)을 계산하는 부분
lr은 학습률로서 미분을 통해 업데이트하는 속도를 조절한다.
grad = gradient(var) : 종료조건이 성립하기 전까지 미분값을 계속 업데이트한다.
변수가 벡터이면?
미분(differentiation)은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로 최적화에서 가장 많이 사용하는 기법이다.
벡터가 입력인 다변수 함수의 경우 편미분(partial difference)을 사용한다.
∂xif(x)=h→0limhf(x+hei)−f(x)
- ei는 i번째 값만 1이고 나머지는 0인 단위벡터이다.
f(x,y)=x2+2xy+3+cos(x+2y)∂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)
- 각 변수별로 편미분을 계산한 그레디언트(gradient)벡터를 이용하여 경사하강/경사상승법에 사용할 수 있다.
↓ 편미분 정의
∂xjf(x)=h→0limhf(x+hej)−f(x)
↓ Gradient 정의
∇f=(∂x1f,∂x2f,⋯,∂xdf)
- ∇ 기호는 nabla 또는 del 기호라고 부른다.
- 앞서 사용한 미분값인 f(x) 대신 벡터 ∇f를 사용하여 변수 x=(x1,...,xd)를 동시에 업데이트 가능하다.
그레디언트 벡터가 뭐에요?

함수 정의
f(x,y)=x2+2y2
- 3차원 곡면 형태로, 볼록한 접시 모양을 가진다.
- 이 곡면의 가장 낮은 지점은 (x,y)=(0,0)이다.
- 이 함수는 x축 방향보다 y축 방향으로 더 가파르게 증가한다.
그레디언트 벡트
−∇f=−(2x,4y)
- 그레디언트 벡터는 함수 값이 가장 빠르게 증가하는 방향을 가리킨다.
- 반대로 경사하강법(gradient descent)은 그 반대 방향인 −∇f로 이동한다.
- 각 점 (x,y,z)공간에서 f(x,y) 표면을 따라 −∇f벡터를 그리면 이렇게 그려진다.
경사하강법: 알고리즘
var = init
grad = gradient(var)
while(norm(grad) > eps):
var = var - lr * grad
grad = gradient(var)
- 경사하강법 알고리즘은 그대로 적용된다.
그러나 벡터는 절대값 대신 노름(norm)을 계산해서 종료조건을 설정한다.
REFERENCE