Optimization (์ตœ์ ํ™”)

Optimization (์ตœ์ ํ™”)


  • loss์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์•„๋‚˜๊ฐ€๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์ด๋‹ค.
  • Backpropagation ๊ณผ์ • ์ค‘์— ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด์„œ ์ง„ํ–‰๋˜๋Š”๋ฐ, ์ด ๋•Œ ํ•œ ์Šคํ…๋งˆ๋‹ค ์ด๋™ํ•˜๋Š” ๋ฐœ์ž๊ตญ์˜ ํฌ๊ธฐ(๋ณดํญ)์ดย ํ•™์Šต๋ฅ (learning rate)๋กœ ์ •์˜๋˜๊ณ , ์•ž์œผ๋กœ ์ด๋™ํ•  ๋ฐฉํ–ฅ์€ย ํ˜„ ์ง€์ ์˜ ๊ธฐ์šธ๊ธฐ(gradient)๋ฅผ ํ†ตํ•ด ์ •์˜๋œ๋‹ค.
  • ๋งค ์Šคํ…๋งˆ๋‹ค forward pass์˜ ๋๋‹จ์—์„œ ๊ณ„์‚ฐ๋˜๋Š” ์†์‹ค ํ•จ์ˆ˜๊ฐ’์€ ์ง€๊ธˆ๊นŒ์ง€ ์—…๋ฐ์ดํŠธ๋œ ๊ฐ€์ค‘์น˜๋“ค์ด ์–ผ๋งˆ๋‚˜ ์ž˜ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ์™€๋„ ๊ฐ™๋‹ค.
ย 

SGD(Stochastic Gradient Descent)


# Vanilla update x += - learning_rate * dx #dx: x์—์„œ์˜ loss์— ๋Œ€ํ•œ ๊ธฐ์šธ๊ธฐ
  • loss์˜ ๊ฐ’์ด ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ณ„์† ๋ฐ˜๋ณตํ•ด์„œ optimization์„ ์ง„ํ–‰ํ•œ๋‹ค.
ย 

๋ฌธ์ œ์ 

slow

notion image
๋นจ๊ฐ„์ ์—์„œ ์ตœ์ ์ ์„ ์ฐพ์•„์„œ ์ด๋™ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด, ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์œผ๋กœ๋Š” ๊ธฐ์šธ๊ธฐ ๋ณ€ํ™”๊ฐ€ ์ž‘๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋А๋ฆฌ๊ฒŒ ์ด๋™ํ•˜๊ณ , ์ˆ˜์ง ๋ฐฉํ–ฅ์œผ๋กœ๋Š” ๊ธฐ์šธ๊ธฐ ๋ณ€ํ™”๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. ๊ทธ๋ž˜์„œ Loss๋Š” ์ˆ˜์ง ๋ฐฉํ–ฅ์˜ ๊ฐ€์ค‘์น˜ ๋ณ€ํ™”์— ํ›จ์”ฌ ๋” ๋ฏผ๊ฐํ•˜๊ฒŒ ๋ฐ˜์‘ํ•˜๊ฒŒ ๋œ๋‹ค. loss๊ฐ€ ์ˆ˜์ง๋ฐฉํ–ฅ์˜ ๋ฒกํ„ฐ์™€ ์ˆ˜ํ‰ ๋ฐฉํ–ฅ ๋ฒกํ„ฐ์˜ ํ•ฉ์ง‘ํ•ฉ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ทธ์žฌ๊ทธ๋กœ ์ด๋™ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” high demension์ผ์ˆ˜๋ก ๋”์šฑ ๋ฌธ์ œ๊ฐ€ ์‹ฌ๊ฐํ•ด์ง„๋‹ค.
ย 

local minima & saddle point

(x์ถ•์€ ๊ฐ€์ค‘์น˜, y์ถ•์€ loss)
(x์ถ•์€ ๊ฐ€์ค‘์น˜, y์ถ•์€ loss)
  • local minima
๊ทน๋Œ€๊ฐ’๋“ค ์‚ฌ์ด์˜ ๊ทน์†Œ๊ฐ’์— ์•ˆ์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ ๋” ์ด์ƒ ๊ฐ€์ค‘์น˜๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š๊ณ  ๋ฉˆ์ถ˜๋‹ค. ๊ธฐ์šธ๊ธฐ๊ฐ€ 0์ธ ์ง€์ ์„ loss์˜ ์ตœ์†Œ๊ฐ’์œผ๋กœ ์ธ์‹ํ•ด ํ•ด๋‹น ์ง€์ (local minima)์„ ์ตœ์ ์ ์œผ๋กœ ํŒ๋‹จํ•˜์—ฌ ๋” ์ด์ƒ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ด๋ค„์ง€์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค. ๋ณดํ†ต 2์ฐจ์›์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.
  • saddle point
๊ธฐ์šธ๊ธฐ๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ 0์€ ์•„๋‹ˆ์ง€๋งŒ ๊ทธ ์ฃผ๋ณ€์ด ๊ต‰์žฅํžˆ ์™„๋งŒํ•ด์„œ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋А๋ฆฌ๊ฒŒ ์ง„ํ–‰๋˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋ณดํ†ต ๊ณ ์ฐจ์› ๊ทธ๋ž˜ํ”„์—์„œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐœ์ƒํ•œ๋‹ค.
ย 

noisy

notion image
  • Mini-Batch Gradient Descent์˜ ๊ฒฝ์šฐ ๋ฏธ๋‹ˆ๋ฐฐ์น˜๋งˆ๋‹ค loss๋ฅผ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ์ด๋Š” ๋งค์šฐ ๋น„ํšจ์œจ์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋งŽ์€ noise๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.
ย 

Momentum


vx = 0 while True: dx = compute_gradient(x) vx = rho * vx + dx x -= learning_rate * vx
  • SGD์— Momentum term ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค. ์ฆ‰, ๊ฐ€์ค‘์น˜ x๋ฅผ ์—…๋ฐ์ดํŠธํ• ๋•Œ ์†๋„ vx์˜ ๊ฐœ๋…์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค.
  • v๋Š” ๊ฐ€์†๋„๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, rho๋Š” ๋ณดํ†ต 0.9, 0.99๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ€์†๋„์— ์•ฝ๊ฐ„์˜ ๋งˆ์ฐฐ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋‹ค. v๋Š” ์ด์ „ gradients์˜ ๊ฐ€์ค‘ํ•ฉ์ด๋ผ๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. gradient ๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ๊ธฐ์šธ๊ธฐ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์†๋„ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ•œ๋‹ค.
ย 

์˜์˜

local minima & saddle point ํ•œ๊ณ„ ๊ทน๋ณต

๊ณต์ด ์–ธ๋•์„ ๋‚ด๋ ค์˜จ๋‹ค๊ณ  ๊ฐ€์ •์„ ํ•ด๋ณด์ž. ๊ทธ ๊ณต์€ ๊ธฐ์šธ๊ธฐ๊ฐ€ 0์ธ ์ง€์ ์—์„œ๋„ ์ด๋•Œ๊นŒ์ง€ ๋‚ด๋ ค์˜ค๋˜ ์†๋„์— ์˜ํ•ด ๊ทธ ๊ณจ์งœ๊ธฐ๋ฅผ ์ง€๋‚˜ ๊ณ„์† ๊ตด๋Ÿฌ๊ฐˆ ๊ฒƒ์ด๋‹ค. ์ฆ‰, ๊ธฐ์šธ๊ธฐ๊ฐ€ 0์ธ ์ง€์ ์—์„œ๋„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋ฉฐ ์ด ์ง€์ ๊นŒ์ง€ ๋‚ด๋ ค์˜ค๋Š” ์†๋„์˜ ๊ฐœ๋…์„ ์ถ”๊ฐ€ํ•œ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— local minima & saddle point์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
ย 

noise ํ‰๊ท ํ™”

  • Momentum์„ ์ถ”๊ฐ€ํ•ด์„œ velocity๊ฐ€ ์ƒ๊ธฐ๋ฉด ๊ฐ€์†๋„๊ฐ€ ์ƒ๊ธฐ๋ฉฐ, momentum์ด ์ˆ˜ํ‰๋ฐฉํ–ฅ์œผ๋กœ๋Š” ๊ฐ€์†๋„๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ๋˜์–ด SGD์—์„œ ์ฒ˜๋Ÿผ ์ง€๊ทธ์žฌ๊ทธ๋กœ ์›€์ง์ด์ง€ ์•Š๋„๋ก step์„ ๊ฐ–๋Š”๋‹ค. step์ด ์ปค์ง์— ๋”ฐ๋ผ noise๋„ ํ‰๊ท ํ™”๋œ๋‹ค.
ย 

Nestero Momentum


notion image
  • ๋นจ๊ฐ„์ ์—์„œ velocity ๋ฐฉํ–ฅ์œผ๋กœ ์ถœ๋ฐœํ•œ ๋’ค ๊ฑฐ๊ธฐ์„œ gradient๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ ์›์ ์œผ๋กœ๊ฐ€์„œ actual step์œผ๋กœ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
ย 
notion image
  • ์ด์ „ ์Šคํ…์˜ velocity ๋ฐฉํ–ฅ์„ ๋”ฐ๋ผ ๋จผ์ € ์ด๋™ํ•˜์—ฌย ๊ทธ ์ž๋ฆฌ์—์„œ gradient๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ ย ๋‹ค์‹œ ๋ณธ๋ž˜ ์ž๋ฆฌ๋กœ ๋Œ์•„์™€ actual step์„ ์ด๋™ํ•œ๋‹ค. ์ฆ‰, gradient๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ์ง€์ ๊ณผ ์‹ค์ œ ์ด๋™ํ•˜๋Š” ์ง€์ ์ด ๋‹ค๋ฅด๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์ƒˆ๋กญ๊ฒŒ ๋ณ€ํ™”๋˜๋Š” ์‹์—์„œย error-correcting term์ด๋ผ๋Š” ๊ฒƒ์ด ์ƒ๊ธฐ๋Š”๋ฐ ์ด๋Š”ย ์ด์ „ velocity์™€ ํ˜„์žฌ velocity์˜ ์ฐจ์ด๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌย ๊ธ‰๊ฒฉํ•œ ์ŠˆํŒ…์„ ๋ฐฉ์ง€ํ•œ๋‹ค๋Š” ์ธก๋ฉด์—์„œ ํšจ๊ณผ๊ฐ€ ์žˆ๊ณ  ๋” ๋น ๋ฅธ ํ•™์Šต์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. (https://velog.io/@yookyungkho/๋”ฅ๋Ÿฌ๋‹-์˜ตํ‹ฐ๋งˆ์ด์ €-์ •๋ณต๊ธฐ๋ถ€์ œ-CS231n-Lecture7-Review ์ฐธ๊ณ )
  • Convex optimization์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ, Neural Network์™€ ๊ฐ™์€ non-convex์—์„œ๋Š” ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
ย 

AdaGrad


grad_sqaured = 0 while True: dx = compute_gradient(x) grad_squared += dx * dx x -= learning_rate * dx/(np.sqart(grad_squared) + 1e-7)
  • grad_squared๋ฅผ ์ด์šฉํ•˜์—ฌ dx์˜ ์ œ๊ณฑ์— ๋ฃจํŠธ๋ฅผ ์”Œ์šด ๊ฐ’์„ x๊ฐ’ ์—…๋ฐ์ดํŠธํ• ๋•Œ ๋‚˜๋ˆ ์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ํ•™์Šต ์ค‘์— ๊ธฐ์šธ๊ธฐ์˜ ์ œ๊ณฑ๊ฐ’์„ grad_squred์— ๊ณ„์† ๋”ํ•ด์„œ update step์—์„œ ๋‚˜๋ˆ  ์ค€๋‹ค. small gradient์ธ ๊ฒฝ์šฐ์—๋Š” grad_squared๊ฐ€ ์ž‘์€ ๊ฐ’์œผ๋กœ ๋‚˜๋ˆ ์ฃผ๋‹ˆ ์†๋„๊ฐ€ ๋” ์ž˜๋ถ™๊ณ , large gradient์ธ ๊ฒฝ์šฐ์—๋Š” ํฐ ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด์„œ wiggling dimension์€ slowdownํ•ด์„œ ์ฒœ์ฒœํžˆ ๋‚ด๋ ค์˜ค๊ฒŒ ๋œ๋‹ค. ์ฆ‰ ํŒŒ๋ผ๋ฏธํ„ฐ x๋“ค ๋งˆ๋‹คย ๋‹ค๋ฅธ ํ•™์Šต๋ฅ ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์ˆ˜์ง์ถ•๊ณผ ์ˆ˜ํ‰์ถ•์˜ ์—…๋ฐ์ดํŠธ ์†๋„๋ฅผ ์ ์ ˆํžˆ ๋งž์ถ˜๋‹ค.
ย 

๋ฌธ์ œ์ 

  • step size๊ฐ€ ์˜ค๋žœ์‹œ๊ฐ„ ์ง€์†๋˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” grad๊ฐ€ ๋งค์šฐ ์ž‘์•„์ง€๊ฒŒ ๋˜์–ด ์ „์ฒด์ ์ธ ์†๋„๊ฐ€ ๋งค์šฐ ๋А๋ ค์ง€๊ฒŒ ๋˜๋ฉฐ ๊ฐ€์ค‘์น˜๊ฐ€ 0์ด ๋˜์–ด ํ•™์Šต์ด ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋‹ค.
  • non-convex์—์„œ๋Š” saddle point์— ๊ฑธ๋ฆฐ๋‹ค.
  • ์ž˜ ์“ฐ์ด์ง€ ์•Š๋Š”๋‹ค.
ย 
ย 

RMSProp update


grad_squared = 0 while True: dx = compute_Gradient(x) grad_sqaured = decay_rate * grad_sqaured + (1-decay_rate) * dx * dx x -= learning_rate * dx / (np.sqrt(grad_squared) + 1e-7)
  • AdaGrad๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ grad_squared๋ฅผ ์ด์šฉํ•˜์ง€๋งŒ, RMSProp update์—์„œ๋Š” ํ›ˆ๋ จํ•˜๋Š” ๋™์•ˆ์— ๊ฐ’์„ ๊ณ„์†ํ•ด์„œ ์ถ•์ ์‹œํ‚จ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ๋ˆ„์ ๋œ grad_squaredํ•ญ์—ย decay_rate๋ฅผ ๊ณฑํ•˜๊ณ , ํ˜„์žฌ์˜ dxํ•ญ์—๋Š” (1-decay_rate)๋ฅผ ๊ณฑํ•ด grad_squared๊ฐ€ ๋ˆ„์ ๋˜๋Š” ์†๋„๋ฅผ ์ค„์—ฌ์ค€๋‹ค. Momentum ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๋‹ค.
  • ๋ณดํ†ต decay rate์œผ๋กœ 0.9๋‚˜ 0.99๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ์˜ค๋ฒ„์ŠˆํŒ…์ด ์‹ฌํ•˜์ง€ ์•Š์€ ํŽธ์ด๋‹ค.
ย 

Adam


# almost first_moment = 0 second_moment = 0 while True: dx = compute_gradient(x) first_moment = beta1 * first_moment + (1-beta1)*dx second_moment = beta2 * second_moment + (1-beta2) * dx * dx x -= learning_rate * first_moment / (np.sqrt(second_moment) + 1e-7))
  • RMSProp + Momentum
  • First moment์™€ second moment๋ฅผ ์ด์šฉํ•ด ์ด์ „ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ณ  gradients์˜ ์ œ๊ณฑ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋•Œ First moment๋Š” velocity๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  second moment๋Š” AdaGrad์ด๋‚˜ RMSProp์ฒ˜๋Ÿผ gradient ์ œ๊ณฑ ํ™œ์šฉํ•œ๋‹ค. ์ดˆ๊ธฐ์— second moment๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ ํ›„ 1ํšŒ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ๋‚˜์„œ๋„ beta2 = decay_rate๋กœ 0.9๋˜๋Š” 0.99๋กœ 1์— ๊ฐ€๊นŒ์šด ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ 0์— ๊ฐ€๊น๋‹ค. update step์—์„œ second moment๋กœ ๋‚˜๋ˆ„๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๊ธฐ step์ด ์—„์ฒญ๋‚˜๊ฒŒ ์ปค์ ธ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Adam์€ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์Šคํ…์— ๋งž๋Š” bias correction term ์ถ”๊ฐ€ํ•œ๋‹ค. first/second moments๋ฅผ Updateํ•˜๊ณ  ๋‚œ ํ›„ ํ˜„์žฌ Step์— ๋งž๋Š” ์ ์ ˆํ•œ unbiased term ์„ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํšŒ์ „๋œ ํƒ€์›(poor conditioning) ๋ฌธ์ œ๋Š” ์—ฌ์ „ํžˆ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†๋‹ค๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.
ย 

Ensemble


  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ชจ๋ธ์„ ๊ฐ๊ฐ ๋”ฐ๋กœ ํ•™์Šต์‹œ์ผœ ๊ทธ ํ‰๊ท ๊ฐ’์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. train/test error์˜ ๊ฒฉ์ฐจ๋ฅผ ์ค„์ด๋Š” ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๋ชจ๋ธ์„ ๋…๋ฆฝ์ ์œผ๋กœ ํ•™์Šต์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ•™์Šต ๋„์ค‘ ์ค‘๊ฐ„ ๋ชจ๋ธ๋“ค์„ ์ €์žฅ(sanpshots)ํ•˜๊ณ  ์•™์ƒ๋ธ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Test time์—๋Š” ์—ฌ๋Ÿฌ snapshots์—์„œ ๋‚˜์˜จ ์˜ˆ์ธก๊ฐ’๋“ค์„ ํ‰๊ท ์„ ๋‚ด์„œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด๋Ÿฐ snapshots์€ Training ๊ณผ์ • ์ค‘๊ฐ„์— ์ €์žฅํ•œ๋‹ค.
ย 
ย 
ย