참고
Click here to download the full example code
준비 운동: NumPy¶
\(y=\sin(x)\) 을 예측할 수 있도록, \(-\pi\) 부터 \(pi\) 까지 유클리드 거리(Euclidean distance)를 최소화하도록 3차 다항식을 학습합니다.
이 구현은 NumPy를 사용하여 순전파 단계와 손실(loss), 역전파 단계를 직접 계산합니다.
NumPy 배열은 일반적인 n-차원 배열로, 딥러닝이나 변화도(gradient), 연산 그래프(computational graph)는 알지 못하며 일반적인 수치 연산을 수행합니다.
99 194.89043558667026
199 138.37186701075603
299 99.094740638708
399 71.77516634385633
499 52.75648058012474
599 39.505542978651874
699 30.265812768098804
799 23.81810231403214
899 19.315409781960135
999 16.16877298738901
1099 13.968302049512976
1199 12.42849378976511
1299 11.350324072536285
1399 10.594945230776396
1499 10.065418732333026
1599 9.69401688025359
1699 9.433388006013455
1799 9.25040446113067
1899 9.121875234067549
1999 9.031555681695123
Result: y = -0.014846554694561535 + 0.8526561369842101 x + 0.002561277732548343 x^2 + -0.09274937516929047 x^3
import numpy as np
import math
# 무작위로 입력과 출력 데이터를 생성합니다
x = np.linspace(-math.pi, math.pi, 2000)
y = np.sin(x)
# 무작위로 가중치를 초기화합니다
a = np.random.randn()
b = np.random.randn()
c = np.random.randn()
d = np.random.randn()
learning_rate = 1e-6
for t in range(2000):
# 순전파 단계: 예측값 y를 계산합니다
# y = a + b x + c x^2 + d x^3
y_pred = a + b * x + c * x ** 2 + d * x ** 3
# 손실(loss)을 계산하고 출력합니다
loss = np.square(y_pred - y).sum()
if t % 100 == 99:
print(t, loss)
# 손실에 따른 a, b, c, d의 변화도(gradient)를 계산하고 역전파합니다.
grad_y_pred = 2.0 * (y_pred - y)
grad_a = grad_y_pred.sum()
grad_b = (grad_y_pred * x).sum()
grad_c = (grad_y_pred * x ** 2).sum()
grad_d = (grad_y_pred * x ** 3).sum()
# 가중치를 갱신합니다.
a -= learning_rate * grad_a
b -= learning_rate * grad_b
c -= learning_rate * grad_c
d -= learning_rate * grad_d
print(f'Result: y = {a} + {b} x + {c} x^2 + {d} x^3')
Total running time of the script: ( 0 minutes 0.297 seconds)