๋ฐ์ํ
์ด๋ฒ์๋ 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๋ ์์ฃผ ์ด์ฉํฉ๋๋ค. ์์์ ์๋์ ๊ฐ์ต๋๋ค.
- ์ฌ๊ธฐ์ 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 (๊ต์ฐจ ์ํธ๋กํผ ์ค์ฐจ)๋ ์ ๋ต์ผ ๋์ ์ถ๋ ฅ์ด ์ ์ฒด ๊ฐ์ ์ ํ๊ฒ ๋ฉ๋๋ค. ์๋์ ๊ทธ๋ํ๋ ์์ฐ๋ก๊ทธ์ ๊ทธ๋ํ์ ๋๋ค.
- ์์ ์, ๊ทธ๋ํ์ ๋ง์ฐฌ๊ฐ์ง๋ก 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(์์ค ํจ์)์ ๊ฐ์ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
- ๋ฐ์ดํฐ๊ฐ 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()
- ๊ทธ๋ฌ๋ฉด x=5์ผ ๋์ 10์ผ๋ ์ด ํจ์์ ๋ฏธ๋ถ์ ๊ณ์ฐํด ๋ณด๊ฒ ์ต๋๋ค.
>>> numerical_diff(function_1, 5)
0.199999
>>> numerical_diff(function_1, 10)
0.299999
- ์ด๋ ๊ฒ ๊ณ์ฐํ ๋ฏธ๋ถ ๊ฐ์ด x์ ๋ํ f(x)์ ๋ณํ๋, ์ฆ ํจ์์ ๊ธฐ์ธ๊ธฐ์ ํด๋นํฉ๋๋ค.
- ์ด์ ์์์ ๊ตฌํ ์์น ๋ฏธ๋ถ ๊ฐ์ ๊ธฐ์ธ๊ธฐ๋ก ํ๋ ์ง์ ์ ๊ทธ๋ ค๋ณด๊ฒ ์ต๋๋ค. ๊ฒฐ๊ณผ๋ ์๋์ ๊ทธ๋ํ์ ๊ฐ๊ฒ ๋์ด, ํจ์์ ์ ์ ์ ํด๋นํ๋๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
ํธ๋ฏธ๋ถ
์์ ์์ ์ธ์๋ค์ ์ ๊ณฑ ํฉ์ ๊ณ์ฐํ๋ ๋จ์ํ ์์ด์ง๋ง, ์๊ณผ ๋ฌ๋ฆฌ ๋ณ์๊ฐ 2๊ฐ๋ผ๋ ์ ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
- ์ด ์์ Python์ผ๋ก ๊ตฌํ ํ ์ ์์ต๋๋ค.
- ์ฌ๊ธฐ์ ์ธ์ x๋ numpy ๋ฐฐ์ด ์ ๋๋ค. ๊ฐ ์์๋ฅผ ์ ๊ณฑํ๊ณ ๊ทธ ํฉ์ ๊ตฌํ๋ ๊ฐ๋จํ ๊ตฌํ์ ๋๋ค.
def function_2(x):
return x[0]**2 + x[1]**2 # ๋๋ return np.sum(x**2)
- ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ด 3์ฐจ์์ผ๋ก ๊ทธ๋ ค์ง๋๋ค.
- ์ฌ๊ธฐ์ ์ฃผ์ํด์ผ ํ ์ ์ ๋ณ์๊ฐ 2๊ฐ์ ๋๋ค. '์ด๋ ๋ณ์์ ๋ํ ๋ฏธ๋ถ์ด๋?', ์ฆ x0, x1์ค ์ด๋ ๋ณ์์ ๋ํ ๋ฏธ๋ถ์ด๋๋ฅผ ๊ตฌ๋ณํด์ผ ํฉ๋๋ค.
- ๋ง๋ถ์ฌ ์ด์ ๊ฐ์ด ๋ณ์๊ฐ ์ฌ๋ฟ์ธ ํจ์์ ๋ํ ๋ฏธ๋ถ์ ํธ๋ฏธ๋ถ ์ด๋ผ๊ณ ํฉ๋๋ค.
- ์ด์ฒ๋ผ ํธ๋ฏธ๋ถ์ ๋ณ์๊ฐ ํ๋์ธ ๋ฏธ๋ถ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํน์ ์ฅ์์ Gradient(๊ธฐ์ธ๊ธฐ)๋ฅผ ๊ตฌํฉ๋๋ค.
- ๋จ, ์ฌ๋ฌ ๋ณ์์ค ๋ชฉํ ๋ณ์ ํ๋์ ์ด์ ์ ๋ง์ถ๊ณ ๋ค๋ฅธ ๋ณ์๋ ๊ฐ์ ๊ณ ์ ํฉ๋๋ค.
๋ฐ์ํ
'๐ฅ๏ธ Deep Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DL] Backpropagation (์ค์ฐจ์ญ์ ํ๋ฒ) (0) | 2024.03.27 |
---|---|
[DL] Gradient (๊ธฐ์ธ๊ธฐ), Training Algorithm(ํ์ต ์๊ณ ๋ฆฌ์ฆ) (0) | 2024.03.23 |
[DL] Neural Networks (์ ๊ฒฝ๋ง) (0) | 2024.03.17 |
[DL] Perceptron (ํผ์ ํธ๋ก ) (0) | 2024.03.12 |
[DL] Matplotlib ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐํ์ฌ ์์๋ณด๊ธฐ (0) | 2024.03.05 |