11장 심층신경망 훈련

감사의 글

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

  • ์‹ฌ์ธต์‹ ๊ฒฝ๋ง
    • ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋‰ด๋ จ์œผ๋กœ ๊ตฌ์„ฑ๋œ 10๊ฐœ ์ด์ƒ์˜ ์ธต์„ ์‚ฌ์šฉํ•˜๋Š” ์‹ ๊ฒฝ๋ง
    • ์˜ˆ์ œ: ๊ณ ํ•ด์ƒ๋„ ์ด๋ฏธ์ง€์—์„œ ์ˆ˜๋ฐฑ ์ข…๋ฅ˜์˜ ๋ฌผ์ฒด ๊ฐ์ง€
  • ์‹ฌ์ธต์‹ ๊ฒฝ๋ง ํ›ˆ๋ จ ์ค‘ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ
    • ๊ทธ๋ ˆ์ด๋””์–ธํŠธ ์†Œ์‹ค/ํญ์ฃผ: ์‹ฌ์ธต์‹ ๊ฒฝ๋ง์˜ ์•„๋ž˜์กฑ์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ๊ทธ๋ ˆ์ด๋””์–ธํŠธ๊ฐ€ ์ ์  ๋” ์ž‘์•„์ง€๊ฑฐ๋‚˜ ์ปค์ง€๋Š” ํ˜„์ƒ
    • ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ ๋ถ€์กฑ ๋˜๋Š” ๋„ˆ๋ฌด ๋น„์‹ผ ๋ ˆ์ด๋ธ” ์ž‘์—…
    • ๊ทน๋‹จ์ ์œผ๋กœ ๋Š๋ฆฐ ํ›ˆ๋ จ๊ณผ์ •
    • ๊ณผ๋Œ€์ ํ•ฉ: ์ˆ˜๋ฐฑ๋งŒ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์˜ํ•ด ๊ณผ๋Œ€์ ํ•ฉ ๊ฐ€๋Šฅ์„ฑ ๋งค์šฐ ํผ. ํŠนํžˆ ํ›ˆ๋ จ ์ƒ˜ํ”Œ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์žก์Œ์ด ๋งŽ์€ ๊ฒฝ์šฐ ๊ทธ๋Ÿฌํ•จ.

주요 내용

  • ์–ธ๊ธ‰๋œ ๋ฌธ์ œ ํ•ด๊ฒฐ์ฑ… ์ œ์‹œ

그레이디언트 소실/폭주 문제

  • (10์žฅ์—์„œ ์„ค๋ช…ํ•œ) ์—ญ์ „ํŒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ์ถœ๋ ฅ์ธต์—์„œ ์ž…๋ ฅ์ธต์œผ๋กœ ์˜ค์ฐจ ๊ทธ๋ ˆ์ด๋””์–ธํŠธ๋ฅผ ์ „ํŒŒ
  • ํ•˜์œ„์ธต์œผ๋กœ ๊ฐˆ ์ˆ˜๋ก ๊ทธ๋ ˆ์ด๋””์–ธํŠธ ์†Œ์‹ค/ํญ์ฃผ ๋ฌธ์ œ ๋ฐœ์ƒ ์ž์ฃผ ๋ฐœ์ƒ.
    • ๊ทธ๋ ˆ์ด๋””์–ธํŠธ ์†Œ์‹ค: ์ตœ์ ์˜ ๋ชจ๋ธ๋กœ ์ˆ˜๋ ดํ•˜์ง€ ์•Š์Œ.
    • ๊ทธ๋ ˆ์ด๋””์–ธํŠธ ํญ์ฃผ: ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฐœ์‚ฐ.
  • ์›์ธ: ํ™œ์„ฑํ™” ํ•จ์ˆ˜์™€ ๊ฐ€์ค‘์น˜ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•ด ์•„๋ž˜ ์กฐํ•ฉ์„ ์„ ํƒํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์ž„.
    • ํ™œ์„ฑํ™” ํ•จ์ˆ˜: ๋กœ์ง€์Šคํ‹ฑ ํ™œ์„ฑํ™” ํ•จ์ˆ˜
    • ๊ฐ€์ค‘์น˜ ์ดˆ๊ธฐํ™”: ํ‘œ์ค€์ •๊ทœ๋ถ„ํฌ ํ™œ์šฉ

  • 2010๋…„์— ์œ„ ์‚ฌ์‹ค์ด ์•Œ๋ ค์งˆ ๋•Œ๊นŒ์ง€ ์‹ฌ์ธต์‹ ๊ฒฝ๋ง์€ ์‚ฌ์‹ค์ƒ ๋ฐฉ์น˜๋˜์—ˆ์Œ.
  • ํ•˜์ง€๋งŒ ์ดํ›„ ๊ธ‰์†๋„๋กœ ๋ฐœ์ „ํ•˜์—ฌ 2016๋…„ ์•ŒํŒŒ๊ณ ์™€ ์ด์„ธ๋Œ ๋ฐ”๋‘‘๋Œ€์ „๊นŒ์ง€ ๊ฐ€๋Šฅํ•ด์ง.
  • ํ˜„์žฌ ๋ฐ์ดํ„ฐ๊ณผํ•™๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ถ„์•ผ์—์„œ ๊ธฐ์กด์— ํ•ด๊ฒฐ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์Œ.
  • ํ•˜๋‚˜์˜ ์—ฐ๊ตฌ๋ถ„์•ผ๊ฐ€ ์•„๋‹ˆ๋ผ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•„์ˆ˜ ๊ธฐ๋ฒ•์œผ๋กœ ์ž๋ฆฌ์žก์Œ.

초기화 방식 선택

  • ์ธต์— ์‚ฌ์šฉ๋˜๋Š” ํ™œ์„ฑํ™” ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์•„๋ž˜ ์„ธ ๊ฐ€์ง€ ์ดˆ๊ธฐํ™” ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜ ์„ ํƒ
  • ๊ธ€๋กœ๋กœ(Glorot) ์ดˆ๊ธฐํ™”
  • ๋ฅด์ฟค(LeCun) ์ดˆ๊ธฐํ™”
  • ํ—ค(He) ์ดˆ๊ธฐํ™”

글로로(Glorot) 초기화

  • ํŒฌ-์ธ/ํŒฌ-์•„์›ƒ
    • fan-in(ํŒฌ-์ธ, $\textit{fan}_{\textrm{in}}$): ์ธต์— ๋“ค์–ด์˜ค๋Š” ์ž…๋ ฅ ์ˆ˜
    • fan-out(ํŒฌ-์•„์›ƒ, $\textit{fan}_{\textrm{out}}$): ์ธต์—์„œ ๋‚˜๊ฐ€๋Š” ์ถœ๋ ฅ ์ˆ˜
$$ \textit{fan}_{\textrm{avg}} = \frac{\textit{fan}_{\textrm{in}} + \textit{fan}_{\textrm{out}}}{2} $$
  • ๊ธ€๋กœ๋กœ ์ดˆ๊ธฐํ™”(์ •๊ทœ๋ถ„ํฌ ํ™œ์šฉ)
    • ํ‰๊ท ($\mu$) = $0$
    • ๋ถ„์‚ฐ($\sigma^2$) = $\frac{1}{\textit{fan}_{\textrm{avg}}}$
  • ๊ธ€๋กœ๋กœ ์ดˆ๊ธฐํ™”(๊ท ๋“ฑ๋ถ„ํฌ ํ™œ์šฉ)

    • $-r$๊ณผ $r$ ์‚ฌ์ด์˜ ๊ท ๋“ฑ๋ถ„ํฌ

      $$r = \sqrt{\frac{3}{\textit{fan}_{\textrm{avg}}}}$$

르쿤(LeCun) 초기화

  • ๊ธ€๋กœ๋กœ ์ดˆ๊ธฐํ™” ์ •์˜์—์„œ $\textit{fan}_{\textrm{avg}}$๋ฅผ $\textit{fan}_{\textrm{in}}$ ์œผ๋กœ ๋Œ€์ฒด.

헤(He) 초기화

  • ์ •๊ทœ๋ถ„ํฌ ํ™œ์šฉ ์ดˆ๊ธฐํ™”:
$$ \sigma^2 = \frac{2}{\textit{fan}_{\textrm{in}}} $$
  • ๊ท ๋“ฑ๋ถ„ํฌ ํ™œ์šฉ ์ดˆ๊ธฐํ™”:
$$ r = \sqrt{3 \sigma^2} $$

활성화 함수와 초기화 방식

  • ์ธต์„ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ™œ์„ฑํ™” ํ•จ์ˆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ฐ€์ค‘์น˜ ์ดˆ๊ธฐํ™” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.
์ดˆ๊ธฐํ™” ์ „๋žต ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์ •๊ทœ๋ถ„ํฌ ์ดˆ๊ธฐํ™” ๊ท ๋“ฑ๋ถ„ํฌ ์ดˆ๊ธฐํ™”
Glorot ์ดˆ๊ธฐํ™” ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ํ•˜์ดํผ๋ณผ๋ฆญ ํƒ„์  ํŠธ, ๋กœ์ง€์Šคํ‹ฑ, ์†Œํ”„ํŠธ๋งฅ์Šค glorot_normal glorot_uniform
He ์ดˆ๊ธฐํ™” ReLU ํ•จ์ˆ˜์™€ ๊ทธ ๋ณ€์ข…๋“ค he_normal he_uniform
LeCun ์ดˆ๊ธฐํ™” SELU lecun_normal lecun_uniform
  • ์ผ€๋ผ์Šค์˜ ๊ธฐ๋ณธ ์ดˆ๊ธฐํ™” ์„ค์ •๊ฐ’: glorot_uniform

예제

  • ์ธต์„ ๋งŒ๋“ค ๋•Œ ์ •๊ทœ๋ถ„ํฌ๋ฅผ ์ด์šฉํ•œ He ์ดˆ๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ
keras.layers.Dense(10, activation="relu", kernel_initializer="he_normal")

예제

  • $\textit{fan}_{\textrm{in}}$ ๋Œ€์‹  $\textit{fan}_{\textrm{out}}$ ๊ธฐ๋ฐ˜์˜ ๊ท ๋“ฑ๋ถ„ํฌ He ์ดˆ๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•  ๊ฒฝ์šฐ
    • VarianceScaling ํด๋ž˜์Šค ํ™œ์šฉ
init = keras.initializers.VarianceScaling(scale=2., mode='fan_avg',
                                          distribution='uniform')
keras.layers.Dense(10, activation="relu", kernel_initializer=init)

활성화 함수 선택

  • ์‹ฌ์ธต์‹ ๊ฒฝ๋ง์˜ ์ธต์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋Š” ์‹œ๊ทธ๋ชจ์ด๋“œ ํ•จ์ˆ˜๋ณด๋‹ค ์•„๋ž˜ ํ•จ์ˆ˜๋“ค์ด ๋ณด๋‹ค ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ฐœํœ˜ํ•จ.
  • ReLU
  • LeakyReLU
  • RReLU
  • PReLU
  • ELU
  • SELU

ReLU

  • 2010๋…„๋„์— ์†Œ๊ฐœ๋จ.

  • $\textrm{ReLU}_\alpha(z) = \max(0, z)$

  • ์™„๋ฒฝํ•˜์ง€ ์•Š์Œ

  • ์ž…๋ ฅ์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์Œ์ˆ˜๊ฐ€ ๋˜๋ฉด ๋‰ด๋Ÿฐ์ด ์ฃฝ๊ฒŒ ๋˜์–ด ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฒŒ๋จ.

LeakyReLU

  • 2014๋…„์— ์†Œ๊ฐœ๋จ
  • $\textrm{LeakyReLU}_\alpha(z) = \max(\alpha z, z)$
    • $\alpha$: ์ƒˆ์–ด ๋‚˜๊ฐ€๋Š” ์ •๋„๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ
  • ReLU ๋ณด๋‹ค ์ข‹์€ ์„ฑ๋Šฅ ๋ฐœํœ˜
    • ๊ธฐ๋ณธ๊ฐ’: $\alpha = 0.1$
    • $\alpha = 0.2$๋กœ ํ•  ๋•Œ ์ข€ ๋” ์„ฑ๋Šฅ ์ข‹์•„์ง.

RReLU

  • $\alpha$๋ฅผ ์ฃผ์–ด์ง„ ๋ฒ”์œ„์—์„œ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒํ•˜๋Š” LeakyReLU
  • ๊ฝค ์ž˜ ์ž‘๋™ํ•จ
  • ๊ณผ๋Œ€์ ํ•ฉ์„ ์ค„์ด๋Š” ๊ทœ์ œ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž„

PReLU

  • ์—ญ์ „ํŒŒ ๊ณผ์ •์—์„œ $\alpha$๊ฐ’๋„ ์ž๋™ ์กฐ์ •๋จ
  • ๋Œ€๊ทœ๋ชจ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์…‹์—์„œ ReLU ๋ณด๋‹ค ์„ฑ๋Šฅ ์ข‹์Œ.
  • ์†Œ๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์„ธ์—์„œ๋Š” ๊ณผ๋Œ€์ ํ•ฉ ์œ„ํ—˜์„ฑ ์กด์žฌ.

ELU

  • 2015๋…„๋„์— ์†Œ๊ฐœ๋จ.
  • ์•ž์„œ ์–ธ๊ธ‰๋œ ReLU ๋ณ€์ข…๋“ค๋ณด๋‹ค ์„ฑ๋Šฅ ์ข‹์€ ๊ฒƒ์œผ๋กœ ๋ณด์ž„.
  • ํ›ˆ๋ จ ์‹œ๊ฐ„ ์ค„์–ด๋“ฆ.
$$ \textrm{ELU}_\alpha(z) = \begin{cases} \alpha(\exp(z) - 1) & \text{if } z < 0, \\ z & \text{if } z \ge 0. \end{cases} $$

  • ELU ํ•จ์ˆ˜์˜ ์žฅ๋‹จ์ 
    • ์ˆ˜๋ ด ์†๋„ ๋น ๋ฆ„
    • ๊ณ„์‚ฐ์ด ๋Š๋ฆผ. ์ง€์ˆ˜ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ.
    • ๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธํ•  ๋•Œ ReLU๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹ ๊ฒฝ๋ง๋ณด๋‹ค ๋Š๋ฆผ.

SELU

  • 2017๋…„๋„์— ์†Œ๊ฐœ๋จ.
  • ์Šค์ผ€์ผ์ด ์กฐ์ •๋œ ELU ํ™œ์„ฑํ™” ํ•จ์ˆ˜์˜ ๋ณ€์ข…
  • ์•„๋ž˜ ์กฐ๊ฑด ํ•˜์—์„œ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ ๋ฐœํœ˜ํ•จ

    • ์ž…๋ ฅํŠน์„ฑ์ด ํ‘œ์ค€ํ™”(ํ‰๊ท  0, ํ‘œ์ค€ํŽธ์ฐจ 1)๋˜์–ด์•ผ ํ•จ.
    • ๋ชจ๋“  ์€๋‹‰์ธต์—์„œ ๋ฅด์ฟค ์ •๊ทœ๋ถ„ํฌ ์ดˆ๊ธฐํ™” ์‚ฌ์šฉ
    • ์ผ๋ ฌ๋กœ ์Œ“์€ ์ธต๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•จ.
    • ๋ชจ๋“  ์ธต์ด ์™„์ „์—ฐ๊ฒฐ์ธต์ด์–ด์•ผ ํ•จ.
  • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง์—์„œ๋„ ์ข‹์€ ์„ฑ๋Šฅ ๋ฐœํœ˜

심층신경망의 은닉층에 대한 활성화 함수 선택 가이드라인

  • ์ผ๋ฐ˜์  ์šฐ์„ ์ˆœ์œ„: SELU > ELU > LeakyReLU ์™€ ๊ธฐํƒ€ ๋ณ€์ข…๋“ค > ReLU > ๋กœ์ง€์Šคํ‹ฑ
  • ์‹ ๊ฒฝ๋ง์ด ์ž๊ธฐ์ •๊ทœํ™”(self-normlizing)ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ: SELU ๋ณด๋‹ค ELU ์„ ํ˜ธ
  • ์‹œ๊ฐ„๊ณผ ์ปดํ“จํŒ…ํŒŒ์›Œ๊ฐ€ ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ: ๊ต์ฐจ๊ฒ€์ฆ์„ ์ด์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ™œ์„ฑํ™”ํ•จ์ˆ˜ ํ‰๊ฐ€
  • ์‹คํ–‰์†๋„๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ: LeakyReLU
  • ๊ณผ๋Œ€์ ํ•ฉ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ: RReLU
  • ํ›ˆ๋ จ์„ธํŠธ๊ฐ€ ๋งค์šฐ ํฐ ๊ฒฝ์šฐ: PReLU
  • ํ›ˆ๋ จ์†๋„๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ: ReLU
    • ์ด์œ : ๊ธฐ์กด์— ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ€์†๊ธฐ๊ฐ€ ๊ฐœ๋ฐœ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ.

예제

  • LeakyReLU ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์‚ฌ์šฉ
  • LeakyReLU ์ธต์„ ๋งŒ๋“ค๊ณ  ๋ชจ๋ธ์—์„œ ์ ์šฉํ•˜๋ ค๋Š” ์ธต ๋’ค์— ์ถ”๊ฐ€
model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28, 28]),
    keras.layers.Dense(300, kernel_initializer="he_normal"),
    keras.layers.LeakyReLU(),
    keras.layers.Dense(100, kernel_initializer="he_normal"),
    keras.layers.LeakyReLU(),
    keras.layers.Dense(10, activation="softmax")
])

예제

  • PReLU ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์‚ฌ์šฉ
  • PReLU ์ธต์„ ๋งŒ๋“ค๊ณ  ๋ชจ๋ธ์—์„œ ์ ์šฉํ•˜๋ ค๋Š” ์ธต ๋’ค์— ์ถ”๊ฐ€
model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28, 28]),
    keras.layers.Dense(300, kernel_initializer="he_normal"),
    keras.layers.PReLU(),
    keras.layers.Dense(100, kernel_initializer="he_normal"),
    keras.layers.PReLU(),
    keras.layers.Dense(10, activation="softmax")
])

예제

  • RReLU ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์‚ฌ์šฉ
  • ์ผ€๋ผ์Šค์—์„œ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ. (12์žฅ ์—ฐ์Šต๋ฌธ์ œ ์ฐธ์กฐ)

예제

  • SELU ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์‚ฌ์šฉ
  • ์ธต์„ ๋งŒ๋“ค ๋•Œ activation="selu" ์™€ kernel_initializer="lecun_normal" ์ง€์ •.
model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=[28, 28]))
model.add(keras.layers.Dense(300, activation="selu",
                             kernel_initializer="lecun_normal"))
for layer in range(99):
    model.add(keras.layers.Dense(100, activation="selu",
                                 kernel_initializer="lecun_normal"))
model.add(keras.layers.Dense(10, activation="softmax"))

배치정규화

  • (ELU ๋˜๋Š” ๋‹ค๋ฅธ ReLU ๋ณ€์ข…) + (He ์ดˆ๊ธฐํ™”)
    • ํ›ˆ๋ จ ์ดˆ๊ธฐ๋‹จ๊ณ„์˜ ๊ทธ๋ ˆ์ด๋””์–ธํŠธ ์†Œ์‹ค/ํญ์ฃผ ๋ฌธ์ œ ํ•ด๊ฒฐ
    • ํ•˜์ง€๋งŒ ํ›ˆ๋ จ ์ค‘ ๋™์ผ ๋ฌธ์ œ ์žฌ๋ฐœ์ƒ ๋ฐฉ์ง€ ๋ณด์žฅ ๋ชปํ•จ
  • ๋ฐฐ์น˜์ •๊ทœํ™”(batch normalization, BN) ๊ธฐ๋ฒ• ํ™œ์šฉ ๊ฐ€๋Šฅ

배치정규화

  • ๊ฐ ์ธต์˜ ํ™œ์„ฑํ™”ํ•จ์ˆ˜ ํ†ต๊ณผ ์ด์ „/์ดํ›„ ์ •๊ทœํ™” ์—ฐ์‚ฐ ํ•˜๋‚˜ ์ถ”๊ฐ€
  • ์‚ฌ์šฉ๋˜๋Š” ์ •๊ทœํ™” ์—ฐ์‚ฐ
    • ํ‰๊ท : 0์œผ๋กœ ์กฐ์ •
    • ๋ถ„์‚ฐ: ์Šค์ผ€์ผ ์กฐ์ •
  • ๋ชจ๋“  ์‹ฌ์ธต์‹ ๊ฒฝ๋ง์˜ ์„ฑ๋Šฅ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ด
  • ๊ทธ๋ ˆ์ด๋””์–ธํŠธ ์†Œ์‹ค/ํญ์ฃผ ๋ฌธ์ œ๋ฅผ ๊ฐ์†Œ์‹œ์ผœ์„œ ํ•˜์ดํผ๋ณผ๋ฆญ ํƒ„์  ํŠธ ๋˜๋Š” ๋กœ์ง€์Šคํ‹ฑ ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
  • ๊ฐ€์ค‘์น˜ ์ดˆ๊ธฐํ™”์— ๋œ ๋ฏผ๊ฐํ•ด์ง.
  • ๊ทœ์ œ ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋‹ค๋ฅธ ๊ทœ์ œ์˜ ํ•„์š”์„ฑ ์ค„์—ฌ์คŒ.

케라스로 배치정규화 구현

  • ์€๋‹‰์ธต์˜ ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์ด์ „/์ดํ›„์— BatchNormalization ์ธต ์ถ”๊ฐ€
model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28, 28]),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(300, activation="relu"),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(100, activation="relu"),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(10, activation="softmax")
])
  • ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์ด์ „์— ์ •๊ทœํ™” ์ธต ์ถ”๊ฐ€ ๋ฐฉ๋ฒ•
    • ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋ฅผ ์ •๊ทœํ™” ์ธต ๋’ค์— ๋ณ„๋„์˜ ์ธต์œผ๋กœ ์ถ”๊ฐ€ํ•จ
model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28, 28]),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(300, use_bias=False),
    keras.layers.BatchNormalization(),
    keras.layers.Activation("relu"),
    keras.layers.Dense(100, use_bias=False),
    keras.layers.BatchNormalization(),
    keras.layers.Activation("relu"),
    keras.layers.Dense(10, activation="softmax")
])
  • BatchNormalization ํด๋ž˜์Šค์˜ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ
    • ๊ฝค ๋งŽ์€ ์ˆ˜์˜ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ์กด์žฌ
    • ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ๊ฐ’์ด ์ž˜ ์ž‘๋™ํ•จ.
    • momentum, axis ๊ฐ’์— ๋Œ€ํ•ด ์ž˜ ์•Œ์•„๋‘˜ ํ•„์š” ์žˆ์Œ.
  • BatchNormalization ํ™œ์šฉ
    • ๋งค์šฐ ๋„๋ฆฌ ์‚ฌ์šฉ๋จ.
    • ๋ณดํ†ต ๋ชจ๋“  ์ธต ๋’ค์— ๋ฐฐ์น˜์ •๊ทœํ™”๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •
    • ๋”ฐ๋ผ์„œ ์‹ ๊ฒฝ๋งŒ ๊ทธ๋ฆผ์— ์ข…์ข… ์ƒ๋žต๋จ.
  • BatchNormalization๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ตœ์‹  ๊ธฐ๋ฒ•
    • Hongyi Zhang 2019๋…„์— ์ œ์•ˆํ•œ Fixup ๊ฐ€์ค‘์น˜ ์ดˆ๊ธฐํ™” ๊ธฐ๋ฒ•
    • ์ •๊ทœํ™” ์—†์ด 10,000๊ฐœ์˜ ์ธต์„ ๊ฐ€์ง„ ์‹ฌ์ธต์‹ ๊ฒฝ๋ง์œผ๋กœ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ ๋‹ฌ์„ฑ
    • ํ•˜์ง€๋งŒ ์ข€ ๋” ๊ฒ€์ฆ์ด ํ•„์š”ํ•จ.

그레이디언트 클리핑

  • ์—ญ์ „ํŒŒ ๊ณผ์ •์—์„œ ๊ทธ๋ ˆ์ด๋””์–ธํŠธ ๊ฐ’์ด ์ผ์ • ์ž„๊ณ—๊ฐ’์„ ๋„˜์–ด์„ค ๊ฒฝ์šฐ ์ž˜๋ผ๋ƒ„.
  • ์ˆœํ™˜์‹ ๊ฒฝ๋ง์—์„œ ๋ฐฐ์น˜์ •๊ทœํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•จ. (15์žฅ ์ฐธ์กฐ)

케라스의 그레이디언트 클리핑

  • ์˜ตํ‹ฐ๋งˆ์ด์ €๋ฅผ ์ƒ์„ฑํ•  ๋•Œ clipvalue ๋˜๋Š” clipnorm ์ง€์ •
  • clipvalue: ์ง€์ •๋œ ์ž„๊ณ„๊ฐ’์„ ๋ฒ—์–ด๋‚˜๋ฉด ์ž˜๋ผ๋ƒ„.
    • ์˜ˆ์ œ: [0.9, 100] => [0.9, 1.0]
  • ์ฃผ์˜: ๋น„์œจ์ด ๋‹ฌ๋ผ์ง.
optimizer = keras.optimizers.SGD(clipvalue=1.0)
  • clipnorm: ์ง€์ •๋œ ์ž„๊ณ„๊ฐ’ ๋ฒ”์œ„๋‚ด๋กœ ์ „์ฒด ๊ฐ’์„ ์„ ํ˜•์ ์œผ๋กœ ์ถ•์†Œํ•จ
    • ์˜ˆ์ œ: [0.9, 100] => [0.0089964, 0.9999595]
  • ์ฃผ์˜: ๊ทธ๋ ˆ์ด๋””์–ธํŠธ ์†Œ์‹ค ๋ฐœ์ƒ ๊ฐ€๋Šฅ
optimizer = keras.optimizers.SGD(clipnorm=1.0)
  • ๊ฒ€์ฆ์„ธํŠธ์—์„œ ์–ด๋–ค ๋ฐฉ์‹์ด ์ข‹์€์ง€ ํ™•์ธํ•ด์•ผ ํ•จ.
    • ํ…์„œ๋ณด๋“œ ํ™œ์šฉ ๊ฐ€๋Šฅ

전이학습

  • ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ ์‚ฌ์ „ํ›ˆ๋ จ๋œ ๋ชจ๋ธ์˜ ์ผ๋ถ€ ์ธต์„ ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ํ›ˆ๋ จ์†๋„๋ฅผ ํฌ๊ฒŒ ๋†’์ผ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ•„์š”ํ•œ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์˜ ์–‘๋„ ํฌ๊ฒŒ ์ค„์—ฌ์คŒ.

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

예제: 케라스 활용 전이학습

  • ๊ฐ€์ •: model_A ์ฃผ์–ด์ง
    • ์ƒŒ๋“ค๊ณผ ์…”์ธ ๋ฅผ ์ œ์™ธํ•œ 8๊ฐœ์˜ ํด๋ž˜์Šค๋งŒ ๋‹ด๊ฒจ ์žˆ๋Š” ํŒจ์…˜ MNIST ํ™œ์šฉ
    • 90% ์ด์ƒ์˜ ์ •ํ™•๋„ ์„ฑ๋Šฅ์„ ๊ฐ–๋Š” 8๊ฐœ์˜ ํด๋ž˜์Šค ๋ถ„๋ฅ˜ ํ•™์Šต ๋ชจ๋ธ
  • ๋ชฉํ‘œ:์…”์ธ ์™€ ์ƒŒ๋“ค์„ ๋ถ„๋ฅ˜ํ•˜๋Š” ์ด์ง„๋ถ„๋ฅ˜๊ธฐ model_B ํ›ˆ๋ จ
  • ๋ฐฉ๋ฒ•: ์ „์ดํ•™์Šต์„ ์ด์šฉํ•œ model_B_on_A ํ›ˆ๋ จ
model_A = keras.models.load_model("my_model_A.h5")
model_B_on_A = keras.models.Sequential(model_A.layers[:-1])
model_B_on_A.add(keras.layers.Dense(1, activation="sigmoid"))

전이학습 성능?

  • ์œ„ ๊ฒฝ์šฐ๋Š” ๋งค์šฐ ์ข‹์Œ. ์—ฌ๋Ÿฌ ์‹คํ—˜์„ ๊ฑฐ์ณ ์ฐพ์€ ์ข‹์€ ๊ฒฐ๊ณผ์— ๋ถˆ๊ณผํ•จ.
    • ๋”ฐ๋ผ์„œ ์‚ฌ๋žŒ๋“ค์˜ ์ฃผ์žฅ์„ ๊ทธ๋Œ€๋กœ ๋ฏฟ์ง€ ๋ง์•„์•ผ ํ•จ.
  • ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ญ์ƒ ๊ทธ๋ ‡์ง€๋Š” ์•Š์Œ.
  • ์–•์€ ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ์—์„œ๋Š” ์ „์ดํ•™์Šต ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์Œ.
  • ์ „์ดํ•™์Šต์€ ์‹ฌ์ธตํ•ฉ์„ฑ์‹ ๊ฒฝ๋ง ์ฒ˜๋Ÿผ ํ•˜์œ„์ธต์—์„œ ์กฐ๊ธˆ ๋” ์ผ๋ฐ˜์ ์ธ ํŠน์„ฑ์„ ๊ฐ์ง€ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋Š” ์‹ ๊ฒฝ๋ง์—์„œ ์ž˜ ์ž‘๋™ํ•จ.

비지도 사전훈련

  • ๋ ˆ์ด๋ธ”๋œ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์„ ๊ฒฝ์šฐ ํ™œ์šฉ
  • ๋ ˆ์ด๋ธ” ์—†๋Š” ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์˜คํ† ์ธ์ฝ”๋” ๋˜๋Š” GAN ๋“ฑ์„ ์ด์šฉํ•ด ๋น„์ง€๋„ ํ•™์Šต์„ ํ†ตํ•ด ๋ ˆ์ด๋ธ” ์ง€์ • ํ›„์— ํ•˜์œ„์ธต ์žฌ์‚ฌ์šฉ (17์žฅ ์ฐธ์กฐ)
  • ํ•˜์œ„์ธต ์œ„์— ์ž‘์—…์— ๋งž๋Š” ์ถœ๋ ฅ์ธต ์ถ”๊ฐ€ ํ›„ ์ง€๋„ํ•™์Šต ์‹คํ–‰

보조작업 사전훈련 활용

  • ๋ ˆ์ด๋ธ”๋œ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์„ ๊ฒฝ์šฐ ํ™œ์šฉ

예제: 얼굴인식 시스템 개발

  • ๊ฐœ์ธ๋ณ„ ์ด๋ฏธ์ง€๊ฐ€ ๋งŽ์ง€ ์•Š์„ ๊ฒฝ์šฐ
  • ์ธํ„ฐ๋„ท์—์„œ ๋ฌด์ž‘์œ„๋กœ ๋งŽ์€ ์ธ๋ฌผ ์ด๋ฏธ์ง€ ์ˆ˜์ง‘
  • ๋‘ ๊ฐœ์˜ ๋‹ค๋ฅธ ์ด๋ฏธ์ง€๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ์‹ ๊ฒฝ๋ง ํ›ˆ๋ จ
  • ์ดํ›„ ํ•™์Šต๋œ ๋ชจ๋ธ์˜ ํ•˜์œ„์ธต์„ ์žฌ์‚ฌ์šฉ
  • ์ ์€ ์–‘์˜ ๋ ˆ์ด๋ธ”๋œ ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ์–ผ๊ตด์ธ์‹ ๋ถ„๋ฅ˜๊ธฐ ํ•™์Šต ๊ฐ€๋Šฅ

고속 옵티마이저

  • ์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ณธ ํ›ˆ๋ จ์†๋„ ํ–ฅ์ƒ ๊ธฐ๋ฒ•
    • ์ข‹์€ ์ดˆ๊ธฐํ™” ์ „๋žต ์‚ฌ์šฉ
    • ์ข‹์€ ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ์‚ฌ์šฉ
    • ๋ฐฐ์น˜์ •๊ทœํ™” ์‚ฌ์šฉ
    • ์‚ฌ์ „ํ›ˆ๋ จ๋œ ์‹ฌ์ธต๋ง ์ผ๋ถ€ ์‚ฌ์šฉ
  • ๋ชจ๋ธ ์ปดํŒŒ์ผ ๊ณผ์ •์— ํ•„์š”ํ•œ ๊ณ ์† ์˜ตํ‹ฐ๋งˆ์ด์ € ์„ ํƒ ๊ธฐ๋ฒ•
    • ๋ชจ๋ฉ˜ํ…€ ์ตœ์ ํ™”
    • Nesterov ๊ฐ€์† ๊ฒฝ์‚ฌ(NAG)
    • AdaGrad
    • RMSProp
    • Adam ์ตœ์ ํ™”
    • Adamax ์ตœ์ ํ™”
    • Nadam ์ตœ์ ํ™”

모멘텀 최적화

  • 1964๋…„ ์†Œ๊ฐœ๋จ
  • ๊ฐ€์ค‘์น˜ ์กฐ์ • ๊ณผ์ •์„ ์ถ”์ ํ•˜๋ฉด์„œ ๋ณ€ํ™” ๊ฐ€์†๋„ ์กฐ์ ˆ
  • ์ผ๋ฐ˜ ๊ฒฝ์‚ฌํ•˜๊ฐ•๋ฒ•๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์ „์—ญ ์ตœ์†Œ์ ์— ๋„๋‹ฌ
  • ์•„๋ž˜์™€ ๊ฐ™์ด ์ง€์ •ํ•˜๋ฉด 10๋ฐฐ ์ •๋„ ๋น ๋ฅด๊ฒŒ ํ•™์Šต์ด ์ง„ํ–‰๋จ.
optimizer = keras.optimizers.SGD(lr=0.001, momentum=0.9)

Nesterov 가속 경사(NAG)

  • 1983๋…„์— ์†Œ๊ฐœ๋จ
  • ๋ชจ๋ฉ˜ํ…€ ๊ฐ€์†ํ™” ๊ธฐ๋ฒ• ์ˆ˜์ •

  • ๊ธฐ๋ณธ ๋ชจ๋ฉ˜ํ…€ ์ตœ์ ํ™”๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ํ›ˆ๋ จ ์†๋„ ๋น ๋ฆ„
optimizer = keras.optimizers.SGD(lr=0.001, momentum=0.9, nesterov=True)

AdaGrad

  • 2011๋…„์— ์†Œ๊ฐœ๋จ
  • ์ „์—ญ ์ตœ์ ์  ๋ฐฉํ–ฅ์œผ๋กœ ๋” ๊ณง์žฅ ๊ฐ€๋„๋ก ๋„์™€์คŒ.

  • 2์ฐจ๋ฐฉ์ •์‹ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž˜ ์ž‘๋™ํ•จ
  • ์‹ ๊ฒฝ๋ง ํ›ˆ๋ จํ•  ๋•Œ ๋„ˆ๋ฌด ์ผ์ฐ ๋จผ์ถ”๋Š” ๊ฒฝํ–ฅ ์žˆ์Œ. ๋”ฐ๋ผ์„œ ์‹ฌ์ธต์‹ ๊ฒฝ๋ง์—๋Š” ๋ถ€์ ํ•ฉํ•จ.
optimizer = keras.optimizers.Adagrad(lr=0.001)

RMSProp

  • 2012๋…„์— ์†Œ๊ฐœ๋จ
  • AdaGrad์˜ ์ด๋ฅธ ์ข…๋ฃŒ ๋ฌธ์ œ์  ํ•ด๊ฒฐํ•œ ๊ธฐ๋ฒ•
optimizer = keras.optimizers.RMSprop(lr=0.001, rho=0.9)

Adam 최적화

  • 2014๋…„์— ์†Œ๊ฐœ๋จ
  • ๋ชจ๋ฉ˜ํ…€ ์ตœ์ ํ™”์™€ RMSProp์˜ ์•„์ด๋””์–ด ํ™œ์šฉ
optimizer = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999)

AdaMax 최적화

  • 2016(?)๋…„์— ์†Œ๊ฐœ๋จ
  • Adam ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ์„ 
  • ํ•˜์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ Adam ์„ฑ๋Šฅ์ด ๋” ์ข‹์Œ.
optimizer = keras.optimizers.Adamax(lr=0.001, beta_1=0.9, beta_2=0.999)

Nadam 최적화

  • 2016๋…„์— ์†Œ๊ฐœ๋จ
  • Adam + Nesterov
  • ์ผ๋ฐ˜์ ์œผ๋กœ Adam ๋ณด๋‹ค ์„ฑ๋Šฅ ์ข‹์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ RMSProp์ด ๋” ์ข‹๊ธฐ๋„ ํ•จ.
optimizer = keras.optimizers.Adamax(lr=0.001, beta_1=0.9, beta_2=0.999)

옵티마이저 정리

  • ์„ ํƒํ•œ ์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ์„ฑ๋Šฅ์ด ๋งŒ์กฑ์Šค๋Ÿฝ์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ Nesterov ๊ฐ€์† ๊ฒฝ์‚ฌ ์‚ฌ์šฉ ์ถ”์ฒœ
  • ์ƒˆ๋กœ์šด ๊ธฐ๋ฒ• ํ™œ์šฉ์— ๊ด€์‹ฌ ๊ฐ€์งˆ ๊ฒƒ.
ํด๋ž˜์Šค ์ˆ˜๋ ด ์†๋„ ์ˆ˜๋ ด ํ’ˆ์งˆ
SGD * ***
SGD(momentum=...) ** ***
SGD(momentum=..., nesterov=...) ** ***
Adagrad *** * (๋„ˆ๋ฌด ์ผ์ฐ ๋ฉˆ์ถค)
RMSProp *** ** ๋˜๋Š” ***
Adam *** ** ๋˜๋Š” ***
Nadam *** ** ๋˜๋Š” ***
AdaMax *** ** ๋˜๋Š” ***

부록: 희소 모델 훈련 최적화 알고리즘

  • ์•„์ฃผ ๋น ๋ฅด๊ฒŒ ์‹คํ–‰ํ•  ๋ชจ๋ธ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒŒ ์š”๊ตฌํ•˜๋Š” ๋ชจ๋ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํฌ์†Œ(sparse) ๋ชจ๋ธ ํ›ˆ๋ จ ๊ฐ€๋Šฅ

해법 1

  • ์˜ตํ‹ฐ๋งˆ์ด์ €์— $\ell_1$ ๊ทœ์  ์ ์šฉ
    • (4์žฅ) ๋ผ์˜ ํšŒ๊ท€์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ๊ฐ€์ค‘์น˜๋ฅผ 0์œผ๋กœ ๋งŒ๋“ฆ.

해법 2

  • ํ…์„œํ”Œ๋กœ์šฐ์˜ ๋ชจ๋ธ์ตœ์ ํ™” ํˆดํ‚ท(TF-MOT) ์‚ฌ์šฉ ๊ฐ€๋Šฅ.
    • ํ›ˆ๋ จ๊ณผ์ • ๋™์•ˆ ๋ฐ˜๋ณต์ ์œผ๋กœ ์—ฐ๊ฒฐ๊ฐ€์ค‘์น˜๋ฅผ ํฌ๊ธฐ์— ๋งž์ถฐ ์ œ๊ฑฐํ•˜๋Š” ๊ฐ€์ง€์น˜๊ธฐ API ์ œ๊ณต.

학습률 스케줄링

  • ํ•™์Šต๋ฅ  ์„ ํƒ์ด ํ›ˆ๋ จ์˜ ์„ฑํŒจ๋ฅผ ๊ฐ€๋ฆ„.

정의

  • ๋ชจ๋ธ ํ›ˆ๋ จ๊ณผ์ •๋™์•ˆ ํ•™์Šต๋ฅ ์„ ์กฐ์ •ํ•˜๋Š” ๊ธฐ๋ฒ•
  • ๋ณดํ†ต ๋†’์€ ํ•™์Šต๋ฅ ๋กœ ์‹œ์ž‘ํ•ด์„œ ํ•™์Šต์†๋„๊ฐ€ ๋Š๋ ค์งˆ ๊ฒฝ์šฐ ํ•™์Šต๋ฅ  ์ž‘๊ฒŒ ์กฐ์ •
  • ๋‹ค์–‘ํ•œ ๊ธฐ๋ฒ• ์†Œ๊ฐœ๋จ.

알려진 주요 기법

  • ๊ฑฐ๋“ญ์ œ๊ณฑ ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง(power scheduling)
  • ์ง€์ˆ˜ ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง(exponential scheduling)
  • ๊ตฌ๊ฐ„๋ณ„ ๊ณ ์ • ์Šค์ผ€์ค„๋ง(piecewise constant scheduling)
  • ์„ฑ๋Šฅ ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง(performance scheduling)
  • 1์‚ฌ์ดํด ์Šค์ผ€์ค„๋ง(1cycle scheduling)
    • 2018๋…„ ์†Œ๊ฐœ๋จ

성능 비교

  • 2013๋…„ ๋ฐœํ‘œ๋œ ๋…ผ๋ฌธ์—์„œ ์†Œ๊ฐœ
  • ๋ชจ๋ฉ˜ํ…€ ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•œ ์Œ์„ฑ ์ธ์‹์šฉ ์‹ฌ์ธต์‹ ๊ฒฝ๋ง ํ›ˆ๋ จ์— ๋‹ค์–‘ํ•œ ํ•™์Šต๋ฅ  ์Šค์ผ€์ค„๋ง ๊ธฐ๋ฒ• ๋น„๊ต
  • ์„ฑ๋Šฅ ๊ธฐ๋ฐ˜๊ณผ ์ง€์ˆ˜ ๊ธฐ๋ฐ˜ ๋ชจ๋‘ ์ข‹์ง€๋งŒ ์ง€์ˆ˜ ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง ์„ ํ˜ธ
  • ํŠœ๋‹ ์‰ฝ๊ณ , ์„ฑ๋Šฅ ์ข€ ๋” ์ข‹๊ณ , ๊ตฌํ˜„ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ.
  • (์˜ค๋ ๋ฆฌ์•„ ์ œ๋กฑ์— ๋”ฐ๋ฅด๋ฉด) ํ•˜์ง€๋งŒ 1์‚ฌ์ดํด ๋ฐฉ์‹์ด ์ข€ ๋” ์„ฑ๋Šฅ ์ข‹์Œ.

거듭제곱 기반 스케줄링(power scheduling)

  • ํ•™์Šต๋ฅ ์„ ์Šคํ…์˜ ๋ฐ˜๋ณตํšŸ์ˆ˜ $t$์— ๋Œ€ํ•œ ์•„๋ž˜ ํ•จ์ˆ˜๋กœ ์„ ์–ธ
$$ \eta(t) = \frac{\eta_0}{(1 + \frac{t}{s})^c} $$
  • $t = k\cdot s$ ๋กœ ์ปค์ง€๋ฉด ํ•™์Šต๋ฅ ์ด $\frac{\eta_0}{k+1}$ ๋กœ ์ค„์–ด๋“ฆ.
  • ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ
    • $\eta_0$: ์ดˆ๊ธฐ ํ•™์Šต๋ฅ 
    • $c$: ๊ฑฐ๋“ญ์ œ๊ณฑ์ˆ˜, ์ผ๋ฐ˜์ ์œผ๋กœ 1๋กœ ์ง€์ •
    • $s$: ์Šคํ… ํšŸ์ˆ˜
  • ์˜ตํ‹ฐ๋งˆ์ด์ € ์„ ์–ธํ•  ๋•Œ decay ์˜ต์…˜์œผ๋กœ ์ง€์ •
optimizer = keras.optimizers.SGD(lr=0.01, decay=1e-4)
  • lr: ์ดˆ๊ธฐ ํ•™์Šต๋ฅ 
  • decay: ์Šคํ…์ˆ˜($s$)์˜ ์—ญ์ˆ˜
  • ์ผ€๋ผ์Šค๋Š” $c=1$์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ.

지수 기반 스케줄링(exponential scheduling)

  • ํ•™์Šต๋ฅ ์„ ์Šคํ…์˜ ๋ฐ˜๋ณตํšŸ์ˆ˜ $t$์— ๋Œ€ํ•œ ์•„๋ž˜ ํ•จ์ˆ˜๋กœ ์„ ์–ธ
$$ \eta(t) = \eta_0\, (0.1)^{t/s} $$
  • ํ•™์Šต๋ฅ ์ด $s$ ์Šคํ…๋งˆ๋‹ค 10๋ฐฐ์”ฉ ์ค„์–ด๋“ฆ.
  • ํ˜„์žฌ ์—ํฌํฌ์˜ ํ•™์Šต๋ฅ ์„ ๋ฐ›์•„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ํ•„์š”
def exponential_decay_fn(epoch):
    return 0.01 * 0.1**(epoch / 20)
  • ์•„๋ž˜ ๋ฐฉ์‹์ฒ˜๋Ÿผ $\eta_0$์™€ $s$๋ฅผ ์„ค์ •ํ•œ ํด๋กœ์ €(closure)๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋„ ํ™œ์šฉ ๊ฐ€๋Šฅ.
def exponential_decay(lr0, s):
    def exponential_decay_fn(epoch):
        return lr0 * 0.1**(epoch / s)
    return exponential_decay_fn

exponential_decay_fn = exponential_decay(lr0=0.01, s=20)
  • ์ด์ œ ์Šค์ผ€์ค„๋ง ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ LearningRateScheduler ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ ํ›„ fit() ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ.
    • ์—ํฌํฌ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค ์˜ตํ‹ฐ๋งˆ์ด์ €์˜ ํ•™์Šต๋ฅ  ์—…๋ฐ์ดํŠธ.
lr_scheduler = keras.callbacks.LearningRateScheduler(exponential_decay_fn)

history = model.fit(X_train_scaled, y_train, epochs=n_epochs,
                    validation_data=(X_valid_scaled, y_valid),
                    callbacks=[lr_scheduler])
  • ์—ํฌํฌ๋ฅผ ์Šคํ…๋งˆ๋‹ค ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ •์˜ ์ฝœ๋ฐฑ์„ ์ •์˜ํ•ด์•ผ ํ•จ.
  • ์˜ˆ์ œ: on_batch_begin()๊ณผ on_epoch_end() ๋ฉ”์„œ๋“œ ์žฌ์ •์˜
  • ์ฃผ์˜: keras.backend ๋ชจ๋“ˆ ํ™œ์šฉ.
    • batch ๋‹จ์œ„๋กœ ํ›ˆ๋ จ์ค‘์ธ ๋ชจ๋ธ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธ/๋ณ€๊ฒฝํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ ์ง€์›.
K = keras.backend
class ExponentialDecay(keras.callbacks.Callback):
    def __init__(self, s=40000):
        super().__init__()
        self.s = s

    def on_batch_begin(self, batch, logs=None):
        # Note: the `batch` argument is reset at each epoch
        lr = K.get_value(self.model.optimizer.lr)
        K.set_value(self.model.optimizer.lr, lr * 0.1**(1 / s))

    def on_epoch_end(self, epoch, logs=None):
        logs = logs or {}
        logs['lr'] = K.get_value(self.model.optimizer.lr)
  • ์ดํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด fit() ๋ฉ”์„œ๋“œ์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์ „๋‹ฌ
s = 20 * len(X_train) // 32        # 20 ์—ํฌํฌ ๋™์•ˆ์˜ ์Šคํ… ์ˆ˜, ๋ฐฐ์น˜ํฌ๊ธฐ๋Š” 32
exp_decay = ExponentialDecay(s)

history = model.fit(X_train_scaled, y_train, epochs=n_epochs,
                    validation_data=(X_valid_scaled, y_valid),
                    callbacks=[exp_decay])
  • ์—ํฌํฌ ๋‹น ์Šคํ… ์ˆ˜๊ฐ€ ๋งŽ์œผ๋ฉด ์Šคํ…๋งˆ๋‹ค ํ•™์Šต๋ฅ ์„ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ.
  • keras.optimizers.schedules ๋ชจ๋“ˆ ํ™œ์šฉ ๊ฐ€๋Šฅ. (์ž ์‹œ ๋’ค์— ์„ค๋ช…๋จ)

구간별 고정 스케줄링(piecewise constant scheduling)

  • ์ง€์ •๋œ ์—ํฌํฌ ํšŸ์ˆ˜๊ฐ€ ์ง€๋‚  ๋•Œ๋งˆ๋‹ค ํ•™์Šต๋ฅ  ์กฐ์ •.
  • ์ ์ ˆํ•œ ํ•™์Šต๋ฅ ๊ณผ ์—ํฌํฌ ํšŸ์ˆ˜๋ฅผ ์ž˜ ์ฐพ์•„์•ผ ํ•จ.
  • ์ง€์ˆ˜ ๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง ๋ฐฉ์‹๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๊ตฌํ˜„
def piecewise_constant_fn(epoch):
    if epoch < 5:
        return 0.01
    elif epoch < 15:
        return 0.005
    else:
        return 0.001
  • ๋˜๋Š”
def piecewise_constant(boundaries, values):
    boundaries = np.array([0] + boundaries)
    values = np.array(values)
    def piecewise_constant_fn(epoch):
        return values[np.argmax(boundaries > epoch) - 1]
    return piecewise_constant_fn

piecewise_constant_fn = piecewise_constant([5, 15], [0.01, 0.005, 0.001])
  • ์ฝœ๋ฐฑํ•จ์ˆ˜ ์ง€์ •
lr_scheduler = keras.callbacks.LearningRateScheduler(piecewise_constant_fn)

history = model.fit(X_train_scaled, y_train, epochs=n_epochs,
                    validation_data=(X_valid_scaled, y_valid),
                    callbacks=[lr_scheduler])

성능 기반 스케줄링(performance scheduling)

  • ์ง€์ •๋œ ์Šคํ… ์ˆ˜๋งˆ๋‹ค ๊ฒ€์ฆ์˜ค์ฐจ ํ™•์ธ ํ›„ ์˜ค์ฐจ๊ฐ€ ์ค„์–ด๋“ค์ง€ ์•Š์œผ๋ฉด ์ง€์ •๋œ factor ๋ฐฐ ๋งŒํผ ํ•™์Šต๋ฅ  ๊ฐ์†Œ์‹œํ‚ด.
  • ReduceLROnPlateau ์ฝœ๋ฐฑ ํด๋ž˜์Šค ํ™œ์šฉ
lr_scheduler = keras.callbacks.ReduceLROnPlateau(factor=0.5, patience=5)

tf.keras schedulers 모듈의 스케줄 클래스 활용

  • ์ฃผ์˜: ํ‘œ์ค€ Keras API ์•„๋‹ˆ๋ฉฐ, tf.keras์—์„œ๋งŒ ์ง€์›๋จ.
  • keras.optimizers.schedules ๋ชจ๋“ˆ์˜ ์Šค์ผ€์ค„ ํด๋ž˜์Šค์— ํ•™์Šต๋ฅ  ์ง€์ • ํ›„ ์˜ตํ‹ฐ๋งˆ์ด์ €์— ์ „๋‹ฌ
  • ์—ํฌํฌ๊ฐ€ ์•„๋‹ˆ๋ผ ์Šคํ…๋งˆ๋‹ค ํ•™์Šต๋ฅ  ์—…๋ฐ์ดํŠธ

예제

  • ์•„๋ž˜ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ์•ž์„œ ์ •์˜ํ•œ exponential_decay_fun() ํ•จ์ˆ˜์™€ ๋™์ผํ•œ ์ง€์ˆ˜๊ธฐ๋ฐ˜ ์Šค์ผ€์ค„๋ง ๊ธฐ๋Šฅ ์ œ๊ณต
s = 20 * len(X_train) // 32 # ์ „์ฒด ์Šคํ… ์ˆ˜ ๊ณ„์‚ฐ(์—ํฌํฌ 20, ๋ฐฐ์น˜ํฌ๊ธฐ 32)
learning_rate = keras.optimizers.schedules.ExponentialDecay(0.01, s, 0.1)
optimizer = keras.optimizers.SGD(learning_rate)

예제

  • ์•„๋ž˜ ์˜ตํ‹ฐ๋งˆ์ด์ €๋Š” ๊ตฌ๊ฐ„๋ณ„ ๊ณ ์ • ์Šค์ผ€์ค„๋ง ๊ธฐ๋Šฅ ์ œ๊ณต
learning_rate = keras.optimizers.schedules.PiecewiseConstantDecay(
                    boundaries=[5. * n_steps_per_epoch, 15. * n_steps_per_epoch],
                    values=[0.01, 0.005, 0.001])
optimizer = keras.optimizers.SGD(learning_rate)

1사이클 스케줄링(1cycle scheduling)

  • 2018๋…„์— ์†Œ๊ฐœ๋จ.
  • ํ•™์Šต๋ฅ ์„ ํ›ˆ๋ จ ๊ณผ์ • ์ค‘์— ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ๋‚ด๋ฆฌ๋„๋ก ์กฐ์ •
  • ํ›ˆ๋ จ ์ „๋ฐ˜๋ถ€: ๋‚ฎ์€ ํ•™์Šต๋ฅ  $\eta_0$์—์„œ ๋†’์€ ํ•™์Šต๋ฅ  $\eta_1$๊นŒ์ง€ ์„ ํ˜•์ ์œผ๋กœ ๋†’ํž˜.
  • ํ›ˆ๋ จ ํ›„๋ฐ˜๋ถ€: ๋‹ค์‹œ ์„ ํ˜•์ ์œผ๋กœ $\eta_0$๊นŒ์ง€ ๋‚ฎ์ถค.
  • ํ›ˆ๋ จ ๋งˆ์ง€๋ง‰ ๋ช‡ ๋ฒˆ์˜ ์—ํฌํฌ: ํ•™์Šต๋ฅ ์„ ์†Œ์ˆ˜์  ๋ช‡ ์งธ ์งœ๋ฆฌ๊นŒ์ง€ ์„ ํ˜•์ ์œผ๋กœ ๋‚ฎ์ถค.

모멘텀 사용하는 경우

  • ํ›ˆ๋ จ ์ „๋ฐ˜๋ถ€: 0.95์™€ ๊ฐ™์€ ๋†’์€ ๋ชจ๋ฉ˜ํ…€์œผ๋กœ ์‹œ์ž‘ํ•ด์„œ 0.85์™€ ๊ฐ™์€ ๋‚ฎ์€ ๋ชจ๋ฉ˜ํ…€์œผ๋กœ ์„ ํ˜•์ ์œผ๋กœ ๋‚ฎ์ถค.
  • ํ›ˆ๋ จ ํ›„๋ฐ˜๋ถ€: ๋‹ค์‹œ ์„ ํ˜•์ ์œผ๋กœ ์ตœ๋Œ€ ๋ชจ๋ฉ˜ํ…€์œผ๋กœ ๋†’ํž˜.
  • ํ›ˆ๋ จ ๋งˆ์ง€๋ง‰ ๋ช‡ ๋ฒˆ์˜ ์—ํฌํฌ: ์ตœ๋Œ€ ๋ชจ๋ฉ˜ํ…€ ์‚ฌ์šฉ.

장점

  • ํ›ˆ๋ จ์†๋„๋ฅผ ํฌ๊ฒŒ ๋†’์ด๊ณ  ์„ฑ๋Šฅ๋„ ์ข‹์•„์ง.

구현

  • ๋จผ์ € ์ตœ๋Œ€ํ•™์Šต๋ฅ  $\eta_1$์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ•™์Šต๋ฅ ๊ณผ ์†์‹คํ•จ์ˆ˜ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์•Œ์•„๋‚ด์•ผ ํ•จ.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์šฐ $\eta_1 = 0.05$๊ฐ€ ๊ฐ€์žฅ ์ ์ ˆํ•ด ๋ณด์ž„.

  • ์ด์ œ ์ ์ ˆํ•œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์‹คํ–‰ํ•˜๋ฉด ๋จ.
    • ์ฃผํ”ผํ„ฐ ๋…ธํŠธ๋ถ ์ฐธ์กฐ.

규제 사용과 과대적합 피하기

  • ์‹ฌ์ธต์‹ ๊ฒฝ๋ง์— ์‚ฌ์š”๋˜๋Š” ์ˆ˜์ฒœ, ์ˆ˜๋งŒ, ์ˆ˜๋ฐฑ๋งŒ ๊ฐœ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์˜ํ•ด ๊ณผ๋Œ€์ ํ•ฉ ๋ฐœ์ƒ ์‰ฌ์›€.
  • ๊ณผ๋Œ€์ ํ•ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ๊ทœ์ œ ์š”๊ตฌ๋จ.

심층신경망 관련 지금까지 살펴본 규제기법

  • ์กฐ๊ธฐ์ข…๋ฃŒ ๊ธฐ๋ฒ• (10์žฅ)
    • EarlyStopping ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์ • ์—ํฌํฌ ๋™์•ˆ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์ž๋™ ์ข…๋ฃŒ์‹œํ‚ค๊ธฐ
  • ๋ฐฐ์น˜์ •๊ทœํ™”
    • ๋ถˆ์•ˆ์ •ํ•œ ๊ทธ๋ ˆ์ด๋””์–ธํŠธ ๋ฌธ์ œํ•ด๊ฒฐ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ทœ์ œ์šฉ์œผ๋กœ๋„ ํ™œ์šฉ ๊ฐ€๋Šฅ.
    • ๊ฐ€์ค‘์น˜์˜ ๋ณ€ํ™”๋ฅผ ์กฐ์ ˆํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ.
  • ์ƒˆ๋กœ ์‚ดํŽด๋ณผ ๊ทœ์ œ๊ธฐ๋ฒ•
    • $\ell_1$๊ณผ $\ell_2$ ๊ทœ์ œ
    • ๋“œ๋กญ์•„์›ƒ(dropout)
    • ๋งฅ์Šค-๋…ธ๋ฆ„(max-norm) ๊ทœ์ œ

$\ell_1$과 $\ell_2$ 규제

  • ์ธต์„ ์„ ์–ธํ•  ๋•Œ ๊ทœ์ œ ๋ฐฉ์‹๊ณผ ๊ทœ์ œ๊ฐ•๋„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ.
    • kernel_regularizer ์˜ต์…˜ ์‚ฌ์šฉ.
  • ์˜ˆ์ œ: $\ell_2$ ๊ทœ์ œ, ๊ทœ์ œ๊ฐ•๋„๋Š” 0.01.
layer = keras.layers.Dense(100, activation="elu",
                           kernel_initializer="he_normal",
                           kernel_regularizer=keras.regularizers.l2(0.01))

functools.partial() 함수 활용

  • ์ผ๋ถ€ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ํ˜ธ์ถœ์„ ๊ฐ์‹ธ๋Š” ๋ฐฉ์‹ ์ง€์›
  • ๋ชจ๋“  ์ธต์— ๋™์ผํ•œ ํ™œ์„ฑํ™” ํ•จ์ˆ˜, ๋™์ผํ•œ ์ดˆ๊ธฐํ™” ์ „๋žต, ๋™์ผํ•œ ๊ทœ์ œ ๋“ฑ์„ ๋ฐ˜๋ณตํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•จ.
from functools import partial

RegularizedDense = partial(keras.layers.Dense,
                           activation="elu",
                           kernel_initializer="he_normal",
                           kernel_regularizer=keras.regularizers.l2(0.01))

model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28, 28]),
    RegularizedDense(300),
    RegularizedDense(100),
    RegularizedDense(10, activation="softmax")

드롭아웃(dropout)

  • ์‹ ๊ฒฝ๋ง์—์„œ ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” ๊ทœ์ œ๊ธฐ๋ฒ•
  • 2012๋…„์— ์†Œ๊ฐœ๋จ.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ์ž˜ ์ž‘๋™ํ•จ.

기본 아이디어

  • ๋งค ํ›ˆ๋ จ ์Šคํ…์—์„œ ์ถœ๋ ฅ ๋‰ด๋Ÿฐ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋‰ด๋Ÿฐ์ด $p$์˜ ํ™•๋ฅ ๋กœ ํ›ˆ๋ จ์—์„œ ์ œ์™ธ๋  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ฆ.
    • ์ œ์™ธ๋˜๋Š” ๋‰ด๋Ÿฐ์˜ ์ถœ๋ ฅ๊ฐ’์€ 0.

  • ์—ํฌํฌ ๋˜๋Š” ์Šคํ…๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ ๊ณ ์œ ํ•œ ๋ชจ๋ธ์ด ํ›ˆ๋ จ๋˜๋Š” ํšจ๊ณผ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด.
  • ํ›ˆ๋ จ์ด ๋๋‚˜๋ฉด ๋“œ๋กญ์•„์›ƒ ์ ์šฉํ•˜์ง€ ์•Š์Œ.

드롭아웃 비율($p$)

  • ์ˆœํ™˜ ์‹ ๊ฒฝ๋ง(15์žฅ): 20% - 30%
  • ํ•ฉ์„ฑ๊ณฑ ์‹ ๊ฒฝ๋ง(14์žฅ): 40% - 50%
  • ์ˆœํ™˜์‹ ๊ฒฝ๋ง(15์žฅ): 20%-30%
  • ๋“œ๋กญ์•„์›ƒ ๋น„์œจ์„ ์˜ฌ๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
    • ๊ณผ๋Œ€์ ํ•ฉ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ
    • ์ธต์— ๋งŽ์€ ๋‰ด๋Ÿฐ์ด ํฌํ•จ๋  ๋•Œ
  • ๋“œ๋กญ์•„์›ƒ ๋น„์œจ์„ ์˜ฌ๋ ค์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
    • ๊ณผ์†Œ์ ํ•ฉ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ
    • ์ธต์— ์ ์€ ๋‰ด๋Ÿฐ์ด ํฌํ•จ๋  ๋•Œ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ถœ๋ ฅ์ธต์„ ์ œ์™ธํ•œ ์ตœ์ƒ์œ„ 3๊ฐœ ์ธต์— ๋Œ€ํ•ด ๋“œ๋กญ์•„์›ƒ ์ ์šฉ.
    • ์ตœ์‹  ์‹ ๊ฒฝ๋ง ๋ชจ๋ธ: ๋งˆ์ง€๋ง‰ ์€๋‹‰์ธต์—๋งŒ ์ ์šฉํ•˜๊ธฐ๋„ ํ•จ.

보존확률(keep probability)

  • ํ›ˆ๋ จ ์™„๋ฃŒ ํ›„ ๋ชจ๋“  ๊ฐ€์ค‘์น˜์— ๋ณด์กดํ™•๋ฅ (keep probability) $(1-p)$๋ฅผ ๊ณฑํ•ด์ฃผ๋Š” ๊ฒŒ ์ข‹์Œ.
    • ์ด์œ : ํ›ˆ๋ จ๊ณผ์ •์ค‘์— ์ „์ฒด ๋‰ด๋Ÿฐ์˜ ($p$ ๋น„์œจ์— ํ•ด๋‹นํ•˜๋Š”) ์ผ๋ถ€๋งŒ ์ถœ๋ ฅ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์— ๋ชจ๋ธ์ด ์ต์ˆ™ํ•ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ.
  • ๋˜๋Š” ํ›ˆ๋ จ๊ณผ์ • ์ค‘์— ๊ฐ ๋‰ด๋Ÿฐ์˜ ์ถœ๋ ฅ์„ ๋ณด์กดํ™•๋ฅ ๋กœ ๋‚˜๋ˆŒ ์ˆ˜๋„ ์žˆ์Œ.
    • ์ผ€๋ผ์Šค ๋ชจ๋ธ์€ ์ด ๋ฐฉ์‹์„ ๊ธฐ๋ณธ์œผ๋กœ ์ง€์›ํ•จ.

예제

  • ๋ชจ๋“  Dense ์ธต ์ด์ „์— ๋“œ๋กญ์•„์›ƒ ๋น„์œจ 0.2 ์ง€์›ํ•˜๊ธฐ
model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28, 28]),
    keras.layers.Dropout(rate=0.2),
    keras.layers.Dense(300, activation="elu", kernel_initializer="he_normal"),
    keras.layers.Dropout(rate=0.2),
    keras.layers.Dense(100, activation="elu", kernel_initializer="he_normal"),
    keras.layers.Dropout(rate=0.2),
    keras.layers.Dense(10, activation="softmax")
    ])

드롭아웃과 과대적합

  • ํ›ˆ๋ จ์†์‹ค๊ณผ ๊ฒ€์ฆ์†์‹ค์„ ๊ทธ๋Œ€๋กœ ๋น„๊ตํ•˜๋ฉด ์•ˆ๋จ.
    • ์ด์œ : ํ›ˆ๋ จ์‹œ์—๋งŒ ๋“œ๋กญ์•„์›ƒ์„ ์ ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ.
  • ํ›ˆ๋ จ ํ›„ ๋“œ๋กญ์•„์›ƒ์„ ๋„๊ณ  ํ›ˆ๋ จ์†์‹ค์„ ์žฌํ‰๊ฐ€ํ•ด์•ผ ํ•จ.

알파 드롭아웃

  • SELU ํ™œ์„ฑํ™”ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์•ŒํŒŒ(alpha) ๋“œ๋กญ์•„์›ƒ ์‚ฌ์šฉ ์ถ”์ฒœ

  • ์ž…๋ ฅ๊ณผ ํ‰๊ท ์˜ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ์œ ์ง€์‹œ์ผœ์คŒ.

  • ์ผ๋ฐ˜ ๋“œ๋กญ์•„์›ƒ์€ ์ž๊ธฐ ์ •๊ทœํ™” ๊ธฐ๋Šฅ ๋ฐฉํ•ด.

model = keras.models.Sequential([
    keras.layers.Flatten(input_shape=[28, 28]),
    keras.layers.AlphaDropout(rate=0.2),
    keras.layers.Dense(300, activation="selu", kernel_initializer="lecun_normal"),
    keras.layers.AlphaDropout(rate=0.2),
    keras.layers.Dense(100, activation="selu", kernel_initializer="lecun_normal"),
    keras.layers.AlphaDropout(rate=0.2),
    keras.layers.Dense(10, activation="softmax")
    ])

몬테카를로 드롭아웃(MC Dropout)

  • 2016๋…„์— ์†Œ๊ฐœ๋จ.
  • ํ›ˆ๋ จ๋œ ๋“œ๋กญ์•„์›ƒ ๋ชจ๋ธ์„ ์žฌํ›ˆ๋ จํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ธฐ๋ฒ•
  • ์•„๋ž˜์™€ ๊ฐ™์ด ํ›ˆ๋ จ๋œ ๋ชจ๋ธ์˜ ์˜ˆ์ธก๊ธฐ๋Šฅ์„ ์ด์šฉํ•œ ๊ฒฐ๊ณผ๋ฅผ ์Šคํƒ์œผ๋กœ ์Œ“์€ ํ›„ ํ‰๊ท ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋ฉด ๋จ.
    • ๋‹จ, training=True ๋กœ ์ง€์ •ํ•˜์—ฌ ๋“œ๋กญ์•„์›ƒ ์ธต์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•จ.
  • ์˜ˆ์ œ: 100๊ฐœ์˜ ํ–‰๋ ฌ์„ ์Œ“์•„ ์˜ฌ๋ฆฐ ํ›„ ํ‰๊ท  ๋‚ด๊ธฐ
y_probas = np.stack([model(X_test_scaled, training=True)
                     for sample in range(100)])
y_proba = y_probas.mean(axis=0)
y_std = y_probas.std(axis=0)
  • ํ…Œ์ŠคํŠธ ์„ธํŠธ ์ƒ˜ํ”Œ ์ˆ˜๋Š” 10,000๊ฐœ, ํด๋ž˜์Šค ์ˆ˜๋Š” 10๊ฐœ. ๋”ฐ๋ผ์„œ [10000, 10] ๋ชจ์–‘์˜ ํ–‰๋ ฌ 100๊ฐœ.
  • ์ฆ‰, [100, 10000, 10] ๋ชจ์–‘์˜ ํ–‰๋ ฌ์ด y_probas์— ์ €์žฅ๋จ.
  • ๋ชฌํ…Œ์นด๋ฅผ๋กœ ๋“œ๋กญ์•„์›ƒ์„ ์‹คํ–‰ํ•˜๋ฉด ๋ณด๋‹ค ์ •ํ™•ํ•œ ์˜ˆ์ธก๊ณผ ๋ณด๋‹ค ์ •ํ™•ํ•œ ๋ถˆํ™•์‹ค์„ฑ ์ถ”์ •์ด ๊ฐ€๋Šฅํ•ด์ง.
    • ์œ„ํ—˜์— ๋ฏผ๊ฐํ•˜์ง€๋งŒ ์˜ˆ์ธก์†๋„๊ฐ€ ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‚ฌ์šฉ ์ถ”์ฒœ
  • ์ฃผ์˜์‚ฌํ•ญ
    • BatchNormalization ๊ณผ ๊ฐ™์€ ์ธต์ด ์‚ฌ์šฉ๋˜๋ฉด ์•ž์„œ ์„ค๋ช…ํ•œ ๋ฐฉ์‹์„ ์ ์šฉํ•˜๋ฉด ์•ˆ๋จ.
    • ๋Œ€์‹ ์— Dropout ๋˜๋Š” AlphaDropout ์ธต์„ ์•„๋ž˜์— ์ •์˜๋œ MCDropout ๋˜๋Š” MCAlphaDropout ์ธต์œผ๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•จ.
class MCDropout(keras.layers.Dropout):
    def call(self, inputs):
        return super().call(inputs, training=True)

class MCAlphaDropout(keras.layers.AlphaDropout):
    def call(self, inputs):
        return super().call(inputs, training=True)
mc_model = keras.models.Sequential([
    MCAlphaDropout(layer.rate) if isinstance(layer, keras.layers.AlphaDropout) else layer
    for layer in model.layers
    ])

맥스-노름(max-norm) 규제

  • ๊ฐ๊ฐ์˜ ๋‰ด๋Ÿฐ์— ๋Œ€ํ•ด ์ž…๋ ฅ ๊ฐ€์ค‘์น˜ $\mathbf w$์˜ $\ell_2$ ๋…ธ๋ฆ„์„ ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ $r$ ๋ณด๋‹ค ์ž‘๊ฒŒ ์ œํ•œํ•˜๋Š” ๊ธฐ๋ฒ•
  • ์€๋‹‰์ธต ๋ณ„๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ. kernel_constraint ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ง€์ •ํ•˜๋ฉด ๋จ.
layer = keras.layers.Dense(100, activation="selu", kernel_initializer="lecun_normal",
                           kernel_constraint=keras.constraints.max_norm(1.))
  • 14์žฅ์—์„œ ๋‹ค๋ฃฐ ํ•ฉ์„ฑ๊ณฑ ์ธต์—์„œ ๋งฅ์Šค-๋…ธ๋ฆ„์„ ์ ์šฉํ•˜๋ ค๋ฉด max_norm() ํ•จ์ˆ˜์˜ axis ๊ฐ’์„ ์ ์ ˆํ•˜๊ฒŒ ์ง€์ •ํ•ด์•ผ ํ•จ.

실용적 가이드라인

  • ์†Œ๊ฐœ๋œ ๋งŽ์€ ๊ธฐ๋ฒ•๋“ค์„ ์–ด์ œ ์–ด๋–ป๊ฒŒ ์จ์•ผํ• ์ง€ ๊ณ ๋ฏผ๋  ๋•Œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ ์†Œ๊ฐœ

심층신경망 기본 설정

ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋ณธ๊ฐ’
์ปค๋„์ดˆ๊ธฐํ™” He ์ดˆ๊ธฐํ™”
ํ™œ์„ฑํ™” ํ•จ์ˆ˜ ELU
์ •๊ทœํ™” ๊นŠ์€ ์‹ ๊ฒฝ๋ง์ผ ๊ฒฝ์šฐ์—๋งŒ ๋ฐฐ์น˜์ •๊ทœํ™” ์‚ฌ์šฉ
๊ทœ์ œ ์กฐ๊ธฐ์ข…๋ฃŒ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ $\ell_2$ ๊ทœ์ œ ์ถ”๊ฐ€
์˜ตํ‹ฐ๋งˆ์ด์ € ๋ชจ๋ฉ˜ํ…€ ์ตœ์ ํ™”, RMSProp, Nadam ์ค‘ ํ•˜๋‚˜
ํ•™์Šต๋ฅ  ์Šค์ผ€์ค„ 1์‚ฌ์ดํด

자기정규화를 위한 심층신경망 설정

  • ์™„์ „์—ฐ๊ฒฐ์ธต์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋‹จ์ˆœํ•œ ๋ชจ๋ธ์ธ ๊ฒฝ์šฐ ์•„๋ž˜ ์„ค์ • ์ถ”์ฒœ
ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ๊ธฐ๋ณธ๊ฐ’
์ปค๋„์ดˆ๊ธฐํ™” ๋ฅด์ฟค(LeCun) ์ดˆ๊ธฐํ™”
ํ™œ์„ฑํ™” ํ•จ์ˆ˜ SELU
์ •๊ทœํ™” ํ•„์š” ์—†์Œ
๊ทœ์ œ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์•ŒํŒŒ ๋“œ๋กญ์•„์›ƒ
์˜ตํ‹ฐ๋งˆ์ด์ € ๋ชจ๋ฉ˜ํ…€ ์ตœ์ ํ™”, RMSProp, Nadam ์ค‘ ํ•˜๋‚˜
ํ•™์Šต๋ฅ  ์Šค์ผ€์ค„ 1์‚ฌ์ดํด
  • ์ฃผ์˜์‚ฌํ•ญ
    • ์ž…๋ ฅํŠน์„ฑ์„ ์ •๊ทœํ™”ํ•ด์•ผ ํ•จ.
    • ๋น„์Šทํ•œ ๋ชจ๋ธ์˜ ์‚ฌ์ „ํ›ˆ๋ จ๋œ ์‹ ๊ฒฝ๋ง์˜ ์ผ๋ถ€ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ

희소모델인 경우

  • $\ell_1$ ๊ทœ์ œ ์‚ฌ์šฉ ์ถ”์ฒœ
  • ๋งค์šฐ ํฌ์†Œํ•œ ๋ชจ๋ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ: ํ…์„œํ”Œ๋กœ์šฐ์˜ ๋ชจ๋ธ์ตœ์ ํ™” ํˆดํ‚ท(TF-MOT) ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ๊ธฐ๋ณธ DNN ์‚ฌ์šฉํ•ด์•ผ ํ•จ. ์ž๊ธฐ ์ •๊ทœํ™”๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ.

빠른 응답 모델인 경우

  • ์›ํ•˜๋Š” ์‘๋‹ต์†๋„์— ๋”ฐ๋ผ ์€๋‹‰์ธต ์ˆ˜ ์ค„์—ฌํ– ํ•จ.
  • ๋ฐฐ์น˜์ •๊ทœํ™” ์ธต์„ ์ด์ „ ์ธต๊ณผ ํ•ฉ์น  ๊ฒƒ.
  • LeakyReLU ๋˜๋Š” ReLU ์‚ฌ์šฉ.
  • ํฌ์†Œ๋ชจ๋ธ ์‚ฌ์šฉ
  • ๋ถ€๋™์†Œ์ˆ˜์  ์ •๋ฐ€๋„ ์กฐ์ • (19์žฅ 2์ ˆ์˜ ๋ชจ๋ฐ”์ผ/์ž„๋ฒ ๋””๋“œ ์žฅ์น˜ ๋ชจ๋ธ ์ฐธ์กฐ)

예측속도보다 정확도에 충실한 모델인 경우

  • ์„ฑ๋Šฅ์„ ์˜ฌ๋ฆฌ๊ณ  ๋ถˆํ™•์‹ค์„ฑ ์ถ”์ •์„ ์ •ํ™•ํ•˜๊ฒŒ ํ•˜์—ฌ ์‹ ๋ขฐ๋„๊ฐ€ ๋†’์€ ๋ชจ๋ธ์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ
  • ๋ชฌํ…Œ์นด๋ฅผ๋กœ ๋“œ๋กญ์•„์›ƒ ์‚ฌ์šฉ ์ถ”์ฒœ