방학동안 학회에서 김성훈 교수님의 PyTorch Zero To All 강의로 공부를 하게 된 김에 스스로 정리해보려고 합니다.
좋은 강의 공유해주신 김성훈 교수님께 감사드립니다.
강의링크:
https://www.youtube.com/playlist?list=PLlMkM4tgfjnJ3I-dbhO9JTw7gNty6o_2m
PyTorchZeroToAll (in English)
Basic ML/DL lectures using PyTorch in English.
www.youtube.com
Gradient Descent
2강의 예제는 단순한 예제이기 때문에 loss를 최소화하는 w를 찾는 것이 어렵지 않았습니다. 하지만 실제 data에서 이런 경우는 없다고 해도 무방합니다. 따라서 우리는 loss를 최소화하는 w를 자동으로 식별하는 체계적인 방법을 필요로 하는데, 3강에서 다룰 Gradient Descent가 그 방법 중 하나입니다.
방법은 생각보다 간단합니다. 아래와 같은 loss graph가 있다고 가정할 때, 특정 w값에서의 gradient가 양수라면 음의 방향으로, 음수라면 양의 방향으로 w를 보내주면 됩니다. 그래서 gradient는 점점 0을 향해 학습이 됩니다. 이를 수식으로 나타내면 다음과 같습니다.
w = w - $\alpha \frac{\partial loss}{\partial w}$
gradient를 빼주는 이유는 gradient가 양수라면 음의 방향으로, 음수라면 양의 방향으로 w를 보내주기 때문입니다. 또, 여기서 $\alpha$는 learning rate라고 불리는데, learning rate란, 현재 지점에서 다음 지점까지 얼만큼을 이동할지, 다르게 이야기하면 얼마나 세세하게 학습을 진행할지를 좌우하는 초모수입니다. Learning rate가 너무 작다면 최적의 w를 찾는데 시간이 오래 걸리고, 너무 크다면 w를 지나치거나 무질서하게 학습이 진행될 수도 있기 때문에 적정한 값을 찾아 지정해주는 것이 중요합니다.
# Training Data
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]
#2강에서와 마찬가지로 실습에 필요한 데이터를 생성해줍니다.
w = 1.0 # a random guess: random value
#랜덤하게 w의 initial value를 지정해줍니다.
# our model forward pass
def forward(x):
return x * w
#역시나 2강에서와 마찬가지로 y_hat값인 x * w, x_data와 weight을 곱해주는 함수 forward를 정의합니다.
# Loss function
def loss(x, y):
y_pred = forward(x)
return (y_pred - y) * (y_pred - y)
#error인 (y_hat - y)^2를 계산해주는 함수 loss를 정의합니다.
# compute gradient
def gradient(x, y): # d_loss/d_w
return 2 * x * (x * w - y)
#loss function을 w에 대해 미분한 gradient를 계산해주는 함수를 정의합니다.
#loss는 (x * w - y)^2이므로 gradient는 2 * x * (x * w - y)가 됩니다.
# Before training
print("Prediction (before training)", 4, forward(4))
#학습 이전에 w의 initial value는 1이기 때문에 forward(4)의 결과는 4.0입니다.
# Training loop
# 0부터 9까지 10번 반복
for epoch in range(10):
for x_val, y_val in zip(x_data, y_data):
# Compute derivative w.r.t to the learned weights
# Update the weights
# Compute the loss and print progress
grad = gradient(x_val, y_val)
#사용자 정의함수 gradient를 이용하여 x_val, y_val에서의 gradient값을 구해줍니다.
w = w - 0.01 * grad
#learning rate = 0.01로 w에 대한 학습을 진행합니다.
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))
#loss가 점차 감소하고, w가 실제값인 2에 가까워지는 것을 확인할 수 있습니다.
# After training
print("Predicted score (after training)", "4 hours of studying: ", forward(4))
#학습을 진행한 후의 예측값 또한 실제값 8에 가까운 값을 보입니다.
'ML \ DL > PyTorch Zero To All' 카테고리의 다른 글
PyTorch Lecture 10: Basic CNN (0) | 2022.07.26 |
---|---|
PyTorch Lecture 09: Softmax Classifier (0) | 2022.07.14 |
PyTorch Lecture 06: Logistic Regression (0) | 2022.07.13 |
Pytorch Lecture 04: Back-Propagation and Autograd (0) | 2022.07.13 |
PyTorch Lecture 02: Linear Model (0) | 2022.07.13 |