์•ˆ๋…•ํ•˜์„ธ์š” Oneclick AI ์ž…๋‹ˆ๋‹ค!!
์˜ค๋Š˜์€, RNN(์ˆœํ™˜ ์‹ ๊ฒฝ๋ง, Recurrent Neural Network) ๋ชจ๋ธ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฅ๋Ÿฌ๋‹์ด ๋ฌธ์žฅ, ์Œ์„ฑ, ์ฃผ๊ฐ€ ์˜ˆ์ธก๊ณผ ๊ฐ™์€ ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ(Sequential Data)๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์€ ์ „์ ์œผ๋กœ RNN ๋•๋ถ„์ž…๋‹ˆ๋‹ค.
๋‹จ์ˆœํ•œ ์‹ ๊ฒฝ๋ง์ด '์ˆœ์„œ'๋ผ๋Š” ๊ฐœ๋…์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ฐ˜๋ฉด,
RNN์€ ๋งˆ์น˜ ์‚ฌ๋žŒ์ฒ˜๋Ÿผ ์‹œ๊ฐ„์˜ ํ๋ฆ„์— ๋”ฐ๋ผ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๊ณ , ๋‹ค์Œ์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์ด RNN์ด๋ผ๋Š” ์‹ ๊ฒฝ๋ง์ด ์–ด๋–ป๊ฒŒ ๊ณผ๊ฑฐ์˜ ์ •๋ณด๋ฅผ ๊ธฐ์–ตํ•˜๋ฉฐ ์ž‘๋™ํ•˜๋Š”์ง€,
๊ทธ๋ฆฌ๊ณ  ์–ด๋–ป๊ฒŒ ๋ฌธ์žฅ์˜ ์ˆจ๊ฒจ์ง„ ๋ฌธ๋งฅ๊ณผ ์˜๋ฏธ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.


๋ชฉ์ฐจ

  1. RNN ํ•ต์‹ฌ ์›๋ฆฌ ํŒŒ์•…ํ•˜๊ธฐ
    • ์™œ ์ˆœ์ฐจ ๋ฐ์ดํ„ฐ์— RNN์„ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ํ• ๊นŒ?
    • RNN์˜ ์‹ฌ์žฅ : ์ˆœํ™˜ ๊ตฌ์กฐ์™€ ์€๋‹‰ ์ƒํƒœ์˜ ์—ญํ•™
    • RNN์„ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ํŽผ์ณ๋ณด๊ธฐ
    • RNN์˜ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ ์ƒ์„ธ ๋ถ„์„
  2. ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ†ตํ•œ ๋‚ด๋ถ€ ์ฝ”๋“œ ๋“ค์—ฌ๋‹ค ๋ณด๊ธฐ
    • Keras๋กœ ๊ตฌํ˜„ํ•œ RNN ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜
    • model.summary()๋กœ ๊ตฌ์กฐ ํ™•์ธํ•˜๊ธฐ
  3. ์ง์ ‘ RNN ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ
    • 1๋‹จ๊ณ„ : ๋ฐ์ดํ„ฐ ๋กœ๋“œ ๋ฐ ์ „์ฒ˜๋ฆฌ
    • 2๋‹จ๊ณ„ : ๋ชจ๋ธ ์ปดํŒŒ์ผ
    • 3๋‹จ๊ณ„ : ๋ชจ๋ธ ํ•™์Šต ๋ฐ ํ‰๊ฐ€
    • 4๋‹จ๊ณ„ : ํ•™์Šต๋œ ๋ชจ๋ธ ์ €์žฅ ๋ฐ ์žฌ์‚ฌ์šฉ
    • 5๋‹จ๊ณ„ : ๋‚˜๋งŒ์˜ ๋ฌธ์žฅ์œผ๋กœ ๋ชจ๋ธ ํ…Œ์ŠคํŠธํ•˜๊ธฐ
  4. ๋‚˜๋งŒ์˜ RNN ๋ชจ๋ธ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ
    • ๊ธฐ์ดˆ ์ฒด๋ ฅ ํ›ˆ๋ จ : ํ•˜์ดํผํŒŒ๋ผ๋ฏธํ„ฐ ํŠœ๋‹
    • RNN์˜ ์น˜๋ช…์  ์•ฝ์  : ์žฅ๊ธฐ ์˜์กด์„ฑ ๋ฌธ์ œ
    • ๊ธฐ์–ต๋ ฅ ๊ฐ•ํ™” : LSTM๊ณผ GRU์˜ ๋“ฑ์žฅ
    • ๊ณผ๊ฑฐ์™€ ๋ฏธ๋ž˜๋ฅผ ๋™์‹œ์— : ์–‘๋ฐฉํ–ฅ RNN
  5. ๊ฒฐ๋ก 

1. RNN ํ•ต์‹ฌ์›๋ฆฌ ํŒŒ์•…ํ•˜๊ธฐ

๊ฐ€์žฅ ๋จผ์ €, RNN์ด ์™œ ์ˆœ์ฐจ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ์ธ์ง€ ๊ทธ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์™œ ์ˆœ์ฐจ ๋ฐ์ดํ„ฐ์— RNN์„ ์‚ฌ์šฉํ• ๊นŒ?? with MLP, CNN์˜ ํ•œ๊ณ„
๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์‹ ๊ฒฝ๋ง์ธ MLP(๋‹ค์ธต ํผ์…‰ํŠธ๋ก )์— "๋‚˜๋Š” ํ•™๊ต์— ๊ฐ„๋‹ค"๋ผ๋Š” ๋ฌธ์žฅ์„ ์ž…๋ ฅํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค.
MLP๋Š” ๊ฐ ๋‹จ์–ด๋ฅผ ๋…๋ฆฝ์ ์ธ ํŠน์ง•์œผ๋กœ ๋ณด๊ธฐ ๋•Œ๋ฌธ์—, "ํ•™๊ต์— ๋‚˜๋Š” ๊ฐ„๋‹ค"๋ผ๋Š” ๋ฌธ์žฅ๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜๊ฒŒ ๋ฐ›์•„๋“ค์ž…๋‹ˆ๋‹ค.
๋‹จ์–ด์˜ '์ˆœ์„œ'๊ฐ€ ๊ฐ€์ง„ ์ค‘์š”ํ•œ ์˜๋ฏธ, ์ฆ‰ ๋ฌธ๋งฅ์„ ์™„์ „ํžˆ ์žƒ์–ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์— ํŠนํ™”๋œ CNN ์—ญ์‹œ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.
CNN์€ ๊ณต๊ฐ„์ ์ธ ํŠน์ง•(ํ”ฝ์…€ ์ฃผ๋ณ€ ๊ด€๊ณ„)์„ ์ถ”์ถœํ•˜๋Š” ๋ฐ๋Š” ๋›ฐ์–ด๋‚˜์ง€๋งŒ, ์‹œ๊ฐ„์ ์ธ ์ˆœ์„œ๋‚˜ ํ๋ฆ„์„ ํŒŒ์•…ํ•˜๋„๋ก ์„ค๊ณ„๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด, RNN์€ ์„ค๊ณ„ ์ž์ฒด๊ฐ€ '์ˆœ์„œ'๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
์ด์ „ ๋‹จ๊ณ„์˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์Œ ๋‹จ๊ณ„์˜ ์ž…๋ ฅ์œผ๋กœ ์žฌ์‚ฌ์šฉํ•˜๋Š” '์ˆœํ™˜' ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด, ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ๋ฌธ์žฅ์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ์ฝ์œผ๋ฉฐ ๋‚ด์šฉ์„ ๋จธ๋ฆฟ์†์— ์ถ•์ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

RNN์˜ ์‹ฌ์žฅ : ์ˆœํ™˜ ๊ตฌ์กฐ์™€ ์€๋‹‰ ์ƒํƒœ์˜ ์—ญํ•™
RNN์˜ ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ๋ฐ”๋กœ ์ˆœํ™˜ ๊ตฌ์กฐ(Recurrent Structure)์™€ ์€๋‹‰ ์ƒํƒœ(Hidden State) ์ž…๋‹ˆ๋‹ค.

  • ์ˆœํ™˜ ๊ตฌ์กฐ(Recurrent Structure)
    ์‹ ๊ฒฝ๋ง ๋‚ด๋ถ€์— '๋ฃจํ”„'๊ฐ€ ์กด์žฌํ•˜์—ฌ, ์ •๋ณด๊ฐ€ ๊ณ„์†ํ•ด์„œ ์ˆœํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
    ๊ฐ ํƒ€์ž„์Šคํ… $t$์—์„œ ๋ชจ๋ธ์€ ์ž…๋ ฅ $x_t$์™€ ์ด์ „ ํƒ€์ž„์Šคํ…์˜ ์ •๋ณด ์š”์•ฝ๋ณธ์ธ $h_{t-1}$์„ ํ•จ๊ป˜ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ์€๋‹‰ ์ƒํƒœ(Hidden State, $h_t$)
    ์€๋‹‰ ์ƒํƒœ๋Š” '๋ฉ”๋ชจ๋ฆฌ' ๋˜๋Š” '๋ฌธ๋งฅ ๋ฒกํ„ฐ'๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ, RNN์˜ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    ํŠน์ • ํƒ€์ž„์Šคํ… t์—์„œ์˜ ์€๋‹‰ ์ƒํƒœ $h_t$๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜์‹์œผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค.
    $h_t=tanh(W_hhh_tโˆ’1+W_xhx_t+b_h)$์—ฌ๊ธฐ์„œ $W_hh$, $W_{xh}$๋Š” ํ•™์Šต์„ ํ†ตํ•ด ์ตœ์ ํ™”๋˜๋Š” ๊ฐ€์ค‘์น˜ ํ–‰๋ ฌ์ด๋ฉฐ, $b_h$๋Š” ํŽธํ–ฅ์ž…๋‹ˆ๋‹ค.
    ์ค‘์š”ํ•œ ์ ์€ ๋ชจ๋“  ํƒ€์ž„์Šคํ…์—์„œ ๋™์ผํ•œ ๊ฐ€์ค‘์น˜($W$)์™€ ํŽธํ–ฅ($b$)์ด ๊ณต์œ ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    ์ด๋Š” ๋ชจ๋ธ์ด ์‹œ๊ฐ„๊ณผ ๊ด€๊ณ„์—†์ด ์ผ๊ด€๋œ ํŒจํ„ด์„ ํ•™์Šตํ•˜๊ฒŒ ํ•˜๋ฉฐ, ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๋ฅผ ํฌ๊ฒŒ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.
    tanh์™€ ๊ฐ™์€ ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋Š” ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ํŠน์ • ๋ฒ”์œ„(-1์—์„œ 1 ์‚ฌ์ด)๋กœ ์••์ถ•ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

RNN์„ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ํŽผ์ณ๋ณด๊ธฐ
์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ธธ๊ฒŒ ํŽผ์ณ์„œ ํ‘œํ˜„ํ•˜๋ฉด, ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ๊ฐ„ ํ๋ฆ„ โ”€โ”€โ”€โ–ถ
์ž…๋ ฅ ์‹œํ€€์Šค:  xโ‚     xโ‚‚      xโ‚ƒ     ...     xโ‚œ
              โ†“      โ†“      โ†“              โ†“
           โ”Œโ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”   ...   โ”Œโ”€โ”€โ”€โ”€โ”
hโ‚€  โ”€โ”€โ”€โ–ถ  โ”‚RNN โ”‚โ–ถโ”‚RNN โ”‚โ–ถโ”‚RNN โ”‚ โ–ถ ... โ–ถโ”‚RNN โ”‚
           โ””โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”˜         โ””โ”€โ”€โ”€โ”€โ”˜
             โ”‚      โ”‚       โ”‚               โ”‚
             โ–ผ      โ–ผ       โ–ผ               โ–ผ
             hโ‚     hโ‚‚      hโ‚ƒ              hโ‚œ

RNN์€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ™์€ ์…€ ์„ ๋งค ์‹œ์ ๋งˆ๋‹ค ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ ์ž…๋‹ˆ๋‹ค.
ํŽผ์ณ์„œ ๋ณด๋ฉด, ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ RNN์…€์ด ์‹œ๊ฐ„์ด ํ๋ฆ„์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณต์ œ๋œ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.
์ˆœ์„œ๋Œ€๋กœ ๋ณด์ž๋ฉด,

  1. ๊ฐ ์‹œ์ ์˜ $X_t$๊ฐ€ RNN ์…€์— ๋“ค์–ด๊ฐ€๊ณ ,
  2. ์ด์ „ ์‹œ์ ์˜ ์€์‹ ์ƒํƒœ์˜ $h_(t^-1)$๋„ ํ•จ๊ป˜ ๋“ค์–ด๊ฐ€์„œ,
  3. ์ƒˆ๋กœ์šด ์€๋‹‰์ƒํƒœ $h_t$๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  4. ์ด $h_t$๋Š” ๋‹ค์Œ ์‹œ์ ์œผ๋กœ ์ „๋‹ฌ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์œ„ ๊ทธ๋ฆผ ์† ์—ฌ๋Ÿฌ ์…€์€ ๊ฐ™์€ RNN ์…€์„ ์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋ณต์ œํ•œ ๊ฒƒ์ด๊ณ , ๋ชจ๋“  ์…€์€ ๊ฐ€์ค‘์น˜๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹œ์ ์ด ๋‹ฌ๋ผ๋„ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ๊ณ„์‚ฐ์ด ์ด๋ฃจ์–ด ์ง‘๋‹ˆ๋‹ค.

๋ณด์ถฉ์„ค๋ช… ํ•˜์ž๋ฉด,
๋‚˜๋Š” ํ•™๊ต์— ๊ฐ„๋‹ค
๋ฅผ ์ž…๋ ฅํ•˜๋ฉด,
$X_1$์ด ๋‚˜๋Š”, $X_2$๊ฐ€ ํ•™๊ต์—, $X_3$ ๊ฐ€ ๊ฐ„๋‹ค๊ฐ€ ๋˜๋ฉด์„œ ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ์—ฐ์‚ฐ์ด ์ด๋ฃจ์–ด ์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

2. ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ†ตํ•œ ๋‚ด๋ถ€ ์ฝ”๋“œ ๋“ค์—ฌ๋‹ค ๋ณด๊ธฐ

์ด์ œ ์ด๋ก ์„ ๋ฐ”ํƒ•์œผ๋กœ, TensorFlow Keras ๋ฅผ ํ†ตํ•ด ์ง์ ‘ RNN์„ ๊ตฌํ˜„ํ•ด ๋ด…์‹œ๋‹ค.
Keras๋กœ ๊ตฌํ˜„ํ•œ RNN ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜ ์‹ฌ์ธต ๋ถ„์„๋‹ค์Œ์€ IMDB ์˜ํ™” ๋ฆฌ๋ทฐ ๊ฐ์„ฑ ๋ถ„์„์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ RNN ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

import tensorflow as tf
from tensorflow import keras

# ๋ชจ๋ธ ์•„ํ‚คํ…์ฒ˜ ์ •์˜
model = keras.Sequential([
    # 1. ๋‹จ์–ด ์ž„๋ฒ ๋”ฉ ์ธต
    # input_dim: ์ „์ฒด ๋‹จ์–ด ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ (๊ฐ€์žฅ ๋นˆ๋ฒˆํ•œ 1๋งŒ๊ฐœ ๋‹จ์–ด)
    # output_dim: ๊ฐ ๋‹จ์–ด๋ฅผ ํ‘œํ˜„ํ•  ๋ฒกํ„ฐ์˜ ์ฐจ์› (32์ฐจ์›)
    keras.layers.Embedding(input_dim=10000, output_dim=32),
    
    # 2. RNN ์ธต
    # units: ์€๋‹‰ ์ƒํƒœ ๋ฒกํ„ฐ์˜ ์ฐจ์› (32์ฐจ์›)
    keras.layers.SimpleRNN(32),
    
    # 3. ์ตœ์ข… ๋ถ„๋ฅ˜๊ธฐ(Classifier)
    # units: ์ถœ๋ ฅ ๋‰ด๋Ÿฐ์˜ ์ˆ˜ (๊ธ์ •/๋ถ€์ • 1๊ฐœ)
    # activation: ์ถœ๋ ฅ ๊ฐ’์„ 0~1 ์‚ฌ์ด ํ™•๋ฅ ๋กœ ๋ณ€ํ™˜ (์ด์ง„ ๋ถ„๋ฅ˜)
    keras.layers.Dense(1, activation="sigmoid"),
])

# ๋ชจ๋ธ ๊ตฌ์กฐ ์š”์•ฝ ์ถœ๋ ฅ
model.summary()

๋ ˆ์ด์–ด๋ฅผ ์ž์„ธํžˆ ๋“ค์–ด๋‹ค ๋ด…์‹œ๋‹ค.

  • ์ž„๋ฒ ๋”ฉ ์ธต(Embedding)
keras.layers.Embedding(input_dim=10000, output_dim=32)

์ปดํ“จํ„ฐ๋Š” '์˜ํ™”', '์žฌ๋ฏธ' ๊ฐ™์€ ๋‹จ์–ด๋ฅผ ์ง์ ‘ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
Embedding ์ธต์€ ๊ฐ ๋‹จ์–ด์— ๋ถ€์—ฌ๋œ ๊ณ ์œ ํ•œ ์ •์ˆ˜ ์ธ๋ฑ์Šค๋ฅผ output_dim ์ฐจ์›์˜ ์˜๋ฏธ๋ก ์  ๋ฒกํ„ฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
์ด ๊ณผ์ •์—์„œ '์Šฌํ””'๊ณผ '๋น„๊ทน' ๊ฐ™์€ ๋‹จ์–ด๋“ค์€ ๋ฒกํ„ฐ ๊ณต๊ฐ„์ƒ์—์„œ ๊ฐ€๊นŒ์šด ์œ„์น˜์—, 'ํ–‰๋ณต'๊ณผ๋Š” ๋จผ ์œ„์น˜์— ํ‘œํ˜„๋˜๋„๋ก ํ•™์Šต๋ฉ๋‹ˆ๋‹ค.

  • ์ˆœํ™˜ ๊ณ„์ธต(SimpleRNN)
keras.layers.SimpleRNN(32),

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

  • ์™„์ „ ์—ฐ๊ฒฐ ๊ณ„์ธต(Dense)
keras.layers.Dense(1, activation="sigmoid")

์ตœ์ข… ์€๋‹‰ ์ƒํƒœ ๋ฒกํ„ฐ๋ฅผ ๋ฐ›์•„, ๋ฆฌ๋ทฐ๊ฐ€ ๊ธ์ •(1์— ๊ฐ€๊นŒ์šด ๊ฐ’)์ธ์ง€ ๋ถ€์ •(0์— ๊ฐ€๊นŒ์šด ๊ฐ’)์ธ์ง€ ์ตœ์ข… ํŒ๋‹จ์„ ๋‚ด๋ฆฝ๋‹ˆ๋‹ค. model.summary()๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜ ๊ณ„์‚ฐ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ์œ„ ์ฝ”๋“œ์—์„œ model.summary()๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 embedding (Embedding)       (None, None, 32)          320000    
                                                                 
 simple_rnn (SimpleRNN)      (None, 32)                2080      
                                                                 
 dense (Dense)               (None, 1)                 33        
                                                                 
=================================================================
Total params: 322,113
Trainable params: 322,113
Non-trainable params: 0
_________________________________________________________________

๊ฐ ์ธต์˜ ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๋Š” ์–ด๋–ป๊ฒŒ ๊ณ„์‚ฐ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž๋ฉด,

  1. Embedding: input_dim * output_dim = 10,000 * 32 = 320,000 ๊ฐœ. (1๋งŒ ๊ฐœ ๋‹จ์–ด ๊ฐ๊ฐ์— ๋Œ€ํ•œ 32์ฐจ์› ๋ฒกํ„ฐ)
  2. SimpleRNN:
    • ์ž…๋ ฅ ๊ฐ€์ค‘์น˜(W_xh): input_shape * units = 32 * 32 = 1024
    • ์€๋‹‰ ์ƒํƒœ ๊ฐ€์ค‘์น˜(W_hh): units * units = 32 * 32 = 1024
    • ํŽธํ–ฅ(b_h): units = 32
    • ์ดํ•ฉ: 1024 + 1024 + 32 = 2,080 ๊ฐœ.
  3. Dense: input_shape * units + bias = 32 * 1 + 1 = 33 ๊ฐœ.

์ด์ฒ˜๋Ÿผ summary๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ์˜ ๊ตฌ์กฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ฐ ์ธต์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•™์Šตํ•ด์•ผ ํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์ง์ ‘ RNN ๊ตฌํ˜„ํ•ด ๋ณด๊ธฐ (์‹ค์ „ ์˜ˆ์ œ)

์ด์ œ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰ํ•˜๋ฉฐ ์ง์ ‘ ๋ชจ๋ธ์„ ํ•™์Šต์‹œ์ผœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1๋‹จ๊ณ„ : ๋ฐ์ดํ„ฐ ๋กœ๋“œ ๋ฐ ์ „์ฒ˜๋ฆฌ (ํŒจ๋”ฉ์˜ ์ค‘์š”์„ฑ)
RNN์€ ๊ณ ์ •๋œ ๊ธธ์ด์˜ ์‹œํ€€์Šค๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์˜ํ™” ๋ฆฌ๋ทฐ๋Š” ๊ธธ์ด๊ฐ€ ์ œ๊ฐ๊ฐ์ด๋ฏ€๋กœ, **ํŒจ๋”ฉ(Padding)**์„ ํ†ตํ•ด ๋ชจ๋“  ๋ฆฌ๋ทฐ์˜ ๊ธธ์ด๋ฅผ ๋™์ผํ•˜๊ฒŒ ๋งž์ถฐ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import numpy as np
import tensorflow as tf
from tensorflow import keras
from keras import layers

# ๊ฐ€์žฅ ๋นˆ๋„๊ฐ€ ๋†’์€ 1๋งŒ๊ฐœ ๋‹จ์–ด๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์…‹ ๋กœ๋“œ
(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=10000)

print(f"ํŒจ๋”ฉ ์ „ ์ฒซ ๋ฒˆ์งธ ๋ฆฌ๋ทฐ ๊ธธ์ด: {len(x_train[0])}")

# ๋ชจ๋“  ์‹œํ€€์Šค์˜ ๊ธธ์ด๋ฅผ 256์œผ๋กœ ํ†ต์ผ
# maxlen๋ณด๋‹ค ๊ธธ๋ฉด ์ž˜๋ผ๋‚ด๊ณ , ์งง์œผ๋ฉด ์•ž๋ถ€๋ถ„์„ 0์œผ๋กœ ์ฑ„์›€ (pre-padding)
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=256)
x_test = keras.preprocessing.sequence.pad_sequences(x_test, maxlen=256)

print(f"ํŒจ๋”ฉ ํ›„ ์ฒซ ๋ฒˆ์งธ ๋ฆฌ๋ทฐ ๊ธธ์ด: {len(x_train[0])}")

2๋‹จ๊ณ„ : ๋ชจ๋ธ ์ปดํŒŒ์ผ
๋ชจ๋ธ์„ ์–ด๋–ป๊ฒŒ ํ•™์Šต์‹œํ‚ฌ์ง€ ํ•™์Šต ๋ฐฉ๋ฒ•์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

model.compile(
    # ์†์‹ค ํ•จ์ˆ˜: ์˜ˆ์ธก์ด ์ •๋‹ต๊ณผ ์–ผ๋งˆ๋‚˜ ๋‹ค๋ฅธ์ง€ ์ธก์ •.
    # ์ด์ง„ ๋ถ„๋ฅ˜(0 ๋˜๋Š” 1) ๋ฌธ์ œ์ด๋ฏ€๋กœ binary_crossentropy๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉ.
    loss="binary_crossentropy",
    
    # ์˜ตํ‹ฐ๋งˆ์ด์ €: ์†์‹ค์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋ธ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜.
    # Adam์€ ํ˜„์žฌ ๊ฐ€์žฅ ๋„๋ฆฌ ์“ฐ์ด๊ณ  ์„ฑ๋Šฅ์ด ์ข‹์€ ์˜ตํ‹ฐ๋งˆ์ด์ € ์ค‘ ํ•˜๋‚˜.
    optimizer="adam",
    
    # ํ‰๊ฐ€์ง€ํ‘œ: ํ›ˆ๋ จ ๊ณผ์ •์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ง€ํ‘œ. ์ •ํ™•๋„๋ฅผ ์‚ฌ์šฉ.
    metrics=["accuracy"]
)

3๋‹จ๊ณ„ : ๋ชจ๋ธ ํ•™์Šต ๋ฐ ํ‰๊ฐ€ (๋ฐฐ์น˜, ์—ํฌํฌ, ๊ทธ๋ฆฌ๊ณ  ๊ณผ์ ํ•ฉ)
model.fit() ํ•จ์ˆ˜๋กœ ์‹ค์ œ ํ•™์Šต์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
batch_size: ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•  ๋ฐ์ดํ„ฐ ์ƒ˜ํ”Œ์˜ ์ˆ˜. ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ๊ณผ ํ•™์Šต ์†๋„์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.
epochs: ์ „์ฒด ๋ฐ์ดํ„ฐ์…‹์„ ๋ช‡ ๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ํ•™์Šตํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

batch_size = 128
epochs = 10

# ๋ชจ๋ธ ํ•™์Šต ์‹คํ–‰
# validation_data๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋งค ์—ํฌํฌ๋งˆ๋‹ค ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ์„ฑ๋Šฅ์„ ๊ฒ€์ฆ
history = model.fit(
    x_train, y_train,
    batch_size=batch_size,
    epochs=epochs,
    validation_data=(x_test, y_test)
)

# ํ•™์Šต ์™„๋ฃŒ ํ›„ ์ตœ์ข… ์„ฑ๋Šฅ ํ‰๊ฐ€
score = model.evaluate(x_test, y_test, verbose=0)
print(f"\nTest loss: {score[0]:.4f}")
print(f"Test accuracy: {score[1]:.4f}")

ํ•™์Šต ๊ณผ์ •์„ ์ง€์ผœ๋ณผ ๋•Œ, ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•๋„(accuracy)๋Š” ๊ณ„์† ์˜ค๋ฅด๋Š”๋ฐ ๊ฒ€์ฆ ๋ฐ์ดํ„ฐ์˜ ์ •ํ™•๋„(val_accuracy)๊ฐ€ ์–ด๋А ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์ •์ฒด๋˜๊ฑฐ๋‚˜ ๋–จ์–ด์ง„๋‹ค๋ฉด, ๋ชจ๋ธ์ด ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์—๋งŒ ๊ณผํ•˜๊ฒŒ ์ ์‘ํ•˜๋Š” ๊ณผ์ ํ•ฉ(Overfitting)์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.
์ด๋Ÿด ๋•Œ๋Š”, ๋“œ๋กญ์•„์›ƒ์˜ ๋น„์œจ์„ ๋†’์ด๊ฑฐ๋‚˜ ํ•™์Šต์œจ์„ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

# ๋ชจ๋ธ์˜ ๊ตฌ์กฐ, ๊ฐ€์ค‘์น˜, ํ•™์Šต ์„ค์ •์„ ๋ชจ๋‘ '.keras' ํŒŒ์ผ ํ•˜๋‚˜์— ์ €์žฅ
model.save("my_rnn_model_imdb.keras")

# ์ €์žฅ๋œ ๋ชจ๋ธ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
loaded_model = keras.models.load_model("my_rnn_model_imdb.keras")

5๋‹จ๊ณ„ : ๋‚˜๋งŒ์˜ ๋ฌธ์žฅ์œผ๋กœ ๋ชจ๋ธ ํ…Œ์ŠคํŠธํ•˜๊ธฐ (์‹ค์ „ ์˜ˆ์ธก)
์‹ค์ œ ๋ฌธ์žฅ์„ ์˜ˆ์ธกํ•˜๋ ค๋ฉด, ํ›ˆ๋ จ ๋ฐ์ดํ„ฐ์™€ ๋™์ผํ•œ ์ „์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# IMDB ๋ฐ์ดํ„ฐ์…‹์˜ ๋‹จ์–ด-์ธ๋ฑ์Šค ์‚ฌ์ „ ๋กœ๋“œ
word_index = keras.datasets.imdb.get_word_index()

# ์ƒˆ๋กœ์šด ๋ฆฌ๋ทฐ ๋ฌธ์žฅ
review = "This movie was fantastic and wonderful"

# 1. ์†Œ๋ฌธ์ž ๋ณ€ํ™˜ ๋ฐ ๋‹จ์–ด ๋ถ„๋ฆฌ -> 2. ๋‹จ์–ด ์ธ๋ฑ์Šค๋กœ ๋ณ€ํ™˜
tokens = [word_index.get(word, 2) for word in review.lower().split()]

# 3. ํŒจ๋”ฉ ์ฒ˜๋ฆฌ
padded_tokens = keras.preprocessing.sequence.pad_sequences([tokens], maxlen=256)

# 4. ์˜ˆ์ธก
prediction = loaded_model.predict(padded_tokens)
print(f"๋ฆฌ๋ทฐ: '{review}'")
print(f"๊ธ์ • ํ™•๋ฅ : {prediction[0][0] * 100:.2f}%")
  1. ๋‚˜๋งŒ์˜ RNN ๋ชจ๋ธ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ
    ๊ธฐ๋ณธ RNN๋„ ์ข‹์ง€๋งŒ, ๋” ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

RNN์˜ ์น˜๋ช…์  ์•ฝ์  : ์žฅ๊ธฐ ์˜์กด์„ฑ ๋ฌธ์ œ (Vanishing Gradients)
"๋‚˜๋Š” ํ”„๋ž‘์Šค์—์„œ ํƒœ์–ด๋‚˜ ์ž๋ž๋‹ค. ... (์ค‘๋žต) ... ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ___๋ฅผ ์œ ์ฐฝํ•˜๊ฒŒ ๊ตฌ์‚ฌํ•œ๋‹ค."
๋นˆ์นธ์— ๋“ค์–ด๊ฐˆ ๋ง์€ 'ํ”„๋ž‘์Šค์–ด'์ž…๋‹ˆ๋‹ค.
์‚ฌ๋žŒ์€ ๋ฌธ์žฅ ๋งจ ์•ž์˜ 'ํ”„๋ž‘์Šค'๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๊ธฐ์–ตํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋‹ต์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ RNN์€ ์‹œํ€€์Šค๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๋ก, ์—ญ์ „ํŒŒ ๊ณผ์ •์—์„œ ๊ทธ๋ž˜๋””์–ธํŠธ(๊ธฐ์šธ๊ธฐ)๊ฐ€ ๊ณ„์† ๊ณฑํ•ด์ง€๋ฉด์„œ 0์— ๊ฐ€๊นŒ์›Œ์ ธ ์‚ฌ๋ผ์ง€๋Š” ๊ทธ๋ž˜๋””์–ธํŠธ ์†Œ์‹ค(Vanishing Gradient) ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
์ด๋กœ ์ธํ•ด ๋ฌธ์žฅ ์•ž๋ถ€๋ถ„์˜ ์ค‘์š”ํ•œ ์ •๋ณด๋ฅผ ํ•™์Šตํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ์žฅ๊ธฐ ์˜์กด์„ฑ ๋ฌธ์ œ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ, ์ง€๊ธˆ ํ—ˆ๊น…ํŽ˜์ด์Šค์— ์˜ฌ๋ผ๊ฐ€์™€ ์žˆ๋Š” RNN ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด ๋ณด๋ฉด,
ํŽธํ–ฅ๋˜์–ด ํ•œ๊ฐ€์ง€ ๋ผ๋ฒจ๋งŒ ๊ณ„์† ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
์ด ๋ชจ์Šต์ด RNN์˜ ํ•œ๊ณ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š”๋ฐ์š”,
๋ฐ”๋กœ ์•ž์„œ ์„ค๋ช…ํ•œ ์žฅ๊ธฐ์˜์กด์„ฑ, ๊ธฐ์šธ๊ธฐ ์†Œ์‹ค ๋ฌธ์ œ ์ž…๋‹ˆ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ตฌ์กฐ๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์–ต๋ ฅ ๊ฐ•ํ™” : LSTM๊ณผ GRU์˜ ๋“ฑ์žฅ
์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด **LSTM(Long Short-Term Memory)**๊ณผ **GRU(Gated Recurrent Unit)**๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด๋“ค์€ RNN ๋‚ด๋ถ€์— **๊ฒŒ์ดํŠธ(Gate)**๋ผ๋Š” ์ •๊ตํ•œ ์žฅ์น˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ •๋ณด์˜ ํ๋ฆ„์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

  • LSTM: '์…€ ์ƒํƒœ(Cell State)'๋ผ๋Š” ๋ณ„๋„์˜ ๊ธฐ์–ต ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๋ฅผ ๋‘๊ณ , ๋ง๊ฐ ๊ฒŒ์ดํŠธ(Forget Gate), ์ž…๋ ฅ ๊ฒŒ์ดํŠธ(Input Gate), ์ถœ๋ ฅ ๊ฒŒ์ดํŠธ(Output Gate) 3๊ฐœ์˜ ๊ฒŒ์ดํŠธ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์ •๋ณด๋ฅผ ๋ฒ„๋ฆฌ๊ณ , ์–ด๋–ค ์ •๋ณด๋ฅผ ์ƒˆ๋กœ ๊ธฐ์–ตํ•˜๊ณ , ์–ด๋–ค ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ• ์ง€ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.
    ์žฅ๊ธฐ ๊ธฐ์–ต์— ๋งค์šฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.
  • GRU: LSTM์„ ๋” ๋‹จ์ˆœํ™”ํ•œ ๋ชจ๋ธ๋กœ, **๋ฆฌ์…‹ ๊ฒŒ์ดํŠธ(Reset Gate)**์™€ ์—…๋ฐ์ดํŠธ ๊ฒŒ์ดํŠธ(Update Gate) 2๊ฐœ์˜ ๊ฒŒ์ดํŠธ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    ํŒŒ๋ผ๋ฏธํ„ฐ ์ˆ˜๊ฐ€ ์ ์–ด ๊ณ„์‚ฐ ํšจ์œจ์„ฑ์ด ๋†’๊ณ , ๋งŽ์€ ๊ฒฝ์šฐ LSTM๊ณผ ๋น„์Šทํ•œ ์„ฑ๋Šฅ์„ ๋ณด์ž…๋‹ˆ๋‹ค.
# LSTM์„ 2๊ฐœ ์ธต์œผ๋กœ ์Œ“์€ ๋ชจ๋ธ
model_lstm = keras.Sequential([
    layers.Embedding(input_dim=10000, output_dim=64),
    # return_sequences=True: ๋‹ค์Œ LSTM ์ธต์œผ๋กœ ์ „์ฒด ์‹œํ€€์Šค๋ฅผ ์ „๋‹ฌ
    layers.LSTM(64, return_sequences=True), 
    layers.LSTM(32),
    layers.Dense(1, activation='sigmoid')
])

๊ณผ๊ฑฐ์™€ ๋ฏธ๋ž˜๋ฅผ ๋™์‹œ์— : ์–‘๋ฐฉํ–ฅ RNN (Bidirectional RNN)
"์˜ค๋Š˜ ์ƒˆ๋กœ ์˜จ ___ ์„ ์ƒ๋‹˜์€ ์ •๋ง ๋ฉ‹์ง€๋‹ค."
๋นˆ์นธ์— ๋“ค์–ด๊ฐˆ '์˜์–ด'๋ผ๋Š” ๋‹จ์–ด๋Š” ๋’ท๋ถ€๋ถ„์˜ '์„ ์ƒ๋‹˜'์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋ด์•ผ ๋” ์ •ํ™•ํžˆ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด์ฒ˜๋Ÿผ ๋ฌธ๋งฅ์€ ์ˆœ๋ฐฉํ–ฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ญ๋ฐฉํ–ฅ์˜ ์ •๋ณด๋„ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
**์–‘๋ฐฉํ–ฅ RNN(Bidirectional RNN)**์€ ์‹œํ€€์Šค๋ฅผ ์ •๋ฐฉํ–ฅ์œผ๋กœ ํ•œ๋ฒˆ, ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ํ•œ๋ฒˆ ๋…๋ฆฝ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ ํ›„, ๋‘ ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ณ์„œ ์ตœ์ข… ์ถœ๋ ฅ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ๋ฌธ๋งฅ์„ ํ›จ์”ฌ ๋” ํ’๋ถ€ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

model_bidirectional = keras.Sequential([
    layers.Embedding(input_dim=10000, output_dim=64),
    # LSTM ๋ ˆ์ด์–ด๋ฅผ Bidirectional ๋ž˜ํผ๋กœ ๊ฐ์‹ธ๊ธฐ๋งŒ ํ•˜๋ฉด ๋จ
    layers.Bidirectional(layers.LSTM(64)),
    layers.Dropout(0.5), # ๊ณผ์ ํ•ฉ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๋“œ๋กญ์•„์›ƒ ์ถ”๊ฐ€
    layers.Dense(1, activation='sigmoid')
])

5. ๊ฒฐ๋ก 

์˜ค๋Š˜์€ ์ˆœ์ฐจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์˜ ๊ทผ๊ฐ„์ด ๋˜๋Š” RNN์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ, ์‹ค์ œ ์ฝ”๋“œ๋กœ ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•˜๊ณ , LSTM, GRU, ์–‘๋ฐฉํ–ฅ RNN๊ณผ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€ ์ƒ์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.
RNN์€ ๊ทธ ์ž์ฒด๋กœ๋„ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ ๋ถ„์•ผ์˜ ๋ฐœ์ „์— ์—„์ฒญ๋‚œ ๊ธฐ์—ฌ๋ฅผ ํ•œ ๊ธฐ๋…๋น„์ ์ธ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.
ํŠนํžˆ RNN์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๋ ค๋Š” ์‹œ๋„ ์†์—์„œ ํƒ„์ƒํ•œ ์–ดํ…์…˜(Attention) ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ดํ›„ **ํŠธ๋žœ์Šคํฌ๋จธ(Transformer)**๋ผ๋Š” ํ˜์‹ ์ ์ธ ๋ชจ๋ธ์˜ ๊ธฐ๋ฐ˜์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์—๋Š” ์˜ค๋Š˜ ์งง๊ฒŒ ์•Œ์•„๋ณธ LSTM๊ณผ GRU๋กœ ๋Œ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค!!
์˜ค๋Š˜๋„ ์ข‹์€ํ•˜๋ฃจ ๋ณด๋‚ด์„ธ์š”!!

Downloads last month
42
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support