
ํ ๊ฐ์ ์ ๋ ฅ์ด ๋ค์ด๊ฐ์ ํ ๊ฐ์ ์ถ๋ ฅ์ด ๋์ค๋ ๊ตฌ์กฐ
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
torch.manual_seed(2024)
> <torch._C.Generator at 0x7f09a27705f0>
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[2], [4], [6]])
print(x_train, x_train.shape)
print(y_train, y_train.shape)
> tensor([[1.],
[2.],
[3.]]) torch.Size([3, 1])
> tensor([[2.],
[4.],
[6.]]) torch.Size([3, 1])
plt.figure(figsize=(6, 4))
plt.scatter(x_train, y_train)

# y = Wx + b
model = nn.Linear(1, 1) # ๋ฐ์ดํฐ ํ๋ ๋ค์ด์ค๋ฉด ์ถ๋ ฅ ํ๋
model
> Linear(in_features=1, out_features=1, bias=True)
y_pred = model(x_train) # ์์ง์ ํ์ต ์๋ผ์์
y_pred
> tensor([[0.7260],
[0.7894],
[0.8528]], grad_fn=<AddmmBackward0>)
list(model.parameters()) # W: 0.0634, b: 0.6625
# y = Wx + b
# x=1, 0.0634*1 + 0.6625 = 0.7259
# x=2, 0.0634*2 + 0.6625 = 0.7893
> [Parameter containing:
tensor([[0.0634]], requires_grad=True),
Parameter containing:
tensor([0.6625], requires_grad=True)]
((y_pred - y_train)**2).mean() # ์ค์ฐจ ๊ณ์ฐ
> tensor(12.8082, grad_fn=<MeanBackward0>)
loss = nn.MSELoss()(y_pred, y_train) # ํจ์๋ก ์ค์ฐจ ๊ณ์ฐ
loss
> tensor(12.8082, grad_fn=<MseLossBackward0>)
mse = nn.MSELoss() # ๊ฐ์ฒด ์์ฑ
mse(y_pred, y_train)
> tensor(12.8082, grad_fn=<MseLossBackward0>)
- ํ์ต ๋ชจ๋ธ์ ์์คํจ์(loss function)์ ์ต์๊ฐ์ ์ฐพ์๊ฐ๋ ๊ณผ์
- ํ์ต ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ์ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฑธ์ณ ์์ธก ๊ฐ์ ๋ฐ์ -> ์์ธก ๊ฐ๊ณผ ์ค์ ์ ๋ต๊ณผ์ ์ฐจ์ด๋ฅผ ๋น๊ตํ๋ ๊ฒ์ด ์์คํจ์์ด๊ณ , ์์ธก๊ฐ๊ณผ ์ค์ ฏ๊ฐ์ ์ฐจ์ด๋ฅผ ์ต์ํํ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐพ๋ ๊ณผ์ ์ด ์ต์ ํ
- ๋ฅ๋ฌ๋ ์๊ณ ๋ฆฌ์ฆ ํ์ต ์ ์ฌ์ฉ๋๋ ์ต์ ํ ๋ฐฉ๋ฒ ์ค ํ๋
- ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ํตํด a์ b๋ฅผ ์ฐพ์๋ด๋ ๊ณผ์ ์ 'ํ์ต'์ด๋ผ๊ณ ๋ถ๋ฆ
- ํ ๋ฒ์ W๋ฅผ ์์ง์ด๋ ๊ฑฐ๋ฆฌ(increment step)
- 0~1 ์ฌ์ด์ ์ค์
- ํ์ต๋ฅ ์ด ๋๋ฌด ํฌ๋ฉด ํ ์ง์ ์ผ๋ก ์๋ ดํ๋ ๊ฒ์ด ์๋๋ผ ๋ฐ์ฐํ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌ
- ํ์ต๋ฅ ์ด ๋๋ฌด ์์ผ๋ฉด ์๋ ด์ด ๋ฆ์ด์ง๊ณ , ์์์ ์ ์ด๋๋ก ์ก๋๋์ ๋ฐ๋ผ ์๋ ด ์ง์ ์ด ๋ฌ๋ผ์ง
- ๋ง์ ์ฐ์ฐ๋๊ณผ ์ปดํจํฐ ์์์ ์๋ชจ
- ๋ฐ์ดํฐ(์ ๋ ฅ๊ฐ) ํ๋๊ฐ ๋ชจ๋ธ์ ์ง๋ ๋๋ง๋ค ๋ชจ๋ ๊ฐ์ค์น๋ฅผ ํ ๋ฒ์ฉ ์ ๋ฐ์ดํธ ํจ
- ๊ฐ์ค์น๊ฐ ์ ์ ๋ชจ๋ธ์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์์ผ๋, ๋ชจ๋ธ์ ๊ฐ์ค์น๊ฐ ๋งค์ฐ ๋ง๋ค๋ฉด ๋ชจ๋ ๊ฐ์ค์น์ ๋ํด ์ฐ์ฐ์ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ง์ ์ฐ์ฐ๋์ ์๊ตฌ
- Global Minimum์ ๋ชฉํ ํจ์ ๊ทธ๋ํ ์ ์ฒด๋ฅผ ๊ณ ๋ คํ์ ๋ ์ต์๊ฐ์ ์๋ฏธํ๊ณ , Local Minimum์ ๊ทธ๋ํ ๋ด ์ผ๋ถ๋ง ๊ณ ๋ คํ์ ๋ ์ต์๊ฐ์ ์๋ฏธ -> ๊ฒฝ์ฌ ํ๊ฐ๋ฒ์ผ๋ก ์ต์ ์ ๊ฐ์ธ ์ค ์์๋ ๊ฐ์ด Local Minimum์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์
# SGD(Stochastic Gradient Descent)
# ๋๋คํ๊ฒ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ๋ฝ์์ loss๋ฅผ ๋ง๋ฆ
# ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ๊ณ ๋ฐ๋ณต
# ๋น ๋ฅด๊ฒ ๋ฐฉํฅ์ ๊ฒฐ์
optimizer = optim.SGD(model.parameters(), lr=0.01) # ์ตํฐ๋ง์ด์ ๊ฐ์ฒด
loss = nn.MSELoss()(y_pred, y_train)
# optimizer๋ฅผ ์ด๊ธฐํ
# loss.backward() ํธ์ถ๋ ๋ ์ด๊ธฐ์ค์ ์ gradient๋ฅผ ๋ํด์ฃผ๋ ๊ฒ์ผ๋ก ๋์ด ์์
# ํ์ต loop๋ฅผ ๋ ๋ ์ด์์ ์ผ๋ก ํ์ต์ด ์ด๋ฃจ์ด์ง๊ธฐ ์ํด์ ํ ๋ฒ์ ํ์ต์ด ์๋ฃ๋๋ฉด graidient๋ฅผ ํญ์ 0์ผ๋ก ๋ง๋ค์ด์ค์ผ ํจ
optimizer.zero_grad()
# ์ญ์ ํ: ๋น์ฉ ํจ์๋ฅผ ๋ฏธ๋ถํ์ฌ gradient ๊ณ์ฐ
loss.backward()
# ๊ฐ์ค์น ์
๋ฐ์ดํธ: ๊ณ์ฐ๋ gradient๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์
๋ฐ์ดํธ
optimizer.step()
# list(model.parameters()) # W: 0.0634, b: 0.6625
list(model.parameters()) # W: 0.2177 b: 0.7267
> [Parameter containing:
tensor([[0.2177]], requires_grad=True),
Parameter containing:
tensor([0.7267], requires_grad=True)]
# ๋ฐ๋ณต ํ์ต์ ํตํด ์ค์ฐจ๊ฐ ์๋ W, b๋ฅผ ์์ ํ๋ฉด์ ์ค์ฐจ๋ฅผ ๊ณ์ ์ค์ฌ๋๊ฐ
# epochs: ๋ฐ๋ณต ํ์ต ํ์(์ํฌํฌ)
epochs = 1000
for epoch in range(epochs + 1):
y_pred = model(x_train)
loss = nn.MSELoss()(y_pred, y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 100 == 0:
print(f'Epoch: {epoch}/{epochs} Loss: {loss:.6f}')
> Epoch: 0/1000 Loss: 10.171454
> Epoch: 100/1000 Loss: 0.142044
> Epoch: 200/1000 Loss: 0.087774
> Epoch: 300/1000 Loss: 0.054239
> Epoch: 400/1000 Loss: 0.033517
> Epoch: 500/1000 Loss: 0.020711
> Epoch: 600/1000 Loss: 0.012798
> Epoch: 700/1000 Loss: 0.007909
> Epoch: 800/1000 Loss: 0.004887
> Epoch: 900/1000 Loss: 0.003020
> Epoch: 1000/1000 Loss: 0.001866
print(list(model.parameters())) # W: 1.9499, b: 0.1138
> [Parameter containing:
tensor([[1.9499]], requires_grad=True), Parameter containing:
tensor([0.1138], requires_grad=True)]
x_test = torch.FloatTensor([[5]])
y_pred = model(x_test)
y_pred
> tensor([[9.8635]], grad_fn=<AddmmBackward0>)
- ์ฌ๋ฌ ๊ฐ์ ์ ๋ ฅ์ด ๋ค์ด๊ฐ์ ํ ๊ฐ์ ์ถ๋ ฅ์ด ๋์ค๋ ๊ตฌ์กฐ
X_train = torch.FloatTensor([[73, 80, 75],
[93, 88, 93],
[89, 91, 90],
[96, 98, 100],
[73, 66, 70]])
y_train = torch.FloatTensor([[220], [270], [265], [290], [200]])
print(X_train, X_train.shape)
print(y_train, y_train.shape)
> tensor([[ 73., 80., 75.],
[ 93., 88., 93.],
[ 89., 91., 90.],
[ 96., 98., 100.],
[ 73., 66., 70.]]) torch.Size([5, 3])
> tensor([[220.],
[270.],
[265.],
[290.],
[200.]]) torch.Size([5, 1])
# y = w1x1 + w2x2 + w3x3 + b
model = nn.Linear(3, 1) # ์
๋ ฅ3๊ฐ ์ถ๋ ฅ1๊ฐ
model
> Linear(in_features=3, out_features=1, bias=True)
optimizer = optim.SGD(model.parameters(), lr=0.00001)
epochs = 20000
for epoch in range(epochs + 1):
y_pred = model(X_train)
loss = nn.MSELoss()(y_pred, y_train)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if epoch % 100 == 0:
print(f'Epoch: {epoch}/{epochs} Loss: {loss:.6f}')
> Epoch: 0/20000 Loss: 75967.109375
> Epoch: 100/20000 Loss: 15.825180
> Epoch: 200/20000 Loss: 15.499573
...
list(model.parameters()) # W: 0.6814, 0.8616, 1.3889 b: -0.2950
> [Parameter containing:
tensor([[0.6814, 0.8616, 1.3889]], requires_grad=True),
Parameter containing:
tensor([-0.2950], requires_grad=True)]
x_test = torch.FloatTensor([[100, 100, 100]])
y_pred = model(x_test)
y_pred
> tensor([[292.8991]], grad_fn=<AddmmBackward0>)
```~~ํ
์คํธ~~