ํผ์ ํธ๋ก ์ ํ๊ณ ํด๊ฒฐ ๋ฐฉ๋ฒ : ์ขํ ํ๋ฉด ์์ฒด์ ๋ณํ๋ฅผ ์ฃผ์!
XOR ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๋ ๊ฐ์ ํผ์ ํธ๋ก ์ ํ๋ฒ์ ๊ณ์ฐ ํด์ผํ๋ค ! ์๋์ธต(hidden layer)์ ๋ง๋ฆ
ํผ์ ํธ๋ก ์ด ๊ฐ์ด๋ฐ ์๋์ธต์ผ๋ก ์์ ์ ๊ฐ์ค์นw์ ๋ฐ์ด์ด์คb ๊ฐ์ ๋ณด๋ด๊ณ ,
์๋์ธต์์ ๋ชจ์ธ ๊ฐ์ด ํ ๋ฒ ๋ ์๊ทธ๋ชจ์ด๋ ํจ์(σ)๋ฅผ ์ด์ฉํด ์ต์ข ๊ฐ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ธ๋ค.
๋ ธ๋(node) = ์๋์ธต์ ๋ชจ์ด๋ ์ค๊ฐ ์ ๊ฑฐ์ฅ
n1๊ณผ n2์ ๊ฐ์ ๊ฐ๊ฐ ๋จ์ผ ํผ์ ํธ๋ก ์ ๊ฐ๊ณผ ๊ฐ๋ค.
n1 = σ(x1w11 + x2w21+b1)
n2 = σ(x1w12 + x2w22 + b2)
์ด์ ๊ฐ๊ฐ์ ๊ฐ์ค์น(w)์ ๋ฐ์ด์ด์ค(b)์ ๊ฐ์ ์ ํ ์ฐจ๋ก์ ๋๋ค. 2์ฐจ์ ๋ฐฐ์ด๋ก ๋์ด๋์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ํ ์ ์์ต๋๋ค.
์๋์ธต์ ํฌํจํด ๊ฐ์ค์น 6๊ฐ์ ๋ฐ์ด์ด์ค 3๊ฐ๊ฐ ํ์ํฉ๋๋ค.
XOR๋ฌธ์ ํด๊ฒฐ
๋ค์๊ณผ ๊ฐ์ด ๋ณ์๊ฐ์ ์ ํ๊ณ , ๋์์ ๋์
x1 |
x2 |
n1 |
n2 |
y out |
์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฐ |
0 |
0 |
σ(0 * (-2) + 0 * (-2) + 3) ≈ 1 |
σ(0 * 2 + 0 * 2 - 1) ≈ 0 |
σ(1 * 1 + 0 * 1 - 1) ≈ 0 |
0 |
0 |
1 |
σ(0 * (-2) + 1 * (-2) + 3) ≈ 1 |
σ(0 * 2 + 1 * 2 - 1) ≈ 1 |
σ(1 * 1 + 1 * 1 - 1) ≈ 1 |
1 |
1 |
0 |
σ(1 * (-2) + 0 * (-2) + 3) ≈ 1 |
σ(1 * 2 + 0 * 2 - 1) ≈ 1 |
σ(1 * 1 + 1 * 1 - 1) ≈ 1 |
1 |
1 |
1 |
σ(1 * (-2) + 1 * (-2) + 3) ≈ 0 |
σ(1 * 2 + 1 * 2 - 1) ≈ 1 |
σ(0 * 1 + 1 * 1 - 1) ≈ 0 |
0 |
≈๊ฑฐ์ ๊ฐ๋ค๋ ์๋ฏธ
n1 = NAND ๊ฒ์ดํธ
n2 = x1, x2์ ๋ํ OR ๊ฒ์ดํธ
y out = n1,n2์ ๋ํ AND ๊ฒ์ดํธ
์ฝ๋ฉ์ผ๋ก ๊ตฌํํ๊ธฐ
import numpy as np
#w์ b
w11 = np.array([-2,-2])
w12 = np.array([2,2])
w2 = np.array([1,1])
b1 = 3
b2 = -1
b3 = -1
# ํผ์
ํธ๋ก
def MLP(x, w, b):
y = np.sum(w*x)+b
if y<0:
return 0
else:
return 1
# NAND ๊ฒ์ดํธ
def NAND(x1, x2):
return MLP(np.array([x1, x2]), w11, b1)
# OR ๊ฒ์ดํธ
def OR(x1, x2):
return MLP(np.array([x1, x2]), w12, b2)
# AND ๊ฒ์ดํธ
def AND(x1, x2):
return MLP(np.array([x1, x2]), w2, b3)
# XOR ๊ฒ์ดํธ
def XOR(x1, x2):
return AND(NAND(x1, x2),OR(x1, x2))
# x1, x2 ๊ฐ์ ๋ฒ๊ฐ์ ๋์
ํ๋ฉฐ ์ต์ข
๊ฐ ์ถ๋ ฅ
if __name__ == '__main__':
for x in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = XOR(x[0], x[1])
print("์
๋ ฅ ๊ฐ: " + str(x) + " ์ถ๋ ฅ ๊ฐ: " + str(y))