A A
[DL] Neural Network Training (์‹ ๊ฒฝ๋ง ํ•™์Šต)
์ด๋ฒˆ์—๋Š” Neural Network(์‹ ๊ฒฝ๋ง) ํ•™์Šต์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜๊ณ  Pyhon์—์„œ Mnist Dataset์˜ ์†๊ธ€์”จ ์ˆซ์ž๋ฅผ ํ•™์Šตํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Data ์ฃผ๋„ ํ•™์Šต

  • Machine Learning(ML)์˜ ์ค‘์‹ฌ์—๋Š” Data(๋ฐ์ดํ„ฐ)๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ด๋„๋Š” ์ ‘๊ทผ ๋ฐฉ์‹ ๋•์— ์‚ฌ๋žŒ ์ค‘์‹ฌ ์ ‘๊ทผ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทผ๋ฐ, ๋ณดํ†ต ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํŒจํ„ด์„ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•˜์—ฌ ์‚ฌ๋žŒ์€ ์ƒ๊ฐ์„ ํ•˜๊ณ  ๊ฒฐ๋ก ์„ ๋„์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋งŒ Machine Learning(๊ธฐ๊ณ„ ํ•™์Šต)์—์„œ๋Š” ์‚ฌ๋žŒ์˜ ๊ฐœ์ž…์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ์˜ ํŒจํ„ด์„ ์ฐพ์œผ๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  Neural Network(์‹ ๊ฒฝ๋ง) & DL(๋”ฅ๋Ÿฌ๋‹)์€ ๊ธฐ์กด Machine Learning(๊ธฐ๊ณ„ ํ•™์Šต)์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๋ฐฉ๋ฒ•๋ณด๋‹ค ์‚ฌ๋žŒ์˜ ๊ฐœ์ž…์„ ๋ฐฐ์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์ค‘์š”ํ•œ ํŠน์„ฑ์„ ์ง€๋…”๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  Machine Learning(๊ธฐ๊ณ„ ํ•™์Šต)์—์„œ๋Š” ๋ชจ์•„์ง„ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ๊ทœ์น™์„ ์ฐพ์•„๋‚ด๋Š” ์—ญํ• ์„ '๊ธฐ๊ณ„'๊ฐ€ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์ƒํƒœ๋ถ€ํ„ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํšจ์œจ์ด ๋†’์•„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ์‚ฌ๋žŒ์˜ ๋ถ€๋‹ด๋„ ๋œ์–ด์ค๋‹ˆ๋‹ค.
  • ๋‹ค๋งŒ ์ด๋ฏธ์ง€๋ฅผ ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ง•์€ ์—ฌ์ „ํžˆ '์‚ฌ๋žŒ'์ด ์„ค๊ณ„ํ•˜๋Š”๊ฒƒ์ž„์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๋ง์€ ๋ฌธ์ œ์— ์ ํ•ฉํ•œ ํŠน์ง•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ข€์ฒ˜๋Ÿผ ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, ํŠน์ง•๊ณผ ๊ธฐ๊ณ„ํ•™์Šต์„ ํ™œ์šฉํ•œ ์ ‘๊ทผ์—๋„ ๋ฌธ์ œ์— ๋”ฐ๋ผ์„œ '์‚ฌ๋žŒ'์ด ์ ์ ˆํ•œ ํŠน์ง•์„ ์ƒ๊ฐํ•ด๋‚ด์•ผ ํ•˜๋Š”๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๊ทœ์น™์„ '์‚ฌ๋žŒ'์ด ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์—์„œ '๊ธฐ๊ณ„'๊ฐ€ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ๋ฐฐ์šฐ๋Š” ๋ฐฉ์‹์œผ๋กœ์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ „ํ™˜: ํšŒ์ƒ‰ ๋ธ”๋ก์€ ์‚ฌ๋žŒ์ด ๊ฐœ์ž…ํ•˜์ง€ ์•Š์Œ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.
  • ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์‹ ๊ฒฝ๋ง์€ ์ด๋ฏธ์ง€๋ฅผ '์žˆ๋Š” ๊ทธ๋Œ€๋กœ' ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆผ์—์„œ ๋ณด์ด๋Š” 2๊ฐœ์˜ ์ ‘๊ทผ ๋ฐฉ์‹(ํŠน์ง•, ๊ธฐ๊ณ„ํ•™์Šต ๋ฐฉ์‹)์—์„œ๋Š” ํŠน์ง•์€ ์‚ฌ๋žŒ์ด ์„ค๊ณ„ ํ–ˆ์ง€๋งŒ, ์‹ ๊ฒฝ๋ง์€ ์ด๋ฏธ์ง€์— ํฌํ•จ๋œ ์ค‘์š”ํ•œ ํŠน์ง•๊นŒ์ง€๋„ '๊ธฐ๊ณ„'๊ฐ€ ์Šค์Šค๋กœ ํ•™์Šตํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์‹ ๊ฒฝ๋ง์€ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ๊ฐ™์€ ๋งฅ๋žต์—์„œ ํ’€ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์„ธ๋ถ€์‚ฌํ•ญ๊ณผ ๊ด€๊ณ„์—†์ด ์‹ ๊ฒฝ๋ง์€ ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์˜จ์ „ํžˆ ํ•™์Šตํ•˜๊ณ , ์ฃผ์–ด์ง„ ๋ฌธ์ œ์˜ ํŒจํ„ด์„ ๋ฐœ๊ฒฌํ•˜๋ ค ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, ์‹ ๊ฒฝ๋ง์€ ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ์ฃผ์–ด์ง„ ๋ฐ์ดํ„ฐ ๊ทธ๋Œ€๋กœ๋ฅผ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด 'end-to-end'๋กœ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋”ฅ๋Ÿฌ๋‹์„ ์—ฌ๊ธฐ์„œ ์ข…๋‹จ๊ฐ„ ๊ธฐ๊ณ„ํ•™์Šต(end-to-end machine learning)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ข…๋‹จ๊ฐ„์€ '์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€'๋ผ๋Š” ์˜๋ฏธ๋กœ ๋ฐ์ดํ„ฐ(์ž…๋ ฅ)์—์„œ ๋ชฉํ‘œํ•œ ๊ฒฐ๊ณผ(์ถœ๋ ฅ)๋ฅผ ์‚ฌ๋žŒ์˜ ๊ฐœ์ž… ์—†์ด ์–ป๋Š”๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

Training Data(ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ)์™€ Test Data(์‹คํ—˜ ๋ฐ์ดํ„ฐ)

๊ธฐ๊ณ„ํ•™์Šต ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ Training Data(ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ), Test Data(์‹คํ—˜ ๋ฐ์ดํ„ฐ)๋กœ ๋‚˜๋ˆ  ํ•™์Šต๊ณผ ์‹คํ—˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.
  • ์šฐ์„  Training Data(ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ)๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ํ•™์Šตํ•˜๋ฉด์„œ ์ตœ์ ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ ๋‹ค์Œ Test Data(์‹คํ—˜ ๋ฐ์ดํ„ฐ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ž์„œ ํ›ˆ๋ จํ•œ ๋ชจ๋ธ์˜ ์‹ค๋ ฅ์„ ํ‰๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๊ทผ๋ฐ ์™œ ์—ฌ๊ธฐ์„œ Training Data(ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ), Test Data(์‹คํ—˜ ๋ฐ์ดํ„ฐ)๋ฅผ ๋‚˜๋ˆ ์•ผ ํ• ๊นŒ์š”?
  • ์ด์œ ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š”๊ฒƒ์ด ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋ธ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ฒ”์šฉ๋Šฅ๋ ฅ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ  Training Data(ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ),Test Data(์‹คํ—˜ ๋ฐ์ดํ„ฐ)๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฒ”์šฉ๋Šฅ๋ ฅ

  • ๋ฒ”์šฉ๋Šฅ๋ ฅ์€ ์•„์ง ๋ณด์ง€ ๋ชปํ•œ ๋ฐ์ดํ„ฐ(Training Data(ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ)์— ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ)๋กœ ๋ฌธ์ œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ’€์–ด๋‚ด๋Š” ๋Šฅ๋ ฅ์ž…๋‹ˆ๋‹ค.
  • ์ด ๋ฒ”์šฉ ๋Šฅ๋ ฅ์„ ์–ป๋Š”๊ฒƒ์ด Machine Learning(๊ธฐ๊ณ„ ํ•™์Šต)์˜ ์ดค์ข… ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋ฌธ์ œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ’€์–ด๋‚ด๋ ค๋ฉด ๋ฐ์ดํ„ฐ์…‹ ํ•˜๋‚˜๋กœ๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ•™์Šต๊ณผ ํ‰๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ํ‰๊ฐ€๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ˆ˜์ฃผ์œผ์ด ๋ฐ์ดํ„ฐ์…‹์€ ์ œ๋Œ€๋กœ ๋งžํžˆ๋”๋ผ๋„, ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์…‹์—๋Š” ์—‰๋ง์ธ ์ผ๋„ ๋ฒŒ์–ด์ง‘๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ์— ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ์…‹์—๋งŒ ์ง€๋‚˜์น˜๊ฒŒ ์ตœ์ ํ™”๋œ ์ƒํƒœ๋ฅผ Overfitting(์˜ค๋ฒ„ํ”ผํŒ…)์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด ์˜ค๋ฒ„ํ”ผํŒ…์„ ํ”ผํ•˜๊ฑฐ๋‚˜ ๋ฐฉ์ง€ํ•˜๋Š”๊ฒƒ์ด  Machine Learning(๊ธฐ๊ณ„ ํ•™์Šต)์—์„œ ์ค‘์š”ํ•œ ๊ณผ์ œ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

Loss Function (์†์‹ค ํ•จ์ˆ˜)

Neural Network(์‹ ๊ฒฝ๋ง)์—์„œ๋Š” 'ํ•˜๋‚˜์˜ ์ง€ํ‘œ'๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ตœ์ ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • Neural Network(์‹ ๊ฒฝ๋ง)ํ•™์Šต์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ง€ํ‘œ๋Š” 'Loss Function(์†์‹คํ•จ์ˆ˜)' ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • 'Loss Function(์†์‹คํ•จ์ˆ˜)'๋Š” ์ž„์˜์˜ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์˜ค์ฐจ์ œ๊ณฑํ•ฉ๊ณผ Cross-Entropy ์˜ค์ฐจ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ค์ฐจ์ œ๊ณฑํ•ฉ (Sum of Squares for Error, SSE)

๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” Loss Function(์†์‹ค ํ•จ์ˆ˜)๋Š” ์˜ค์ฐจ์ œ๊ณฑํ•ฉ(Sum of Squares for Error, SSE)์ž…๋‹ˆ๋‹ค. ์ˆ˜์‹์œผ๋กœ๋Š” ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์˜ค์ฐจ์ œ๊ณฑํ•ฉ ์ˆ˜์‹

  • ์—ฌ๊ธฐ์„œ Yk๋Š” ์‹ ๊ฒฝ๋ง์˜ ์ถœ๋ ฅ(์‹ ๊ฒฝ๋ง์ด ์ถ”์ •ํ•œ๊ฐ’), Tk๋Š” ์ •๋‹ต lable, k๋Š” ๋ฐ์ดํ„ฐ์˜ Dimension(์ฐจ์›)์ˆ˜๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ํ•œ๋ฒˆ ์›์†Œ 10๊ฐœ์˜ ๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋กœ ์˜ˆ์‹œ๋ฅผ ํ•œ๋ฒˆ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
>>> y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
>>> t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
  • ์—ฌ๊ธฐ์„œ ์ด ๋ฐฐ์—ด๋“ค์˜ ์›์†Œ๋Š” ์ฒซ๋ฒˆ์งธ index์˜ ์ˆœ์„œ๋Œ€๋กœ ์ˆซ์ž 0, 1, 2...์ผ๋•Œ์˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.
  • 'y' ๋Š” ์‹ ๊ฒฝ๋ง์˜ ์ถœ๋ ฅ, ์ฆ‰, Softmax ํ•จ์ˆ˜์˜ ์ถœ๋ ฅ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ํ™•๋ฅ ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์œ„์˜ ์˜ˆ์‹œ์—์„œ๋Š” ์ด๋ฏธ์ง€๊ฐ€ '0'์ผ ํ™•๋ฅ ์€ 0.1, '1'์ผ ํ™•๋ฅ ์€ 0,05 ๋ผ๊ณ  ํ•ด์„๋ฉ๋‹ˆ๋‹ค.
  • ์ •๋‹ต ๋ ˆ์ด๋ธ”์ธ 't'๋Š” ์ •๋‹ต์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜์˜ ์›์†Œ '1'๋กœ ๊ทธ ์™ธ์—๋Š” 0์œผ๋กœ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ˆซ์ž '2'์— ํ•ด๋‹นํ•˜๋Š” ์›์†Œ์˜ ๊ฐ’์ด 1์ด๋ฏ€๋กœ, ์ •๋‹ต์ด '2'์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด์ฒ˜๋Ÿผ ํ•œ ์›์†Œ๋งŒ 1๋กœ ํ•˜๊ณ  ๊ทธ ์™ธ์—๋Š” 0์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œ๊ธฐ๋ฒ•์„ One-Hot Encoding (์›-ํ•ซ ์ธ์ฝ”๋”ฉ)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ์˜ค์ฐจ์ œ๊ณฑํ•ฉ(Sum of Squares for Error, SSE)์€ ๊ฐ ์›์†Œ์˜ ์ถœ๋ ฅ(์ถ”์ • ๊ฐ’) & ์ •๋‹ต label(์ฐธ ๊ฐ’)์˜ ์ฐจ๋ฅผ ์ œ๊ณฑํ•œ ํ›„, ๊ทธ ์ดํ•ฉ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค. ํ•œ๋ฒˆ Python ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
# y, t๋Š” ๋„˜ํŒŒ์ด ๋ฐฐ์—ด
def sum_squares_error(y, t):
	return 0.5 * np.sum((y-t)**2)
  • ์—ฌ๊ธฐ์„œ ์ธ์ˆ˜ y, t๋Š” Numpy Array(๋„˜ํŒŒ์ด ๋ฐฐ์—ด)์ž…๋‹ˆ๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋Š” ์˜ค์ฐจ์ œ๊ณฑํ•ฉ(Sum of Squares for Error, SSE) ์ˆ˜์‹์„ ๊ทธ๋Œ€๋กœ ์ˆ˜ํ˜„ํ•œ ๊ฒƒ์ด๋‹ˆ, ์„ค๋ช…์€ ์ƒ๋žตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ํ•จ์ˆ˜๋ฅผ ํ•œ๋ฒˆ ์‚ฌ์šฉํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค (by Python Interpreter).
# ์ •๋‹ต์€ 2
>>> t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]

# ์˜ˆ1: '2'์ผ ํ™•๋ฅ ์ด ๊ฐ€์žฅ ๋†’๋‹ค๊ณ  ์ถ”์ •ํ•จ (0.6)
>>> y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
>>> sum_squares_error(np.array(y), np.array(t))
0.0975

# ์˜ˆ2: '7'์ผ ํ™•๋ฅ ์ด ๊ฐ€์žฅ ๋†’๋‹ค๊ณ  ์ถ”์ •ํ•จ (0.6)
>>> y = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]
>>> sum_squares_error(np.array(y), np.array(t))
>>> 0.5975
  • ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ๋Š๋ผ๋Š”๊ฑด ์ฒซ๋ฒˆ์งธ ์ถ”์ • ๊ฒฐ๊ณผ๊ฐ€ (์˜ค์ฐจ๊ฐ€ ๋” ์ž‘์œผ๋‹ˆ) ์ •๋‹ต์— ๋” ๊ฐ€๊นŒ์šธ๊ฑฐ๋ผ๊ณ  ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ)

๋˜ ๋‹ค๋ฅธ Loss Function(์†์‹ค ํ•จ์ˆ˜)๋กœ์„œ Cross-Entropy Error, CEE๋„ ์ž์ฃผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์‹์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Cross-Entropy Error, CEE ์ˆ˜์‹

  • ์—ฌ๊ธฐ์„œ log๋Š” ๋ฐ‘์ด e์ธ ์ž์—ฐ๋กœ๊ทธ(log e) ์ž…๋‹ˆ๋‹ค. Yk๋Š” ์‹ ๊ฒฝ๋ง์˜ ์ถœ๋ ฅ, Tk๋Š” ์ •๋‹ต ๋ ˆ์ด๋ธ”์ž…๋‹ˆ๋‹ค.
  • ๋˜ tk๋Š” ์ •๋‹ต์— ํ•ด๋‹นํ•˜๋Š” ์ธ๋ฑ์Šค์˜ ์›์†Œ๋งŒ 1์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” 0์ž…๋‹ˆ๋‹ค. (One-Hot Encoding)
  • ์ •๋‹ต label์€ '2'๊ฐ€ ์ •๋‹ต์ด๋ผ ํ•˜๊ณ , ์ด๋•Œ์˜ Neural Network(์‹ ๊ฒธ๋ง) ์ถœ๋ ฅ์ด 0.6 ์ด๋ผ๋ฉด, Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ)๋Š” -log0.6 = 0.51์ด ๋ฉ๋‹ˆ๋‹ค.
  • ์ฆ‰, Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ)๋Š” ์ •๋‹ต์ผ ๋•Œ์˜ ์ถœ๋ ฅ์ด ์ „์ฒด ๊ฐ’์„ ์ •ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ๊ทธ๋ž˜ํ”„๋Š” ์ž์—ฐ๋กœ๊ทธ์˜ ๊ทธ๋ž˜ํ”„์ž…๋‹ˆ๋‹ค.

์ž์—ฐ๋กœ๊ทธ y = logx์˜ ๊ทธ๋ž˜ํ”„

  • ์œ„์˜ ์‹, ๊ทธ๋ž˜ํ”„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ x๊ฐ€ 1์ผ๋•Œ y๋Š” 0์ด ๋˜๊ณ , x๊ฐ€ 0์— ๊ฐ€๊นŒ์›Œ์งˆ์ˆ˜๋ก y์˜ ๊ฐ’์€ ์ ์  ์ž‘์•„์ง‘๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋กœ ์ •๋‹ต์ผ๋•Œ์˜ ์ถœ๋ ฅ์ด ์ž‘์•„์งˆ์ˆ˜๋ก ์˜ค์ฐจ๋Š” ์ปค์ง‘๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ)๋ฅผ ํ•œ๋ฒˆ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
def cross_entropy_error(y, t):
	delta = 1e-7
    return -np.sum(t * np.log(y+delta))
  • ์—ฌ๊ธฐ์„œ y, t๋Š” Numpy Array(๋„˜ํŒŒ์ด ๋ฐฐ์—ด)์ž…๋‹ˆ๋‹ค. ๊ทผ๋ฐ, ์ฝ”๋“œ ๋งˆ์ง€๋ง‰์„ ๋ณด๋ฉด np.log๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ์•„์ฃผ ์ž‘์€ ๊ฐ’์ธ delta๋ฅผ ๋”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Š” np.log() ํ•จ์ˆ˜์— 0์„ ์ž…๋ ฅํ•˜๋ฉด -inf(๋งˆ์ด๋„ˆ์Šค ๋ฌดํ•œ๋Œ€)๊ฐ€ ๋˜์–ด์„œ ๊ณ„์‚ฐ์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ž‘์€๊ฐ’์ธ delta๋ฅผ ๋”ํ•ด์„œ ์ ˆ๋Œ€ 0์ด ๋˜์ง€ ์•Š๋„๋ก (์ฆ‰, ๋งˆ์ด๋„ˆ์Šค ๋ฌดํ•œ๋Œ€๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก)ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด ์ด cross_entropy_error(y, t) ํ•จ์ˆ˜๋ฅผ ์จ์„œ ๊ฐ„๋‹จํ•œ ๊ณ„์‚ฐ์„ ํ•ด๋ด…๋‹ˆ๋‹ค. ์ •๋‹ต์€ ๋˜‘๊ฐ™์ด '2' ์ž…๋‹ˆ๋‹ค.
>>> t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]

# ์˜ˆ1: ์ •๋‹ต์ผ ๋•Œ์˜ ์ถœ๋ ฅ์ด 0.6์ธ ๊ฒฝ์šฐ
>>> y = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
>>> cross_entropy_error(np.array(y), np.array(t))
0.5108

# ์˜ˆ2: ์ •๋‹ต์ผ ๋•Œ์˜ ์ถœ๋ ฅ์ด 0.1์ธ ๊ฒฝ์šฐ
>>> y = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0]
>>> cross_entropy_error(np.array(y), np.array(t))
2.3025
  • ์˜ˆ 1: ์ •๋‹ต์ผ๋•Œ์˜ ์ถœ๋ ฅ์ด 0.6์ธ ๊ฒฝ์šฐ๋กœ, ์ด๋•Œ์˜ Cross-Entropy Error๋Š” 0.51 ์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, ๊ฒฐ๊ณผ(์˜ค์ฐจ ๊ฐ’)์ด ๋” ๋‚ฎ์€ ์ฒซ๋ฒˆ์งธ ์ถ”์ •์ด ์ •๋‹ต์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค๊ณ  ํŒ๋‹จํ•œ ๊ฒƒ์œผ๋กœ, ์•ž์„œ ์˜ค์ฐจ์ œ๊ณฑํ•ฉ์˜ ํŒ๋‹จ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

Mini-Batch Training (๋ฏธ๋‹ˆ ๋ฐฐ์น˜ ํ•™์Šต)

  • ML(Machine Learning)๋ฌธ์ œ๋Š” Training ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Loss Function(์†์‹ค ํ•จ์ˆ˜)์˜ ๊ฐ’์„ ๊ตฌํ•˜๊ณ , ๊ทธ ๊ฐ’์„ ์ตœ๋Œ€ํ•œ ์ค„๋ ค์ฃผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.
  • ์ฆ‰, ์ด๋Ÿฌ๋ ค๋ฉด ๋ชจ๋“  Training ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์†์‹ค ํ•จ์ˆ˜ ๊ฐ’์„ ๊ตฌํ•ด์„œ ์ด ๋ชจ๋“  ์†์‹ค ํ•จ์ˆ˜ ๊ฐ’๋“ค์˜ ํ•ฉ์„ ์ง€ํ‘œ๋กœ ์‚ผ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ๋ชจ๋‘์— ๋Œ€ํ•œ  Loss Function(์†์‹ค ํ•จ์ˆ˜)์˜ ๊ฐ’์„ ๊ตฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

ex) Cross-Entropy Error,

  • ๋ฐ์ดํ„ฐ๊ฐ€ N๊ฐœ๋ผ๊ณ  ํ•˜๋ฉด, ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜์— ๋Œ€ํ•œ ์†์‹ค ํ•จ์ˆ˜๋ฅผ N๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋กœ ํ™•์žฅํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— N์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ •๊ทœํ™” ํ•œ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์ฆ‰, N์œผ๋กœ ๋‚˜๋ˆ”์œผ๋กœ์จ ํ‰๊ท  ์†์‹ค ํ•จ์ˆ˜๋ฅผ ๊ตฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ›ˆ๋ จ๋ฐ์ดํ„ฐ๊ฐ€ 1000๊ฐœ, 10000๊ฐœ๋“ , ์ƒ๊ด€์—†์ด ํ‰๊ท  ์†์‹ค ํ•จ์ˆ˜๋ฅผ ๊ตฌํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • MNIST์˜ ๋ฐ์ดํ„ฐ์…‹์€ ํ›ˆ๋ จ๋ฐ์ดํ„ฐ๊ฐ€ 60,000๊ฐœ์ธ๋ฐ, ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ Loss Function(์†์‹ค ํ•จ์ˆ˜)์˜ ํ•ฉ์„ ๊ตฌํ•˜๋ ค๋ฉด ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Training data(ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ)์ค‘ ์ผ๋ถ€๋งŒ ๊ณจ๋ผ์„œ ํ•™์Šต์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ผ๋ถ€๋ฅผ Mini-Batch(๋ฏธ๋‹ˆ ๋ฐฐ์น˜)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ํ•™์Šต ๋ฐฉ๋ฒ•์„ ๋ฏธ๋‹ˆ๋ฐฐ์น˜ ํ•™์Šต(Mini-Batch Training)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ Mini-Batch Training(๋ฏธ๋‹ˆ ๋ฐฐ์น˜ ํ•™์Šต)์„ ๊ตฌํ˜„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. (ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์—์„œ ์ง€์ •ํ•œ ์ˆ˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌด์ž‘์œ„๋กœ ๊ณจ๋ผ๋ƒ„)

Mini-Batch Training Example Code (by Python)

import sys, os
sys.path.append(os.pardir)
import numpy as np
from dataset.mnist import load_mnist

(x_train, t_train), (x_test, t_test) = \
	load_mnist(normalize=True, one_hot_label=True)
    
print(x_train.shape) # (60000, 784)
print(t_train.shape) # (60000, 10)
  • load_mnist: ํ•จ์ˆ˜๋Š” Mnist Dataset์„ ์ฝ์–ด์˜ค๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • one_hot_label=True: One-hot Encoding์œผ๋กœ ์ •๋‹ต ์œ„์น˜์˜ ์›์†Œ๋งŒ 1์ด๊ณ , ๋‚˜๋จธ์ง€๋Š” 0์ธ ๋ฐฐ์—ด์„ ์–ป์„ ์ˆ˜ ์žˆ์Œ
  • Input Data(์ž…๋ ฅ ๋ฐ์ดํ„ฐ)๋Š” 784์—ด ์ž…๋‹ˆ๋‹ค. - (28*28)์ธ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ
  • ์ •๋‹ต label์€ 10์ค„ ์งœ๋ฆฌ ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ์ด ํ›ˆ๋ จ๋ฐ์ดํ„ฐ์—์„œ ๋ฌด์ž‘์œ„๋กœ 10์žฅ๋งŒ ๋นผ๋‚ด๋ ค๋ฉด ์–ด๋–ปํ•ด์•ผ ํ• ๊นŒ์š”? Numpy์˜ np.random.choice() ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ„๋‹จํžˆ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
train_size = x_train.shape[0]
batch_size = 10
batch_mask = np,random.choice(train_size, batch_size)
x_batch = x_train[batch_mask]
t_batch = t_train[batch_mask]
  • np.random.choice()๋Š” ์ง€์ •ํ•œ ๋ฒ”์œ„ ์ˆ˜ ์ค‘์—์„œ ๋ฌด์ž‘์œ„๋กœ ์›ํ•˜๋Š” ๊ฐœ์ˆ˜๋งŒ ๊บผ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • np.random.choice(60000, 10)์ด๋ฉด 0์ด์ƒ 60000๋ฏธ๋งŒ ์ˆ˜์ค‘์—์„œ ๋ฌด์ž‘์œ„๋กœ 10๊ฐœ๋ฅผ ๊ณจ๋ผ๋ƒ…๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์‹ค์ œ๋กœ ๋Œ๋ ค๋ณธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.
  • ์ด ํ•จ์ˆ˜๊ฐ€ ์ถœ๋ ฅํ•œ ๋ฐฐ์—ด์„ Mini-Batch๋กœ ๋ฝ‘์•„๋‚ผ ๋ฐ์ดํ„ฐ์˜ Index๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
>>> np.random.choice(60000, 10)
array([8013, 14666, 58210, 23832, 52091, 10153, 8107, 19410, 27260, 21411])

Batch ์šฉ Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ) ๊ตฌํ˜„ํ•˜๊ธฐ (by Python)

Mini-Batch ๊ฐ™์€ ๋ฐฐ์น˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์›ํ•˜๋Š” Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ)๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ์š”?
  • Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ)๋ฅผ ์กฐ๊ธˆ๋งŒ ๋ด๊พธ์–ด์ฃผ๋ฉด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๊ฐ€ Batch๋กœ ๋ฌถ์—ฌ์„œ ์ž…๋ ฅ๋  ๊ฒฝ์šฐ ๋ชจ๋‘๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
def cross_entropy_error(y, t):
	if y.ndim == 1:
    	t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
        
	batch_size = y.shape[0]
    return -np.sum(t * np.log(y + 1e-7)) / batch_size
  • ์ด ์ฝ”๋“œ์—์„œ y๋Š” ์‹ ๊ฒฝ๋ง์˜ ์ถœ๋ ฅ, t๋Š” ์ •๋‹ต ๋ ˆ์ด๋ธ”์ž…๋‹ˆ๋‹ค.
  • y๊ฐ€ 1์ฐจ์› ์ด๋ผ๋ฉด? ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋‹น Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ)๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํ˜•์ƒ์„ reshape() ํ•จ์ˆ˜๋กœ ๋ด๊ฟ”์ค๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  Batch์˜ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ  ์ •๊ทœํ™” ํ•˜๊ณ , ์ด๋ฏธ์ง€ 1์žฅ๋‹น ํ‰๊ท ์˜ Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ)๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
์ •๋‹ต ๋ ˆ์ด๋ธ”์ด One-Hot Encoding์ด ์•„๋‹Œ, '2', '7' ๋“ฑ์˜ ์ˆซ์ž ๋ ˆ์ด๋ธ”๋กœ ์ฃผ์–ด์กŒ์„๋•Œ์˜ Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ) ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
def cross_entropy_error(y, t):
	if y.ndim == 1:
    	t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
        
	batch_size = y.shape[0]
    return -np.sum(np.log(y[np.arange(batch_size), t] + 1e-7)) / batch_size
  • ์—ฌ๊ธฐ์„œ๋Š” One-Hot Encoding ์ผ๋•Œ t๊ฐ€ 0์ธ ์›์†Œ๋Š” Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ)๋„ 0์ด๋ฏ€๋กœ, ์ด ๊ณ„์‚ฐ์€ ๋ฌด์‹œํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์‹œ ๋งํ•˜๋ฉด ์ •๋‹ต์— ํ•ด๋‹นํ•˜๋Š” Neural Network(์‹ ๊ฒฝ๋ง)์˜ ์ถœ๋ ฅ๋งŒ์œผ๋กœ Cross-Entropy Error, CEE (๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ)๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ One-Hot Encoding ์ผ๋•Œ t, np.log(y)์˜€๋˜ ๋ถ€๋ถ„์„ label๋กœ ํ‘œํ˜„ํ• ๋•Œ np.log(y[np.arange(batch_size), t])๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

Code ์„ค๋ช…

  • np.arange(batch_size)๋Š” 0๋ถ€ํ„ฐ batch_size-1๊นŒ์ง€ ๋ฐฐ์—ด ์ƒ์„ฑ
  • y[np.arange(batch_size), t]๋Š” ๊ฐ ๋ฐ์ดํ„ฐ์˜ ์ •๋‹ต ๋ ˆ์ด๋ธ”์— ํ•ด๋‹นํ•˜๋Š” ์‹ ๊ฒฝ๋ง์˜ ์ถœ๋ ฅ์„ ์ถ”์ถœ

Loss Function(์†์‹ค ํ•จ์ˆ˜)๋ฅผ ์„ค์ •ํ•˜๋Š” ์ด์œ ๋Š”?

  • ์™œ ๊ถ…์ด Loss Function(์†์‹ค ํ•จ์ˆ˜)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ์ด๊ฑด ์‹ ๊ฒฝ๋ง ํ•™์Šต์—์„œ '๋ฏธ๋ถ„'์˜ ์—ญํ• ์„ ์ฃผ๋ชฉํ•˜๋ฉด ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹ ๊ฒฝ๋ง ํ•™์Šต์—์„œ๋Š” ์ตœ์ ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜(๊ฐ€์ค‘์น˜, ํŽธํ–ฅ)๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ ์†์‹ค ํ•จ์ˆ˜์˜ ๊ฐ’์„ ๊ฐ€๋Šฅํ•œ ์ž‘๊ฒŒ ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
  • ์ด๋•Œ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฏธ๋ถ„(์ •ํ™•ํžˆ๋Š” Gradient(๊ธฐ์šธ๊ธฐ))๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๊ทธ ๋ฏธ๋ถ„๊ฐ’์„ ๋‹จ์„œ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์„œ์„œ์ด ๊ฐฑ์‹ ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋งŒ์•ฝ์˜ ๋ฏธ๋ถ„๊ฐ’์ด ์Œ์ˆ˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์–‘์˜ ๋ฐฉํ–ฅ์œผ๋กœ ๋ณ€ํ™˜ ์‹œ์ผœ์„œ Loss Function(์†์‹ค ํ•จ์ˆ˜)์˜ ๊ฐ’์„ ์ค„์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฏธ๋ถ„๊ฐ’์ด ์–‘์ˆ˜์ด๋ฉด Weight(๊ฐ€์ค‘์น˜) ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์Œ์˜ ๋ฐฉํ–ฅ์œผ๋กœ ๋ณ€ํ™˜์‹œ์ผœ ์†์‹คํ•จ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทผ๋ฐ ๋ฏธ๋ถ„๊ฐ’์ด 0์ด๋ฉด? 
  • Weight(๊ฐ€์ค‘์น˜) ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์–ด๋Š์ชฝ์œผ๋กœ ์›€์ง์—ฌ๋„ Loss Function(์†์‹ค ํ•จ์ˆ˜)์˜ ๊ฐ’์€ ์ค„์–ด๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์‹ ๊ฒฝ๋ง์„ ํ•™์Šตํ•  ๋•Œ ์ •ํ™•๋„๋ฅผ ์ง€ํ‘œ๋กœ ํ•˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฏธ๋ถ„์ด ๋Œ€๋ถ€๋ถ„์˜ ์žฅ์†Œ์—์„œ 0์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•๋„๋ฅผ ์ง€ํ‘œ๋กœ ์‚ผ์•„์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ˆ˜์น˜ ๋ฏธ๋ถ„

๋ฏธ๋ถ„์€ ํ•œ์ˆœ๊ฐ„์˜ ๋ณ€ํ™”๋Ÿ‰์„ ํ‘œ์‹œํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ˆ˜์‹์€ ์•„๋ž˜๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฏธ๋ถ„ ์ˆ˜์‹

  • ์ขŒ๋ณ€์€ f(x)์ด x์— ๋Œ€ํ•œ ๋ฏธ๋ถ„(x์— ๋Œ€ํ•œ f(x)์ด ๋ณ€ํ™”๋Ÿ‰)์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธฐํ˜ธ์ž…๋‹ˆ๋‹ค. 
  • ๊ฒฐ๊ตญ x์˜ '์ž‘์€ ๋ณ€ํ™”'๊ฐ€ ํ•จ์ˆ˜ f(x)๋ฅผ ์–ผ๋งˆ๋‚˜ ๋ณ€ํ™”์‹œํ‚ค๋Š๋ƒ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์‹œ๊ฐ„์˜ ์ž‘์€ ๋ณ€ํ™”, ์ฆ‰ ์‹œ๊ฐ„์„ ๋œปํ•˜๋Š” h๋ฅผ ํ•œ์—†์ด 0์— ๊ฐ€๊น๊ฒŒ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ lim / h->0 ์œผ๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • ์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ถ„ํ•˜๋Š” ๊ณ„์‚ฐ์„ Python์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
def numerical_diff(f, x):
	h = 1e-50
    return (f(x+h) - f(x)) / h
  • ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ์ˆ˜์น˜ ๋ฏธ๋ถ„(Numerical differentation)์—์„œ ๋”ฐ์˜จ numerical_diff(f,x)๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. 
  • ์ด ํ•จ์ˆ˜๋Š” 'ํ•จ์ˆ˜ f'์™€ 'ํ•จ์ˆ˜ f์— ๋„˜๊ธธ ์ธ์ˆ˜ x' ๋‘ ์ธ์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ง„์ •ํ•œ ๋ฏธ๋ถ„(์ง„์ •ํ•œ ์ ‘์„ )๊ณผ ์ˆ˜์น˜ ๋ฏธ๋ถ„(๊ทผ์‚ฌ๋กœ ๊ตฌํ•œ ์ ‘์„ )์˜ ๊ฐ’์€ ๋‹ค๋ฅด๋‹ค.

  • ์œ„์˜ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด ์ˆ˜์น˜ ๋ฏธ๋ถ„์—๋Š” ์˜ค์ฐจ๊ฐ€ ํฌํ•จ๋˜๋นˆ๋‹ค. ์ด ์˜ค์ฐจ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ (x + h)์™€ (x - h)์ผ ๋•Œ์˜ ํ•จ์ˆ˜ f์˜ ์ฐจ๋ถ„์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์“ฐ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์ฐจ๋ถ„์€ x๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ทธ ์ „ํ›„์˜ ์ฐจ๋ถ„์„ ๊ณ„์‚ฐํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ์ค‘์‹ฌ ์ฐจ๋ถ„ ํ˜น์€ ์ค‘์•™ ์ฐจ๋ถ„์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด ๊ทธ๋ž˜ํ”„๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ์ˆ˜์น˜ ๋ฏธ๋ถ„์„ ๋‹ค์‹œ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
def numerical_diff(f, x):
	h = 1e-4 # 0.0001
    return (f(x+h) - f(x-h)) / (2*h)

์ˆ˜์น˜ ๋ฏธ๋ถ„์˜ ์˜ˆ

  • ์•ž ์ ˆ์˜ ์ˆ˜์น˜ ๋ฏธ๋ถ„์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ถ„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์œ„์˜ ์‹์„ Python์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.
def function_1(x):
	return 0.01*x**2 + 0.1*x
  • ์ด์–ด์„œ ์ด ํ•จ์ˆ˜๋ฅผ ๊ทธ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
import numpy as np
import matplotlib.pylab as plt

x = np.arange(0.0, 20.0, 0.1)
y = function_1(x)
plt.xlabel("x")
plt.ylabel("f(x)")
plt.plot(x, y)
plt.show()

์œ„์˜ ์ˆ˜์‹ ๊ทธ๋ž˜ํ”„, f(x) = 0.01x**2 + 0.1x

  • ๊ทธ๋Ÿฌ๋ฉด x=5์ผ ๋•Œ์™€ 10์ผ๋•Œ ์ด ํ•จ์ˆ˜์˜ ๋ฏธ๋ถ„์„ ๊ณ„์‚ฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
>>> numerical_diff(function_1, 5)
0.199999
>>> numerical_diff(function_1, 10)
0.299999
  • ์ด๋ ‡๊ฒŒ ๊ณ„์‚ฐํ•œ ๋ฏธ๋ถ„ ๊ฐ’์ด x์— ๋Œ€ํ•œ f(x)์˜ ๋ณ€ํ™”๋Ÿ‰, ์ฆ‰ ํ•จ์ˆ˜์˜ ๊ธฐ์šธ๊ธฐ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ œ ์•ž์—์„œ ๊ตฌํ•œ ์ˆ˜์น˜ ๋ฏธ๋ถ„ ๊ฐ’์„ ๊ธฐ์šธ๊ธฐ๋กœ ํ•˜๋Š” ์ง์„ ์„ ๊ทธ๋ ค๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์˜ ๊ทธ๋ž˜ํ”„์™€ ๊ฐ™๊ฒŒ ๋˜์–ด, ํ•จ์ˆ˜์˜ ์ ‘์„ ์— ํ•ด๋‹นํ•˜๋Š”๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ขŒ: x = 5 ์ผ๋•Œ์˜ ์ ‘์„ , ์šฐ: x = 10 ์ผ๋•Œ์˜ ์ ‘์„ 


ํŽธ๋ฏธ๋ถ„

์œ„์˜ ์‹์€ ์ธ์ˆ˜๋“ค์˜ ์ œ๊ณฑ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋‹จ์ˆœํ•œ ์‹์ด์ง€๋งŒ, ์•ž๊ณผ ๋‹ฌ๋ฆฌ ๋ณ€์ˆ˜๊ฐ€ 2๊ฐœ๋ผ๋Š” ์ ์— ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ์‹์€ Python์œผ๋กœ ๊ตฌํ˜„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์ธ์ˆ˜ x๋Š” numpy ๋ฐฐ์—ด ์ž…๋‹ˆ๋‹ค. ๊ฐ ์›์†Œ๋ฅผ ์ œ๊ณฑํ•˜๊ณ  ๊ทธ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค.
def function_2(x):
	return x[0]**2 + x[1]**2 # ๋˜๋Š” return np.sum(x**2)

 

  • ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด 3์ฐจ์›์œผ๋กœ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.

f(x0, x1) = x0**2 + x1**2์˜ ๊ทธ๋ž˜ํ”„

  • ์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•ด์•ผ ํ• ์ ์€ ๋ณ€์ˆ˜๊ฐ€ 2๊ฐœ์ž…๋‹ˆ๋‹ค. '์–ด๋Š ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฏธ๋ถ„์ด๋ƒ?', ์ฆ‰ x0, x1์ค‘ ์–ด๋Š ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฏธ๋ถ„์ด๋ƒ๋ฅผ ๊ตฌ๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ง๋ถ™์—ฌ ์ด์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๊ฐ€ ์—ฌ๋Ÿฟ์ธ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋ฏธ๋ถ„์„ ํŽธ๋ฏธ๋ถ„ ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ฒ˜๋Ÿผ ํŽธ๋ฏธ๋ถ„์€ ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜์ธ ๋ฏธ๋ถ„๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŠน์ • ์žฅ์†Œ์˜ Gradient(๊ธฐ์šธ๊ธฐ)๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.
    • ๋‹จ, ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜์ค‘ ๋ชฉํ‘œ ๋ณ€์ˆ˜ ํ•˜๋‚˜์˜ ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค.