변수의 움직임에 따른 함수값의 변화를 측정하기 위한 도구
# sympy.diff을 사용하면 컴퓨터로 미분을 계산할 수 있다.
import sympy as sym
from sympy.abc import x
sym.diff(sym.poly(x**2 + 2*x + 3), x)
미분값을 더하여 함수의 극대값의 위치를 구할 수 있다.
미분값을 빼서 함수의 극소값의 위치를 구할 수 있다.
이 방법들은 극값에 도달하면 움직임을 멈춘다.
# gradient: 미분 계산 함수
# init: 시작점, lr: 학습률, eps: 알고리즘 종료조건
var = init
grad = gradient(var)
# 컴퓨터로 계산할 때 미분이 정확히 0이 되는 것은 불가능
# eps보다 작을 때 종료하는 조건이 필요
while (abs(grad) > eps):
var = var - lr * grad
grad = gradient(var) # 업데이트
다변수 함수의 경우, 편미분(partial differentiation)을 사용한다.
import sympy as sym
from sympy.abc import x
sym.diff(sym.poly(x**2 + 2*x*y + 3) + sym.cos(x+2*y), x)
위 식은 변수들인 또는 로 편미분이 가능하다.
각 변수만큼 편미분을 계산하면 그레이디언트(gradient) 벡터를 구할 수 있다.
이로 경사하강, 경사상승법에 사용할 수 있다.
임의의 점에서 가장 빠르게 증가하는 방향
를 붙이면 각점에서 가장빨리 감소하게 되는 방향
다변수 함수에서 최소점을 찾는 코드
# gradient: 그레이디언트 벡터를 찾는 함수
var = init
grad = gradient(var)
while (norm(grad) > eps):
var = var - lr * grad
grad = gradient(var)
역행렬을 이용하지 않고 경사하강법을 이용해 적절한 선형모델 찾아보기
선형모델이 아닌 경우에도 경사하강법 사용가능!
이부분 진짜 모르겠다
for t in range(T):
error = y- X @ beta
grad =- transpose(X) @ error
beta = beta - lr * grad
# 지정된 시간동안 하고싶으면 T사용, 아니면 종료조건 사용해도 됨
# (그대신 학습횟수가 너무 작으면 안됨)
역행렬을 이용하지 않고 회귀계수를 계산할 수 있다!
정확한 값을 구하는게 아니라서 학습률(lr)과 학습횟수(T)가 중요하다!
미분가능하고 볼록한 함수일 경우 적절한 학습률과 학습횟수를 선택했을 때 수렴이 보장!
비선형회귀일 경우는 항상 수렴이 보장되지 않는다.
그래서 변형된 경사하강법을 사용!
모든 데이터를 사용해서 업데이트하는 것이 아니라 데이터 한개 또는 일부를 활용해서 업데이트
볼록이 아닌 경우에는 SGD를 통해 최적화 가능!
만능은 아니지만 딥러닝에서는 SGD가 실증적으로 더 낫다고 한다. 데이터 일부를 가지고 업데이트하는거라 연산자원을 좀 더 효율적으로 활용
경사하강법: 전체데이터를 가지고 목적식의 그레디언트 벡터를 계산
SGD: 미니배치를 가지고 그레디언트 벡터를 계산
완전히 똑같지 않지만 방향은 유사함
매번 다른 미니배치를 사용하기 때문에 목적식 모양이 바뀐다. 그래서 극소점이 더이상 아닌 경우가 생기거나 탈출하기도 한다. 따라서 볼록 아닌 경우에서 사용이 좋다.
정확하지 않지만 훨씬 빠르고 볼록이 아닌 목적식에서도 사용가능
경사하강법보다 머신러닝 학습에 더 효율적!!!
ex) 엄청난 양의 이미지 데이터를 가짐
일반적인 경사하강법으로 하면 모든 데이터를 업데이트 → 메모리 부족
미니배치로 쪼갠 데이터로 업데이트!