경사하강법 - 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)을 사용
- 는 i번째 값만 1이고 나머지는 0인 단위벡터
-
각 변수별로 편미분을 계산한 그레디언트(gradient) 벡터를 이용하여 경사하강/경사상승법에 사용 가능
- 기호를 nabla라 부름
- 벡터 를 사용하여 변수 를 동시에 업데이트 가능
그레디언트 벡터
- 그레디언트 벡터 는 각 점 에서 가장 빨리 증가하는 방향으로 흐름
- 는 랑 같고 이는 각 점에서 가장 빨리 감소하게 되는 방향과 같음
알고리즘
# 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: 종료조건이 성립하기 전까지 미분값 업데이트
Author And Source
이 문제에 관하여(경사하강법 - 1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yst3147/경사하강법-1저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)