-
๋ณธ ๊ธ์ '๋ชจ๋๋ฅผ ์ํ ๋ฅ๋ฌ๋ ์์ฆ 2'์ 'pytorch๋ก ์์ํ๋ ๋ฅ ๋ฌ๋ ์ ๋ฌธ'์ ๋ณด๋ฉฐ ๊ณต๋ถํ ๋ด์ฉ์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
ํ์์ ์๊ฒฌ์ด ์์ฌ ๋ค์ด๊ฐ ๋ถ์ ํํ ๋ด์ฉ์ด ์กด์ฌํ ์ ์์ต๋๋ค.
์ฌ๋ฌ๊ฐ์ ์ ๋ณด์์ ํ๋์ ์ถ์ธก๊ฐ์ ์ป์ด๋ด๋ ์ง์ ์ ์ฐพ๋ ๊ณผ์
์ฆ, ์ด๋ฒ์๋ ๋ค์์ x์์ ํ๋์ y๋ฅผ ์ถ์ถํ๋ ๊ณผ์ ์ด๋ค.
1. Hypothesis Function
์ ๋ ฅ ๋ณ์๊ฐ 3๊ฐ๋ผ๊ณ ๊ฐ์ ํ์ ๋์ ์์ด๋ค. x๊ฐ 3๊ฐ๋ผ๋ฉด w(๊ฐ์ค์น)๋ 3๊ฐ๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ naiveํ๊ฒ ๋ํ๋ด๊ฐ ๋ณด๋ฉด, x์ ๊ฐ์๊ฐ ๋งค์ฐ ๋ง์์ก์ ๋ ์ฃฝ์ ๋ฟ......
๊ทธ๋์ ์ด๋, ํ๋ ฌ์ ํน์ฑ์ ์ฌ์ฉํ๋ค.
2. Dot product
์ผ์ผํ ๊ณฑํ์ง ์๊ณ , xํ ์์ wํ ์๋ฅผ ํ๋ฒ์ ๊ณฑํด์ฃผ๊ณ ์ถ์ด! => ๋ด์ ์ ์ด์ฉํ์.
(๋ ์์ธํ ํ๋ ฌ ์ฐ์ฐ์ https://wikidocs.net/54841 ์ ์ฐธ์กฐํ์๋ฉด ์ข์ต๋๋ค)
์์ ๊ฐ์ด ๋ํ๋ด๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์์ผ๋ก ๊ฐ๋จํ๊ฒ ๋ํ๋ผ ์ ์๋ค! (ํธํฅ ์ ์ธ)
ํธํฅ์ ์ถ๊ฐํ๋ค๋ฉด ๋ํด์ฃผ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
pytorch์์ dot product๋ ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ธ๋ค.
H = X.matmul(w)
์ด๋, w๋ w = torch.zeros((3, 1), requires_grad = True) ์ด๋ค. x์ ๊ฐ์๊ฐ 3๊ฐ๋๊น w๋ 3*1 ํ ์์ด๋ค.
3. Full Code
import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim #x์ y๊ฐ์ ์ ๋ ฅ - ํ๊ฐ์ x์ 3๊ฐ์ ์์! 5๊ฐ๋ test set์ ๊ฐ์์ผ ๋ฟ์. x_train = torch.FloatTensor([[73, 80, 75], [93, 88, 93], [89, 91, 90], [96, 98, 100], [73, 66, 70]]) y_train = torch.FloatTensor([[152], [185], [180], [196], [142]]) # ๋ชจ๋ธ ์ด๊ธฐํ W = torch.zeros((3, 1), requires_grad=True) #ํ๋ ฌ์ ๊ณฑ์ ์ํด ์ซ์๋ง์ถฐ์ค์ผํจ.(x์ ์์ผ?๊ฐ 3๊ฐ์ด๋๊น W๋ 3x1์ด์ฌ์ผ ํจ => x์ ์์์ ๊ฐ๊ฐ ๋์ํ๊ฒ) b = torch.zeros(1, requires_grad=True) #ํธํฅ์ ํ๋! dot product๊ฐ ์์๋ค๋ผ๋ฆฌ ๊ณฑํ๊ณ ๋ํ๋๊ฑฐ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๋ ํ๋๋ง ๋์ค๊ฒ ๋์ด์์ # optimizer ์ค์ - sgd๋ฅผ ์ฌ์ฉํจ optimizer = optim.SGD([W, b], lr=1e-5) #์ง์๊ณ์ฐ๋ฒ, 0.00001์ nb_epochs = 1000 for epoch in range(nb_epochs + 1): # H(x) ๊ณ์ฐ - ๊ฐ์ค์ ์ธ์ธ ๋ dot product์ฌ์ฉ. hypothesis = x_train.matmul(W) + b # cost ๊ณ์ฐ - mse์ฌ์ฉ cost = torch.mean((hypothesis - y_train) ** 2) # cost๋ก H(x) ๊ฐ์ optimizer.zero_grad() cost.backward() optimizer.step() # 100๋ฒ๋ง๋ค ๋ก๊ทธ ์ถ๋ ฅ if epoch % 100 ==0: print('Epoch {:4d}/{} hypothesis: {} Cost: {:.6f}'.format( epoch, nb_epochs, hypothesis.squeeze().detach(), cost.item() ))
4. Full code with nn.Module
์ด๋ฒ์๋ ์๊น์ง ์ง์ ์ฝ๋ฉํ๋๊ฒ ์๋๋ผ, pytorch์ ์น์ ํ๊ฒ ๋ด์ฅ๋์ด ์๋ ํจ์๋ค์ ์ด์ฉํด์ ์์ ์ฝ๋๋ค์ ๋ฐ๊ฟ๋ณด์!
1) mse๋ฅผ ์ ์ฉ์ ์์ด์, ์ด๋ฒ์๋ ์ง์ ์์ ์ ๋ ฅํ์ง ์๊ณ , pytorch์ torch.nn.function์์ ์ ๊ณตํ๋ mse๋ฅผ ์ด์ฉํด๋ณด์.
import torch.nn.function as F cost = F.mse_loss(prediction, y_train) #์ธ์๋ก ๋ฐ์ ์๋ค์ ๋นผ์ ์ ๊ณฑํ ๊ฐ์ ํ๊ท ์ ๋ฆฌํดํ๋ค.
2) ์ ํ ํ๊ท ๋ชจ๋ธ์ ์์ ์ง์ ์ธ์์ฃผ์ง ์๊ณ , nn.Linear()์ ์ด์ฉํด๋ณด์.
import torch.nn as nn model = nn.Linear(input_dim, output_dim)
-1. ๋จ์ ์ ํ ํ๊ท
import torch import torch.nn as nn import torch.nn.functional as F torch.manual_seed(1) # ๋ฐ์ดํฐ x_train = torch.FloatTensor([[1], [2], [3]]) y_train = torch.FloatTensor([[2], [4], [6]]) # ๋ชจ๋ธ์ ์ ์ธ ๋ฐ ์ด๊ธฐํ. ๋จ์ ์ ํ ํ๊ท์ด๋ฏ๋ก input_dim=1, output_dim=1. model = nn.Linear(1,1) # optimizer ์ค์ . ๊ฒฝ์ฌ ํ๊ฐ๋ฒ SGD๋ฅผ ์ฌ์ฉํ๊ณ learning rate๋ฅผ ์๋ฏธํ๋ lr์ 0.01 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # ์ ์ฒด ํ๋ จ ๋ฐ์ดํฐ์ ๋ํด ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ 2,000ํ ๋ฐ๋ณต nb_epochs = 2000 for epoch in range(nb_epochs+1): # H(x) ๊ณ์ฐ prediction = model(x_train) # cost ๊ณ์ฐ cost = F.mse_loss(prediction, y_train) # <== ํ์ดํ ์น์์ ์ ๊ณตํ๋ ํ๊ท ์ ๊ณฑ ์ค์ฐจ ํจ์ # cost๋ก H(x) ๊ฐ์ ํ๋ ๋ถ๋ถ # gradient๋ฅผ 0์ผ๋ก ์ด๊ธฐํ optimizer.zero_grad() # ๋น์ฉ ํจ์๋ฅผ ๋ฏธ๋ถํ์ฌ gradient ๊ณ์ฐ cost.backward() # backward ์ฐ์ฐ # W์ b๋ฅผ ์ ๋ฐ์ดํธ optimizer.step() if epoch % 100 == 0: # 100๋ฒ๋ง๋ค ๋ก๊ทธ ์ถ๋ ฅ print('Epoch {:4d}/{} Cost: {:.6f}'.format( epoch, nb_epochs, cost.item() ))
-2. ๋ค์ค ์ ํ ํ๊ท
import torch import torch.nn as nn import torch.nn.functional as F torch.manual_seed(1) # ๋ฐ์ดํฐ x_train = torch.FloatTensor([[73, 80, 75], [93, 88, 93], [89, 91, 90], [96, 98, 100], [73, 66, 70]]) y_train = torch.FloatTensor([[152], [185], [180], [196], [142]]) # ๋ชจ๋ธ์ ์ ์ธ ๋ฐ ์ด๊ธฐํ. ๋ค์ค ์ ํ ํ๊ท์ด๋ฏ๋ก input_dim=3, output_dim=1. model = nn.Linear(3,1) optimizer = torch.optim.SGD(model.parameters(), lr=1e-5) nb_epochs = 2000 for epoch in range(nb_epochs+1): # H(x) ๊ณ์ฐ prediction = model(x_train) # model(x_train)์ model.forward(x_train)์ ๋์ผํจ. # cost ๊ณ์ฐ cost = F.mse_loss(prediction, y_train) # <== ํ์ดํ ์น์์ ์ ๊ณตํ๋ ํ๊ท ์ ๊ณฑ ์ค์ฐจ ํจ์ # cost๋ก H(x) ๊ฐ์ ํ๋ ๋ถ๋ถ # gradient๋ฅผ 0์ผ๋ก ์ด๊ธฐํ optimizer.zero_grad() # ๋น์ฉ ํจ์๋ฅผ ๋ฏธ๋ถํ์ฌ gradient ๊ณ์ฐ cost.backward() # W์ b๋ฅผ ์ ๋ฐ์ดํธ optimizer.step() if epoch % 100 == 0: # 100๋ฒ๋ง๋ค ๋ก๊ทธ ์ถ๋ ฅ print('Epoch {:4d}/{} Cost: {:.6f}'.format( epoch, nb_epochs, cost.item() ))
+) ์์ ํ, ์ญ์ ํ(forward, backward)
https://excelsior-cjh.tistory.com/171
<Reference>
https://deeplearningzerotoall.github.io/season2/lec_pytorch.html
'๐STUDY > ๐ฅPytorch ML&DL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
05. Logistic Regression (0) 2020.02.28 04-2. Loading Data(Mini batch and data load) (0) 2020.02.24 03. Deeper Look at Gradient Descent (0) 2020.02.24 02. Linear Regression (0) 2020.02.21 01. PyTorch ๊ธฐ์ด (0) 2020.02.13 ๋๊ธ