|
|
--- |
|
|
license: apache-2.0 |
|
|
--- |
|
|
|
|
|
์๋
ํ์ธ์ 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์ ์๊ฐ์ ๋ฐ๋ผ ํผ์ณ๋ณด๊ธฐ** |
|
|
์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์๊ฐ์ ๋ฐ๋ผ ๋คํธ์ํฌ๋ฅผ ๊ธธ๊ฒ ํผ์ณ์ ํํํ๋ฉด, ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. |
|
|
```markdown |
|
|
์๊ฐ ํ๋ฆ โโโโถ |
|
|
์
๋ ฅ ์ํ์ค: 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 ๋ชจ๋ธ์
๋๋ค. |
|
|
|
|
|
```python |
|
|
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)** |
|
|
```python |
|
|
keras.layers.Embedding(input_dim=10000, output_dim=32) |
|
|
``` |
|
|
์ปดํจํฐ๋ '์ํ', '์ฌ๋ฏธ' ๊ฐ์ ๋จ์ด๋ฅผ ์ง์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. |
|
|
Embedding ์ธต์ ๊ฐ ๋จ์ด์ ๋ถ์ฌ๋ ๊ณ ์ ํ ์ ์ ์ธ๋ฑ์ค๋ฅผ output_dim ์ฐจ์์ ์๋ฏธ๋ก ์ ๋ฒกํฐ๋ก ๋ณํํฉ๋๋ค. |
|
|
์ด ๊ณผ์ ์์ '์ฌํ'๊ณผ '๋น๊ทน' ๊ฐ์ ๋จ์ด๋ค์ ๋ฒกํฐ ๊ณต๊ฐ์์์ ๊ฐ๊น์ด ์์น์, 'ํ๋ณต'๊ณผ๋ ๋จผ ์์น์ ํํ๋๋๋ก ํ์ต๋ฉ๋๋ค. |
|
|
|
|
|
- **์ํ ๊ณ์ธต(SimpleRNN)** |
|
|
```python |
|
|
keras.layers.SimpleRNN(32), |
|
|
``` |
|
|
์ด ์ธต์ด ์ํ ์ ๊ฒฝ๋ง์ ๋ณธ์ฒด์
๋๋ค. |
|
|
์
๋ ฅ๋ ๋จ์ด ์๋ฒ ๋ฉ ๋ฒกํฐ ์ํ์ค๋ฅผ ์์๋๋ก ํ๋์ฉ ์ฒ๋ฆฌํ๋ฉฐ ์๋ ์ํ๋ฅผ ๊ณ์ํด์ ์
๋ฐ์ดํธํฉ๋๋ค. |
|
|
๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ง๋ง ๋จ์ด๊น์ง ์ฒ๋ฆฌํ ํ์ ์ต์ข
์๋ ์ํ๋ง์ ๋ค์ ์ธต์ผ๋ก ์ ๋ฌํฉ๋๋ค. |
|
|
์ด ์ต์ข
์๋ ์ํ ๋ฒกํฐ๋ ์ ์ฒด ๋ฌธ์ฅ์ ๋ฌธ๋งฅ์ ์์ถํ ๊ฒฐ๊ณผ๋ฌผ์
๋๋ค. |
|
|
|
|
|
- **์์ ์ฐ๊ฒฐ ๊ณ์ธต(Dense)** |
|
|
```python |
|
|
keras.layers.Dense(1, activation="sigmoid") |
|
|
``` |
|
|
์ต์ข
์๋ ์ํ ๋ฒกํฐ๋ฅผ ๋ฐ์, ๋ฆฌ๋ทฐ๊ฐ ๊ธ์ (1์ ๊ฐ๊น์ด ๊ฐ)์ธ์ง ๋ถ์ (0์ ๊ฐ๊น์ด ๊ฐ)์ธ์ง ์ต์ข
ํ๋จ์ ๋ด๋ฆฝ๋๋ค. |
|
|
model.summary()๋ก ํ๋ผ๋ฏธํฐ ์ ๊ณ์ฐ ์๋ฆฌ ์ดํดํ๊ธฐ์ ์ฝ๋์์ model.summary()๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค. |
|
|
|
|
|
```bash |
|
|
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)**์ ํตํด ๋ชจ๋ ๋ฆฌ๋ทฐ์ ๊ธธ์ด๋ฅผ ๋์ผํ๊ฒ ๋ง์ถฐ์ค์ผ ํฉ๋๋ค. |
|
|
```python |
|
|
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๋จ๊ณ : ๋ชจ๋ธ ์ปดํ์ผ** |
|
|
๋ชจ๋ธ์ ์ด๋ป๊ฒ ํ์ต์ํฌ์ง ํ์ต ๋ฐฉ๋ฒ์ ์ค์ ํฉ๋๋ค. |
|
|
```python |
|
|
model.compile( |
|
|
# ์์ค ํจ์: ์์ธก์ด ์ ๋ต๊ณผ ์ผ๋ง๋ ๋ค๋ฅธ์ง ์ธก์ . |
|
|
# ์ด์ง ๋ถ๋ฅ(0 ๋๋ 1) ๋ฌธ์ ์ด๋ฏ๋ก binary_crossentropy๊ฐ ๊ฐ์ฅ ์ ํฉ. |
|
|
loss="binary_crossentropy", |
|
|
|
|
|
# ์ตํฐ๋ง์ด์ : ์์ค์ ์ต์ํํ๊ธฐ ์ํด ๋ชจ๋ธ์ ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํ๋ ์๊ณ ๋ฆฌ์ฆ. |
|
|
# Adam์ ํ์ฌ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๊ณ ์ฑ๋ฅ์ด ์ข์ ์ตํฐ๋ง์ด์ ์ค ํ๋. |
|
|
optimizer="adam", |
|
|
|
|
|
# ํ๊ฐ์งํ: ํ๋ จ ๊ณผ์ ์ ๋ชจ๋ํฐ๋งํ ์งํ. ์ ํ๋๋ฅผ ์ฌ์ฉ. |
|
|
metrics=["accuracy"] |
|
|
) |
|
|
``` |
|
|
|
|
|
**3๋จ๊ณ : ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ (๋ฐฐ์น, ์ํฌํฌ, ๊ทธ๋ฆฌ๊ณ ๊ณผ์ ํฉ)** |
|
|
model.fit() ํจ์๋ก ์ค์ ํ์ต์ ์์ํฉ๋๋ค. |
|
|
batch_size: ํ ๋ฒ์ ์ฒ๋ฆฌํ ๋ฐ์ดํฐ ์ํ์ ์. ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ๊ณผ ํ์ต ์๋์ ์ํฅ์ ์ค๋๋ค. |
|
|
epochs: ์ ์ฒด ๋ฐ์ดํฐ์
์ ๋ช ๋ฒ ๋ฐ๋ณตํ์ฌ ํ์ตํ ์ง ๊ฒฐ์ ํฉ๋๋ค. |
|
|
|
|
|
```python |
|
|
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๋จ๊ณ : ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ ๋ฐ ์ฌ์ฌ์ฉ** |
|
|
ํ์ต์ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋ชจ๋ธ์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด๋๊ณ ํ์ํ ๋๋ง๋ค ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์
๋๋ค. |
|
|
|
|
|
```python |
|
|
# ๋ชจ๋ธ์ ๊ตฌ์กฐ, ๊ฐ์ค์น, ํ์ต ์ค์ ์ ๋ชจ๋ '.keras' ํ์ผ ํ๋์ ์ ์ฅ |
|
|
model.save("my_rnn_model_imdb.keras") |
|
|
|
|
|
# ์ ์ฅ๋ ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ |
|
|
loaded_model = keras.models.load_model("my_rnn_model_imdb.keras") |
|
|
``` |
|
|
|
|
|
**5๋จ๊ณ : ๋๋ง์ ๋ฌธ์ฅ์ผ๋ก ๋ชจ๋ธ ํ
์คํธํ๊ธฐ (์ค์ ์์ธก)** |
|
|
์ค์ ๋ฌธ์ฅ์ ์์ธกํ๋ ค๋ฉด, ํ๋ จ ๋ฐ์ดํฐ์ ๋์ผํ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํฉ๋๋ค. |
|
|
|
|
|
```python |
|
|
# 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}%") |
|
|
``` |
|
|
|
|
|
4. ๋๋ง์ 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๊ณผ ๋น์ทํ ์ฑ๋ฅ์ ๋ณด์
๋๋ค. |
|
|
|
|
|
```python |
|
|
# 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)**์ ์ํ์ค๋ฅผ ์ ๋ฐฉํฅ์ผ๋ก ํ๋ฒ, ์ญ๋ฐฉํฅ์ผ๋ก ํ๋ฒ ๋
๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํ ํ, ๋ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ์ ์ต์ข
์ถ๋ ฅ์ ๋ง๋ญ๋๋ค. |
|
|
์ด๋ฅผ ํตํด ๋ฌธ๋งฅ์ ํจ์ฌ ๋ ํ๋ถํ๊ฒ ์ดํดํ ์ ์์ต๋๋ค. |
|
|
|
|
|
```python |
|
|
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๋ก ๋์์ค๊ฒ ์ต๋๋ค!! |
|
|
์ค๋๋ ์ข์ํ๋ฃจ ๋ณด๋ด์ธ์!! |