• 04-1. Multivariable Linear regression

    2020. 2. 24.

    by. ํ•ด๋Š”์„ 

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

     

     

    '๐Ÿ“š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

    ๋Œ“๊ธ€