๐Ÿ“šSTUDY/๐Ÿ”ฅPytorch ML&DL

04-1. Multivariable Linear regression

ํ•ด๋Š”์„  2020. 2. 24. 16:13

๋ณธ ๊ธ€์€ '๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๋”ฅ๋Ÿฌ๋‹ ์‹œ์ฆŒ 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

 

03. ์˜ค์ฐจ์—ญ์ „ํŒŒ - BackPropagation

์ด๋ฒˆ ํฌ์ŠคํŒ…์€ '๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๋”ฅ๋Ÿฌ๋‹' ๊ต์žฌ๋กœ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์ด๋ฏธ์ง€๋“ค์€ ํ•ด๋‹น ๊ต์žฌ์˜ GitHub์—์„œ ๊ฐ€์ ธ์™”์œผ๋ฉฐ, ํ˜น์‹œ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค๋ฉด ์ด ํฌ์ŠคํŒ…์€ ์‚ญ์ œํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.. ใ…œใ…œ ์˜ค์ฐจ์—ญ..

excelsior-cjh.tistory.com

 


<Reference>

https://deeplearningzerotoall.github.io/season2/lec_pytorch.html

https://wikidocs.net/55409

https://wikidocs.net/54841