경사하강법

연·2025년 7월 28일

just공부

목록 보기
34/47

미분을 어디에 쓸까?

미분은 함수 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)=lim⁡h→0f(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+2y−sin⁡(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)=lim⁡h→0f(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개의 댓글