[PyTorch] Gradient Descent 심화 실습 : 모두를 위한 딥러닝 시즌2

2024. 8. 31. 01:13Artificial Intelligence/모두를 위한 딥러닝 (PyTorch)

Gradient Descent 이론 요약

 Gradient Descent는 비용 함수의 최솟값을 찾기 위해, 기울기를 사용하며 파라미터를 업데이트하는 방법이다. 아래 그래프의 경우 W=1일 때 Cost는 0으로 최솟값을 갖는다. 현재 파라미터에서 이차 함수의 기울기를 구하고, 학습률을 적용하여 파라미터값을 업데이트한다. 함수의 기울기가 0에 가까워질 때까지 이 과정을 반복한다.

Gradient Descent 구현 코드

 지난 포스팅에서는 torch.optim과 zero_grad, backward, step 함수들을 이용해서 Gradient Descent를 진행했다. 이번에는 앞서 언급한 함수를 사용하지 않고, 직접 Gradient를 계산하고 업데이트하는 코드를 작성했다.

# Data definition
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])

# Initialize model
W = torch.zeros(1)

# Set learning rate
lr = 0.1

nb_epochs = 10
for epoch in range(nb_epochs + 1):

    # Calculate H(x)
    hypothesis = x_train * W

    # Calculate cost gradient
    cost = torch.mean((hypothesis - y_train) ** 2)
    gradient = torch.sum((W * x_train - y_train) * x_train)

    print('Epoch {:4d}/{} W: {:.3f}, Cost: {:.6f}'.format(
        epoch, nb_epochs, W.item(), cost.item()
    ))

    # Update H(x) with the cost gradient
    W -= lr * gradient

실행 결과

 Epoch=10일 때 W=1로, Cost는 0으로 수렴했다. Cost 값이 최소화되었으며, x, y의 훈련 데이터가 이루는 직선이 y=x로 W=1이므로 제대로 훈련이 이루어졌다. 

느낀 점

  • 지난번 실습과 달리 torch.optim을 사용하지 않고, Gradient의 수식을 이해한 후 직접 계산하는 데 의의가 있었다.
  • W에 대해 Cost function을 편미분 했을 때, 상수 2를 왜 파이썬 코드에서는 날려버리는지 가장 궁금했다. 이유를 찾아보니 상수 2는 기울기의 방향에 영향을 미치지 않으며, 상수 2를 생략해도 학습률을 통해 파라미터를 업데이트할 크기를 조절할 수 있기 때문이라고 한다.

 

*참고 자료

모두를 위한 딥러닝 시즌2 - [PyTorch] Lab-03 Deeper Look at GD

https://youtu.be/sVUbNEM9Ap0?feature=shared