: 미분 기울기를 이용하는 경사하강법은 오차를 비교하여 가장 작은 방향으로 이동시키는 방법
즉, '미분 값이 0인 지점'을 찾는 것이다 1. a1에서 미분을 구한다 2. 구해진 기울기의 반대 방향(기울기가 +면 음의 방향, -면 양의 방향)으로 얼마간 이동시킨 a2에서 비분을 구한다 3. 구한 미분 값이 0이 아니면 위 과정을 반복
학습률 (learning rate)
: 어느 만큰 이동시킬지를 신중히 결정해야 하는데, 이때 이동거리를 정해 주는 것이 바로 학습률이다 다시 말해, 경사하강법은 오차 변화에 따라 이차 함수 그래프를 만들고 적절한 학습률을 설절해 미분 값이 0인 지점을 구하는 것이다
경사하강법 코딩
최솟값을 구하기 위해서는 이차 함수에서 미분해야 하고, 그 이차 함수는 평균 제곱 오차를 통해서 나온 것이다
평균 제곱 오차를의 식은
이 값을 미분할 때 우리가 궁금한 것은 a와 b라는 것에 주의해야 하며, 필요한 값을 중심으로 미분해야 하기 때문에 특정한 값을 미분하는 편미분을 사용한다.
위 결과로 코딩을 하면
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#공부시간 X와 성적 Y의 리스트를 만듭니다.
data = [[2, 81], [4, 93], [6, 91], [8, 97]]
x = [i[0] for i in data]
y = [i[1] for i in data]
#그래프로 나타내 봅니다.
plt.figure(figsize=(8,5))
plt.scatter(x, y)
plt.show()
# 리스트로 되어 있는 x와 y값을 넘파이 배열로 바꾸어 줍니다.
# (인덱스를 주어 하나씩 불러와 계산이 가능해 지도록 하기 위함입니다.)
x_data = np.array(x)
y_data = np.array(y)
# 기울기 a와 절편 b의 값을 초기화 합니다.
a = 0
b = 0
#학습률을 정합니다.
lr = 0.03
#몇 번 반복될지를 설정합니다.
epochs = 2001
#경사 하강법을 시작합니다.
for i in range(epochs): # epoch 수 만큼 반복
y_hat = a * x_data + b # y를 구하는 식을 세웁니다 (Hy)
error = y_data - y_hat # 오차를 구하는 식입니다.
a_diff = -(2/len(x_data)) * sum(x_data * (error)) # 오차함수를 a로 미분한 값입니다.
b_diff = -(2/len(x_data)) * sum(error) # 오차함수를 b로 미분한 값입니다.
a = a - lr * a_diff # 학습률을 곱해 기존의 a값을 업데이트합니다.
b = b - lr * b_diff # 학습률을 곱해 기존의 b값을 업데이트합니다.
if i % 100 == 0: # 100번 반복될 때마다 현재의 a값, b값을 출력합니다.
print("epoch=%.f, 기울기=%.04f, 절편=%.04f" % (i, a, b))
# 앞서 구한 기울기와 절편을 이용해 그래프를 그려 봅니다.
y_pred = a * x_data + b
plt.scatter(x, y)
plt.plot([min(x_data), max(x_data)], [min(y_pred), max(y_pred)])
plt.show()