경사하강법 - 1

미분

미분의 정의

  • 미분(differentiation)은 변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구로 최적화에서 가장 많이 사용하는 기법
  • 미분은 변화율의 극한(limit)으로 정의

  • 미분을 손으로 계산하려면 일일이 h->0 극한을 계산해야 함
  • sympy.diff 을 활용하면 미분을 컴퓨터로 계산 가능

그림을 통한 이해

  • 미분은 함수 f의 주어진 점 (x, f(x)) 에서의 접선의 기울기를 구함
  • 미분을 계산하려면 함수의 모양이 매끄러워야(연속) 함

  • h를 0으로 보내면 (x, f(x))에서 접선의 기울기로 수렴

미분을 어디에 쓸까?

  • 한 점에서의 접선의 기울기를 알면 어느 방향으로 점을 움직여야 함수값이 증가 혹은 감소하는지 알 수 있음

    • 증가시키고 싶다면 미분값을 더함
    • 감소시키고 싶다면 미분값을 뺌

경사상승법

  • 미분값을 더하면 경사상승법(gradient ascent)이라 하며 함수의 극대값의 위치를 구할 때 이용(목적함수를 최대화 할 때 이용)

경사하강법

  • 미분값을 빼면 경사하강법(gradient descent)이라 하며 함수의 극소값의 위치를 구할 때 이용(목적함수를 최소화 할 때 이용)

변수가 하나일 때

알고리즘

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

var = init
grad = gradient(var)
while(abs(grad) > eps):
	var = var - lr * grad
    grad = gradient(var)
  • line 3: 컴퓨터로 계산할 때 미분이 정확히 0이 되는 것은 불가능
    • eps보다 작을 때 종료
  • line 4: 미분을 통해 업데이트하는 속도를 조절
  • line 5: 종료조건이 성립하기 전까지 미분값 업데이트

변수가 벡터일 때

  • 벡터가 입력인 다변수 함수인 경우 편미분(partial differentiation)을 사용

    • eie_i

  • 각 변수별로 편미분을 계산한 그레디언트(gradient) 벡터를 이용하여 경사하강/경사상승법에 사용 가능

    • \nabla 기호를 nabla라 부름
    • 벡터 f\nabla f를 사용하여 변수 x=(x1,...,xd)x = (x_1, ..., x_d)

그레디언트 벡터

  • 그레디언트 벡터 f(x,y)\nabla f(x, y)는 각 점 (x,y)(x, y)에서 가장 빨리 증가하는 방향으로 흐름
  • f-\nabla f(f)\nabla (-f)랑 같고 이는 각 점에서 가장 빨리 감소하게 되는 방향과 같음

알고리즘

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

var = init
grad = gradient(var)
while(norm(grad) > eps):
	var = var - lr * grad
    grad = gradient(var)
  • line 3: 벡터는 절대값 대신 노름(norm)을 계산해서 종료조건을 설정
    • eps보다 작을 때 종료
  • line 4: 미분을 통해 업데이트하는 속도를 조절
  • line 5: 종료조건이 성립하기 전까지 미분값 업데이트

좋은 웹페이지 즐겨찾기