Skip to main content

ํ…์„œ ๊ธฐ๋ณธ

ํ…์„œ ๊ธฐ๋ณธโ€‹

์ผ๋‹จ 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 = 2
  • n_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)