Deeper Look at Gradient Descent

POOHYA·2021년 12월 25일
0

Simpler Hypothesis Function

bias 없이 Gradient Descent를 잘 이해해보자!

W = torch.zeros(1, requires_grad=True)
# b = torch.zeros(1, requires_grad=True)
hypothesis = x_train * W

Dummay Data

x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])
  • H(x) = x 가 정확한 모델
  • W = 1이 가장 좋은 케이스

Cost function: Intuition

여기서 cost는 예측값과 실제값의 차이임

  • W = 1 일때 cost = 0
  • 1에서 멀어질수록 높아진다.

Cost function: MSE

  • cost = torch.mean((hypothesis - y_train) ** 2)

Gradient Descent: MSE

여기서 Gradient는 기울기를 의미

cost를 최소화 하기 위해선 기울기가 가파르거나 음수일땐 W가 커져야하고
기울기가 완만하거나 양수일땐 W가 작아져야한다.

Gradient 계산

gradient = torch.sum((W * x_train - y_train) * x_train)
print(gradient)
lr = 0.1
W -= lr * gradient
print(W)
tensor(-14.)
tensor(1.4000)

Full Code

# 데이터
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(x) 계산
    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

# 데이터
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):
…    ))

    # cost gradient로 H(x) 개선
    W -= lr * gradient
Epoch    0/10 W: 0.000, Cost: 4.666667
Epoch    1/10 W: 1.400, Cost: 0.746666
Epoch    2/10 W: 0.840, Cost: 0.119467
Epoch    3/10 W: 1.064, Cost: 0.019115
Epoch    4/10 W: 0.974, Cost: 0.003058
Epoch    5/10 W: 1.010, Cost: 0.000489
Epoch    6/10 W: 0.996, Cost: 0.000078
Epoch    7/10 W: 1.002, Cost: 0.000013
Epoch    8/10 W: 0.999, Cost: 0.000002
Epoch    9/10 W: 1.000, Cost: 0.000000
Epoch   10/10 W: 1.000, Cost: 0.000000

Gradient Descent with torch.optim

  • 시작할때 Optimizer 정의
  • optimizer.zero_grad()로 gradient를 0으로 초기화
  • cost.backward()로 gradient 계산
  • optimizer.step()으로 gradient descent
# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[1], [2], [3]])
# 모델 초기화
W = torch.zeros(1, requires_grad=True)
# optimizer 설정
optimizer = optim.SGD([W], lr=0.15)

nb_epochs = 10
for epoch in range(nb_epochs + 1):
    
    # H(x) 계산
    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()
    cost.backward()
    optimizer.step()
profile
김효주

0개의 댓글