모두의 딥러닝/강의자료 정리
Lab_03: Deeper Look at Gradient Descent
cvlab_김준수
2025. 1. 15. 13:49
Gradient Descent란?
손실함수에서 최소값을 찾기 위한 방법을 말한다.

예를 들어 위의 사진과 같이 W값에 따른 손실함수(2차 함수)를 나타낼 수 있다.
w가 1일 때, 손실함수의 값이 최소값을 가지게된다. 따라서, 1에서 멀어질 수록 손실값도 증가한다.
이런 손실함수에서 최소값을 찾아가는 방법이 Gradient Descent라고 한다. 즉, Gradient Descent는 기울기를 0으로 수렴하게 만들어 손실함수에서 최소값을 향하도록 w를 조정하는 방법이다.

위의 사진과 같이 기울기가 음수(-)면 w를 증가시켜, 기울기를 0으로 수렴시키고 기울기가 양수(+)면 w를 감소시켜, 기울기를 0으로 수렴시킨다. 또한 기울기가 크면 w의 변화폭을 늘리고, 기울기가 작으면 w의 변화폭을 줄이야한다.
수식적 Gradient Descent
Gradient Descent를 수식으로 작성하며 아래와 같다.

수식을 풀어서 작성하면, 이후 "가중치 = 현재 가중치 - (학습률 * 가중치의 기울기)"와 같다.
코드 Gradient Descent
이를 코드로 작성하면 아래와 같이 작성할 수 있다.
import torch
# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])
# 모델 초기화
W = torch.zeros(1)
# learning rate 설정
lr = 0.1
nb_epochs = 10
for epoch in range(nb_epochs + 1):
# H(w) 계산
hypothesis = x_train * W
# 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()
))
# cost gradient로 H(x) 개선
W -= lr * gradient
위의 코드를 torch.optim을 사용해서 Gradient 부분을 쉽게 작성할 수 있다.
import torch
import torch.optim as optim
# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])
# 모델 초기화
W = torch.zeros(1, requires_grad=True)
# learning rate 설정
lr = 0.1
# 옵티마이저 설정
optimizer = optim.SGD([W], lr=lr)
nb_epochs = 10
for epoch in range(nb_epochs + 1):
# H(w) 계산
hypothesis = x_train * W
# cost 계산
cost = torch.mean((hypothesis - y_train) ** 2)
print('Epoch {:4d}/{} W: {:.3f}, Cost: {:.6f}'.format(
epoch, nb_epochs, W.item(), cost.item()
))
# cost로 H(x)를 계산
optimizer.zero_grad() # gradient 0으로 초기화
cost.backward() # gradient 계산
optimizer.step() # 경사 하강