예제를 통해서 선형 모형(Linear regression)을 설명하겠습니다.
> X(학습시간), Y(점수)이며 주어진 데이터를 바탕으로 학습시간에 따른 점수를 예측하는 것이 Task입니다.
> Training dataset - 모델을 구축하기 위해서 train하는 데이터, Test dataset - 모델이 잘 구축되었는지 test하는 데이터
> 학습 모형은 선형 모델을 가정합니다.
> 학습시간에 따른 점수를 잘 예측 할 수있는 선형 모델의 W, b를 찾는 것이 목표입니다.
Weight Initailization
In[1]
W = torch.zeros(1, requires_grad = True)b = torch.zeros(1, requires_grad = True)
> W, b를 0으로 초기화하고
> W, b를 학습할 것이라고 명시합니다.
In[2]
hypothesis = x_train * W +b
cost funtion
In[3]
cost = torch.mean((hypothesis - y_train)**2 )
> 예측값(hypothesis)과 실제값(y_train)차이에 대한 cost function을 정의합니다.
Gradient Descent
In[4]
optimizer = optim.SGD([W,b], lr=0.01)optimizer.zero_grad()cost.backward()optimizer.step()
> [W, b]는 학습 할 값이기 tensor이기 때문에 list로 만들어줍니다.
> Zero_grad()로 gradient 초기화, Backward()로 gradient 계산, Step()으로 개선합니다.
Training with full Code
In[5]
# 데이터x_train = torch.FloatTensor([[1],[2],[3]])y_train = torch.FloatTensor([[2],[4],[6]])# 모델 초기화w = torch.zeros(1,requires_grad = True)b = torch.zeros(1,requires_grad = True)# optimzier 설정optimizer = optim.SGD([W, b], lr=0.01)nb_epochs = 1000for epoch in range(nb_epochs + 1):#H(x)hypothesis = x_train*W + b#costcost = torch.mean((hypothesis - y_train)**2)#cost개선optimizer.zero_grad()cost.backward()optimizer.step()#100번마다 로그 출력if epoch % 100 == 0:print('Epoch {:4d}/{} W:{:.3f}, b:{:.3f}, Cost:{:.6f}'.format(epoch, nb_epochs, W.item(), b.item(), cost.item()))
Out[5]
Epoch 0/1000 W:0.187, b:0.080, Cost:18.666666Epoch 100/1000 W:1.746, b:0.578, Cost:0.048171Epoch 200/1000 W:1.800, b:0.454, Cost:0.029767Epoch 300/1000 W:1.843, b:0.357, Cost:0.018394Epoch 400/1000 W:1.876, b:0.281, Cost:0.011366Epoch 500/1000 W:1.903, b:0.221, Cost:0.007024Epoch 600/1000 W:1.924, b:0.174, Cost:0.004340Epoch 700/1000 W:1.940, b:0.136, Cost:0.002682Epoch 800/1000 W:1.953, b:0.107, Cost:0.001657Epoch 900/1000 W:1.963, b:0.084, Cost:0.001024Epoch 1000/1000 W:1.971, b:0.066, Cost:0.000633
> 결과는 W=1.971, b: 0.066이다. 학습시간 (X=4) 일 때 예상점수(Y)?
> 1.971*4 + 0.066 = 7.95