Gradient Descent
๊ฒฝ์ฌ ํ๊ฐ๋ฒ (Gradient Descent)
: ๋ฏธ๋ถ ๊ธฐ์ธ๊ธฐ๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฌํ๊ฐ๋ฒ์ ์ค์ฐจ๋ฅผ ๋น๊ตํ์ฌ ๊ฐ์ฅ ์์ ๋ฐฉํฅ์ผ๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ
์ฆ, '๋ฏธ๋ถ ๊ฐ์ด 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()
epoch=0, ๊ธฐ์ธ๊ธฐ=27.8400, ์ ํธ=5.4300
epoch=100, ๊ธฐ์ธ๊ธฐ=7.0739, ์ ํธ=50.5117
epoch=200, ๊ธฐ์ธ๊ธฐ=4.0960, ์ ํธ=68.2822
epoch=300, ๊ธฐ์ธ๊ธฐ=2.9757, ์ ํธ=74.9678
epoch=400, ๊ธฐ์ธ๊ธฐ=2.5542, ์ ํธ=77.4830
epoch=500, ๊ธฐ์ธ๊ธฐ=2.3956, ์ ํธ=78.4293
epoch=600, ๊ธฐ์ธ๊ธฐ=2.3360, ์ ํธ=78.7853
epoch=700, ๊ธฐ์ธ๊ธฐ=2.3135, ์ ํธ=78.9192
epoch=800, ๊ธฐ์ธ๊ธฐ=2.3051, ์ ํธ=78.9696
epoch=900, ๊ธฐ์ธ๊ธฐ=2.3019, ์ ํธ=78.9886
epoch=1000, ๊ธฐ์ธ๊ธฐ=2.3007, ์ ํธ=78.9957
epoch=1100, ๊ธฐ์ธ๊ธฐ=2.3003, ์ ํธ=78.9984
epoch=1200, ๊ธฐ์ธ๊ธฐ=2.3001, ์ ํธ=78.9994
epoch=1300, ๊ธฐ์ธ๊ธฐ=2.3000, ์ ํธ=78.9998
epoch=1400, ๊ธฐ์ธ๊ธฐ=2.3000, ์ ํธ=78.9999
epoch=1500, ๊ธฐ์ธ๊ธฐ=2.3000, ์ ํธ=79.0000
epoch=1600, ๊ธฐ์ธ๊ธฐ=2.3000, ์ ํธ=79.0000
epoch=1700, ๊ธฐ์ธ๊ธฐ=2.3000, ์ ํธ=79.0000
epoch=1800, ๊ธฐ์ธ๊ธฐ=2.3000, ์ ํธ=79.0000
epoch=1900, ๊ธฐ์ธ๊ธฐ=2.3000, ์ ํธ=79.0000
epoch=2000, ๊ธฐ์ธ๊ธฐ=2.3000, ์ ํธ=79.0000

์ด๋ ๊ฒ ํด์ ์ต์ ์ ๊ณฑ๋ฒ์ ์ฐ์ง ์๊ณ ํ๊ท ์ ๊ณฑ ์ค์ฐจ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ํตํด ์ํ๋ ๊ฐ์ ๊ตฌํ๋ค
๋ค์ค ์ ํ ํ๊ท
: ์์ธกํ ์ด์ธ์ ์ค์ฐจ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ ์์ธกํ ์์ํ ์ด์ธ์ ๋ค๋ฅธ ์์๊ฐ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๋ ์ ํํ ์์ธก์ ํ๋ ค๋ฉด ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๋ ฅํด์ผ ํ๋ฉฐ, ์ ๋ณด๋ฅผ ์ถ๊ฐํด ์๋ก์ด ์์ธก ๊ฐ์ ๊ตฌํ๋ ค๋ฉด ๋ณ์์ ๊ฐ์๋ฅผ ๋๋ ค ๋ค์ค ์ ํ ํ๊ท๋ฅผ ๋ง๋ค์ด ์ฃผ์ด์ผ ํ๋ค

์ด a1๊ณผ a2์ ๊ธฐ์ธ๊ธฐ๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d # 3D ๊ทธ๋ํ ๊ทธ๋ฆฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
#๊ณต๋ถ์๊ฐ X์ ์ฑ์ Y์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ญ๋๋ค.
data = [[2, 0, 81], [4, 4, 93], [6, 2, 91], [8, 3, 97]]
x1 = [i[0] for i in data]
x2 = [i[1] for i in data]
# x1๊ณผ x2๋ผ๋ ๋๊ฐ์ ๋
๋ฆฝ ๋ณ์ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด ์ค๋ค
y = [i[2] for i in data]
#๊ทธ๋ํ๋ก ํ์ธํด ๋ด
๋๋ค.
ax = plt.axes(projection='3d') # ๊ทธ๋ํ ์ ํ
ax.set_xlabel('study_hours')
ax.set_ylabel('private_class')
ax.set_zlabel('Score')
ax.dist = 11
ax.scatter(x1, x2, y)
plt.show()
#๋ฆฌ์คํธ๋ก ๋์ด ์๋ x์ y๊ฐ์ ๋ํ์ด ๋ฐฐ์ด๋ก ๋ฐ๊พธ์ด ์ค๋๋ค.
# (์ธ๋ฑ์ค๋ฅผ ์ฃผ์ด ํ๋์ฉ ๋ถ๋ฌ์ ๊ณ์ฐ์ด ๊ฐ๋ฅํด ์ง๋๋ก ํ๊ธฐ ์ํจ์
๋๋ค.)
x1_data = np.array(x1)
x2_data = np.array(x2)
y_data = np.array(y)
# ๊ธฐ์ธ๊ธฐ a์ ์ ํธ b์ ๊ฐ์ ์ด๊ธฐํ ํฉ๋๋ค.
a1 = 0
a2 = 0
b = 0
#ํ์ต๋ฅ ์ ์ ํฉ๋๋ค.
lr = 0.05
#๋ช ๋ฒ ๋ฐ๋ณต๋ ์ง๋ฅผ ์ค์ ํฉ๋๋ค.
# (0๋ถํฐ ์ธ๋ฏ๋ก ์ํ๋ ๋ฐ๋ณต ํ์์ +1์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค.)
epochs = 2001
#๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ ์์ํฉ๋๋ค.
for i in range(epochs): # epoch ์ ๋งํผ ๋ฐ๋ณต
y_pred = a1 * x1_data + a2 * x2_data + b # y๋ฅผ ๊ตฌํ๋ ์์ ์ธ์๋๋ค
error = y_data - y_pred # ์ค์ฐจ๋ฅผ ๊ตฌํ๋ ์์
๋๋ค.
a1_diff = -(1/len(x1_data)) * sum(x1_data * (error)) # ์ค์ฐจํจ์๋ฅผ a1๋ก ๋ฏธ๋ถํ ๊ฐ์
๋๋ค.
a2_diff = -(1/len(x2_data)) * sum(x2_data * (error)) # ์ค์ฐจํจ์๋ฅผ a2๋ก ๋ฏธ๋ถํ ๊ฐ์
๋๋ค.
b_diff = -(1/len(x1_data)) * sum(y_data - y_pred) # ์ค์ฐจํจ์๋ฅผ b๋ก ๋ฏธ๋ถํ ๊ฐ์
๋๋ค.
a1 = a1 - lr * a1_diff # ํ์ต๋ฅ ์ ๊ณฑํด ๊ธฐ์กด์ a1๊ฐ์ ์
๋ฐ์ดํธํฉ๋๋ค.
a2 = a2 - lr * a2_diff # ํ์ต๋ฅ ์ ๊ณฑํด ๊ธฐ์กด์ a2๊ฐ์ ์
๋ฐ์ดํธํฉ๋๋ค.
b = b - lr * b_diff # ํ์ต๋ฅ ์ ๊ณฑํด ๊ธฐ์กด์ b๊ฐ์ ์
๋ฐ์ดํธํฉ๋๋ค.
if i % 100 == 0: # 100๋ฒ ๋ฐ๋ณต๋ ๋๋ง๋ค ํ์ฌ์ a1, a2, b๊ฐ์ ์ถ๋ ฅํฉ๋๋ค.
print("epoch=%.f, ๊ธฐ์ธ๊ธฐ1=%.04f, ๊ธฐ์ธ๊ธฐ2=%.04f, ์ ํธ=%.04f" % (i, a1, a2, b))
epoch=0, ๊ธฐ์ธ๊ธฐ1=23.2000, ๊ธฐ์ธ๊ธฐ2=10.5625, ์ ํธ=4.5250
epoch=100, ๊ธฐ์ธ๊ธฐ1=6.4348, ๊ธฐ์ธ๊ธฐ2=3.9893, ์ ํธ=43.9757
epoch=200, ๊ธฐ์ธ๊ธฐ1=3.7255, ๊ธฐ์ธ๊ธฐ2=3.0541, ์ ํธ=62.5766
epoch=300, ๊ธฐ์ธ๊ธฐ1=2.5037, ๊ธฐ์ธ๊ธฐ2=2.6323, ์ ํธ=70.9656
epoch=400, ๊ธฐ์ธ๊ธฐ1=1.9527, ๊ธฐ์ธ๊ธฐ2=2.4420, ์ ํธ=74.7491
epoch=500, ๊ธฐ์ธ๊ธฐ1=1.7042, ๊ธฐ์ธ๊ธฐ2=2.3562, ์ ํธ=76.4554
epoch=600, ๊ธฐ์ธ๊ธฐ1=1.5921, ๊ธฐ์ธ๊ธฐ2=2.3175, ์ ํธ=77.2250
epoch=700, ๊ธฐ์ธ๊ธฐ1=1.5415, ๊ธฐ์ธ๊ธฐ2=2.3001, ์ ํธ=77.5720
epoch=800, ๊ธฐ์ธ๊ธฐ1=1.5187, ๊ธฐ์ธ๊ธฐ2=2.2922, ์ ํธ=77.7286
epoch=900, ๊ธฐ์ธ๊ธฐ1=1.5084, ๊ธฐ์ธ๊ธฐ2=2.2886, ์ ํธ=77.7992
epoch=1000, ๊ธฐ์ธ๊ธฐ1=1.5038, ๊ธฐ์ธ๊ธฐ2=2.2870, ์ ํธ=77.8310
epoch=1100, ๊ธฐ์ธ๊ธฐ1=1.5017, ๊ธฐ์ธ๊ธฐ2=2.2863, ์ ํธ=77.8453
epoch=1200, ๊ธฐ์ธ๊ธฐ1=1.5008, ๊ธฐ์ธ๊ธฐ2=2.2860, ์ ํธ=77.8518
epoch=1300, ๊ธฐ์ธ๊ธฐ1=1.5003, ๊ธฐ์ธ๊ธฐ2=2.2858, ์ ํธ=77.8547
epoch=1400, ๊ธฐ์ธ๊ธฐ1=1.5002, ๊ธฐ์ธ๊ธฐ2=2.2858, ์ ํธ=77.8561
epoch=1500, ๊ธฐ์ธ๊ธฐ1=1.5001, ๊ธฐ์ธ๊ธฐ2=2.2857, ์ ํธ=77.8567
epoch=1600, ๊ธฐ์ธ๊ธฐ1=1.5000, ๊ธฐ์ธ๊ธฐ2=2.2857, ์ ํธ=77.8569
epoch=1700, ๊ธฐ์ธ๊ธฐ1=1.5000, ๊ธฐ์ธ๊ธฐ2=2.2857, ์ ํธ=77.8570
epoch=1800, ๊ธฐ์ธ๊ธฐ1=1.5000, ๊ธฐ์ธ๊ธฐ2=2.2857, ์ ํธ=77.8571
epoch=1900, ๊ธฐ์ธ๊ธฐ1=1.5000, ๊ธฐ์ธ๊ธฐ2=2.2857, ์ ํธ=77.8571
epoch=2000, ๊ธฐ์ธ๊ธฐ1=1.5000, ๊ธฐ์ธ๊ธฐ2=2.2857, ์ ํธ=77.8571

Last updated
Was this helpful?