๐Ÿ’ป/ML

[๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๋”ฅ๋Ÿฌ๋‹] ์ธ๊ณต์‹ ๊ฒฝ๋ง, ์˜ค์ฐจ์—ญ์ „ํŒŒ

ruhz 2020. 8. 11. 14:53

์ธ๊ฐ„์˜ ์ง€๋Šฅ

์ธ๊ณต์ง€๋Šฅ์€ ๋ง ๊ทธ๋Œ€๋กœ, ์‚ฌ๋žŒ์ด ๋งŒ๋“  '์ง€๋Šฅ(Intelligence)'์ด๋‹ค. ์ธ๊ฐ„์˜ ์ž…์žฅ์—์„œ ์ง€๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ธ๊ฐ„์˜ '๋‡Œ'์˜ ๋งค์ปค๋‹ˆ์ฆ˜์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ์ฐธ๊ณ ํ•˜๋Š” ๊ฒƒ์€ ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‡Œ๋Š” ์—ฌ๋Ÿฌ ๋‰ด๋Ÿฐ๋“ค์ด ์„œ๋กœ์„œ๋กœ ๊ทธ๋ฌผ์ฒ˜๋Ÿผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์‹ ๊ฒฝ๋ง(Neural Network)์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ฐ”๋กœ ๋‰ด๋Ÿฐ์˜ ์ž‘๋™์›๋ฆฌ๋ฅผ ์•Œ์•„๋ณด์ž.

๋จผ์ €, ๋‚˜๋ฌด์˜ ๊ฐ€์ง€์ฒ˜๋Ÿผ ๋˜์–ด ์žˆ๋Š” ์ˆ˜์ƒ๋Œ๊ธฐ(dendrite)๋ฅผ ํ†ตํ•ด ์ž๊ทน์„ ๋ฐ›์•„๋“ค์ธ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ž๊ทน์ด ๋„ˆ๋ฌด ์ž‘๋‹ค๋ฉด, ๋‰ด๋Ÿฐ์—๋Š” ์•„๋ฌด ์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋‰ด๋Ÿฐ์—์„œ ์‹ ํ˜ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ตœ์†Œํ•œ์˜ ์ž๊ทน, ์ฆ‰ '์—ญ์น˜'์ด์ƒ์˜ ์ž๊ทน์ด ๊ฐ€ํ•ด์ ธ์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ์ถฉ๋ถ„ํ•œ ์ž๊ทน์œผ๋กœ ์ „๊ธฐ์‹ ํ˜ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด, ์ด๋Š” ๊ณ„์†ํ•ด์„œ ์ „๋‹ฌ๋˜์–ด(axon) ๋‚˜๊ฐ„๋‹ค. ์ด ์ „๊ธฐ์‹ ํ˜ธ๊ฐ€ ๋ง๋‹จ๋ถ€(axon terminal)์— ๋„๋‹ฌํ•˜๋ฉด, ๋ง๋‹จ๋ถ€์—์„œ ์ „๋‹ฌ๋ฌผ์งˆ์„ ๋‚ด๋ณด๋‚ด, ๋‹ค์Œ ๋‰ด๋Ÿฐ์˜ ์ˆ˜์ƒ๋Œ๊ธฐ(dendrite)์— ์‹ ํ˜ธ๋ฅผ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ์•ฝ 1000์–ต๊ฐœ ๊ฐ€๋Ÿ‰์˜ ๋‰ด๋Ÿฐ์ด ๊ทธ๋ฌผ๋ง์ฒ˜๋Ÿผ ์ธ๊ฐ„์˜ ๋‡Œ์— ์–ฝํ˜€์žˆ๋Š” ๊ฒƒ์ด๋‹ค. 

 

์ธ๊ณต์‹ ๊ฒฝ๋ง

์ž˜ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๋‰ด๋Ÿฐ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๊ฒƒ๋“ค๊ณผ ๋งŽ์ด ๋‹ฎ์•„์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€(Logistic Regression)๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. ๋ฐ์ดํ„ฐ x1, x2, x3(์ž๊ทน)๋ฅผ ๋ฐ›๋Š”๋‹ค. x1, x2, x3์— ํ•™์Šตํ•  ๊ฐ€์ค‘์น˜ w1, w2, w3๋ฅผ ๊ณฑํ•˜๊ณ  ํŽธํ–ฅ b๋ฅผ ๋”ํ•ด ๊ฐ€์ •์„ ๋งŒ๋“ค๊ณ , ์ด๊ฒƒ์„ sigmoid์— ๋„ฃ์–ด 0~1 ๋ฒ”์œ„๋กœ  ๋งŒ๋“ ๋‹ค. ์ด ๋•Œ ๊ฐ€์ •์ด 0.5(์—ญ์น˜)๋ณด๋‹ค ์ž‘๋‹ค๋ฉด '0'์œผ๋กœ, ํฌ๋‹ค๋ฉด '1'๋กœ ๊ฒฐ์ •ํ•œ๋‹ค.

๋ญ”๊ฐ€ ์ต์ˆ™ํ•œ ๋‰ด๋Ÿฐ์˜ ๊ตฌ์กฐ๋Š” ๊ทธ๋ ‡๋‹ค ์ณ๋„, ์ด๊ฒƒ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ•ด์„œ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ผ๋‹จ ์œ„ ์‚ฌ์ง„์„ ๋ณด์ž. ํ•˜๋‚˜์˜ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์˜ ๋‰ด๋Ÿฐ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋ ๊ฒƒ์ด๋‹ค. ์˜ˆ์‹œ ์‚ฌ์ง„์€ ๊ฒฐ๊ณผ์ ์œผ๋กœ ์„ธ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด ํ•˜๋‚˜์˜ ์ถœ๋ ฅ์„ ๊ฐ–๋Š”๋‹ค. ๊ทธ ์‚ฌ์ด์—๋Š” ๊ฐ’์„ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋…ธ๋“œ๋“ค์ด ์žˆ๊ณ , ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ธ๊ณต์ง€๋Šฅ์ด '์‚ฌ๊ณ '๋ฅผ ํ•˜๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•ด ๋‚ธ๋‹ค. ์ด '์‚ฌ๊ณ '์˜ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ๋กœ๋Š” XOR๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

 

XOR ๋ฌธ์ œ

์ฒ˜์Œ๋ณด๋Š” ๊ทธ๋ฆผ์ด๋ผ๋ฉด, [4]๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€ ํฌ์ŠคํŒ… ์ฐธ๊ณ 

์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด 0, 1๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ, Wx+b์˜ ๊ฐ€์ • ์ง์„ ์—์„œ W, b๋ฅผ ํ•™์Šต์‹œ์ผœ ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์€ ์ง์„ ์œผ๋กœ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์„ ์•Œ๊ณ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์„ ํ˜•(Wx+b)์ธ ๊ฐ€์ •์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์œ„์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ ์ง์„ ์„ ๊ธ‹๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ๋‰ด๋Ÿฐ, ์ฆ‰ ๋…ธ๋“œ ์—ญ์‹œ ๊ฐ๊ฐ์ด ํ•˜๋‚˜์˜ ์ง์„ ์„ ๊ธ‹๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค. 

XOR์€ ๋‘๊ฐœ์˜ ๊ฐ’์ด ๋‹ค๋ฅผ ๋•Œ๋งŒ, True(=1)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋…ผ๋ฆฌํ•จ์ˆ˜์ด๋‹ค. ์œ„์˜ ๊ทธ๋ฆผ์— ํ•˜๋‚˜์˜ ์ง์„ ์„ ๊ทธ์–ด ๋นจ๊ฐ„์ (False)๊ณผ ํŒŒ๋ž€์ (True)์ด ๊ฐ๊ฐ ๋‹ค๋ฅธ ์˜์—ญ์— ์†ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์กฐ๊ธˆ๋งŒ ํ•ด๋ด๋„ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ˆ˜ํ•™์ ์œผ๋กœ๋„ ์ฆ๋ช…๋œ ์‚ฌ์‹ค์ด๋‹ค. ํ•˜์ง€๋งŒ ํ•˜๋‚˜์˜ ์ง์„ ์ด ์•„๋‹Œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ง์„ ์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๋นจ๊ฐ„์ ๊ณผ ํŒŒ๋ž€์ ์˜ ๊ตฌ๋ถ„์€ ์–ผ๋งˆ๋“ ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๊ฒƒ์„ ๊ฐ„๋‹จํ•œ ์‹ ๊ฒฝ๋ง์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ณด์ž. 

์‹ค์ œ๋กœ (0, 0), (0, 1), (1, 0), (1, 1)์„ ๋„ฃ์—ˆ์„ ๋•Œ, ๊ฐ๊ฐ์ด XOR์˜ ๊ฒฐ๊ณผ๊ฐ’(0, 1, 1, 0) ์ด ๋‚˜์˜ค๋ฉด ๋œ๋‹ค. '-8→0' ์€ ๋‚˜์˜จ ๊ฒฐ๊ณผ๋ฅผ ์Œ์ˆ˜๋Š” 0์œผ๋กœ, ์–‘์ˆ˜๋Š” 1๋กœ sigmoidํ•จ์ˆ˜์ฒ˜๋Ÿผ ๊ทผ์‚ฌ์‹œํ‚จ ๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ XOR์„ ์ž˜ ๊ตฌํ˜„ํ–ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์™ผ์ชฝ ๊ทธ๋ฆผ์„ ์‚ด์ง ๋ฐ”๊ฟ”์ฃผ๋ฉด ์˜ค๋ฅธ์ชฝ์˜ ๋ชจ์–‘์ด ๋˜๊ณ , ์ด๊ฒƒ์„ ์—ฌ๋Ÿฌ๊ฒŒ ์ด์–ด๋ถ™์—ฌ ๊ทธ๋ฌผ๊ณผ ๊ฐ™์€ ๋ชจ์–‘์˜ ์‹ ๊ฒฝ๋ง์ด ์™„์„ฑ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์˜ˆ์‹œ์—์„œ๋Š” ์ด๋ฏธ ์ •๋‹ต์˜ W์™€ b๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋งž๋Š”์ง€ ํ‹€๋ฆฌ๋Š”์ง€ ๊ฐ’์„ ๋„ฃ์–ด๋ณด๊ธฐ๋งŒ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ •๋‹ต W์™€ b๋ฅผ ๋จธ์‹ ๋Ÿฌ๋‹์œผ๋กœ, ์ฆ‰ ํ•™์Šต์„ ํ†ตํ•ด์„œ ์•Œ์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•™์Šตํ•  ๋ฐ์ดํ„ฐ (x1, x2, Y)๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. x1, x2๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ๋…ธ๋“œ(๋‰ด๋Ÿฐ)๋ฅผ ๊ฑฐ์ณ ๋‚˜์˜จ Y'์™€ ์‹ค์ œ Y๋ฅผ ๋น„๊ตํ•ด ์ด ์˜ค์ฐจ๊ฐ€ ์ค„์–ด๋“ค๋„๋ก ๊ฐ ๋…ธ๋“œ์˜ W, b๋ฅผ ํ•™์Šต์‹œ์ผœ์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ์‚ฌ์‹ค ์‹ ๊ฒฝ๋ง์—์„œ ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ€์ค‘์น˜์™€ ํŽธํ–ฅ์„ ํ•™์Šต์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์€ ์ธ๊ฐ„์ด ๋ช‡ ๋…„๋™์•ˆ์ด๋‚˜ ํ—ค๋งธ๋˜ ๋ฌธ์ œ์ด๋‹ค. ๋ช‡ ๋ฒˆ์˜ ์‹œํ–‰์ฐฉ์˜ค๋Š” ์žˆ์—ˆ์ง€๋งŒ ๊ฒฐ๊ตญ ์˜ค์ฐจ์—ญ์ „๋ฒ•์ด๋ผ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋‚ธ๋‹ค.

 

์˜ค์ฐจ์—ญ์ „ํŒŒ

ํ•™์Šต์˜ ๋ชฉ์ ์€ ๊ฒฐ๊ตญ ๋น„์šฉ์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋‹ค. ๋น„์šฉ์€ ๊ฒฐ๊ตญ OUTPUT์œผ๋กœ ๋‚˜์˜จ ๋งˆ์ง€๋ง‰ ๊ฒฐ๊ณผ์™€ ์‹ค์ œ Y์˜ ์ฐจ์ด๊ฐ€ ๋˜๊ณ , ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์„ ํ†ตํ•ด์„œ ๋น„์šฉ์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ตฌํ–ˆ์—ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด ์ „์— ์ •์˜ํ–ˆ๋˜ ๋น„์šฉํ•จ์ˆ˜ cost(W)์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•˜๊ฒŒ W ํ•˜๋‚˜๋กœ OUTPUT์ด ๊ฒฐ์ •๋œ ๊ฒŒ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ ๋…ธ๋“œ๊ฐ€ ๊ฐ€์ง„ ๊ฐ๊ฐ์˜ W, b๊ฐ€ ๋ชจ๋‘ OUTPUT์ด ๋‚˜์˜ค๋Š”๋ฐ ๊ด€์—ฌ๋ฅผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ cost(W)ํ•จ์ˆ˜๋ฅผ ๊ทธ๋ฆฌ๊ณ  ๊ฒฝ์‚ฌ๋ฅผ ๋”ฐ๋ผ ํ•˜๊ฐ•ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋…ธ๋“œ ๊ฐ๊ฐ์„ ๊ฒฝ์‚ฌํ•˜๊ฐ•์‹œ์ผœ์ค„ ๊ฒƒ์ด๋‹ค. ์–ด๋–ค ๋…ธ๋“œ๊ฐ€ OUTPUT์„ ๋‚ด๋Š”๋ฐ์— ์–ผ๋งˆ๋‚˜ ๊ด€์—ฌ๋ฅผ ํ–ˆ๋Š”์ง€๋ฅผ ํŽธ๋ฏธ๋ถ„์œผ๋กœ ๊ณ„์‚ฐํ•˜๊ณ , ์ด ๊ธฐ์šธ๊ธฐ๋ฅผ ๋”ฐ๋ผ ๊ฐ๊ฐ์˜ W, b๋ฅผ ํ•™์Šต์‹œ์ผœ์ค„ ๊ฒƒ์ด๋‹ค. ํŽธ๋ฏธ๋ถ„์€ ๊ณ ๋“ฑํ•™๊ต ๋•Œ ๋ฐฐ์šด ํ•ฉ์„ฑํ•จ์ˆ˜์˜ ๋ฏธ๋ถ„์„ ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

$$f(g(x))'=f'(g(x))\times g'\left(x\right)$$

์šฐ๋ฆฌ๊ฐ€ f(g(x))๋ฅผ x์— ๋Œ€ํ•ด ๋ฏธ๋ถ„ํ•œ ๊ฒƒ์„ ๋ณด๋Š” ํ–‰์œ„๋Š” x๊ฐ€ ์–ผ๋งˆ๋‚˜ f(g(x))์— ๊ด€์—ฌํ•˜๊ณ  ์žˆ๋Š”๊ฐ€(๊ธฐ์šธ๊ธฐ)๋ฅผ ๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‹์„ ๋ณด๋ฉด ๋จผ์ € f๋ฅผ g์— ๋Œ€ํ•ด ๋ฏธ๋ถ„ํ•˜์—ฌ f์— ๋Œ€ํ•œ g๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ด€์—ฌํ•˜๊ณ  ์žˆ๋Š”๊ฐ€ ๋ณด๊ณ , ๊ฑฐ๊ธฐ์— g๋ฅผ x๋กœ ๋ฏธ๋ถ„ํ•œ ๊ฒƒ์„ ๊ณฑํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” f(g(x))์— ๋Œ€ํ•œ x์˜ ๋ฏธ๋ถ„๊ฐ’์„ ์–ป๊ฒŒ๋œ๋‹ค.

์‹ ๊ฒฝ๋ง๋„ ์ด์™€ ๋น„์Šทํ•˜๋‹ค. OUTPUT๋…ธ๋“œ์— ์–ด๋–ค INPUT๋…ธ๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ด€์—ฌํ–ˆ๋‚˜ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ž์‹ ์˜ ์•ž ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ž์‹ ์˜ ๋ฏธ๋ถ„๊ฐ’์„ ๊ณ„์†ํ•ด์„œ ์žฌ๊ท€์ ์œผ๋กœ ๊ณฑํ•ด๋‚˜๊ฐ€๋‹ค ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•ฉ์„ฑํ•จ์ˆ˜์—์„œ x๋Š” ์ž์‹ ์˜ ์•ž์— ์žˆ๋Š” g๋ฅผ , g๋Š” ์ž์‹ ์˜ ์•ž์— ์žˆ๋Š” f๋ฅผ ๋ฏธ๋ถ„ํ•ด์„œ ๊ณฑํ•œ ๊ฒƒ์ฒ˜๋Ÿผ. ์œ„ ๊ณผ์ •์ด ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ผญ ๋งจ ์•„๋ž˜ ๋งํฌ์—์„œ ๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๋”ฅ๋Ÿฌ๋‹ ์‹œ์ฆŒ1 9-2๋ฅผ ๋“ค์–ด๋ณด๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ๊ฐ ๋น„์šฉ์— ๋Œ€ํ•œ ์ž์‹ ์˜ ๊ธฐ์—ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฒฝ์‚ฌ๋ฅผ ํ•˜๊ฐ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ  ์ด๋ ‡๊ฒŒ ๊ฒฝ์‚ฌ๋ฅผ ํ•˜๊ฐ•ํ•˜๋ฉฐ ํ•™์Šต์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ด ๋ชจ์–‘์ด ๋งˆ์น˜ ์˜ค์ฐจ๊ฐ€ ๊ฑฐ๊พธ๋กœ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•ด์„œ ์˜ค์ฐจ์—ญ์ „ํŒŒ(Back-Propagation)๋ผ๊ณ  ํ•œ๋‹ค. ํ…์„œํ”Œ๋กœ์šฐ ์—ญ์‹œ ๋ชจ๋“  ๊ฒƒ์ด ํ…์„œ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ทธ๋ž˜ํ”„(๋…ธ๋“œ, ์—ฃ์ง€)๋กœ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์˜ค์ฐจ๊ฐ€ ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ€๊ณ  ๋‚ด๋ ค์˜ค๋ฉด์„œ ๋ณ€์ˆ˜๋ฅผ ํ•™์Šต์‹œํ‚จ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

XOR ๊ตฌํ˜„


import tensorflow as tf
import numpy as np

tf.set_random_seed(777)  # for reproducibility

x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)
y_data = np.array([[0], [1], [1], [0]], dtype=np.float32)

X = tf.placeholder(tf.float32, [None, 2])
Y = tf.placeholder(tf.float32, [None, 1])

๋จผ์ € ํ•™์Šตํ•  ์ •๋‹ต ๋ฐ์ดํ„ฐ x_data, y_data ์Œ์ด ์ฃผ์–ด์ง„๋‹ค. ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ๋Š” ์ด ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹ ๊ฒฝ๋ง์„ ํ•™์Šต์‹œ์ผœ, ์ƒˆ๋กœ์šด ์ž„์˜์˜ x๋ฅผ ์ž…๋ ฅํ–ˆ์„ ๋•Œ ๊ทธ ๊ฒฐ๊ณผ y๊ฐ€ '0'์ธ์ง€ '1'์ธ์ง€ ๊ตฌ๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ธ๊ณต์ง€๋Šฅ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค. ์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ง€์Šคํ‹ฑ ํšŒ๊ท€์—์„œ ์ผ๋˜ ์ฝ”๋“œ์— ๊ทธ๋Œ€๋กœ ๋„ฃ์–ด๋ณด์ž. ์œ„์—์„œ ๋ณด์•˜๋“ฏ์ด ํ•˜๋‚˜์˜ ์ง์„ ์œผ๋กœ๋Š” XOR์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ •ํ™•๋„๊ฐ€ 0.5, ์ฆ‰ ์ œ๋Œ€๋กœ ํ•™์Šต์ด ๋˜์ง€ ์•Š์€ ์ฑ„ 0๊ณผ 1์„ ์ ˆ๋ฐ˜์˜ ํ™•๋ฅ ๋กœ ์ฐ๋Š”๊ฒƒ๊ณผ ๋‹ค๋ฆ„์ด ์—†๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ด์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

 


W1 = tf.Variable(tf.random_normal([2, 10]), name='weight1')
b1 = tf.Variable(tf.random_normal([10]), name='bias1')
layer1 = tf.sigmoid(tf.matmul(X, W1) + b1)

W2 = tf.Variable(tf.random_normal([10]), name='bias2')
layer2 = tf.sigmoid(tf.matmul(layer1, W2) + b2)

W3 = tf.Variable(tf.random_normal([10, 10]), name='weight3')
b3 = tf.Variable(tf.random_normal([10]), name='bias3')
layer3 = tf.sigmoid(tf.matmul(layer2, W3) + b3)

W4 = tf.Variable(tf.random_normal([10, 1]), name='weight4')
b4 = tf.Variable(tf.random_normal([1]), name='bias4')
hypothesis = tf.sigmoid(tf.matmul(layer3, W4) + b4)

 

 

๊ทธ๋ž˜์„œ ์‹ ๊ฒฝ๋ง์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค. ์‚ฌ์‹ค 2๊ฐœ์˜ ๋ ˆ์ด์–ด๋ฉด ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, ๋„“๊ฒŒ ์‹ ๊ฒฝ๋ง์„ ํŽผ์ณ๋„ ์ „ํ˜€ ์ƒ๊ด€์—†๋‹ค. ๊ฐ๊ฐ์˜ ๋…ธ๋“œ๋“ค์ด ๊ทธ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์˜ค์ฐจ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ์ž ๊ฒฝ์‚ฌ๋ฅผ ํƒ€๊ณ  ํ•˜๊ฐ•ํ•  ๊ฒƒ์ด๊ณ , ๊ฐ์ž ์ตœ์ ์˜ ๊ฐ€์ค‘์น˜์™€ ํŽธํ–ฅ์„ ์ฐพ์„ ๊ฒƒ์ด๋‹ค.

์œ„์˜ ์ฝ”๋“œ๋Š” ๋…ธ๋“œ๊ฐ€ 4๊ฐœ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ๋“ค์„ ๋ ˆ์ด์–ด๋ณ„๋กœ ํ•˜๋‚˜์˜ ํ–‰๋ ฌ๋กœ ํ•ฉ์ณ๋†“์€ ๊ฒƒ์ด๊ณ , 4๊ฐœ์˜ ๋ ˆ์ด์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  W1, W2, ... ์˜ ํ–‰๋ ฌ์€ [์ž…๋ ฅ, ์ถœ๋ ฅ] ์˜ shape์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ํ–‰๋ ฌ ๊ณฑ์€ (n × 'm') ('m' × k)์˜ ๊ผด๋กœ ์•ž ํ–‰๋ ฌ์˜ ์—ด ํฌ๊ธฐ์™€, ๋’ท ํ–‰๋ ฌ์˜ ํ–‰ ํฌ๊ธฐ๊ฐ€ ๊ฐ™์•„์•ผ ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‹ ๊ฒฝ๋ง์˜ ๊ฐ ๋ ˆ์ด์–ด๋„ ์•ž ๋ ˆ์ด์–ด์˜ ์ถœ๋ ฅ ๊ฐฏ์ˆ˜์™€ ๋’ท ๋ ˆ์ด์–ด์˜ ์ž…๋ ฅ ๊ฐฏ์ˆ˜๊ฐ€ ๊ฐ™๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ, ์šฐ๋ฆฌ๋Š” 2๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด 1๊ฐœ์˜ ๊ฒฐ๊ณผ(0 ๋˜๋Š” 1)๋ฅผ ์–ป์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์žฅ ์ฒซ ๋ ˆ์ด์–ด๋Š” [2, ?]์˜ ๊ผด, ๊ฐ€์žฅ ๋’ท ๋ ˆ์ด์–ด๋Š” [?, 1]์˜ ๊ผด์„ ๊ฐ€์ ธ์•ผ๋งŒ ํ•œ๋‹ค.

 


# cost/loss function
cost = -tf.reduce_mean(Y * tf.log(hypothesis) + (1 - Y) * tf.log(1 - hypothesis))
train = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(cost)

# Accuracy computation
# True if hypothesis>0.5 else False
predicted = tf.cast(hypothesis > 0.5, dtype=tf.float32)
accuracy = tf.reduce_mean(tf.cast(tf.equal(predicted, Y), dtype=tf.float32))

# Launch graph
with tf.Session() as sess:
    # Initialize TensorFlow variables
    sess.run(tf.global_variables_initializer())

    for step in range(10001):
        _, cost_val = sess.run([train, cost], feed_dict={X: x_data, Y: y_data})
        if step % 100 == 0:
            print(step, cost_val)

    # Accuracy report
    h, c, a = sess.run(
        [hypothesis, predicted, accuracy], feed_dict={X: x_data, Y: y_data}
    )
    print("\nHypothesis: ", h, "\nCorrect: ", c, "\nAccuracy: ", a)

์•ž์„œ ๋งํ–ˆ๋˜ ์˜ค์ฐจ์—ญ์ „๋ฒ• ์—ญ์‹œ, ๋˜˜๋˜˜ํ•œ ํ…์„œํ”Œ๋กœ์šฐ์˜ ํ•จ์ˆ˜๋“ค์— ๋‹ค ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ์ € ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. 

 

 

์•ž์„  ๊ฒŒ์‹œ๋ฌผ์— ๋งํฌํ–ˆ๋˜ '๋ชจ๋‘๋ฅผ ์œ„ํ•œ ๋”ฅ๋Ÿฌ๋‹' ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ํ•„๊ธฐํ•œ ๋…ธํŠธ์—
์ถ”๊ฐ€์ ์œผ๋กœ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ๋”ํ•ด ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๊ธ€์ž…๋‹ˆ๋‹ค.