경사하강법

·2025년 7월 28일

just공부

목록 보기
34/41

미분을 어디에 쓸까?

미분은 함수 ff의 주어진 점(x,f(x))(x, f(x))에서의 접선의 기울기를 구한다.
한 점에서 접선의 기울기를 알면 어느 방향으로 점을 움직여야 함수값이 증가/감소하는지 알 수 있다.

  • 미분값을 더하면 경사상승법(gradient ascent)이라 하며, 함수의 극대값의 위치를 구할 때 사용한다.
    • 주어진 함수를 최대화시킬 때는 경사상승법을 사용한다.
  • 미분값을 빼면 경사하강법(gradient descent)이라 하며, 함수의 극소값의 위치를 구할 때 사용한다.
    • 주어진 함수를 최소화할 때는 경사하강법을 사용한다.

경사상승/경사하강 방법은 극값에 도달하면 움직임을 멈춘다.
극값에서는 미분값이 0이므로 더이상 update가 안되기 때문에 목적함수 최적화가 자동으로 끝나게 된다.

경사하강법: 알고리즘

# Input: gradient, init, lr, eps
# Output: var
# gradient : 미분을 계산하는 함수
# init: 시작점, lr: 학습률, eps : 알고리즘 종료조건

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)x - \lambda f(x)을 계산하는 부분
    lr은 학습률로서 미분을 통해 업데이트하는 속도를 조절한다.
  • grad = gradient(var) : 종료조건이 성립하기 전까지 미분값을 계속 업데이트한다.

변수가 벡터이면?

미분(differentiation)은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로 최적화에서 가장 많이 사용하는 기법이다.
벡터가 입력인 다변수 함수의 경우 편미분(partial difference)을 사용한다.

xif(x)=limh0f(x+hei)f(x)h\partial_{x_i} f(\mathbf{x}) = \lim_{h \to 0} \frac{f(\mathbf{x} + h \mathbf{e}_i) - f(\mathbf{x})}{h}
  • eie_i는 i번째 값만 1이고 나머지는 0인 단위벡터이다.
f(x,y)=x2+2xy+3+cos(x+2y)xf(x,y)=2x+2ysin(x+2y)f(x, y) = x^2 + 2xy + 3 + \cos(x + 2y) \\ \partial_x f(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)=limh0f(x+hej)f(x)h\partial_{x_j} f(\mathbf{x}) = \lim_{h \to 0} \frac{f(\mathbf{x} + h \mathbf{e}_j) - f(\mathbf{x})}{h}

↓ Gradient 정의

f=(x1f,x2f,,xdf)\nabla f = \left( \partial_{x_1} f, \partial_{x_2} f, \cdots, \partial_{x_d} f \right)
  • \nabla 기호는 nabla 또는 del 기호라고 부른다.
  • 앞서 사용한 미분값인 f(x)f(x) 대신 벡터 f\nabla f를 사용하여 변수 x=(x1,...,xd)x=(x_1, ..., x_d)를 동시에 업데이트 가능하다.

그레디언트 벡터가 뭐에요?

함수 정의

f(x,y)=x2+2y2f(x, y) = x^2 + 2y^2
  • 3차원 곡면 형태로, 볼록한 접시 모양을 가진다.
  • 이 곡면의 가장 낮은 지점은 (x,y)=(0,0)(x,y) = (0,0)이다.
  • 이 함수는 xx축 방향보다 yy축 방향으로 더 가파르게 증가한다.
    • 계수가 2배 크기 때문이다.

그레디언트 벡트

f=(2x,4y)-\nabla f = -(2x, 4y)
  • 그레디언트 벡터는 함수 값이 가장 빠르게 증가하는 방향을 가리킨다.
  • 반대로 경사하강법(gradient descent)은 그 반대 방향인 f-\nabla f로 이동한다.
  • 각 점 (x,y,z)(x,y,z)공간에서 f(x,y)f(x,y) 표면을 따라 f-\nabla f벡터를 그리면 이렇게 그려진다.

경사하강법: 알고리즘

# Input: gradient, init, lr, eps
# Output: var
# gradient : 그레디언트 벡터를 계산하는 함수
# init: 시작점, lr: 학습률, eps: 알고리즘 종료조건

var = init
grad = gradient(var)
while(norm(grad) > eps):
	var = var - lr * grad
    grad = gradient(var)
  • 경사하강법 알고리즘은 그대로 적용된다.
    그러나 벡터는 절대값 대신 노름(norm)을 계산해서 종료조건을 설정한다.

REFERENCE

profile
Whatever I want | Interested in DFIR, Security, Infra, Cloud

0개의 댓글