Home [Week 02 / Day 008] ํ•™์Šต ๊ธฐ๋ก
Post
Cancel

[Week 02 / Day 008] ํ•™์Šต ๊ธฐ๋ก

๐Ÿ“ ์˜ค๋Š˜ ํ•œ ์ผ

  • ๋ฐ์ผ๋ฆฌ ์Šคํฌ๋Ÿผ
  • ๋ฉ˜ํ† ๋ง
  • ๊ฐ•์˜ ์ˆ˜๊ฐ• ๋ฐ ํ€ด์ฆˆ
    • [PyTorch 6๊ฐ•]
  • ๊ธฐ๋ณธ ๊ณผ์ œ 1 ์™„๋ฃŒ
  • ๊ธฐ๋ณธ ๊ณผ์ œ 2
  • ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋Œ€๋น„


๐Ÿ‘ฅ ํ”ผ์–ด์„ธ์…˜ ์š”์•ฝ

  • Further Question (PyTorch 4๊ฐ•)
    1. 1 epoch์—์„œ ์ด๋ค„์ง€๋Š” ๋ชจ๋ธ ํ•™์Šต ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ณด๊ณ  ์„ฑ๋Šฅ์„ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ค ๋ถ€๋ถ„์„ ๋จผ์ € ๊ณ ๋ คํ•˜๋ฉด ์ข‹์„์ง€ ๊ฐ™์ด ๋…ผ์˜ํ•ด๋ณด์„ธ์š”.
      • loss๋ฅผ ๋ฐ”๊พผ๋‹ค. (GAN์—์„œ ํ™•์‹คํžˆ ๋งŽ์ด ์“ฐ์ธ๋‹ค.)
      • model์„ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค. (๋ฌธ์ œ์˜ ์˜๋„๋Š” ์•„๋‹Œ ๊ฒƒ ๊ฐ™๋‹ค.)
      • epoch ๋งˆ๋‹ค data shuffle์„ ํ•ด๋ณธ๋‹ค. (์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ๋Œ€ํšŒ์—์„œ๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.)
    2. optimizer.zero_grad()๋ฅผ ์•ˆํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ์ง€ ๊ทธ๋ฆฌ๊ณ  ๋งค batch step๋งˆ๋‹ค ํ•ญ์ƒ ํ•„์š”ํ•œ์ง€ ๊ฐ™์ด ๋…ผ์˜ํ•ด๋ณด์„ธ์š”.
      • step๋งˆ๋‹ค ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ถ€ํ˜ธ์˜ ๋ฌธ์ œ ๋•Œ๋ฌธ์— gradient์˜ ๋ฐฉํ–ฅ, ์ฆ‰ ํ•™์Šต์˜ ๋ฐฉํ–ฅ์ด ์ž˜๋ชป ๋  ์ˆ˜ ์žˆ๋‹ค.
      • no_grad(), eval()๋„ ์ฃผ์˜ํ•ด์„œ ๊ธฐ์–ตํ•˜๋ฉด ์ข‹๋‹ค.
  • ๊ฐ•์˜์—์„œ ์–ธ๊ธ‰๋œ stepping freezing(?)์˜ ์ •ํ™•ํ•œ ๋ช…์นญ์€?


๐Ÿซ ๋ฉ˜ํ† ๋ง ์š”์•ฝ

Gather

  • ์›ํ•˜๋Š” index์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  • matrix๊ฐ€ sparseํ•œ ๊ฒฝ์šฐ์—, training ๋‚ด๋ถ€์—์„œ ๋“ค์–ด์˜ค๋Š” data์˜ shpae๋ฅผ ๋งž์ถฐ์ฃผ๋Š” ๊ฒƒ์ด ๋ณ‘๋ ฌํ™”์— ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ชจ๋ธ์˜ ๋‚ด๋ถ€๋ณด๋‹ค ํ›„์ฒ˜๋ฆฌ ํ•  ๋•Œ ๋” ๋งŽ์ด ์“ฐ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

    โ‡’ ํ•˜์ง€๋งŒ ๋Œ€์ฒด์ œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. (ex. index masking ํ•˜๋ฉด ๋น„์Šทํ•œ ํšจ๊ณผ)

Q.backward(gradient=โ€ฆ) ์–ด๋””์—์„œ ์“ธ๊นŒ?

  • loss์— backward๋ฅผ ํ•˜๋ฉด ๋ชจ๋“  param ๋งˆ๋‹ค gradient๊ฐ€ ๋‹ฌ๋ฆฐ๋‹ค.
  • ์—ฌ๊ธฐ์—์„œ gradient๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  backward ํ•œ ๋ฒˆ ๋” ํ•˜๋ฉด ํ•™์Šต์˜ ๋ฐฉํ–ฅ์ด ์ž˜๋ชป ๋  ์ˆ˜ ์žˆ๋‹ค.
    โ‡’ zero_grad() ์•ˆํ•˜๋ฉด ๋Œ€์ฐธ์‚ฌ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.

  • loss๋Š” vector๊ฐ€ ์•„๋‹ˆ๊ณ  scalar ๊ฐ’์ด๋‹ค. โ‡’ loss.backward() ํ•จ์ˆ˜๋Š” scalar ๊ฐ’์— backward๊ฐ€ ์ ์šฉ๋˜๋ฏ€๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ํ•˜์ง€๋งŒ, Q.backward() vector/tensor์— backward๋ฅผ ์ ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • loss๋ฅผ scalar ๊ฐ’์ด๋ผ๊ณ  ์ •ํ•ด๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์ธ ๊ฒƒ ๊ฐ™๋‹ค.
    • ๋”ฐ๋ผ์„œ scalar์ธ ์„ฑ๋ถ„๋งŒ ๋–ผ์–ด์„œ Q[0].backward() ๋กœ backward๋ฅผ ์ ์šฉํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • vector/tensor์ธ ๊ฒฝ์šฐ, scalar ๊ฐ’์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ข… loss๋กœ ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ , backprop ์ค‘๊ฐ„์˜ ๊ฐ’์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋”ฐ๋ผ์„œ chain rule์— ์˜ํ•ด ์•ž์—์„œ ๊ฐ’์ด ์ „๋‹ฌ๋˜์–ด ์˜จ๋‹ค๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด Q.backward(gradient=external_gradient)๋กœ gradient๋ฅผ ์ง€์ •ํ•ด ์ฃผ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.
  • ๋ชจ๋ธ์ด ์ปค์„œ backprop ์ค‘ ์ค‘๊ฐ„์—์„œ ๋ฉˆ์ถ˜ ๋‹ค์Œ ๋‹ค์‹œ ์ด์–ด์„œ ๊ณ„์‚ฐํ•  ๋•Œ๋‚˜ ์“ฐ์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.

loss์— ๋Œ€ํ•ด์„œ

loss = loss1 + loss2์ผ ๋•Œ, ๋‹ค์Œ์˜ ๋‘ ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋Š”? โ‡’ ๊ฐ™๋‹ค.

  1. loss.backward()
  2. loss1.backward(), loss2.backward()

epoch ๋‚ด ๊ณผ์ •

  1. grad ์ดˆ๊ธฐํ™”
  2. param์— grad ์Œ“์ž„
  3. optim
  4. param update
  • gradient clipping
    • gradient์˜ norm(ํฌ๊ธฐ)์„ ์–ด๋Š์ •๋„ ์ดํ•˜๋กœ ์ œํ•œํ•ด๋‘๊ธฐ ์œ„ํ•จ์ด๋‹ค.
    • loss backprop ์‹œ gradient๊ฐ€ ์Œ“์—ฌ ๋งค์šฐ ์ปค์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • freeze
    • freeze ์‹œํ‚ค๊ณ  ์‹ถ์€ ๊ฒƒ์—๋งŒ freeze ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • freeze ๋Œ€์‹ , freeze ์‹œํ‚ค๊ณ  ์‹ถ์€ ๊ฒƒ์˜ grad๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•˜๋ฉด update๊ฐ€ ๋˜์ง€ ์•Š์•„ ๊ฐ™์€ ๋™์ž‘์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

      1
      2
      3
      
        loss.backward()
        a.grad = 0.0
        optim.step()
      
    • ์ด๋Š” $a = a-\text{lr}*\text{grad}$ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด 0.1 ์ •๋„๋งŒ ํ•™์Šต๋˜๊ฒŒ๋” ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

      1
      
        a.grad *= 0.1
      

    โ‡’ ์ด๋ ‡๊ฒŒ customizing ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด PyTorch์˜ ์žฅ์ ์ด๋‹ค.

๊ธฐํƒ€

  • prefetch - loader ์„ฑ๋Šฅ์ด ๋งค์šฐ ์ข‹์•„์ง„๋‹ค.
  • TensorBoard
  • TensorFlow๋Š” ๋ฐฐํฌ ์‹œ์— ์ข‹๋‹ค.


๐Ÿ“š ๊ณผ์ œ ๋‚ด์šฉ ์ •๋ฆฌ

๋”ฐ๋กœ Notion์— ์ •๋ฆฌ ์ค‘์ด๋‹ค.


๐Ÿพ ์ผ์ผ ํšŒ๊ณ 

์ด๋ฒˆ์ฃผ๋Š” ๊ณผ์ œ์˜ ๋ฐ๋“œ๋ผ์ธ์ด ๋ชฉ์š”์ผ ์˜ค์ „์ด๋‹ค. ํ•˜์ง€๋งŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐ•์˜์™€ ๊ณผ์ œ์˜ ์ •๋ฆฌ์— ์ง‘์ค‘ํ•˜๋‹ค๋ณด๋‹ˆ ์‹œ๊ฐ„ ๊ด€๋ฆฌ๋ฅผ ์ž˜ ๋ชปํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ์ด์ œ์•ผ ๊ธฐ๋ณธ ๊ณผ์ œ 1์„ ๋งˆ์ณค๊ณ , ๊ธฐ๋ณธ ๊ณผ์ œ 2๋Š” ์˜ค๋Š˜ ๋ฐค์„ ์ƒˆ์„œ ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿ˜ญ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ์ผ์ •๊ณผ ์‹œ๊ฐ„์„ ๋ฏธ๋ฆฌ ํ™•์ธํ•˜์—ฌ ์ด๋Ÿฐ ์ผ์ด ์—†๋„๋ก ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜๋ถ€ํ„ฐ๋Š” ํ”ผ์–ด์„ธ์…˜์—์„œ ๊ฐ•์˜์— ๋‹ฌ๋ ค์žˆ๋Š” Further Question์— ๋Œ€ํ•ด์„œ๋„ ์ด์•ผ๊ธฐ๋ฅผ ๋‚˜๋ˆ„๊ธฐ๋กœ ํ•˜์˜€๋‹ค. (ํ™•์‹คํžˆ ํ˜ผ์ž ๋ณต์Šตํ•  ๋•Œ ํ•ด์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐ๋งŒ ํ•˜๋ฉด ๊ณ„์† ๋ฏธ๋ฃจ๊ฒŒ ๋œ๋‹ค.) ์•„์ง์€ ๋ชจ๋”๋ ˆ์ดํ„ฐ๋กœ์„œ๋Š” ๋„ˆ๋ฌด๋‚˜๋„ ๋ฏธ์ˆ™ํ•˜์ง€๋งŒ, ํŒ€์›๋ถ„๋“ค์˜ ๋„์›€์„ ๋ฐ›์•„ ํ”ผ์–ด์„ธ์…˜ ์‹œ๊ฐ„์ด ์ ์  ์ž๋ฆฌ๋ฅผ ์žก์•„๊ฐ€๋Š” ๊ฒƒ ๊ฐ™๋‹ค! ๋˜ํ•œ, ์˜ค๋Š˜์€ ๋ฉ˜ํ† ๋ง์ด ์žˆ๊ธฐ๋„ ํ–ˆ๋Š”๋ฐ, ์ •๋ง ์œ ์ตํ–ˆ๋‹ค. ํ”ผ์–ด์„ธ์…˜์—์„œ ์™„๋ฒฝํžˆ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ๋˜ PyTorch์˜ backward ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์งˆ๋ฌธ์„ ๋ฉ˜ํ† ๋ง ์‹œ๊ฐ„์—๋„ ๋‹ค๋ฃจ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฉ˜ํ† ๋‹˜๊ป˜์„œ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์จ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ๋ฐ”๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ์…จ๊ณ  ๋•๋ถ„์— ์‰ฝ๊ฒŒ ์ดํ•ด๋ฅผ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋‹ค์Œ ๋ฉ˜ํ† ๋ง๋ถ€ํ„ฐ๋Š” ๋…ผ๋ฌธ ๋ฆฌ๋”ฉ๋„ ๋ณ‘ํ–‰ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค!

์•„์ง๊นŒ์ง€๋Š” ๊ฒจ์šฐ๊ฒจ์šฐ ๋”ฐ๋ผ๊ฐ€๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ๋ฒ…์ฐฌ ๋Š๋‚Œ์ด ๋“ค์ง€๋งŒ ํ•˜๋ฃจํ•˜๋ฃจ ์–ป์–ด๊ฐ€๋Š” ๊ฒƒ์ด ๋งŽ์•„ ๋ฟŒ๋“ฏํ•˜๋‹ค. ์šฐ์„ ์€ ์ œ๋ฐœ ๊ธฐ๋ณธ ๊ณผ์ œ 2๋ฅผ ์™„์„ฑํ•˜๊ณ  ์ œ์ถœํ•˜์ž..


๐Ÿš€ ๋‚ด์ผ ํ•  ์ผ

  • ๊ธฐ๋ณธ ๊ณผ์ œ 1, 2 ์ œ์ถœํ•˜๊ธฐ
  • ๊ฐ•์˜ ์ˆ˜๊ฐ• & ํ€ด์ฆˆ
    • [PyTorch 7๊ฐ•]
    • [PyTorch 8๊ฐ•]
  • ๋งˆ์Šคํ„ฐ ํด๋ž˜์Šค
This post is licensed under CC BY 4.0 by the author.

[Week 02] ๋ฉ˜ํ† ๋ง

[Week 02 / Day 009] ํ•™์Šต ๊ธฐ๋ก