neuralNetworkLearning

Neural Network Learning

: ์‹ ๊ฒฝ๋ง ํ•™์Šต์—์„œ ํ•™์Šต์ด๋ž€ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ๊ฐ€์ค‘์น˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ตœ์ ๊ฐ’์„ ์ž๋™์œผ๋กœ ํš๋“ํ•˜๋Š” ๊ฒƒ

๋ฐ์ดํ„ฐ ์ฃผ๋„ ํ•™์Šต

: ๊ธฐ๊ณ„ํ•™์Šต์€ ๋ฐ์ดํ„ฐ์—์„œ ๋‹ต์„ ์ฐพ๊ณ  ๋ฐ์ดํ„ฐ์—์„œ ํŒจํ„ด์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋กœ ์ด์•ผ๊ธฐ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค

  • ๊ธฐ๊ณ„ํ•™์Šต์˜ ๋ฐฉ๋ฒ• (์ด๋ฏธ์ง€์˜ ์˜ˆ)

    Learning

  • ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์‚ฌ๋žŒ์ด ์ƒ๊ฐํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์‚ฌ๋žŒ๋งˆ๋‹ค ๋ฒ„๋ฆ‡์ด ๋‹ฌ๋ผ ํŠน์ • ์ง“๋Š” ๊ทœ์น™์„ ์ฐพ๊ธฐ๋„ ์‰ฝ์ง€ ์•ˆํ˜น ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค

  • ๋‘๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ์ด๋ฏธ์ง€์—์„œ ํŠน์ง•(feature)์„ ์ถ”์ถœํ•˜๊ณ  ๊ทธ ํŠน์ง•์˜ ํŒจํ„ด์„ ๊ธฐ๊ณ„ํ•™์Šต ๊ธฐ์ˆ ๋กœ ํ•™์Šตํ•˜๋Š” ๋ฐฉ๋ฒ•

    ์ด๋ฏธ์ง€์˜ ํŠน์ง•์€ ๋ณดํ†ต ๋ฒกํ„ฐ๋กœ ๊ธฐ์ˆ ํ•˜๊ณ , ์ปดํ“จํ„ฐ ๋น„์ „ ๋ถ„์•ผ์—์„œ๋Š” SIFT, SURF, HOG ๋“ฑ์˜ ํŠน์ง•์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

    ์ด๋Ÿฐ ํŠน์ง•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ๋ณ€ํ™”๋œ ๋ฒกํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์ง€๋„ ํ•™์Šต ๋ฐฉ์‹์˜ ๋Œ€ํ‘œ ๋ถ„๋ฅ˜ ๊ธฐ๋ฒ•์ธ SBM, KNN ๋“ฑ์œผ๋กœ ํ•™์Šตํ•  ์ˆ˜ ์žˆ๋‹ค.

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

ํ›ˆ๋ จ๋ฐ์ดํ„ฐ์™€ ์‹œํ—˜๋ฐ์ดํ„ฐ

: ๊ธฐ๊ณ„ ํ•™์Šต ๋ฌธ์ œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ›ˆ๋ จ๋ฐ์ดํ„ฐ์™€ ์‹œํ—˜ ๋ฐ์ดํ„ฐ๋กœ ๋‚˜๋ˆ  ํ•™์Šต๊ณผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค

  • ํ›ˆ๋ จ๋ฐ์ดํ„ฐ(training data) : ํ›ˆ๋ จ๋ฐ์ดํ„ฐ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ตœ์ ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค

  • ์‹œํ—˜๋ฐ์ดํ„ฐ(test data) : ์‹œํ—˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ž์„œ ํ›ˆ๋ จํ•œ ๋ชจ๋ธ์˜ ์‹ค๋ ฅ์„ ํ‰๊ฐ€ํ•œ๋‹ค

    ์™œ? ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์™€ ์‹œํ—˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜๋ˆ ์•ผ ํ• ๊นŒ?

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

  • ๋ฐ์ดํ„ฐ์…‹ ํ•˜๋‚˜๋กœ๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ํ•™์Šต๊ณผ ํ‰๊ฐ€๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์˜ฌ๋ฐ”๋ฅธ ํ‰๊ฐ€๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ˆ˜์ค‘์˜ ๋ฐ์ดํ„ฐ์…‹์€ ์ œ๋Œ€๋กœ ๋งžํžˆ๋”๋ผ๋„ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์…‹์—๋Š” ์—‰๋ง์ธ ์ผ๋„ ๋ฒŒ์–ด์ง‘๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ์…‹์—๋งŒ ์ง€๋‚˜์น˜๊ฒŒ ์ตœ์ ํ™”๋œ ์ƒํƒœ๋ฅผ ์˜ค๋ฒ„ํ”ผํŒ…(overfitting)์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ์˜ค๋ฒ„ํ”ผํŒ…์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๊ณ„ํ•™์Šต์˜ ์ค‘์š”ํ•œ ๊ณผ์ œ์ด๊ธฐ๋„ ํ•œ๋‹ค.

์†์‹คํ•จ์ˆ˜ (loss function)

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

ํ‰๊ท  ์ œ๊ณฑ ์˜ค์ฐจ (Mean Squared Error, MSE)

MSE2
  • yk : ์‹ ๊ฒฝ๋ง์˜ ์ถœ๋ ฅ (์‹ ๊ฒฝ๋ง์ด ์ถ”์ •ํ•œ ๊ฐ’)

  • tk : ์ •๋‹ต ๋ ˆ์ด๋ธ”

  • k : ๋ฐ์ดํ„ฐ์˜ ์ฐจ์›์ˆ˜

import numpy as np

def mean_squared_error(y , t):
    return 0.5 * np.sum((y-t)**2)
# t : ์ •๋‹ต ๋ ˆ์ด๋ธ”
# y : ์‹ ๊ฒฝ๋ง์ด ์ถ”์ •ํ•œ ๊ฐ’
t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] # ์›-ํ•ซ ์ธ์ฝ”๋”ฉ, ์ •๋‹ต 2
y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0] # '2'์ผ ํ™•๋ฅ ์ด ๋†’๋‹ค๊ณ  ์ถ”์ •
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0] # '7'์ผ ํ™•๋ฅ ์ด ๋†’๋‹ค๊ณ  ์ถ”์ •

a1 = mean_squared_error(np.array(y1), np.array(t))
a2 = mean_squared_error(np.array(y2), np.array(t))
print(a1) # 0.09750000000000003
print(a2) # 0.5975
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋‹ต 2์ด๊ณ  ์ถœ๋ ฅ์„ 2์ผ๋•Œ์™€ 7์ผ๋•Œ๋ฅผ ๋น„๊ตํ•˜์˜€๊ณ , ๊ฐ๊ฐ์„ ์ถœ๋ ฅํ•˜์˜€๋‹ค. ์ด์‹คํ—˜์˜ ๊ฒฐ๊ณผ๋กœ 2์ธ ๊ฒฐ๊ณผ๋Š” ์†์‹คํ•จ์ˆ˜ ์ชฝ ์ถœ๋ ฅ์ด ์ž‘์œผ๋ฉฐ ์ •๋‹ต ๋ ˆ์ด๋ธ”๊ณผ์˜ ์˜ค์ฐจ๋„ ์ž‘์€ ๊ฒƒ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, 7์ธ ๊ฒฐ๊ณผ๋Š” ์‹ ๊ฒฝ๋ง ์ถœ๋ ฅ์€ ๋†’์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค. ์ฆ‰, ํ‰๊ท  ์ œ๊ณฑ ์˜ค์ฐจ๋ฅผ ๊ธฐ์ค€์œผ๋กœ๋Š” ์˜ค์ฐจ๊ฐ€ ๋”์ž‘์€ ์ฒซ๋ฒˆ์งธ ๊ฒฐ๊ณผ๊ฐ€ ๊ฒฐ๊ณผ์— ๋” ๊ฐ€๊นŒ์šด ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์›-ํ•ซ ์ธ์ฝ”๋”ฉ : ํ•œ ์›์†Œ๋งŒ 1๋กœ ํ•˜๊ณ  ๊ทธ์™ธ๋Š” 0์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ํ‘œ๊ธฐ๋ฒ•

๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ (cross entropy error: CEE)

: ์†์‹คํ•จ์ˆ˜๋กœ์„œ ํ‰๊ท ์ œ๊ณฑ ์˜ค์ฐจ์™€ ๊ฐ™์ด ์ž์ฃผ ์‚ฌ์šฉํ•œ๋‹ค

CEE
  • ๋‹ค์Œ๊ณผ ๊ฐ™์ด yk๋Š” ์‹ ๊ฒฝ๋ง์˜ ์ถœ๋ ฅ, tk๋Š” ์ •๋‹ต ๋ ˆ์ด๋ธ”์ด๋ฉฐ, tk๋Š” ์›-ํ•ซ ์ธ์ฝ”๋”ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค์˜ ์›์†Œ๋งŒ 1์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” 0์ด๋‹ค

    ์˜ˆ๋ฅผ ๋“ค์–ด ์ •๋‹ต ๋ ˆ์ด๋ธ”์€ 2๊ฐ€ ์ •๋‹ต์ด๋ผ ํ•˜๊ณ  ์ด๋•Œ์˜ ์‹ ๊ฒฝ๋ง ์ถœ๋ ฅ์ด 0.6 ์ด๋ผ๋ฉด ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ๋Š” -log0.6 = 0.51 ์ด ๋œ๋‹ค

    ๋˜ํ•œ, ๊ฐ™์€ ์กฐ๊ฑด์—์„œ ์‹ ๊ฒฝ๋ง ์ถœ๋ ฅ์ด 0.1 ์ด๋ผ๊ณ  ํ•˜๋ฉด -log0.1 = 2.30 ์ด ๋œ๋‹ค. ์ฆ‰ ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ๋Š” ์ •๋‹ต์ผ ๋•Œ์˜ ์ถœ๋ ฅ์ด ์ „์ฒด ๊ฐ’์„ ์ •ํ•˜๊ฒŒ ๋œ๋‹ค

import numpy as np

def cross_entropy_error(y , t):
    delta = 1e-7 
    return -np.sum(t*np.log(y + delta))

t = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0] # ์›-ํ•ซ ์ธ์ฝ”๋”ฉ, ์ •๋‹ต 2
y1 = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0] # '2'์ผ ํ™•๋ฅ ์ด ๋†’๋‹ค๊ณ  ์ถ”์ •
y2 = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0] # '7'์ผ ํ™•๋ฅ ์ด ๋†’๋‹ค๊ณ  ์ถ”์ •

a1 = cross_entropy_error(np.array(y1), np.array(t))
a2 = cross_entropy_error(np.array(y2), np.array(t))
print(a1) # 0.510825457099338
print(a2) # 2.302584092994546

๋ฏธ๋‹ˆ๋ฐฐ์น˜ ํ•™์Šต

: ํ›ˆ๋ จ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์†์‹ค ํ•จ์ˆ˜์˜ ๊ฐ’์„ ๊ตฌํ•˜๊ณ , ๊ทธ ๊ฐ’์„ ์ตœ๋Œ€ํ•œ ์ค„์—ฌ์ฃผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋ชจ๋“  ํ›ˆ๋ จ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์†์‹ค ํ•จ์ˆ˜์„ ๊ตฌํ•˜์•  ํ•œ๋‹ค ์ฆ‰, ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๊ฐ€ 100๊ฐœ ์žˆ์œผ๋ฉด ๊ทธ๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•œ 100๊ฐœ์˜ ์†์‹คํ•จ์ˆ˜ ๊ฐ’๋“ค์˜ ํ•ฉ์„ ์ง€ํ‘œ๋กœ ์‚ผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ›ˆ๋ จ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆ˜๋งŒ๊ฐœ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์†์‹คํ•ฉ์„ ๊ตฌํ•˜๋ฉด ์‹œ๊ฐ„ ๋“ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿฌ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ์ผ๋ถ€๋ฅผ ์ถ”๋ ค ์ „์ฒด์˜ ๊ทผ์‚ฌ์น˜๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹ ๋ช…๋ง ํ•™์Šต์—์„œ๋„ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ์ผ๋ถ€๋งŒ ๊ณจ๋ผ ํ•™์Šต ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฏธ๋‹ˆ ๋ฐฐ์น˜(mini-batch)๊ฐ€ ์žˆ๋‹ค.

np.random.choice(60000, 10) #์ง€์ •ํ•œ ๋ฒ”์œ„ ์ˆ˜ ์ค‘์—์„œ ๋ฌด์ž‘์œ„๋กœ ์›ํ•˜๋Š” ๊ฐœ์ˆ˜๋งŒ ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋‹ค

(๋ฐฐ์น˜์šฉ) ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ ๊ตฌํ˜„ํ•˜๊ธฐ

  • ์›-ํ•ซ ์ธ์ฝ”๋”ฉ์ผ๋•Œ ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ

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๊ฐ€ 1์ฐจ์›์ด๋ผ๋ฉด, ์ฆ‰ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋‹น ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ๋Š” reshape ํ•จ์ˆ˜๋กœ ๋ฐ์ดํ„ฐ์˜ ํ˜•์ƒ์„ ๋ฐ”๊ฟ”์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์น˜์˜ ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ  ์ •๊ทœํ™”ํ•˜๊ณ  ์ด๋ฏธ์ง€ 1์žฅ๋‹น ํ‰๊ท ์˜ ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค

  • ์ •๋‹ต ๋ ˆ์ด๋ธ”์ด ์›-ํ•ซ ์ธ์ฝ”๋”ฉ์ด ์•„๋‹ˆ๋ผ 2๋‚˜ 7 ๋“ฑ์˜ ์ˆซ์ž ๋ ˆ์ด๋ธ”๋กœ ์ฃผ์–ด์กŒ์„ ๋•Œ ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ์˜ค์ฐจ

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

: ์ด ๊ตฌํ˜„์—์„œ๋Š” ์›-ํ•ซ ์ธ์ฝ”๋”ฉ์ผ ๋•Œ t๊ฐ€ 0์ธ ์›์†Œ๋Š” ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ๋„ 0์ด๋ฏ€๋กœ, ๊ทธ ๊ณ„์‚ฐ์€ ๋ฌด์‹œํ•ด๋„ ์ข‹๋‹ค๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ ๋‹ค์‹œ ๋งํ•˜๋ฉด ์ •๋‹ต์— ํ•ด๋‹นํ•˜๋Š” ์‹ ๊ฒฝ๋ง์˜ ์ถœ๋ ค๋งŒ์œผ๋กœ ๊ต์ฐจ ์—”ํŠธ๋กœํ”ผ ์˜ค์ฐจ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  • np.log(y[np.arange(batch_size), t]์—์„œ np.arange(batch_size)์€ 0๋ถ€ํ„ฐ batch_size-1๊นŒ์ง€ ๋ฐฐ์—ด(ex) [0, 1, 2, 3, 4])์„ ์ƒ์„ฑํ•˜๊ณ , t์—๋Š” ๋ ˆ์ด๋ธ”(ex) [2, 4, 6, 8, 1])์ด ๊ฐ๊ฐ ์ €์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, np.log(y[np.arange(batch_size), t]๋Š” ๊ฐ ๋ฐ์ดํ„ฐ ์ •๋‹ต ๋ ˆ์ด๋ธ”์— ํ•ด๋‹นํ•˜๋Š” ์‹ ๊ฒฝ๋ง์„ ์ถœ๋ ฅํ•œ๋‹ค. (ex) y[0, 2], y[1, 4], y[2, 6], y[3, 8], y[4, 1])

์™œ? ์†์‹ค ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๋Š”๊ฐ€?

: ์‹ ๊ฒฝ๋ง ํ•™์Šต์—์„œ๋Š” ์ตœ์ ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜(๊ฐ€์ค‘์น˜์™€ ํŽธํ–ฅ)๋ฅผ ํƒ์ƒ‰ํ•  ๋•Œ ์†์‹ค ํ•จ์ˆ˜์˜ ๊ฐ’์„ ๊ฐ€๋Šฅํ•œ ํ•œ ์ž‘๊ฒŒ ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ด๋–„ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฏธ๋ถ„(์ •ํ™•ํžˆ๋Š” ๊ธฐ์šธ๊ธฐ)์„ ๊ณ„์‚ฐํ•˜๊ณ , ๊ทธ ๋ฏธ๋ถ„ ๊ฐ’์„ ๋‹จ์„œ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์„œ์„œํžˆ ๊ฐฑ์‹ ํ•˜๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์ด๋•Œ ๊ทธ ๊ฐ€์ค‘์น˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ด ์†์‹ค ํ•จ์ˆ˜์˜ ๋ฏธ๋ถ„์ด๋ž€ '๊ฐ€์ค‘์น˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์•„์ฃผ ์กฐ๊ธˆ ๋ณ€ํ™”์‹œ์ผฐ์„ ๋•Œ, ์†์‹คํ•จ์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋ƒ'๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค

  • ์‹ ๊ฒฝ๋ง์„ ํ•™์Šต ํ•  ๋•Œ ์ •ํ™•๋„๋ฅผ ์ง€ํ‘œ๋กœ ์‚ผ์•„์„œ๋Š” ์•ˆ๋œ๋‹ค. ์ •ํ™•๋„๋ฅผ ์ง€ํ‘œ๋กœ ํ•˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฏธ๋ถ„์ด ๋Œ€๋ถ€๋ถ„์˜ ์žฅ์†Œ์—์„œ 0์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค

    ์ •ํ™•๋„๋ฅผ ์ง€ํ‘œ๋กœ ์‚ผ์œผ๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๋ฏธ๋ถ„์ด ๋Œ€๋ถ€๋ถ„ ์žฅ์†Œ์—์„œ 0์ด ๋˜๋Š” ์ด์œ ๋Š” ์ •ํ™•๋„๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์•ผ๊ฐ„๋งŒ ์กฐ์ •ํ•ด์„œ๋Š” ์ •ํ™•๋„๊ฐ€ ๊ฐœ์„ ๋˜์ง€ ์•Š๊ณ  ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋œ๋‹ค. ํ•˜์ง€๋งŒ ์†์‹คํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ์กฐ๊ธˆ ๋ณ€ํ•˜๋ฉด ๊ทธ์— ๋ฐ˜์‘ํ•˜์—ฌ ์†์‹คํ•จ์ˆ˜์˜ ๊ฐ’๋„ ๋ณ€ํ•œ๋‹ค.

    ์ด๋Š” ๊ณ„๋‹จํ•จ์ˆ˜๋ฅผ ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ์ž‘์€ ๋ณ€ํ™”๊ฐ€ ์ฃผ๋Š” ํŒŒ์žฅ์„ ๊ณ„๋‹จ ํ•จ์ˆ˜๊ฐ€ ๋ง์‚ดํ•˜์—ฌ ์†์‹คํ•จ์ˆ˜์˜ ๊ฐ’์—๋Š” ์•„๋ฌด๋Ÿฐ ๋ณ€ํ™”๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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

: ๋ฏธ๋ถ„์ด๋ž€ ํ•œ์ˆœ๊ฐ„์˜ ๋ณ€ํ™”๋Ÿ‰์„ ํ‘œ์‹œํ•œ ๊ฒƒ์œผ๋กœ ๊ฒฝ์‚ฌ๋ฒ•์—์„œ๋Š” ๊ธฐ์šธ๊ธฐ(๊ฒฝ์‚ฌ) ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜์•„๊ฐˆ ๋ฐฉํ–ฅ์„ ์ •ํ•˜๋ฉฐ, ์ˆ˜์น˜ ๋ฏธ๋ถ„์ด๋ž€ ์•„์ฃผ ์ž‘์€ ์ฐจ๋ถ„์œผ๋กœ ๋ฏธ๋ถ„ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค

  • ๊ฐ„๋‹จํžˆ ๋งํ•ด ํ•ด์„์  ๋ฏธ๋ถ„์€ ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜ํ•™์‹œ๊ฐ„์— ๋ฐฐ์šด ๊ทธ ๋ฏธ๋ถ„์ด๊ณ , ์ˆ˜์น˜ ๋ฏธ๋ถ„์€ ์ด๋ฅผ ๊ทผ์‚ฌ์น˜๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค

  • ๋ฏธ๋ถ„ derivative

  • ์œ„์˜ ๊ณต์‹์„ ์ด์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋‘๊ฐœ์˜ ๋ฌธ์ œ์ ์ด ๋ฐœ์ƒํ•œ๋‹ค

  • ๋ฐ˜์˜ฌ๋ฆผ ์˜ค์ฐจ(rounding error, ์†Œ์ˆ˜์  8์ž๋ฆฌ ์ดํ•˜๋Š” ์ƒ๋žต)์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ 1e-50์„ float32ํ˜•(32๋น„ํŠธ ๋ถ€๋™์†Œ์ˆ˜์ )์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด 0.0์ด ๋œ๋‹ค

    ๊ทธ๋ž˜์„œ 1e-4์ •๋„์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š”๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ๋‹ค

  • ๋‘๋ฒˆ์งธ ๊ฐœ์„ ์€ ํ•จ์ˆ˜f์˜ ์ฐจ๋ถ„๊ณผ ๊ด€๋ จ๋œ๊ฒƒ์ด๋‹ค. ๊ทผ์‚ฌ๋กœ ๊ตฌํ•œ ์ ‘์„ ๊ณผ ์ง„์ •ํ•œ ์ ‘์„ ์—๋Š” ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด ์˜ค์ฐจ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ (x + h)์™€ (x - h)์ผ ๋•Œ์˜ ํ•จ์ˆ˜ f์˜ ์ฐจ๋ถ„์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์“ด๋‹ค. ์ด ์ฐจ๋ถ„์€ x๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ทธ ์ „ํ›„์˜ ์ฐจ๋ถ„์„ ๊ณ„์‚ฐํ•œ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ์ค‘์‹ฌ์ฐจ๋ถ„ ํ˜น์€ ์ค‘์•™ ์ฐจ๋ถ„์ด๋ผ ํ•œ๋‹ค

def numerical_diff(f, x):
    h = 1e-4
    return (f(x+h) - f(x-h)) /(2*h)

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

diffEX
import numpy as np
import matplotlib.pylab as plt

def function_1(x):
    return 0.01*x**2 + 0.1*x

def numerical_diff(f, x):
    h = 1e-4
    return (f(x+h) - f(x-h)) /(2*h)

def tangent_line(f, x):
    d = numerical_diff(f, x)
    print(d)
    y = f(x) - d*x
    return lambda t: d*t + y

x = np.arange(0.0, 20.0, 0.1)
y1 = function_1(x)
tf1 = tangent_line(function_1, 5)
y2 = tf1(x)
tf2 = tangent_line(function_1, 10)
y3 = tf2(x)

plt.xlabel("x")
plt.ylabel("f(x)")
plt.plot(x, y1)
plt.plot(x, y2, linestyle=":", label = "x=5") 
plt.plot(x, y3, linestyle="--", label = "x=10")
plt.legend() 
plt.show()
diffEXgraph
  • ๋‹ค์Œ์€ ์‹์— ์˜ํ•œ ๊ทธ๋ž˜ํ”„๋ฅผ ํ‘œํ˜„

    diffEXgraph2

  • x=5, x=10์—์„œ์˜ ์ ‘์„  : ์ง์„ ์˜ ๊ธฐ์šธ๊ธฐ๋Š” ์ˆ˜์น˜๋ฏธ๋ถ„์—์„œ ๊ตฌํ•œ ๊ฐ’์„ ์‚ฌ์šฉ

  • ๊ฐ๊ฐ์˜ ๊ฐ’์€ x=5์ผ๋•Œ๋Š” 0.1999999999990898, x=10์ผ๋•Œ๋Š” 0.2999999999986347์˜ ์ˆ˜์น˜ ๋ฏธ๋ถ„ ๊ฐ’์„ ๊ตฌํ•˜์˜€๋‹ค

ํŽธ๋ฏธ๋ถ„

: ๋‹ค๋ณ€์ˆ˜ ํ•จ์ˆ˜์˜ ํŠน์ • ๋ณ€์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ณ€์ˆ˜๋ฅผ ์ƒ์ˆ˜๋กœ ์ƒ๊ฐํ•˜์—ฌ ๋ฏธ๋ถ„

partialDerivative
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt


def f(x0,x1): 
    return x0**2 + x1**2


# f(x,y) = x^2 + y^2 ํ•จ์ˆ˜์˜ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ 
fig = plt.figure() 
ax = fig.gca(projection='3d') 
x0 = np.arange(-3, 3, 0.25) 
x1 = np.arange(-3, 3, 0.25) 
x0, x1 = np.meshgrid(x0, x1) 
f= f(x0,x1) 

surf = ax.plot_wireframe(x0, x1, f, color='blue')
plt.xlabel('x0') 
plt.ylabel('x1') 
ax.set_zlabel('f(x0,x1)')
plt.show()
partialDerivativeGraph
  • ์œ„์˜ ๊ณต์‹์— ๋”ฐ๋ผ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค

  • ๋ถ„ x0=3, x1=4 ์ผ๋•Œ, x0์˜ ํŽธ๋ฏธ๋ถ„๊ณผ x1์˜ ํŽธ๋ฏธ๋ถ„

import numpy as np

def function_x0(x0):
    return x0*x0 + 4.0**2.0
 # ์ฃผ์˜) x0*x0๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, 2*x0์€ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‚˜์˜จ๋‹ค 

def function_x1(x1):
    return 3.0**2.0 + x1*x1

def numerical_diff(f, x):
    h = 1e-4
    return (f(x+h) - f(x-h)) /(2*h)

x0 = numerical_diff(function_x0, 3.0)
x1 = numerical_diff(function_x1, 4.0)
print("x0์— ๋Œ€ํ•œ ํŽธ๋ฏธ๋ถ„", x0) # 6.00000000000378
print("x1์— ๋Œ€ํ•œ ํŽธ๋ฏธ๋ถ„", x1) # 7.999999999999119

๊ธฐ์šธ๊ธฐ

: ๋ชจ๋“  ๋ณ€์ˆ˜์˜ ํŽธ๋ฏธ๋ถ„์„ ๋ฒกํ„ฐ๋กœ ์ •๋ฆฌํ•œ ๊ฒƒ์„ ๊ธฐ์šธ๊ธฐ (gradient)๋ผ๊ณ  ํ•œ๋‹ค

import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import Axes3D

def _numerical_gradient_no_batch(f, x):
    h = 1e-4 # 0.0001
    grad = np.zeros_like(x) # x์™€ ํ˜•์ƒ์ด ๊ฐ™์€ ๋ฐฐ์—ด์„ ์ƒ์„ฑ
        for idx in range(x.size):
        tmp_val = x[idx]
        # f(x+h) ๊ณ„์‚ฐ
        x[idx] = float(tmp_val) + h
        fxh1 = f(x)
        # f(x-h) ๊ณ„์‚ฐ
        x[idx] = tmp_val - h 
        fxh2 = f(x) 

        grad[idx] = (fxh1 - fxh2) / (2*h)
        x[idx] = tmp_val # ๊ฐ’ ๋ณต์›
    return grad

def numerical_gradient(f, X):
    if X.ndim == 1:
        return _numerical_gradient_no_batch(f, X)
    else:
        grad = np.zeros_like(X)

        for idx, x in enumerate(X):
            grad[idx] = _numerical_gradient_no_batch(f, x)

        return grad


def function_2(x):
    if x.ndim == 1:
        return np.sum(x**2)
    else:
        return np.sum(x**2, axis=1)


def tangent_line(f, x):
    d = numerical_gradient(f, x)
    print(d)
    y = f(x) - d*x
    return lambda t: d*t + y

if __name__ == '__main__':
    x0 = np.arange(-2, 2.5, 0.25)
    x1 = np.arange(-2, 2.5, 0.25)
    X, Y = np.meshgrid(x0, x1)

    X = X.flatten()
    Y = Y.flatten()

    grad = numerical_gradient(function_2, np.array([X, Y]) )

    plt.figure()
    plt.quiver(X, Y, -grad[0], -grad[1],  angles="xy",color="#666666"))
    plt.xlim([-2, 2])
    plt.ylim([-2, 2])
    plt.xlabel('x0')
    plt.ylabel('x1')
    plt.grid()
    plt.legend()
    plt.draw()
    plt.show()
gradient
  • ๊ธฐ์šธ๊ธฐ๋Š” ๋ฐฉํ–ฅ์„ ๊ฐ€์ง„ ๋ฒกํ„ฐ(ํ™”์‚ดํ‘œ)๋กœ ๊ทธ๋ ค์ง„๋‹ค. ๊ธฐ์šธ๊ธฐ๋Š” ํ•จ์ˆ˜์˜ ๊ฐ€์žฅ ๋‚ฎ์€ ์žฅ์†Œ(์ตœ์†Ÿ๊ฐ’)์—์„œ ๋ฉ€์–ด์งˆ์ˆ˜๋ก ํ™”์‚ดํ‘œ์˜ ํฌ๊ธฐ๊ฐ€ ์ปค์ง์„ ์•Œ์ˆ˜ ์žˆ๋‹ค

  • ํ•˜์ง€๋งŒ ๊ธฐ์šธ๊ธฐ๋Š” ๊ฐ ์ง€์ ์—์„œ ๋‚ฎ์•„์ง€๋Š” ๋ฐฉํ–ฅ์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค

  • ๋” ์ •ํ™•ํžˆ ๋งํ•˜์ž๋ฉด ๊ธฐ์šธ๊ธฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ชฝ์€ ๊ฐ ์žฅ์†Œ์—์„œ ํ•จ์ˆ˜์˜ ์ถœ๋ ฅ ๊ฐ’์„ ๊ฐ€์žฅ ํฌ๊ฒŒ ์ค„์ด๋Š” ๋ฐฉํ–ฅ์ด๋‹ค.(์ค‘์š”)

๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•(๊ฒฝ์‚ฌ๋ฒ•, gradient descent)

: ์‹ ๊ฒฝ๋ง์€ ์ตœ์ ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜(๊ฐ€์ค‘์น˜์™€ ํŽธํ–ฅ)๋ฅผ ํ•™์Šต ์‹œ์— ์ฐพ์•„์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ตœ์ ์ด๋ž€ ์†์‹ค ํ•จ์ˆ˜๊ฐ€ ์ตœ์†Ÿ๊ฐ’์ด ๋  ๋•Œ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์ด๋‹ค.

  • ๊ธฐ์šธ๊ธฐ๋ฅผ ์ž˜ ์ด์šฉํ•ด ํ•จ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’(๋˜๋Š” ๊ฐ€๋Šฅํ•œ ์ž‘์€ ๊ฐ’)์„ ์ฐพ์œผ๋ ค๋Š” ๊ฒƒ์ด ๊ฒฝ์‚ฌ ํ•˜๊ฐ•๋ฒ•(๊ฒฝ์‚ฌ๋ฒ•)์ด๋‹ค

  • ๊ธฐ์šธ๊ธฐ์ง„ ๋ฐฉํ–ฅ์ด ๊ผญ ์ตœ์†Ÿ๊ฐ’์€ ์•„๋‹ˆ๋ฉฐ, ๊ธฐ์šธ๊ธฐ ์ •๋ณด๋ฅผ ๋‹จ์„œ๋กœ ๋‚˜์•„๊ฐˆ ๋ฐฉํ–ฅ์„ ์ •ํ•ด์•ผ ํ•œ๋‹ค

  • ๊ฒฝ์‚ฌ๋ฒ•์€ ํ˜„ ์œ„์น˜์—์„œ ๊ธฐ์šธ์–ด์ง„ ๋ฐฉํ–ฅ์œผ๋กœ ์ผ์ • ๊ฑฐ๋ฆฌ๋งŒํผ ์ด๋™ํ•œ ํ›„์„ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๊ธฐ์šธ๊ธฐ๋ฅผ ๊ตฌํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด์„œ ํ•จ์ˆ˜์˜ ๊ฐ’์ด ์ ์ฐจ ์ค„์ด๋Š” ๊ฒƒ์„ ๊ฒฝ์‚ฌ๋ฒ•์ด๋‹ค

tip) ํ•จ์ˆ˜๊ฐ€ ๊ทน์†Ÿ๊ฐ’, ์ตœ์†Ÿ๊ฐ’, ๋˜๋Š” ์•ˆ์ •์ (saddle point)์ด ๋˜๋Š” ์žฅ์†Œ์—์„œ๋Š” ๊ธฐ์šธ๊ธฐ๊ฐ€ 0์ด๋‹ค. ์ด๋•Œ ์•ˆ์ •์ ์€ ์–ด๋А ๋ฐฉํ–ฅ์—์„œ ๋ณด๋ฉด ๊ทน๋Œ“๊ฐ’์ด ๋˜๊ณ  ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์—์„œ ๋ณด๋ฉด ๊ทน์†Ÿ๊ฐ’์ด ๋˜๋Š” ์ ์ด๋‹ค. ๊ฒฝ์‚ฌ๋ฒ•์€ ๊ธฐ์šธ๊ธฐ๊ฐ€ 0์ธ ์žฅ์†Œ๋ฅผ ์ฐพ์ง€๋งŒ ๊ทธ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ์ตœ์†Ÿ๊ฐ’์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์—†๋‹ค. ๋˜ ๋ณต์žกํ•˜๊ณ  ์ฐŒ๊ทธ๋Ÿฌ์ง„ ๋ชจ์–‘์˜ ํ•จ์ˆ˜๋ผ๋ฉด(๋Œ€๋ถ€๋ถ„) ํ‰ํ‰ํ•œ ๊ณณ์œผ๋กœ ํŒŒ๊ณ ๋“ค๋ฉด์„œ ๊ณ ์›(plateau, ํ”Œ๋ž˜ํ† )์ด๋ผ ํ•˜๋Š”, ํ•™์Šต์ด ์ง„ํ–‰๋˜์ง€ ์•Š๋Š” ์ •์ฒด๊ธฐ์— ๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค. tip) ๊ฒฝ์‚ฌ๋ฒ•์€ ์ตœ์†Ÿ๊ฐ’๊ณผ ์ตœ๋Œ“๊ฐ’์— ๋”ฐ๋ผ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•, ๊ฒฝ์‚ฌ์ƒ์Šน๋ฒ•์œผ๋กœ ๋‚˜๋‰˜๋ฉฐ ๋ถ€ํ˜ธ๋งŒ ๋ฐ˜์ „์ด๋ฏ€๋กœ ๋ณธ์งˆ์ ์œผ๋กœ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค

NNgradientDescent
  • ์—ํƒ€ ๊ธฐํ˜ธ๋Š” ๊ฐฑ์‹ ํ•˜๋Š” ์–‘์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด๋ฅผ ์‹ ๊ฒฝ๋ง ํ•™์Šต์—์„œ๋Š” ํ•™์Šต๋ฅ (learning rate)๋ผ๊ณ  ํ•œ๋‹ค.

  • ํ•œ๋ฒˆ์˜ ํ•™์Šต์œผ๋กœ ์–ผ๋งˆ๋งŒํผ ํ•™์Šตํ•ด์•ผ ํ• ์ง€, ์ฆ‰ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์–ผ๋งˆ๋‚˜ ๊ฐฑ์‹ ํ•˜๋А๋ƒ๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•™์Šต๋ฅ ์ด๋‹ค

def gradient_descent(f, init_x, lr=0.01, step_num = 100):
    x = init_x

    for i in range(step_num):
        grad - numerical_gradient(f,x)
        x -= lr * grad
    return x

tip)ํ•™์Šต๋ฅ  ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ(hyper parameter, ์ดˆ๋งค๊ฐœ๋ณ€์ˆ˜)๋ผ๊ณ  ํ•œ๋‹ค. ์ด๋Š” ๊ฐ€์ค‘์น˜์™€ ํŽธํ–ฅ ๊ฐ™์€ ์‹ ๊ฒฝ๋ง์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์™€๋Š” ์„ฑ์งˆ์ด ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋‹ค. ์‹ ๊ฒฝ๋ง์˜ ๊ฐ€์ค‘์น˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ›ˆ๋ จ๋ฐ์ดํ„ฐ์™€ ํ•™์Šต ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด์„œ ์ž๋™์œผ๋กœ ํš๋“๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ธ ๋ฐ˜๋ฉด, ํ•™์Šต๋ฅ  ๊ฐ™์€ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์‚ฌ๋žŒ์ด ์ง์ ‘ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋“ค ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์—ฌ๋Ÿฌ ํ›„๋ณด ๊ฐ’ ์ค‘์—์„œ ์‹œํ—˜์„ ํ†ตํ•ด ๊ฐ€์žฅ ์ž˜ ํ•™์Šตํ•˜๋Š” ๊ฐ’์„ ์ฐพ๋Š” ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค

Last updated

Was this helpful?