미분을 사용하는 최적화 알고리즘의 대표적인 예시
경사하강법 (Gradient Descent)은 위에서 거론 됐던 오차 함수인 error (𝜀) 을 최소화 하는 𝑎,𝑏 를 찾을 수 있는 최적화 알고리즘 중의 하나.
최적의 a,b를 찾기 위해선 미분계수가 0인 곳을 찾으면 된다.
하지만 현실적으로 우리가 앞으로 다루게 될 문제에선 파라미터의 갯수는 수없이 많을 것이고 하나의 minimum/maximum만이 존재하지 않는 상황에 직면한다.
경사하강법은 임의의 a, b를 선택한 후 (random initialization)에 기울기 (gradient)를 계산해서 기울기 값이 낮아지는 방향으로 진행.
기울기는 항상 손실 함수 값이 가장 크게 증가하는 방향으로 진행합니다.
그렇기 때문에 경사하강법 알고리즘은 기울기의 반대 방향으로 이동합니다.
경사하강법에서 a,b는 다음과 같이 계산 된다:
a_n+1=a_n−η∇f(a_n)
b_n+1=b_n−η∇f(b_n)
반복적으로 파라미터 a,b를 업데이트 해가면서 그래디언트(∇f)가 0이 될 때까지 이동을 합니다.
이 때 중요한게 바로 학습률 (learning rate, η)인데요. 학습률이 너무 낮게 되면 알고리즘이 수렴하기 위해서 반복을 많이 해야되고 이는 결국 수렴에 시간을 상당히 걸리게 합니다. 반대로 학습률이 너무 크면 오히려 극소값을 지나쳐 버려서 알고리즘이 수렴을 못하고 계산을 계속 반복하게 될 수도 있기 때문에 학습률을 정할 때는 신중하게 정해야 한다.
def gradient_descent(X, y, lr = 0.05, epoch = 10):
a, b = 0.33, 0.48 # 임의 선택한 파라미터 a, b
N = len(X) # 샘플 갯수
for _ in range(epoch):
f = y - (a*X + b)
# a와 b를 업데이트 합니다
a -= lr * (-2 * X.dot(f).sum() / N)
b -= lr * (-2 * f.sum() / N)
print('a: '+str(a))
print('b: '+str(b))
# y = 3 x + 5
X = np.array([1, 2, 3, 4, 5])
y = np.array([8, 11, 14, 17, 20])
gradient_descent(X,y) # 10번만 돌렸을 때
a: 3.820070615328
b: 2.0392842721280005
gradient_descent(X, y, epoch = 100) # 100번 반복
a: 3.176787975497293
b: 4.36173931393391
gradient_descent(X, y, epoch = 1000) # 1000번 반복
a: 3.000000038323629
b: 4.99999986163953
>>>>> 점점 a = 3, b = 5로 수렴
'개념 이론 수학' 카테고리의 다른 글
[통계] 가설검정 (0) | 2021.06.20 |
---|---|
[통계] 기술 통계치(Descriptive Statistics) / 추리 통계치(Inferetial Statistics) (0) | 2021.06.20 |
[수학] 합성함수 미분(Chain Rule) (13) | 2021.06.09 |
[수학] 편미분 (Partial Derivative) (0) | 2021.06.09 |
[수학] 기초 미분 (Basic Derivative) (0) | 2021.06.09 |