투명한 기부를 하고싶다면 이 링크로 와보세요! 🥰 (클릭!)
바이낸스(₿) 수수료 평생 20% 할인받는 링크로 가입하기! 🔥 (클릭!)
2018/07/02 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 1 (Overview)
2018/07/02 - [Programming Project/Pytorch Tutorials] - Pytorch 머신러닝 튜토리얼 강의 2 (Linear Model)
이번 글에서는 Gradient Descent에 대해서 알아 볼 것입니다.
지난 글에서는 loss 함수란 무엇인지, 그리고 MSE Loss에 대해 공부해보았습니다.
이 Loss 함수를 통해서 우리는 어떤 w와 b가 가장 수학적으로 잘 학습된 loss인지 알 수 있게 됩니다.
바로 최소로 만드는 파라미터의 값을 찾아서 말이죠.
수학적으로는 arg min 이라고 표시할 수 있습니다.
(본 식에는 w만 파라미터로 들어가 있으나, w와 b 모두 들어가는것이 정확하다)
이 파라미터를 찾아가는 과정 자체가 머신러닝입니다.
Gradient Descent Algorithm
그렇다면 우리가 만든 loss와 w의 그래프를 통해서
loss에 대해 지금 w의 위치에서의 미분값을 구하고 (다른말로 현재 위치에서의 기울기)
loss가 낮아지는 쪽으로 w를 조금씩 이동시켜 주면 우리는 loss를 낮출 수 있습니다.
는 보통의 경우 아주 작은 수 (ex . 0.001) 가 됩니다.
그럼, 수학적으로 기울기를 미분한 값을 저기에 적용시키면 다음과 같은 제대로 된 update식을 얻을 수 있게 됩니다.
(미분을 하지 못하더라도 인터넷에 미분을 해주는 www.derivative-calculator.net 등의 사이트가 있기 때문에 너무 무서워하지 맙시다)
Code
자 이제 구현 해 보도록 합시다
x_data = [1.0, 2.0, 3.0] y_data = [2.0, 4.0, 6.0] w = 1.0 # a random guess: random value #아무런 숫자가 들어가도 된다. # model의 forward pass 구현 부분 def forward(x): return x * w # Loss function def loss(x, y): y_pred = forward(x) return (y_pred - y) * (y_pred - y) # gradient를 계산 def gradient(x, y): # d_loss/d_w return 2 * x * (x * w - y) # Before training print("predict (before training)", 4, forward(4)) # Training loop # 학습을 시키는 loop for epoch in range(10): for x_val, y_val in zip(x_data, y_data): grad = gradient(x_val, y_val) #업데이트 시키는 부분 ! 중요 !! w = w - 0.01 * grad print("\tgrad: ", x_val, y_val, round(grad, 2)) l = loss(x_val, y_val) print("progress:", epoch, "w=", round(w, 2), "loss=", round(l, 2)) # After training # 학습 완료 print("predict (after training)", "4 hours", forward(4))
그렇다면 딥러닝의 복잡한 미분은 어떻게 할 수 있을까요?
다음 글에서 다뤄보도록 합시다.