ํ ์ ๊ธฐ๋ณธ
ํ ์ ๊ธฐ๋ณธโ
์ผ๋จ Tensor์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ์ ๋ฐฐ์ฐ๋ ค๋ฉด ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ค ๊ตฌ์กฐ๋ก ์ํ๋๋์ง ์ ์ ์์ด์ผํ๋ค.
๐ก ์ฐธ๊ณ
์๋๋ฅผ ์์ฑํด๋ณด๋ผ
์ผ๋จ ์ฃผ์๋ง ๋ณด๊ณ ์ด๋ค ์ฝ๋๊ฐ ๋ค์ด๊ฐ๋์ง ์์ํด๋ณด๋ผ
# ์๋ ๊ณ ์ : ์ฌํ์ฑ์ ์ํด ๋์ ์์ฑ ๊ฒฐ๊ณผ๋ฅผ ๋์ผํ๊ฒ ์ค์
# ์
๋ ฅ ๋ฐ์ดํฐ ์์ฑ: ์ ๊ท๋ถํฌ(ํ๊ท 0, ํ์คํธ์ฐจ 1)์ ๋ฐ๋ผ๋ ๋์ ํ
์ (์ํ 1๊ฐ, ํน์ฑ 3๊ฐ)
# ์ ๊ฒฝ๋ง์ ๊ณ์ธต ํฌ๊ธฐ ์ ์
# ๋ชจ๋ธ ๊ตฌ์ฑ: ์๋์ธต๊ณผ ์ถ๋ ฅ์ธต ๋ด๋ฐ ์ ์ค์
# ์๋์ธต ๋ด๋ฐ ์
# ์ถ๋ ฅ์ธต ๋ด๋ฐ ์ (์: ํ๊ท ๋ฌธ์ )
# ๊ฐ์ค์น ๋ฐ ํธํฅ ์ด๊ธฐํ
# ์
๋ ฅ์ธต -> ์๋์ธต ๊ฐ์ค์น ( 3 x 2 )
# ์๋์ธต ํธํฅ ( 2 X 1 )
# ์๋์ธต -> ์ถ๋ ฅ์ธต ๊ฐ์ค์น ( 2 x 1 )
# ์ถ๋ ฅ์ธต ํธํฅ ( 1 x 1 )
# ์์ ํ ๊ณ์ฐ
# ์
๋ ฅ์ธต์์ ์๋์ธต ๊ณ์ฐ
# ์๋์ธต์์ ์ถ๋ ฅ์ธต ๊ณ์ฐ
# ์ต์ข
์์ธก ๊ฒฐ๊ณผ ์ถ๋ ฅ
def activation (x):
return 1 / (1 + torch.exp(-x))
- ์ํ 1๊ฐ, ํน์ฑ 3๊ฐ์ ๋ฌด์์ ๋งํ๋๊ฐ?
์ํ1๊ฐ : ์ ๊ฒฝ๋ง ๋ชจ๋ธ์ ์ ๋ ฅ๋๋ ๋ฐ์ดํฐ ํ๋๋ฅผ ์๋ฏธํจ (์๋ฅผ ๋ค์ด ์ด๋ฏธ์ง ๋ถ๋ฅ ๋ชจ๋ธ์ด๋ผ๋ฉด ์ด๋ฏธ์ง ํ ์ฅ์ด ์ํ์ด ๋ ์ ์์ต๋๋ค. )
ํน์ฑ3๊ฐ : ์ฌ๋์ด ์ํ 1๊ฐ๋ผ๋ฉด ํน์ฑ 3๊ฐ๋ ์ฌ๋์ ํค, ๋ชธ๋ฌด๊ฒ, ๋์ด ์ ๊ฐ์๊ฒ
- ์ํ 1๊ฐ, ํน์ฑ 3๊ฐ๋ผ๋ฉด ์๋์ธต๊ณผ ์ถ๋ ฅ์ธต์ ์ด๋ป๊ฒ ์ค์ ํด์ผํ ๊น?
์๋์ธต์ 2๊ฐ : n_hidden = 2 ์ถ๋ ฅ์ธต์ 1๊ฐ : n_output = 1
# ์๋ ๊ณ ์ : ์ฌํ์ฑ์ ์ํด ๋์ ์์ฑ ๊ฒฐ๊ณผ๋ฅผ ๋์ผํ๊ฒ ์ค์
torch.manual_seed(7)
# ์
๋ ฅ ๋ฐ์ดํฐ ์์ฑ: ์ ๊ท๋ถํฌ(ํ๊ท 0, ํ์คํธ์ฐจ 1)์ ๋ฐ๋ผ๋ ๋์ ํ
์ (์ํ 1๊ฐ, ํน์ฑ 3๊ฐ)
features = torch.rand((1,3))
# ์ ๊ฒฝ๋ง์ ๊ณ์ธต ํฌ๊ธฐ ์ ์
n_input = features.shape[1]
# ๋ชจ๋ธ ๊ตฌ์ฑ: ์๋์ธต๊ณผ ์ถ๋ ฅ์ธต ๋ด๋ฐ ์ ์ค์
# ์๋์ธต ๋ด๋ฐ ์
n_hidden = 2
# ์ถ๋ ฅ์ธต ๋ด๋ฐ ์ (์: ํ๊ท ๋ฌธ์ )
n_ouput = 1
# ๊ฐ์ค์น ๋ฐ ํธํฅ ์ด๊ธฐํ
# ์
๋ ฅ์ธต -> ์๋์ธต ๊ฐ์ค์น ( 3 x 2 )
W1 = torch.randn(n_input, n_hidden)
# ์๋์ธต ํธํฅ ( 2 X 1 )
W2 = torch.randn(n_hidden)
# ์๋์ธต -> ์ถ๋ ฅ์ธต ๊ฐ์ค์น ( 2 x 1 )
B1 = torch.randn((1, n_hidden))
# ์ถ๋ ฅ์ธต ํธํฅ ( 1 x 1 )
B2 = torch.randn((1, n_output))
# ์์ ํ ๊ณ์ฐ
# ์
๋ ฅ์ธต์์ ์๋์ธต ๊ณ์ฐ
h = activation(torch.mm(features, W1) + B1)
# ์๋์ธต์์ ์ถ๋ ฅ์ธต ๊ณ์ฐ
output = activation(torch.mm(h, W2) + B2)
# ์ต์ข
์์ธก ๊ฒฐ๊ณผ ์ถ๋ ฅ
print(output)
์ ๋ฆฌโ
์ฝ๋ ์์ฝ ๋ฐ ์ค๋ช โ
1. ์๋ ๊ณ ์ (seed ๊ณ ์ )โ
torch.manual_seed(7)- ๋ชฉ์ : ๋์ ์์ฑ ์ ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋๋ก ์ค์ ํ์ฌ, ์ฝ๋ ์คํ ๊ฒฐ๊ณผ์ ์ฌํ์ฑ์ ํ๋ณดํฉ๋๋ค.
- ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ํ์ต์ ๋ฌด์์์ฑ์ ์์กดํ๋ฏ๋ก, ์คํ ๊ฒฐ๊ณผ๋ฅผ ์ฌํํ๊ณ ๋น๊ตํ๊ธฐ ์ํด ์๋ ๊ณ ์ ์ด ํ์์ ์ ๋๋ค.
2. ์ ๋ ฅ ๋ฐ์ดํฐ ์์ฑโ
features = torch.rand((1,3))- ์ญํ : ๋ชจ๋ธ์ ์ ๋ ฅ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค.
- ํํ: 1๊ฐ์ ์ํ๊ณผ 3๊ฐ์ ํน์ฑ์ ๊ฐ์ง ํ ์ ํํ์ ๋๋ค.
torch.randํจ์๋ 0๊ณผ 1 ์ฌ์ด์ ๋ฌด์์ ๊ฐ์ ์์ฑํฉ๋๋ค.
3. ์ ๊ฒฝ๋ง ๊ตฌ์กฐ ์ ์โ
n_input = features.shape[1]n_hidden = 2n_output = 1- ์๋ฏธ:*
n_input: ์ ๋ ฅ์ธต์ ๋ ธ๋ ์ (ํน์ฑ ๊ฐ์)n_hidden: ์๋์ธต์ ๋ ธ๋ ์n_output: ์ถ๋ ฅ์ธต์ ๋ ธ๋ ์ (์์ธกํ๋ ค๋ ๊ฐ์ ๊ฐ์)
4. ๊ฐ์ค์น ๋ฐ ํธํฅ ์ด๊ธฐํโ
W1 = torch.randn(n_input, n_hidden)W2 = torch.randn(n_hidden)B1 = torch.randn((1, n_hidden))B2 = torch.randn((1, n_output))- ์ญํ :*
W1: ์ ๋ ฅ์ธต์์ ์๋์ธต์ผ๋ก ์ฐ๊ฒฐ๋๋ ๊ฐ์ค์นW2: ์๋์ธต์์ ์ถ๋ ฅ์ธต์ผ๋ก ์ฐ๊ฒฐ๋๋ ๊ฐ์ค์นB1: ์๋์ธต์ ํธํฅB2: ์ถ๋ ฅ์ธต์ ํธํฅ
torch.randnํจ์๋ ํ๊ท ์ด 0์ด๊ณ ํ์คํธ์ฐจ๊ฐ 1์ธ ์ ๊ท๋ถํฌ๋ฅผ ๋ฐ๋ฅด๋ ๋์๋ฅผ ์์ฑํฉ๋๋ค.
5. ์์ ํ ๊ณ์ฐโ
h = activation(torch.mm(features, W1) + B1)output = activation(torch.mm(h, W2) + B2)- ์ค๋ช
:*
torch.mm: ํ๋ ฌ ๊ณฑ์ ์ฐ์ฐactivation: ํ์ฑํ ํจ์ (sigmoid, ReLU ๋ฑ)- ์ ๋ ฅ ๋ฐ์ดํฐ -> ์๋์ธต -> ์ถ๋ ฅ์ธต ์์๋ก ๊ณ์ฐ์ ์งํํฉ๋๋ค.
6. ์ต์ข ๊ฒฐ๊ณผ ์ถ๋ ฅโ
print(output)- ์ญํ : ๋ชจ๋ธ์ ์ต์ข ์์ธก ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ์ถ๋ ฅํฉ๋๋ค.
์ถ๊ฐ ์ค๋ช โ
- ์ด ์ฝ๋๋ ๋จ์ธต ํผ์ ํธ๋ก ๋๋ 2๊ณ์ธต ์ ๊ฒฝ๋ง์ ๊ตฌํํ ๊ฒ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
- ํ์ฑํ ํจ์(
activation)๋ ์ฝ๋์ ๋ช ์๋์ด ์์ง ์์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก sigmoid, ReLU ๋ฑ์ ํจ์๊ฐ ์ฌ์ฉ๋ฉ๋๋ค. - ์ด ์ฝ๋๋ ๋จ์ํ ํํ์ ์ ๊ฒฝ๋ง์ผ๋ก, ์ค์ ๋ฌธ์ ์ ์ ์ฉํ๊ธฐ ์ํด์๋ ๋ชจ๋ธ ๊ตฌ์กฐ, ํ์ฑํ ํจ์, ์์ค ํจ์, ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ ๋ฑ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ์ง๋ฌธํด์ฃผ์ธ์.
์ ์ด์ ์ฃผ์ ์์ด ํ๋ฒ ์ญ ์จ๋ด ์๋ค.โ
import torch
def activation(x):
return 1 / (1 + torch.exp(-x))
torch.manual_seed(7)
features = torch.randn((1,3))
n_input = features.shape[1] # 3
n_hidden = 2
n_output = 1
W1 = torch.randn(n_input, n_hidden) # 3, 2
W2 = torch.randn(n_hidden, n_output) # 2, 1
B1 = torch.randn(1, n_hidden) # 1, 2
B2 = torch.randn(1, n_output) # 1, 1
h = activation(torch.mm(features, W1) + B1)
output = activation(torch.mm(h, W2) + B2)
print(output)