Fixed
Browse files
README.md
CHANGED
|
@@ -1,332 +1,332 @@
|
|
| 1 |
-
---
|
| 2 |
-
license: apache-2.0
|
| 3 |
-
---
|
| 4 |
-
|
| 5 |
-
์๋
ํ์ธ์ Oneclick AI ์
๋๋ค!!
|
| 6 |
-
์ค๋์, RNN(์ํ ์ ๊ฒฝ๋ง, Recurrent Neural Network) ๋ชจ๋ธ์ ๋ํด์ ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ๊น ํฉ๋๋ค.
|
| 7 |
-
|
| 8 |
-
๋ฅ๋ฌ๋์ด ๋ฌธ์ฅ, ์์ฑ, ์ฃผ๊ฐ ์์ธก๊ณผ ๊ฐ์ ์์๊ฐ ์๋ ๋ฐ์ดํฐ(Sequential Data)๋ฅผ ๋ค๋ฃฐ ์ ์๊ฒ ๋ ๊ฒ์ ์ ์ ์ผ๋ก RNN ๋๋ถ์
๋๋ค.
|
| 9 |
-
๋จ์ํ ์ ๊ฒฝ๋ง์ด '์์'๋ผ๋ ๊ฐ๋
์ ์ดํดํ์ง ๋ชปํ๋ ๋ฐ๋ฉด,
|
| 10 |
-
RNN์ ๋ง์น ์ฌ๋์ฒ๋ผ ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ , ๋ค์์ ์์ธกํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค.
|
| 11 |
-
|
| 12 |
-
์ค๋์ ์ด RNN์ด๋ผ๋ ์ ๊ฒฝ๋ง์ด ์ด๋ป๊ฒ ๊ณผ๊ฑฐ์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๋ฉฐ ์๋ํ๋์ง,
|
| 13 |
-
๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ๋ฌธ์ฅ์ ์จ๊ฒจ์ง ๋ฌธ๋งฅ๊ณผ ์๋ฏธ๋ฅผ ํ์
ํ ์ ์๋์ง ์์๋ด
์๋ค.
|
| 14 |
-
|
| 15 |
-
---
|
| 16 |
-
|
| 17 |
-
## ๋ชฉ์ฐจ
|
| 18 |
-
1. RNN ํต์ฌ ์๋ฆฌ ํ์
ํ๊ธฐ
|
| 19 |
-
- ์ ์์ฐจ ๋ฐ์ดํฐ์ RNN์ ์ฌ์ฉํด์ผ๋ง ํ ๊น?
|
| 20 |
-
- RNN์ ์ฌ์ฅ : ์ํ ๊ตฌ์กฐ์ ์๋ ์ํ์ ์ญํ
|
| 21 |
-
- RNN์ ์๊ฐ์ ๋ฐ๋ผ ํผ์ณ๋ณด๊ธฐ
|
| 22 |
-
- RNN์ ์ฃผ์ ๊ตฌ์ฑ ์์ ์์ธ ๋ถ์
|
| 23 |
-
2. ์ํคํ
์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ
|
| 24 |
-
- Keras๋ก ๊ตฌํํ RNN ๋ชจ๋ธ ์ํคํ
์ฒ
|
| 25 |
-
- model.summary()๋ก ๊ตฌ์กฐ ํ์ธํ๊ธฐ
|
| 26 |
-
3. ์ง์ RNN ๊ตฌํํด ๋ณด๊ธฐ
|
| 27 |
-
- 1๋จ๊ณ : ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ
|
| 28 |
-
- 2๋จ๊ณ : ๋ชจ๋ธ ์ปดํ์ผ
|
| 29 |
-
- 3๋จ๊ณ : ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ
|
| 30 |
-
- 4๋จ๊ณ : ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ ๋ฐ ์ฌ์ฌ์ฉ
|
| 31 |
-
- 5๋จ๊ณ : ๋๋ง์ ๋ฌธ์ฅ์ผ๋ก ๋ชจ๋ธ ํ
์คํธํ๊ธฐ
|
| 32 |
-
4. ๋๋ง์ RNN ๋ชจ๋ธ ์
๊ทธ๋ ์ด๋ํ๊ธฐ
|
| 33 |
-
- ๊ธฐ์ด ์ฒด๋ ฅ ํ๋ จ : ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋
|
| 34 |
-
- RNN์ ์น๋ช
์ ์ฝ์ : ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์
|
| 35 |
-
- ๊ธฐ์ต๋ ฅ ๊ฐํ : LSTM๊ณผ GRU์
|
| 36 |
-
- ๊ณผ๊ฑฐ์ ๋ฏธ๋๋ฅผ ๋์์ : ์๋ฐฉํฅ RNN
|
| 37 |
-
5. ๊ฒฐ๋ก
|
| 38 |
-
---
|
| 39 |
-
|
| 40 |
-
## 1. RNN ํต์ฌ์๋ฆฌ ํ์
ํ๊ธฐ
|
| 41 |
-
๊ฐ์ฅ ๋จผ์ , RNN์ด ์ ์์ฐจ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ดํดํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์ธ์ง ๊ทธ ๊ทผ๋ณธ์ ์ธ ์ด์ ๋ถํฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
|
| 42 |
-
|
| 43 |
-
**์ ์์ฐจ ๋ฐ์ดํฐ์ RNN์ ์ฌ์ฉํ ๊น?? with MLP, CNN์ ํ๊ณ**
|
| 44 |
-
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ๊ฒฝ๋ง์ธ MLP(๋ค์ธต ํผ์
ํธ๋ก )์ "๋๋ ํ๊ต์ ๊ฐ๋ค"๋ผ๋ ๋ฌธ์ฅ์ ์
๋ ฅํ๋ค๊ณ ์์ํด ๋ด
์๋ค.
|
| 45 |
-
MLP๋ ๊ฐ ๋จ์ด๋ฅผ ๋
๋ฆฝ์ ์ธ ํน์ง์ผ๋ก ๋ณด๊ธฐ ๋๋ฌธ์, "ํ๊ต์ ๋๋ ๊ฐ๋ค"๋ผ๋ ๋ฌธ์ฅ๊ณผ ๊ฑฐ์ ๋์ผํ๊ฒ ๋ฐ์๋ค์
๋๋ค.
|
| 46 |
-
๋จ์ด์ '์์'๊ฐ ๊ฐ์ง ์ค์ํ ์๋ฏธ, ์ฆ ๋ฌธ๋งฅ์ ์์ ํ ์์ด๋ฒ๋ฆฌ๋ ๊ฒ์
๋๋ค.
|
| 47 |
-
์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ํนํ๋ CNN ์ญ์ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
|
| 48 |
-
CNN์ ๊ณต๊ฐ์ ์ธ ํน์ง(ํฝ์
์ฃผ๋ณ ๊ด๊ณ)์ ์ถ์ถํ๋ ๋ฐ๋ ๋ฐ์ด๋์ง๋ง, ์๊ฐ์ ์ธ ์์๋ ํ๋ฆ์ ํ์
ํ๋๋ก ์ค๊ณ๋์ง ์์์ต๋๋ค.
|
| 49 |
-
๋ฐ๋ฉด, RNN์ ์ค๊ณ ์์ฒด๊ฐ '์์'๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค.
|
| 50 |
-
์ด์ ๋จ๊ณ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋จ๊ณ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฌ์ฉํ๋ '์ํ' ๊ตฌ์กฐ๋ฅผ ํตํด, ๋ง์น ์ฐ๋ฆฌ๊ฐ ๋ฌธ์ฅ์ ์์์๋ถํฐ ์ฐจ๋ก๋ก ์ฝ์ผ๋ฉฐ ๋ด์ฉ์ ๋จธ๋ฆฟ์์ ์ถ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
|
| 51 |
-
|
| 52 |
-
**RNN์ ์ฌ์ฅ : ์ํ ๊ตฌ์กฐ์ ์๋ ์ํ์ ์ญํ**
|
| 53 |
-
RNN์ ํต์ฌ ์์ด๋์ด๋ ๋ฐ๋ก ์ํ ๊ตฌ์กฐ(Recurrent Structure)์ ์๋ ์ํ(Hidden State) ์
๋๋ค.
|
| 54 |
-
- ์ํ ๊ตฌ์กฐ(Recurrent Structure)
|
| 55 |
-
์ ๊ฒฝ๋ง ๋ด๋ถ์ '๋ฃจํ'๊ฐ ์กด์ฌํ์ฌ, ์ ๋ณด๊ฐ ๊ณ์ํด์ ์ํํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋งํฉ๋๋ค.
|
| 56 |
-
๊ฐ ํ์์คํ
$t$์์ ๋ชจ๋ธ์ ์
๋ ฅ $x_t$์ ์ด์ ํ์์คํ
์ ์ ๋ณด ์์ฝ๋ณธ์ธ $h_{t-1}$์ ํจ๊ป ๋ฐ์ ์ฒ๋ฆฌํฉ๋๋ค.
|
| 57 |
-
|
| 58 |
-
- ์๋ ์ํ(Hidden State, $h_t$)
|
| 59 |
-
์๋ ์ํ๋ '๋ฉ๋ชจ๋ฆฌ' ๋๋ '๋ฌธ๋งฅ ๋ฒกํฐ'๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, RNN์ ๋ชจ๋ ๊ฒ์ ๋ด๊ณ ์์ต๋๋ค.
|
| 60 |
-
ํน์ ํ์์คํ
t์์์ ์๋ ์ํ $h_t$๋ ๋ค์๊ณผ ๊ฐ์ ์์์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค.
|
| 61 |
-
$h_t=tanh(W_hhh_tโ1+W_xhx_t+b_h)$์ฌ๊ธฐ์ $W_hh$, $W_{xh}$๋ ํ์ต์ ํตํด ์ต์ ํ๋๋ ๊ฐ์ค์น ํ๋ ฌ์ด๋ฉฐ, $b_h$๋ ํธํฅ์
๋๋ค.
|
| 62 |
-
์ค์ํ ์ ์ ๋ชจ๋ ํ์์คํ
์์ ๋์ผํ ๊ฐ์ค์น($W$)์ ํธํฅ($b$)์ด ๊ณต์ ๋๋ค๋ ๊ฒ์
๋๋ค.
|
| 63 |
-
์ด๋ ๋ชจ๋ธ์ด ์๊ฐ๊ณผ ๊ด๊ณ์์ด ์ผ๊ด๋ ํจํด์ ํ์ตํ๊ฒ ํ๋ฉฐ, ํ๋ผ๋ฏธํฐ ์๋ฅผ ํฌ๊ฒ ์ค์ฌ์ค๋๋ค.
|
| 64 |
-
tanh์ ๊ฐ์ ํ์ฑํ ํจ์๋ ๊ณ์ฐ๋ ๊ฐ์ ํน์ ๋ฒ์(-1์์ 1 ์ฌ์ด)๋ก ์์ถํ๋ ์ญํ ์ ํฉ๋๋ค.
|
| 65 |
-
|
| 66 |
-
**RNN์ ์๊ฐ์ ๋ฐ๋ผ ํผ์ณ๋ณด๊ธฐ**
|
| 67 |
-
์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์๊ฐ์ ๋ฐ๋ผ ๋คํธ์ํฌ๋ฅผ ๊ธธ๊ฒ ํผ์ณ์ ํํํ๋ฉด, ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
|
| 68 |
-
```markdown
|
| 69 |
-
์๊ฐ ํ๋ฆ โโโโถ
|
| 70 |
-
์
๋ ฅ ์ํ์ค: xโ xโ xโ ... xโ
|
| 71 |
-
โ โ โ โ
|
| 72 |
-
โโโโโโ โโโโโโ โโโโโโ ... โโโโโโ
|
| 73 |
-
hโ โโโโถ โRNN โโถโRNN โโถโRNN โ โถ ... โถโRNN โ
|
| 74 |
-
โโโโโโ โโโโโโ โโโโโโ โโโโโโ
|
| 75 |
-
โ โ โ โ
|
| 76 |
-
โผ โผ โผ โผ
|
| 77 |
-
hโ hโ hโ hโ
|
| 78 |
-
```
|
| 79 |
-
RNN์ ๋ด๋ถ์ ์ผ๋ก **๊ฐ์ ์
** ์ ๋งค ์์ ๋ง๋ค ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ ๊ตฌ์กฐ ์
๋๋ค.
|
| 80 |
-
ํผ์ณ์ ๋ณด๋ฉด, ์ ๊ทธ๋ฆผ์ฒ๋ผ ํ๋์ RNN์
์ด ์๊ฐ์ด ํ๋ฆ์ ๋ฐ๋ผ ์ฌ๋ฌ ๋ฒ ๋ณต์ ๋ ๊ฒ ์ฒ๋ผ ๋ณด์
๋๋ค.
|
| 81 |
-
์์๋๋ก ๋ณด์๋ฉด,
|
| 82 |
-
1. ๊ฐ ์์ ์ $X_t$๊ฐ RNN ์
์ ๋ค์ด๊ฐ๊ณ ,
|
| 83 |
-
2. ์ด์ ์์ ์ ์์ ์ํ์ $h_(t^-1)$๋ ํจ๊ป ๋ค์ด๊ฐ์,
|
| 84 |
-
3. ์๋ก์ด ์๋์ํ $h_t$๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
|
| 85 |
-
4. ์ด $h_t$๋ ๋ค์ ์์ ์ผ๋ก ์ ๋ฌ๋์ด ๋ฉ๋ชจ๋ฆฌ ์ญํ ์ ํฉ๋๋ค.
|
| 86 |
-
|
| 87 |
-
์ ๊ทธ๋ฆผ ์ ์ฌ๋ฌ ์
์ ๊ฐ์ RNN ์
์ ์๊ฐ์ ๋ฐ๋ผ ๋ณต์ ํ ๊ฒ์ด๊ณ , ๋ชจ๋ ์
์ ๊ฐ์ค์น๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์์ ์ด ๋ฌ๋ผ๋ ๊ฐ์ ๊ท์น์ผ๋ก ๊ณ์ฐ์ด ์ด๋ฃจ์ด ์ง๋๋ค.
|
| 88 |
-
|
| 89 |
-
๋ณด์ถฉ์ค๋ช
ํ์๋ฉด,
|
| 90 |
-
`๋๋ ํ๊ต์ ๊ฐ๋ค`
|
| 91 |
-
๋ฅผ ์
๋ ฅํ๋ฉด,
|
| 92 |
-
$X_1$์ด ๋๋, $X_2$๊ฐ ํ๊ต์, $X_3$ ๊ฐ ๊ฐ๋ค๊ฐ ๋๋ฉด์ ์๊ฐ์ ๋ฐ๋ฅธ ์ฐ์ฐ์ด ์ด๋ฃจ์ด ์ง๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
|
| 93 |
-
|
| 94 |
-
## 2. ์ํคํ
์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ
|
| 95 |
-
์ด์ ์ด๋ก ์ ๋ฐํ์ผ๋ก, TensorFlow Keras ๋ฅผ ํตํด ์ง์ RNN์ ๊ตฌํํด ๋ด
์๋ค.
|
| 96 |
-
Keras๋ก ๊ตฌํํ RNN ๋ชจ๋ธ ์ํคํ
์ฒ ์ฌ์ธต ๋ถ์๋ค์์ IMDB ์ํ ๋ฆฌ๋ทฐ ๊ฐ์ฑ ๋ถ์์ ์ํ ๊ฐ๋จํ RNN ๋ชจ๋ธ์
๋๋ค.
|
| 97 |
-
|
| 98 |
-
```python
|
| 99 |
-
import tensorflow as tf
|
| 100 |
-
from tensorflow import keras
|
| 101 |
-
|
| 102 |
-
# ๋ชจ๋ธ ์ํคํ
์ฒ ์ ์
|
| 103 |
-
model = keras.Sequential([
|
| 104 |
-
# 1. ๋จ์ด ์๋ฒ ๋ฉ ์ธต
|
| 105 |
-
# input_dim: ์ ์ฒด ๋จ์ด ์งํฉ์ ํฌ๊ธฐ (๊ฐ์ฅ ๋น๋ฒํ 1๋ง๊ฐ ๋จ์ด)
|
| 106 |
-
# output_dim: ๊ฐ ๋จ์ด๋ฅผ ํํํ ๋ฒกํฐ์ ์ฐจ์ (32์ฐจ์)
|
| 107 |
-
keras.layers.Embedding(input_dim=10000, output_dim=32),
|
| 108 |
-
|
| 109 |
-
# 2. RNN ์ธต
|
| 110 |
-
# units: ์๋ ์ํ ๋ฒกํฐ์ ์ฐจ์ (32์ฐจ์)
|
| 111 |
-
keras.layers.SimpleRNN(32),
|
| 112 |
-
|
| 113 |
-
# 3. ์ต์ข
๋ถ๋ฅ๊ธฐ(Classifier)
|
| 114 |
-
# units: ์ถ๋ ฅ ๋ด๋ฐ์ ์ (๊ธ์ /๋ถ์ 1๊ฐ)
|
| 115 |
-
# activation: ์ถ๋ ฅ ๊ฐ์ 0~1 ์ฌ์ด ํ๋ฅ ๋ก ๋ณํ (์ด์ง ๋ถ๋ฅ)
|
| 116 |
-
keras.layers.Dense(1, activation="sigmoid"),
|
| 117 |
-
])
|
| 118 |
-
|
| 119 |
-
# ๋ชจ๋ธ ๊ตฌ์กฐ ์์ฝ ์ถ๋ ฅ
|
| 120 |
-
model.summary()
|
| 121 |
-
```
|
| 122 |
-
๋ ์ด์ด๋ฅผ ์์ธํ ๋ค์ด๋ค ๋ด
์๋ค.
|
| 123 |
-
|
| 124 |
-
- **์๋ฒ ๋ฉ ์ธต(Embedding)**
|
| 125 |
-
```python
|
| 126 |
-
keras.layers.Embedding(input_dim=10000, output_dim=32)
|
| 127 |
-
```
|
| 128 |
-
์ปดํจํฐ๋ '์ํ', '์ฌ๋ฏธ' ๊ฐ์ ๋จ์ด๋ฅผ ์ง์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
|
| 129 |
-
Embedding ์ธต์ ๊ฐ ๋จ์ด์ ๋ถ์ฌ๋ ๊ณ ์ ํ ์ ์ ์ธ๋ฑ์ค๋ฅผ output_dim ์ฐจ์์ ์๋ฏธ๋ก ์ ๋ฒกํฐ๋ก ๋ณํํฉ๋๋ค.
|
| 130 |
-
์ด ๊ณผ์ ์์ '์ฌํ'๊ณผ '๋น๊ทน' ๊ฐ์ ๋จ์ด๋ค์ ๋ฒกํฐ ๊ณต๊ฐ์์์ ๊ฐ๊น์ด ์์น์, 'ํ๋ณต'๊ณผ๋ ๋จผ ์์น์ ํํ๋๋๋ก ํ์ต๋ฉ๋๋ค.
|
| 131 |
-
|
| 132 |
-
- **์ํ ๊ณ์ธต(SimpleRNN)**
|
| 133 |
-
```python
|
| 134 |
-
keras.layers.SimpleRNN(32),
|
| 135 |
-
```
|
| 136 |
-
์ด ์ธต์ด ์ํ ์ ๊ฒฝ๋ง์ ๋ณธ์ฒด์
๋๋ค.
|
| 137 |
-
์
๋ ฅ๋ ๋จ์ด ์๋ฒ ๋ฉ ๋ฒกํฐ ์ํ์ค๋ฅผ ์์๋๋ก ํ๋์ฉ ์ฒ๋ฆฌํ๋ฉฐ ์๋ ์ํ๋ฅผ ๊ณ์ํด์ ์
๋ฐ์ดํธํฉ๋๋ค.
|
| 138 |
-
๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ง๋ง ๋จ์ด๊น์ง ์ฒ๋ฆฌํ ํ์ ์ต์ข
์๋ ์ํ๋ง์ ๋ค์ ์ธต์ผ๋ก ์ ๋ฌํฉ๋๋ค.
|
| 139 |
-
์ด ์ต์ข
์๋ ์ํ ๋ฒกํฐ๋ ์ ์ฒด ๋ฌธ์ฅ์ ๋ฌธ๋งฅ์ ์์ถํ ๊ฒฐ๊ณผ๋ฌผ์
๋๋ค.
|
| 140 |
-
|
| 141 |
-
- **์์ ์ฐ๊ฒฐ ๊ณ์ธต(Dense)**
|
| 142 |
-
```python
|
| 143 |
-
keras.layers.Dense(1, activation="sigmoid")
|
| 144 |
-
```
|
| 145 |
-
์ต์ข
์๋ ์ํ ๋ฒกํฐ๋ฅผ ๋ฐ์, ๋ฆฌ๋ทฐ๊ฐ ๊ธ์ (1์ ๊ฐ๊น์ด ๊ฐ)์ธ์ง ๋ถ์ (0์ ๊ฐ๊น์ด ๊ฐ)์ธ์ง ์ต์ข
ํ๋จ์ ๋ด๋ฆฝ๋๋ค.
|
| 146 |
-
model.summary()๋ก ํ๋ผ๋ฏธํฐ ์ ๊ณ์ฐ ์๋ฆฌ ์ดํดํ๊ธฐ์ ์ฝ๋์์ model.summary()๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค.
|
| 147 |
-
|
| 148 |
-
```bash
|
| 149 |
-
Model: "sequential"
|
| 150 |
-
_________________________________________________________________
|
| 151 |
-
Layer (type) Output Shape Param #
|
| 152 |
-
=================================================================
|
| 153 |
-
embedding (Embedding) (None, None, 32) 320000
|
| 154 |
-
|
| 155 |
-
simple_rnn (SimpleRNN) (None, 32) 2080
|
| 156 |
-
|
| 157 |
-
dense (Dense) (None, 1) 33
|
| 158 |
-
|
| 159 |
-
=================================================================
|
| 160 |
-
Total params: 322,113
|
| 161 |
-
Trainable params: 322,113
|
| 162 |
-
Non-trainable params: 0
|
| 163 |
-
_________________________________________________________________
|
| 164 |
-
```
|
| 165 |
-
|
| 166 |
-
๊ฐ ์ธต์ ํ๋ผ๋ฏธํฐ ์๋ ์ด๋ป๊ฒ ๊ณ์ฐ๋๋์ง ์์๋ณด์๋ฉด,
|
| 167 |
-
1. Embedding: input_dim * output_dim = 10,000 * 32 = 320,000 ๊ฐ. (1๋ง ๊ฐ ๋จ์ด ๊ฐ๊ฐ์ ๋ํ 32์ฐจ์ ๋ฒกํฐ)
|
| 168 |
-
2. SimpleRNN:
|
| 169 |
-
- ์
๋ ฅ ๊ฐ์ค์น(W_xh): input_shape * units = 32 * 32 = 1024
|
| 170 |
-
- ์๋ ์ํ ๊ฐ์ค์น(W_hh): units * units = 32 * 32 = 1024
|
| 171 |
-
- ํธํฅ(b_h): units = 32
|
| 172 |
-
- ์ดํฉ: 1024 + 1024 + 32 = 2,080 ๊ฐ.
|
| 173 |
-
3. Dense: input_shape * units + bias = 32 * 1 + 1 = 33 ๊ฐ.
|
| 174 |
-
|
| 175 |
-
์ด์ฒ๋ผ summary๋ฅผ ํตํด ๋ชจ๋ธ์ ๊ตฌ์กฐ๋ฟ๋ง ์๋๋ผ, ๊ฐ ์ธต์ด ์ผ๋ง๋ ๋ง์ ํ๋ผ๋ฏธํฐ๋ฅผ
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
## 3. ์ง์ RNN ๊ตฌํํด ๋ณด๊ธฐ (์ค์ ์์ )
|
| 179 |
-
์ด์ ์ ์ฒด ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ์คํํ๋ฉฐ ์ง์ ๋ชจ๋ธ์ ํ์ต์์ผ ๋ณด๊ฒ ์ต๋๋ค.
|
| 180 |
-
|
| 181 |
-
**1๋จ๊ณ : ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ (ํจ๋ฉ์ ์ค์์ฑ)**
|
| 182 |
-
RNN์ ๊ณ ์ ๋ ๊ธธ์ด์ ์ํ์ค๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ต๋๋ค.
|
| 183 |
-
ํ์ง๋ง ์ํ ๋ฆฌ๋ทฐ๋ ๊ธธ์ด๊ฐ ์ ๊ฐ๊ฐ์ด๋ฏ๋ก, **ํจ๋ฉ(Padding)**์ ํตํด ๋ชจ๋ ๋ฆฌ๋ทฐ์ ๊ธธ์ด๋ฅผ ๋์ผํ๊ฒ ๋ง์ถฐ์ค์ผ ํฉ๋๋ค.
|
| 184 |
-
```python
|
| 185 |
-
import numpy as np
|
| 186 |
-
import tensorflow as tf
|
| 187 |
-
from tensorflow import keras
|
| 188 |
-
from keras import layers
|
| 189 |
-
|
| 190 |
-
# ๊ฐ์ฅ ๋น๋๊ฐ ๋์ 1๋ง๊ฐ ๋จ์ด๋ง ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์
๋ก๋
|
| 191 |
-
(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=10000)
|
| 192 |
-
|
| 193 |
-
print(f"ํจ๋ฉ ์ ์ฒซ ๋ฒ์งธ ๋ฆฌ๋ทฐ ๊ธธ์ด: {len(x_train[0])}")
|
| 194 |
-
|
| 195 |
-
# ๋ชจ๋ ์ํ์ค์ ๊ธธ์ด๋ฅผ 256์ผ๋ก ํต์ผ
|
| 196 |
-
# maxlen๋ณด๋ค ๊ธธ๋ฉด ์๋ผ๋ด๊ณ , ์งง์ผ๋ฉด ์๋ถ๋ถ์ 0์ผ๋ก ์ฑ์ (pre-padding)
|
| 197 |
-
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=256)
|
| 198 |
-
x_test = keras.preprocessing.sequence.pad_sequences(x_test, maxlen=256)
|
| 199 |
-
|
| 200 |
-
print(f"ํจ๋ฉ ํ ์ฒซ ๋ฒ์งธ ๋ฆฌ๋ทฐ ๊ธธ์ด: {len(x_train[0])}")
|
| 201 |
-
```
|
| 202 |
-
|
| 203 |
-
**2๋จ๊ณ : ๋ชจ๋ธ ์ปดํ์ผ**
|
| 204 |
-
๋ชจ๋ธ์ ์ด๋ป๊ฒ ํ์ต์ํฌ์ง ํ์ต ๋ฐฉ๋ฒ์ ์ค์ ํฉ๋๋ค.
|
| 205 |
-
```python
|
| 206 |
-
model.compile(
|
| 207 |
-
# ์์ค ํจ์: ์์ธก์ด ์ ๋ต๊ณผ ์ผ๋ง๋ ๋ค๋ฅธ์ง ์ธก์ .
|
| 208 |
-
# ์ด์ง ๋ถ๋ฅ(0 ๋๋ 1) ๋ฌธ์ ์ด๋ฏ๋ก binary_crossentropy๊ฐ ๊ฐ์ฅ ์ ํฉ.
|
| 209 |
-
loss="binary_crossentropy",
|
| 210 |
-
|
| 211 |
-
# ์ตํฐ๋ง์ด์ : ์์ค์ ์ต์ํํ๊ธฐ ์ํด ๋ชจ๋ธ์ ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํ๋ ์๊ณ ๋ฆฌ์ฆ.
|
| 212 |
-
# Adam์ ํ์ฌ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๊ณ ์ฑ๋ฅ์ด ์ข์ ์ตํฐ๋ง์ด์ ์ค ํ๋.
|
| 213 |
-
optimizer="adam",
|
| 214 |
-
|
| 215 |
-
# ํ๊ฐ์งํ: ํ๋ จ ๊ณผ์ ์ ๋ชจ๋ํฐ๋งํ ์งํ. ์ ํ๋๋ฅผ ์ฌ์ฉ.
|
| 216 |
-
metrics=["accuracy"]
|
| 217 |
-
)
|
| 218 |
-
```
|
| 219 |
-
|
| 220 |
-
**3๋จ๊ณ : ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ (๋ฐฐ์น, ์ํฌํฌ, ๊ทธ๋ฆฌ๊ณ ๊ณผ์ ํฉ)**
|
| 221 |
-
model.fit() ํจ์๋ก ์ค์ ํ์ต์ ์์ํฉ๋๋ค.
|
| 222 |
-
batch_size: ํ ๋ฒ์ ์ฒ๋ฆฌํ ๋ฐ์ดํฐ ์ํ์ ์. ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ๊ณผ ํ์ต ์๋์ ์ํฅ์ ์ค๋๋ค.
|
| 223 |
-
epochs: ์ ์ฒด ๋ฐ์ดํฐ์
์ ๋ช ๋ฒ ๋ฐ๋ณตํ์ฌ ํ์ตํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
|
| 224 |
-
|
| 225 |
-
```python
|
| 226 |
-
batch_size = 128
|
| 227 |
-
epochs = 10
|
| 228 |
-
|
| 229 |
-
# ๋ชจ๋ธ ํ์ต ์คํ
|
| 230 |
-
# validation_data๋ฅผ ์ง์ ํ์ฌ ๋งค ์ํฌํฌ๋ง๋ค ํ
์คํธ ๋ฐ์ดํฐ๋ก ์ฑ๋ฅ์ ๊ฒ์ฆ
|
| 231 |
-
history = model.fit(
|
| 232 |
-
x_train, y_train,
|
| 233 |
-
batch_size=batch_size,
|
| 234 |
-
epochs=epochs,
|
| 235 |
-
validation_data=(x_test, y_test)
|
| 236 |
-
)
|
| 237 |
-
|
| 238 |
-
# ํ์ต ์๋ฃ ํ ์ต์ข
์ฑ๋ฅ ํ๊ฐ
|
| 239 |
-
score = model.evaluate(x_test, y_test, verbose=0)
|
| 240 |
-
print(f"\nTest loss: {score[0]:.4f}")
|
| 241 |
-
print(f"Test accuracy: {score[1]:.4f}")
|
| 242 |
-
```
|
| 243 |
-
|
| 244 |
-
ํ์ต ๊ณผ์ ์ ์ง์ผ๋ณผ ๋, ํ๋ จ ๋ฐ์ดํฐ์ ์ ํ๋(accuracy)๋ ๊ณ์ ์ค๋ฅด๋๋ฐ ๊ฒ์ฆ ๋ฐ์ดํฐ์ ์ ํ๋(val_accuracy)๊ฐ ์ด๋ ์๊ฐ๋ถํฐ ์ ์ฒด๋๊ฑฐ๋ ๋จ์ด์ง๋ค๋ฉด, ๋ชจ๋ธ์ด ํ๋ จ ๋ฐ์ดํฐ์๋ง ๊ณผํ๊ฒ ์ ์ํ๋ **๊ณผ์ ํฉ(Overfitting)**์ด ๋ฐ์ํ๊ณ ์๋ค๋ ์ ํธ์
๋๋ค.
|
| 245 |
-
์ด๋ด ๋๋, ๋๋กญ์์์ ๋น์จ์ ๋์ด๊ฑฐ๋ ํ์ต์จ์ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
|
| 246 |
-
|
| 247 |
-
**4๋จ๊ณ : ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ ๋ฐ ์ฌ์ฌ์ฉ**
|
| 248 |
-
ํ์ต์ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋ชจ๋ธ์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด๋๊ณ ํ์ํ ๋๋ง๋ค ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์
๋๋ค.
|
| 249 |
-
|
| 250 |
-
```python
|
| 251 |
-
# ๋ชจ๋ธ์ ๊ตฌ์กฐ, ๊ฐ์ค์น, ํ์ต ์ค์ ์ ๋ชจ๋ '.keras' ํ์ผ ํ๋์ ์ ์ฅ
|
| 252 |
-
model.save("my_rnn_model_imdb.keras")
|
| 253 |
-
|
| 254 |
-
# ์ ์ฅ๋ ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
|
| 255 |
-
loaded_model = keras.models.load_model("my_rnn_model_imdb.keras")
|
| 256 |
-
```
|
| 257 |
-
|
| 258 |
-
**5๋จ๊ณ : ๋๋ง์ ๋ฌธ์ฅ์ผ๋ก ๋ชจ๋ธ ํ
์คํธํ๊ธฐ (์ค์ ์์ธก)**
|
| 259 |
-
์ค์ ๋ฌธ์ฅ์ ์์ธกํ๋ ค๋ฉด, ํ๋ จ ๋ฐ์ดํฐ์ ๋์ผํ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
|
| 260 |
-
|
| 261 |
-
```python
|
| 262 |
-
# IMDB ๋ฐ์ดํฐ์
์ ๋จ์ด-์ธ๋ฑ์ค ์ฌ์ ๋ก๋
|
| 263 |
-
word_index = keras.datasets.imdb.get_word_index()
|
| 264 |
-
|
| 265 |
-
# ์๋ก์ด ๋ฆฌ๋ทฐ ๋ฌธ์ฅ
|
| 266 |
-
review = "This movie was fantastic and wonderful"
|
| 267 |
-
|
| 268 |
-
# 1. ์๋ฌธ์ ๋ณํ ๋ฐ ๋จ์ด ๋ถ๋ฆฌ -> 2. ๋จ์ด ์ธ๋ฑ์ค๋ก ๋ณํ
|
| 269 |
-
tokens = [word_index.get(word, 2) for word in review.lower().split()]
|
| 270 |
-
|
| 271 |
-
# 3. ํจ๋ฉ ์ฒ๋ฆฌ
|
| 272 |
-
padded_tokens = keras.preprocessing.sequence.pad_sequences([tokens], maxlen=256)
|
| 273 |
-
|
| 274 |
-
# 4. ์์ธก
|
| 275 |
-
prediction = loaded_model.predict(padded_tokens)
|
| 276 |
-
print(f"๋ฆฌ๋ทฐ: '{review}'")
|
| 277 |
-
print(f"๊ธ์ ํ๋ฅ : {prediction[0][0] * 100:.2f}%")
|
| 278 |
-
```
|
| 279 |
-
|
| 280 |
-
4. ๋๋ง์ RNN ๋ชจ๋ธ ์
๊ทธ๋ ์ด๋ํ๊ธฐ
|
| 281 |
-
๊ธฐ๋ณธ RNN๋ ์ข์ง๋ง, ๋ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ช ๊ฐ์ง ํ๊ณ๋ฅผ ๊ทน๋ณตํด์ผ ํฉ๋๋ค.
|
| 282 |
-
|
| 283 |
-
**RNN์ ์น๋ช
์ ์ฝ์ : ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์ (Vanishing Gradients)**
|
| 284 |
-
"๋๋ ํ๋์ค์์ ํ์ด๋ ์๋๋ค. ... (์ค๋ต) ... ๊ทธ๋์ ๋๋ ___๋ฅผ ์ ์ฐฝํ๊ฒ ๊ตฌ์ฌํ๋ค."
|
| 285 |
-
๋น์นธ์ ๋ค์ด๊ฐ ๋ง์ 'ํ๋์ค์ด'์
๋๋ค.
|
| 286 |
-
์ฌ๋์ ๋ฌธ์ฅ ๋งจ ์์ 'ํ๋์ค'๋ผ๋ ๋จ์ด๋ฅผ ๊ธฐ์ตํ์ฌ ์ฝ๊ฒ ๋ต์ ์ฐพ์ต๋๋ค.
|
| 287 |
-
ํ์ง๋ง ๊ธฐ๋ณธ RNN์ ์ํ์ค๊ฐ ๊ธธ์ด์ง์๋ก, ์ญ์ ํ ๊ณผ์ ์์ ๊ทธ๋๋์ธํธ(๊ธฐ์ธ๊ธฐ)๊ฐ ๊ณ์ ๊ณฑํด์ง๋ฉด์ 0์ ๊ฐ๊น์์ ธ ์ฌ๋ผ์ง๋ ๊ทธ๋๋์ธํธ ์์ค(Vanishing Gradient) ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
|
| 288 |
-
์ด๋ก ์ธํด ๋ฌธ์ฅ ์๋ถ๋ถ์ ์ค์ํ ์ ๋ณด๋ฅผ ํ์ตํ์ง ๋ชปํ๊ฒ ๋ฉ๋๋ค.
|
| 289 |
-
์ด๋ฅผ ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์ ๋ผ๊ณ ํฉ๋๋ค.
|
| 290 |
-
|
| 291 |
-
**๊ธฐ์ต๋ ฅ ๊ฐํ : LSTM๊ณผ GRU์ ๋ฑ์ฅ**
|
| 292 |
-
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด **LSTM(Long Short-Term Memory)**๊ณผ **GRU(Gated Recurrent Unit)**๊ฐ ๋ฑ์ฅํ์ต๋๋ค.
|
| 293 |
-
์ด๋ค์ RNN ๋ด๋ถ์ **๊ฒ์ดํธ(Gate)**๋ผ๋ ์ ๊ตํ ์ฅ์น๋ฅผ ์ถ๊ฐํ์ฌ ์ ๋ณด์ ํ๋ฆ์ ์ ์ดํฉ๋๋ค.
|
| 294 |
-
- LSTM: '์
์ํ(Cell State)'๋ผ๋ ๋ณ๋์ ๊ธฐ์ต ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ๋๊ณ , ๋ง๊ฐ ๊ฒ์ดํธ(Forget Gate), ์
๋ ฅ ๊ฒ์ดํธ(Input Gate), ์ถ๋ ฅ ๊ฒ์ดํธ(Output Gate) 3๊ฐ์ ๊ฒ์ดํธ๋ฅผ ํตํด ์ด๋ค ์ ๋ณด๋ฅผ ๋ฒ๋ฆฌ๊ณ , ์ด๋ค ์ ๋ณด๋ฅผ ์๋ก ๊ธฐ์ตํ๊ณ , ์ด๋ค ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ์ง ํ์ตํฉ๋๋ค.
|
| 295 |
-
์ฅ๊ธฐ ๊ธฐ์ต์ ๋งค์ฐ ํจ๊ณผ์ ์
๋๋ค.
|
| 296 |
-
- GRU: LSTM์ ๋ ๋จ์ํํ ๋ชจ๋ธ๋ก, **๋ฆฌ์
๊ฒ์ดํธ(Reset Gate)**์ ์
๋ฐ์ดํธ ๊ฒ์ดํธ(Update Gate) 2๊ฐ์ ๊ฒ์ดํธ๋ง ์ฌ์ฉํฉ๋๋ค.
|
| 297 |
-
ํ๋ผ๋ฏธํฐ ์๊ฐ ์ ์ด ๊ณ์ฐ ํจ์จ์ฑ์ด ๋๊ณ , ๋ง์ ๊ฒฝ์ฐ LSTM๊ณผ ๋น์ทํ ์ฑ๋ฅ์ ๋ณด์
๋๋ค.
|
| 298 |
-
|
| 299 |
-
```python
|
| 300 |
-
# LSTM์ 2๊ฐ ์ธต์ผ๋ก ์์ ๋ชจ๋ธ
|
| 301 |
-
model_lstm = keras.Sequential([
|
| 302 |
-
layers.Embedding(input_dim=10000, output_dim=64),
|
| 303 |
-
# return_sequences=True: ๋ค์ LSTM ์ธต์ผ๋ก ์ ์ฒด ์ํ์ค๋ฅผ ์ ๋ฌ
|
| 304 |
-
layers.LSTM(64, return_sequences=True),
|
| 305 |
-
layers.LSTM(32),
|
| 306 |
-
layers.Dense(1, activation='sigmoid')
|
| 307 |
-
])
|
| 308 |
-
```
|
| 309 |
-
|
| 310 |
-
**๊ณผ๊ฑฐ์ ๋ฏธ๋๋ฅผ ๋์์ : ์๋ฐฉํฅ RNN (Bidirectional RNN)**
|
| 311 |
-
"์ค๋ ์๋ก ์จ ___ ์ ์๋์ ์ ๋ง ๋ฉ์ง๋ค."
|
| 312 |
-
๋น์นธ์ ๋ค์ด๊ฐ '์์ด'๋ผ๋ ๋จ์ด๋ ๋ท๋ถ๋ถ์ '์ ์๋'์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ด์ผ ๋ ์ ํํ ์ ์ถํ ์ ์์ต๋๋ค.
|
| 313 |
-
์ด์ฒ๋ผ ๋ฌธ๋งฅ์ ์๋ฐฉํฅ๋ฟ๋ง ์๋๋ผ ์ญ๋ฐฉํฅ์ ์ ๋ณด๋ ์ค์ํฉ๋๋ค.
|
| 314 |
-
**์๋ฐฉํฅ RNN(Bidirectional RNN)**์ ์ํ์ค๋ฅผ ์ ๋ฐฉํฅ์ผ๋ก ํ๋ฒ, ์ญ๋ฐฉํฅ์ผ๋ก ํ๋ฒ
|
| 315 |
-
์ด๋ฅผ ํตํด ๋ฌธ๋งฅ์ ํจ์ฌ ๋ ํ๋ถํ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
|
| 316 |
-
|
| 317 |
-
```python
|
| 318 |
-
model_bidirectional = keras.Sequential([
|
| 319 |
-
layers.Embedding(input_dim=10000, output_dim=64),
|
| 320 |
-
# LSTM ๋ ์ด์ด๋ฅผ Bidirectional ๋ํผ๋ก ๊ฐ์ธ๊ธฐ๋ง ํ๋ฉด ๋จ
|
| 321 |
-
layers.Bidirectional(layers.LSTM(64)),
|
| 322 |
-
layers.Dropout(0.5), # ๊ณผ์ ํฉ ๋ฐฉ์ง๋ฅผ ์ํ ๋๋กญ์์ ์ถ๊ฐ
|
| 323 |
-
layers.Dense(1, activation='sigmoid')
|
| 324 |
-
])
|
| 325 |
-
```
|
| 326 |
-
|
| 327 |
-
## 5. ๊ฒฐ๋ก
|
| 328 |
-
์ค๋์ ์์ฐจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ทผ๊ฐ์ด ๋๋ RNN์ ํต์ฌ ์๋ฆฌ๋ถํฐ ์์ํ์ฌ, ์ค์ ์ฝ๋๋ก ๋ชจ๋ธ์ ๊ตฌํํ๊ณ , LSTM, GRU, ์๋ฐฉํฅ RNN๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฒ์ ํตํด ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ๊น์ง ์์ธํ๊ฒ ์์๋ณด์์ต๋๋ค.
|
| 329 |
-
RNN์ ๊ทธ ์์ฒด๋ก๋ ๊ฐ๋ ฅํ์ง๋ง, ์์ฐ์ด ์ฒ๋ฆฌ ๋ถ์ผ์ ๋ฐ์ ์ ์์ฒญ๋ ๊ธฐ์ฌ๋ฅผ ํ ๊ธฐ๋
๋น์ ์ธ ๋ชจ๋ธ์
๋๋ค.
|
| 330 |
-
ํนํ RNN์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๋ ค๋ ์๋ ์์์ ํ์ํ ์ดํ
์
(Attention) ๋ฉ์ปค๋์ฆ์ ์ดํ
|
| 331 |
-
๋ค์์๋ ์ดํ
์
๊ธฐ๋ฒ๊ณผ ํธ๋์คํฌ๋จธ ๋ชจ๋ธ, ์ธ์ฝ๋, ๋์ฝ๋๋ก ๋์์ค๊ฒ ์ต๋๋ค!!
|
| 332 |
์ค๋๋ ์ข์ํ๋ฃจ ๋ณด๋ด์ธ์!!
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: apache-2.0
|
| 3 |
+
---
|
| 4 |
+
|
| 5 |
+
์๋
ํ์ธ์ Oneclick AI ์
๋๋ค!!
|
| 6 |
+
์ค๋์, RNN(์ํ ์ ๊ฒฝ๋ง, Recurrent Neural Network) ๋ชจ๋ธ์ ๋ํด์ ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ๊น ํฉ๋๋ค.
|
| 7 |
+
|
| 8 |
+
๋ฅ๋ฌ๋์ด ๋ฌธ์ฅ, ์์ฑ, ์ฃผ๊ฐ ์์ธก๊ณผ ๊ฐ์ ์์๊ฐ ์๋ ๋ฐ์ดํฐ(Sequential Data)๋ฅผ ๋ค๋ฃฐ ์ ์๊ฒ ๋ ๊ฒ์ ์ ์ ์ผ๋ก RNN ๋๋ถ์
๋๋ค.
|
| 9 |
+
๋จ์ํ ์ ๊ฒฝ๋ง์ด '์์'๋ผ๋ ๊ฐ๋
์ ์ดํดํ์ง ๋ชปํ๋ ๋ฐ๋ฉด,
|
| 10 |
+
RNN์ ๋ง์น ์ฌ๋์ฒ๋ผ ์๊ฐ์ ํ๋ฆ์ ๋ฐ๋ผ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ , ๋ค์์ ์์ธกํ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ถ๊ณ ์์ต๋๋ค.
|
| 11 |
+
|
| 12 |
+
์ค๋์ ์ด RNN์ด๋ผ๋ ์ ๊ฒฝ๋ง์ด ์ด๋ป๊ฒ ๊ณผ๊ฑฐ์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๋ฉฐ ์๋ํ๋์ง,
|
| 13 |
+
๊ทธ๋ฆฌ๊ณ ์ด๋ป๊ฒ ๋ฌธ์ฅ์ ์จ๊ฒจ์ง ๋ฌธ๋งฅ๊ณผ ์๋ฏธ๋ฅผ ํ์
ํ ์ ์๋์ง ์์๋ด
์๋ค.
|
| 14 |
+
|
| 15 |
+
---
|
| 16 |
+
|
| 17 |
+
## ๋ชฉ์ฐจ
|
| 18 |
+
1. RNN ํต์ฌ ์๋ฆฌ ํ์
ํ๊ธฐ
|
| 19 |
+
- ์ ์์ฐจ ๋ฐ์ดํฐ์ RNN์ ์ฌ์ฉํด์ผ๋ง ํ ๊น?
|
| 20 |
+
- RNN์ ์ฌ์ฅ : ์ํ ๊ตฌ์กฐ์ ์๋ ์ํ์ ์ญํ
|
| 21 |
+
- RNN์ ์๊ฐ์ ๋ฐ๋ผ ํผ์ณ๋ณด๊ธฐ
|
| 22 |
+
- RNN์ ์ฃผ์ ๊ตฌ์ฑ ์์ ์์ธ ๋ถ์
|
| 23 |
+
2. ์ํคํ
์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ
|
| 24 |
+
- Keras๋ก ๊ตฌํํ RNN ๋ชจ๋ธ ์ํคํ
์ฒ
|
| 25 |
+
- model.summary()๋ก ๊ตฌ์กฐ ํ์ธํ๊ธฐ
|
| 26 |
+
3. ์ง์ RNN ๊ตฌํํด ๋ณด๊ธฐ
|
| 27 |
+
- 1๋จ๊ณ : ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ
|
| 28 |
+
- 2๋จ๊ณ : ๋ชจ๋ธ ์ปดํ์ผ
|
| 29 |
+
- 3๋จ๊ณ : ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ
|
| 30 |
+
- 4๋จ๊ณ : ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ ๋ฐ ์ฌ์ฌ์ฉ
|
| 31 |
+
- 5๋จ๊ณ : ๋๋ง์ ๋ฌธ์ฅ์ผ๋ก ๋ชจ๋ธ ํ
์คํธํ๊ธฐ
|
| 32 |
+
4. ๋๋ง์ RNN ๋ชจ๋ธ ์
๊ทธ๋ ์ด๋ํ๊ธฐ
|
| 33 |
+
- ๊ธฐ์ด ์ฒด๋ ฅ ํ๋ จ : ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋
|
| 34 |
+
- RNN์ ์น๋ช
์ ์ฝ์ : ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์
|
| 35 |
+
- ๊ธฐ์ต๋ ฅ ๊ฐํ : LSTM๊ณผ GRU์ ๋ฑ๏ฟฝ๏ฟฝ๏ฟฝ
|
| 36 |
+
- ๊ณผ๊ฑฐ์ ๋ฏธ๋๋ฅผ ๋์์ : ์๋ฐฉํฅ RNN
|
| 37 |
+
5. ๊ฒฐ๋ก
|
| 38 |
+
---
|
| 39 |
+
|
| 40 |
+
## 1. RNN ํต์ฌ์๋ฆฌ ํ์
ํ๊ธฐ
|
| 41 |
+
๊ฐ์ฅ ๋จผ์ , RNN์ด ์ ์์ฐจ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ดํดํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ์ธ์ง ๊ทธ ๊ทผ๋ณธ์ ์ธ ์ด์ ๋ถํฐ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
|
| 42 |
+
|
| 43 |
+
**์ ์์ฐจ ๋ฐ์ดํฐ์ RNN์ ์ฌ์ฉํ ๊น?? with MLP, CNN์ ํ๊ณ**
|
| 44 |
+
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ๊ฒฝ๋ง์ธ MLP(๋ค์ธต ํผ์
ํธ๋ก )์ "๋๋ ํ๊ต์ ๊ฐ๋ค"๋ผ๋ ๋ฌธ์ฅ์ ์
๋ ฅํ๋ค๊ณ ์์ํด ๋ด
์๋ค.
|
| 45 |
+
MLP๋ ๊ฐ ๋จ์ด๋ฅผ ๋
๋ฆฝ์ ์ธ ํน์ง์ผ๋ก ๋ณด๊ธฐ ๋๋ฌธ์, "ํ๊ต์ ๋๋ ๊ฐ๋ค"๋ผ๋ ๋ฌธ์ฅ๊ณผ ๊ฑฐ์ ๋์ผํ๊ฒ ๋ฐ์๋ค์
๋๋ค.
|
| 46 |
+
๋จ์ด์ '์์'๊ฐ ๊ฐ์ง ์ค์ํ ์๋ฏธ, ์ฆ ๋ฌธ๋งฅ์ ์์ ํ ์์ด๋ฒ๋ฆฌ๋ ๊ฒ์
๋๋ค.
|
| 47 |
+
์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ํนํ๋ CNN ์ญ์ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.
|
| 48 |
+
CNN์ ๊ณต๊ฐ์ ์ธ ํน์ง(ํฝ์
์ฃผ๋ณ ๊ด๊ณ)์ ์ถ์ถํ๋ ๋ฐ๋ ๋ฐ์ด๋์ง๋ง, ์๊ฐ์ ์ธ ์์๋ ํ๋ฆ์ ํ์
ํ๋๋ก ์ค๊ณ๋์ง ์์์ต๋๋ค.
|
| 49 |
+
๋ฐ๋ฉด, RNN์ ์ค๊ณ ์์ฒด๊ฐ '์์'๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค.
|
| 50 |
+
์ด์ ๋จ๊ณ์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋จ๊ณ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฌ์ฉํ๋ '์ํ' ๊ตฌ์กฐ๋ฅผ ํตํด, ๋ง์น ์ฐ๋ฆฌ๊ฐ ๋ฌธ์ฅ์ ์์์๋ถํฐ ์ฐจ๋ก๋ก ์ฝ์ผ๋ฉฐ ๋ด์ฉ์ ๋จธ๋ฆฟ์์ ์ถ์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ํฉ๋๋ค.
|
| 51 |
+
|
| 52 |
+
**RNN์ ์ฌ์ฅ : ์ํ ๊ตฌ์กฐ์ ์๋ ์ํ์ ์ญํ**
|
| 53 |
+
RNN์ ํต์ฌ ์์ด๋์ด๋ ๋ฐ๋ก ์ํ ๊ตฌ์กฐ(Recurrent Structure)์ ์๋ ์ํ(Hidden State) ์
๋๋ค.
|
| 54 |
+
- ์ํ ๊ตฌ์กฐ(Recurrent Structure)
|
| 55 |
+
์ ๊ฒฝ๋ง ๋ด๋ถ์ '๋ฃจํ'๊ฐ ์กด์ฌํ์ฌ, ์ ๋ณด๊ฐ ๊ณ์ํด์ ์ํํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๋งํฉ๋๋ค.
|
| 56 |
+
๊ฐ ํ์์คํ
$t$์์ ๋ชจ๋ธ์ ์
๋ ฅ $x_t$์ ์ด์ ํ์์คํ
์ ์ ๋ณด ์์ฝ๋ณธ์ธ $h_{t-1}$์ ํจ๊ป ๋ฐ์ ์ฒ๋ฆฌํฉ๋๋ค.
|
| 57 |
+
|
| 58 |
+
- ์๋ ์ํ(Hidden State, $h_t$)
|
| 59 |
+
์๋ ์ํ๋ '๋ฉ๋ชจ๋ฆฌ' ๋๋ '๋ฌธ๋งฅ ๋ฒกํฐ'๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, RNN์ ๋ชจ๋ ๊ฒ์ ๋ด๊ณ ์์ต๋๋ค.
|
| 60 |
+
ํน์ ํ์์คํ
t์์์ ์๋ ์ํ $h_t$๋ ๋ค์๊ณผ ๊ฐ์ ์์์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค.
|
| 61 |
+
$h_t=tanh(W_hhh_tโ1+W_xhx_t+b_h)$์ฌ๊ธฐ์ $W_hh$, $W_{xh}$๋ ํ์ต์ ํตํด ์ต์ ํ๋๋ ๊ฐ์ค์น ํ๋ ฌ์ด๋ฉฐ, $b_h$๋ ํธํฅ์
๋๋ค.
|
| 62 |
+
์ค์ํ ์ ์ ๋ชจ๋ ํ์์คํ
์์ ๋์ผํ ๊ฐ์ค์น($W$)์ ํธํฅ($b$)์ด ๊ณต์ ๋๋ค๋ ๊ฒ์
๋๋ค.
|
| 63 |
+
์ด๋ ๋ชจ๋ธ์ด ์๊ฐ๊ณผ ๊ด๊ณ์์ด ์ผ๊ด๋ ํจํด์ ํ์ตํ๊ฒ ํ๋ฉฐ, ํ๋ผ๋ฏธํฐ ์๋ฅผ ํฌ๊ฒ ์ค์ฌ์ค๋๋ค.
|
| 64 |
+
tanh์ ๊ฐ์ ํ์ฑํ ํจ์๋ ๊ณ์ฐ๋ ๊ฐ์ ํน์ ๋ฒ์(-1์์ 1 ์ฌ์ด)๋ก ์์ถํ๋ ์ญํ ์ ํฉ๋๋ค.
|
| 65 |
+
|
| 66 |
+
**RNN์ ์๊ฐ์ ๋ฐ๋ผ ํผ์ณ๋ณด๊ธฐ**
|
| 67 |
+
์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์๊ฐ์ ๋ฐ๋ผ ๋คํธ์ํฌ๋ฅผ ๊ธธ๊ฒ ํผ์ณ์ ํํํ๋ฉด, ์ฝ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
|
| 68 |
+
```markdown
|
| 69 |
+
์๊ฐ ํ๋ฆ โโโโถ
|
| 70 |
+
์
๋ ฅ ์ํ์ค: xโ xโ xโ ... xโ
|
| 71 |
+
โ โ โ โ
|
| 72 |
+
โโโโโโ โโโโโโ โโโโโโ ... โโโโโโ
|
| 73 |
+
hโ โโโโถ โRNN โโถโRNN โโถโRNN โ โถ ... โถโRNN โ
|
| 74 |
+
โโโโโโ โโโโโโ โโโโโโ โโโโโโ
|
| 75 |
+
โ โ โ โ
|
| 76 |
+
โผ โผ โผ โผ
|
| 77 |
+
hโ hโ hโ hโ
|
| 78 |
+
```
|
| 79 |
+
RNN์ ๋ด๋ถ์ ์ผ๋ก **๊ฐ์ ์
** ์ ๋งค ์์ ๋ง๋ค ๋ฐ๋ณตํด์ ์ฌ์ฉํ๋ ๊ตฌ์กฐ ์
๋๋ค.
|
| 80 |
+
ํผ์ณ์ ๋ณด๋ฉด, ์ ๊ทธ๋ฆผ์ฒ๋ผ ํ๋์ RNN์
์ด ์๊ฐ์ด ํ๋ฆ์ ๋ฐ๋ผ ์ฌ๋ฌ ๋ฒ ๋ณต์ ๋ ๊ฒ ์ฒ๋ผ ๋ณด์
๋๋ค.
|
| 81 |
+
์์๋๋ก ๋ณด์๋ฉด,
|
| 82 |
+
1. ๊ฐ ์์ ์ $X_t$๊ฐ RNN ์
์ ๋ค์ด๊ฐ๊ณ ,
|
| 83 |
+
2. ์ด์ ์์ ์ ์์ ์ํ์ $h_(t^-1)$๋ ํจ๊ป ๋ค์ด๊ฐ์,
|
| 84 |
+
3. ์๋ก์ด ์๋์ํ $h_t$๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
|
| 85 |
+
4. ์ด $h_t$๋ ๋ค์ ์์ ์ผ๋ก ์ ๋ฌ๋์ด ๋ฉ๋ชจ๋ฆฌ ์ญํ ์ ํฉ๋๋ค.
|
| 86 |
+
|
| 87 |
+
์ ๊ทธ๋ฆผ ์ ์ฌ๋ฌ ์
์ ๊ฐ์ RNN ์
์ ์๊ฐ์ ๋ฐ๋ผ ๋ณต์ ํ ๊ฒ์ด๊ณ , ๋ชจ๋ ์
์ ๊ฐ์ค์น๋ฅผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์์ ์ด ๋ฌ๋ผ๋ ๊ฐ์ ๊ท์น์ผ๋ก ๊ณ์ฐ์ด ์ด๋ฃจ์ด ์ง๋๋ค.
|
| 88 |
+
|
| 89 |
+
๋ณด์ถฉ์ค๋ช
ํ์๋ฉด,
|
| 90 |
+
`๋๋ ํ๊ต์ ๊ฐ๋ค`
|
| 91 |
+
๋ฅผ ์
๋ ฅํ๋ฉด,
|
| 92 |
+
$X_1$์ด ๋๋, $X_2$๊ฐ ํ๊ต์, $X_3$ ๊ฐ ๊ฐ๋ค๊ฐ ๋๋ฉด์ ์๊ฐ์ ๋ฐ๋ฅธ ์ฐ์ฐ์ด ์ด๋ฃจ์ด ์ง๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
|
| 93 |
+
|
| 94 |
+
## 2. ์ํคํ
์ฒ๋ฅผ ํตํ ๋ด๋ถ ์ฝ๋ ๋ค์ฌ๋ค ๋ณด๊ธฐ
|
| 95 |
+
์ด์ ์ด๋ก ์ ๋ฐํ์ผ๋ก, TensorFlow Keras ๋ฅผ ํตํด ์ง์ RNN์ ๊ตฌํํด ๋ด
์๋ค.
|
| 96 |
+
Keras๋ก ๊ตฌํํ RNN ๋ชจ๋ธ ์ํคํ
์ฒ ์ฌ์ธต ๋ถ์๋ค์์ IMDB ์ํ ๋ฆฌ๋ทฐ ๊ฐ์ฑ ๋ถ์์ ์ํ ๊ฐ๋จํ RNN ๋ชจ๋ธ์
๋๋ค.
|
| 97 |
+
|
| 98 |
+
```python
|
| 99 |
+
import tensorflow as tf
|
| 100 |
+
from tensorflow import keras
|
| 101 |
+
|
| 102 |
+
# ๋ชจ๋ธ ์ํคํ
์ฒ ์ ์
|
| 103 |
+
model = keras.Sequential([
|
| 104 |
+
# 1. ๋จ์ด ์๋ฒ ๋ฉ ์ธต
|
| 105 |
+
# input_dim: ์ ์ฒด ๋จ์ด ์งํฉ์ ํฌ๊ธฐ (๊ฐ์ฅ ๋น๋ฒํ 1๋ง๊ฐ ๋จ์ด)
|
| 106 |
+
# output_dim: ๊ฐ ๋จ์ด๋ฅผ ํํํ ๋ฒกํฐ์ ์ฐจ์ (32์ฐจ์)
|
| 107 |
+
keras.layers.Embedding(input_dim=10000, output_dim=32),
|
| 108 |
+
|
| 109 |
+
# 2. RNN ์ธต
|
| 110 |
+
# units: ์๋ ์ํ ๋ฒกํฐ์ ์ฐจ์ (32์ฐจ์)
|
| 111 |
+
keras.layers.SimpleRNN(32),
|
| 112 |
+
|
| 113 |
+
# 3. ์ต์ข
๋ถ๋ฅ๊ธฐ(Classifier)
|
| 114 |
+
# units: ์ถ๋ ฅ ๋ด๋ฐ์ ์ (๊ธ์ /๋ถ์ 1๊ฐ)
|
| 115 |
+
# activation: ์ถ๋ ฅ ๊ฐ์ 0~1 ์ฌ์ด ํ๋ฅ ๋ก ๋ณํ (์ด์ง ๋ถ๋ฅ)
|
| 116 |
+
keras.layers.Dense(1, activation="sigmoid"),
|
| 117 |
+
])
|
| 118 |
+
|
| 119 |
+
# ๋ชจ๋ธ ๊ตฌ์กฐ ์์ฝ ์ถ๋ ฅ
|
| 120 |
+
model.summary()
|
| 121 |
+
```
|
| 122 |
+
๋ ์ด์ด๋ฅผ ์์ธํ ๋ค์ด๋ค ๋ด
์๋ค.
|
| 123 |
+
|
| 124 |
+
- **์๋ฒ ๋ฉ ์ธต(Embedding)**
|
| 125 |
+
```python
|
| 126 |
+
keras.layers.Embedding(input_dim=10000, output_dim=32)
|
| 127 |
+
```
|
| 128 |
+
์ปดํจํฐ๋ '์ํ', '์ฌ๋ฏธ' ๊ฐ์ ๋จ์ด๋ฅผ ์ง์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
|
| 129 |
+
Embedding ์ธต์ ๊ฐ ๋จ์ด์ ๋ถ์ฌ๋ ๊ณ ์ ํ ์ ์ ์ธ๋ฑ์ค๋ฅผ output_dim ์ฐจ์์ ์๋ฏธ๋ก ์ ๋ฒกํฐ๋ก ๋ณํํฉ๋๋ค.
|
| 130 |
+
์ด ๊ณผ์ ์์ '์ฌํ'๊ณผ '๋น๊ทน' ๊ฐ์ ๋จ์ด๋ค์ ๋ฒกํฐ ๊ณต๊ฐ์์์ ๊ฐ๊น์ด ์์น์, 'ํ๋ณต'๊ณผ๋ ๋จผ ์์น์ ํํ๋๋๋ก ํ์ต๋ฉ๋๋ค.
|
| 131 |
+
|
| 132 |
+
- **์ํ ๊ณ์ธต(SimpleRNN)**
|
| 133 |
+
```python
|
| 134 |
+
keras.layers.SimpleRNN(32),
|
| 135 |
+
```
|
| 136 |
+
์ด ์ธต์ด ์ํ ์ ๊ฒฝ๋ง์ ๋ณธ์ฒด์
๋๋ค.
|
| 137 |
+
์
๋ ฅ๋ ๋จ์ด ์๋ฒ ๋ฉ ๋ฒกํฐ ์ํ์ค๋ฅผ ์์๋๋ก ํ๋์ฉ ์ฒ๋ฆฌํ๋ฉฐ ์๋ ์ํ๋ฅผ ๊ณ์ํด์ ์
๋ฐ์ดํธํฉ๋๋ค.
|
| 138 |
+
๊ธฐ๋ณธ์ ์ผ๋ก ๋ง์ง๋ง ๋จ์ด๊น์ง ์ฒ๋ฆฌํ ํ์ ์ต์ข
์๋ ์ํ๋ง์ ๋ค์ ์ธต์ผ๋ก ์ ๋ฌํฉ๋๋ค.
|
| 139 |
+
์ด ์ต์ข
์๋ ์ํ ๋ฒกํฐ๋ ์ ์ฒด ๋ฌธ์ฅ์ ๋ฌธ๋งฅ์ ์์ถํ ๊ฒฐ๊ณผ๋ฌผ์
๋๋ค.
|
| 140 |
+
|
| 141 |
+
- **์์ ์ฐ๊ฒฐ ๊ณ์ธต(Dense)**
|
| 142 |
+
```python
|
| 143 |
+
keras.layers.Dense(1, activation="sigmoid")
|
| 144 |
+
```
|
| 145 |
+
์ต์ข
์๋ ์ํ ๋ฒกํฐ๋ฅผ ๋ฐ์, ๋ฆฌ๋ทฐ๊ฐ ๊ธ์ (1์ ๊ฐ๊น์ด ๊ฐ)์ธ์ง ๋ถ์ (0์ ๊ฐ๊น์ด ๊ฐ)์ธ์ง ์ต์ข
ํ๋จ์ ๋ด๋ฆฝ๋๋ค.
|
| 146 |
+
model.summary()๋ก ํ๋ผ๋ฏธํฐ ์ ๊ณ์ฐ ์๋ฆฌ ์ดํดํ๊ธฐ์ ์ฝ๋์์ model.summary()๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ต๋๋ค.
|
| 147 |
+
|
| 148 |
+
```bash
|
| 149 |
+
Model: "sequential"
|
| 150 |
+
_________________________________________________________________
|
| 151 |
+
Layer (type) Output Shape Param #
|
| 152 |
+
=================================================================
|
| 153 |
+
embedding (Embedding) (None, None, 32) 320000
|
| 154 |
+
|
| 155 |
+
simple_rnn (SimpleRNN) (None, 32) 2080
|
| 156 |
+
|
| 157 |
+
dense (Dense) (None, 1) 33
|
| 158 |
+
|
| 159 |
+
=================================================================
|
| 160 |
+
Total params: 322,113
|
| 161 |
+
Trainable params: 322,113
|
| 162 |
+
Non-trainable params: 0
|
| 163 |
+
_________________________________________________________________
|
| 164 |
+
```
|
| 165 |
+
|
| 166 |
+
๊ฐ ์ธต์ ํ๋ผ๋ฏธํฐ ์๋ ์ด๋ป๊ฒ ๊ณ์ฐ๋๋์ง ์์๋ณด์๋ฉด,
|
| 167 |
+
1. Embedding: input_dim * output_dim = 10,000 * 32 = 320,000 ๊ฐ. (1๋ง ๊ฐ ๋จ์ด ๊ฐ๊ฐ์ ๋ํ 32์ฐจ์ ๋ฒกํฐ)
|
| 168 |
+
2. SimpleRNN:
|
| 169 |
+
- ์
๋ ฅ ๊ฐ์ค์น(W_xh): input_shape * units = 32 * 32 = 1024
|
| 170 |
+
- ์๋ ์ํ ๊ฐ์ค์น(W_hh): units * units = 32 * 32 = 1024
|
| 171 |
+
- ํธํฅ(b_h): units = 32
|
| 172 |
+
- ์ดํฉ: 1024 + 1024 + 32 = 2,080 ๊ฐ.
|
| 173 |
+
3. Dense: input_shape * units + bias = 32 * 1 + 1 = 33 ๊ฐ.
|
| 174 |
+
|
| 175 |
+
์ด์ฒ๋ผ summary๋ฅผ ํตํด ๋ชจ๋ธ์ ๊ตฌ์กฐ๋ฟ๋ง ์๋๋ผ, ๊ฐ ์ธต์ด ์ผ๋ง๋ ๋ง์ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ตํด์ผ ํ๋์ง ์ ํํ ํ์
ํ ์ ์์ต๋๋ค.
|
| 176 |
+
|
| 177 |
+
|
| 178 |
+
## 3. ์ง์ RNN ๊ตฌํํด ๋ณด๊ธฐ (์ค์ ์์ )
|
| 179 |
+
์ด์ ์ ์ฒด ์ฝ๋๋ฅผ ๋จ๊ณ๋ณ๋ก ์คํํ๋ฉฐ ์ง์ ๋ชจ๋ธ์ ํ์ต์์ผ ๋ณด๊ฒ ์ต๋๋ค.
|
| 180 |
+
|
| 181 |
+
**1๋จ๊ณ : ๋ฐ์ดํฐ ๋ก๋ ๋ฐ ์ ์ฒ๋ฆฌ (ํจ๋ฉ์ ์ค์์ฑ)**
|
| 182 |
+
RNN์ ๊ณ ์ ๋ ๊ธธ์ด์ ์ํ์ค๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ต๋๋ค.
|
| 183 |
+
ํ์ง๋ง ์ํ ๋ฆฌ๋ทฐ๋ ๊ธธ์ด๊ฐ ์ ๊ฐ๊ฐ์ด๋ฏ๋ก, **ํจ๋ฉ(Padding)**์ ํตํด ๋ชจ๋ ๋ฆฌ๋ทฐ์ ๊ธธ์ด๋ฅผ ๋์ผํ๊ฒ ๋ง์ถฐ์ค์ผ ํฉ๋๋ค.
|
| 184 |
+
```python
|
| 185 |
+
import numpy as np
|
| 186 |
+
import tensorflow as tf
|
| 187 |
+
from tensorflow import keras
|
| 188 |
+
from keras import layers
|
| 189 |
+
|
| 190 |
+
# ๊ฐ์ฅ ๋น๋๊ฐ ๋์ 1๋ง๊ฐ ๋จ์ด๋ง ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์
๋ก๋
|
| 191 |
+
(x_train, y_train), (x_test, y_test) = keras.datasets.imdb.load_data(num_words=10000)
|
| 192 |
+
|
| 193 |
+
print(f"ํจ๋ฉ ์ ์ฒซ ๋ฒ์งธ ๋ฆฌ๋ทฐ ๊ธธ์ด: {len(x_train[0])}")
|
| 194 |
+
|
| 195 |
+
# ๋ชจ๋ ์ํ์ค์ ๊ธธ์ด๋ฅผ 256์ผ๋ก ํต์ผ
|
| 196 |
+
# maxlen๋ณด๋ค ๊ธธ๋ฉด ์๋ผ๋ด๊ณ , ์งง์ผ๋ฉด ์๋ถ๋ถ์ 0์ผ๋ก ์ฑ์ (pre-padding)
|
| 197 |
+
x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=256)
|
| 198 |
+
x_test = keras.preprocessing.sequence.pad_sequences(x_test, maxlen=256)
|
| 199 |
+
|
| 200 |
+
print(f"ํจ๋ฉ ํ ์ฒซ ๋ฒ์งธ ๋ฆฌ๋ทฐ ๊ธธ์ด: {len(x_train[0])}")
|
| 201 |
+
```
|
| 202 |
+
|
| 203 |
+
**2๋จ๊ณ : ๋ชจ๋ธ ์ปดํ์ผ**
|
| 204 |
+
๋ชจ๋ธ์ ์ด๋ป๊ฒ ํ์ต์ํฌ์ง ํ์ต ๋ฐฉ๋ฒ์ ์ค์ ํฉ๋๋ค.
|
| 205 |
+
```python
|
| 206 |
+
model.compile(
|
| 207 |
+
# ์์ค ํจ์: ์์ธก์ด ์ ๋ต๊ณผ ์ผ๋ง๋ ๋ค๋ฅธ์ง ์ธก์ .
|
| 208 |
+
# ์ด์ง ๋ถ๋ฅ(0 ๋๋ 1) ๋ฌธ์ ์ด๋ฏ๋ก binary_crossentropy๊ฐ ๊ฐ์ฅ ์ ํฉ.
|
| 209 |
+
loss="binary_crossentropy",
|
| 210 |
+
|
| 211 |
+
# ์ตํฐ๋ง์ด์ : ์์ค์ ์ต์ํํ๊ธฐ ์ํด ๋ชจ๋ธ์ ๊ฐ์ค์น๋ฅผ ์
๋ฐ์ดํธํ๋ ์๊ณ ๋ฆฌ์ฆ.
|
| 212 |
+
# Adam์ ํ์ฌ ๊ฐ์ฅ ๋๋ฆฌ ์ฐ์ด๊ณ ์ฑ๋ฅ์ด ์ข์ ์ตํฐ๋ง์ด์ ์ค ํ๋.
|
| 213 |
+
optimizer="adam",
|
| 214 |
+
|
| 215 |
+
# ํ๊ฐ์งํ: ํ๋ จ ๊ณผ์ ์ ๋ชจ๋ํฐ๋งํ ์งํ. ์ ํ๋๋ฅผ ์ฌ์ฉ.
|
| 216 |
+
metrics=["accuracy"]
|
| 217 |
+
)
|
| 218 |
+
```
|
| 219 |
+
|
| 220 |
+
**3๋จ๊ณ : ๋ชจ๋ธ ํ์ต ๋ฐ ํ๊ฐ (๋ฐฐ์น, ์ํฌํฌ, ๊ทธ๋ฆฌ๊ณ ๊ณผ์ ํฉ)**
|
| 221 |
+
model.fit() ํจ์๋ก ์ค์ ํ์ต์ ์์ํฉ๋๋ค.
|
| 222 |
+
batch_size: ํ ๋ฒ์ ์ฒ๋ฆฌํ ๋ฐ์ดํฐ ์ํ์ ์. ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ๊ณผ ํ์ต ์๋์ ์ํฅ์ ์ค๋๋ค.
|
| 223 |
+
epochs: ์ ์ฒด ๋ฐ์ดํฐ์
์ ๋ช ๋ฒ ๋ฐ๋ณตํ์ฌ ํ์ตํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
|
| 224 |
+
|
| 225 |
+
```python
|
| 226 |
+
batch_size = 128
|
| 227 |
+
epochs = 10
|
| 228 |
+
|
| 229 |
+
# ๋ชจ๋ธ ํ์ต ์คํ
|
| 230 |
+
# validation_data๋ฅผ ์ง์ ํ์ฌ ๋งค ์ํฌํฌ๋ง๋ค ํ
์คํธ ๋ฐ์ดํฐ๋ก ์ฑ๋ฅ์ ๊ฒ์ฆ
|
| 231 |
+
history = model.fit(
|
| 232 |
+
x_train, y_train,
|
| 233 |
+
batch_size=batch_size,
|
| 234 |
+
epochs=epochs,
|
| 235 |
+
validation_data=(x_test, y_test)
|
| 236 |
+
)
|
| 237 |
+
|
| 238 |
+
# ํ์ต ์๋ฃ ํ ์ต์ข
์ฑ๋ฅ ํ๊ฐ
|
| 239 |
+
score = model.evaluate(x_test, y_test, verbose=0)
|
| 240 |
+
print(f"\nTest loss: {score[0]:.4f}")
|
| 241 |
+
print(f"Test accuracy: {score[1]:.4f}")
|
| 242 |
+
```
|
| 243 |
+
|
| 244 |
+
ํ์ต ๊ณผ์ ์ ์ง์ผ๋ณผ ๋, ํ๋ จ ๋ฐ์ดํฐ์ ์ ํ๋(accuracy)๋ ๊ณ์ ์ค๋ฅด๋๋ฐ ๊ฒ์ฆ ๋ฐ์ดํฐ์ ์ ํ๋(val_accuracy)๊ฐ ์ด๋ ์๊ฐ๋ถํฐ ์ ์ฒด๋๊ฑฐ๋ ๋จ์ด์ง๋ค๋ฉด, ๋ชจ๋ธ์ด ํ๋ จ ๋ฐ์ดํฐ์๋ง ๊ณผํ๊ฒ ์ ์ํ๋ **๊ณผ์ ํฉ(Overfitting)**์ด ๋ฐ์ํ๊ณ ์๋ค๋ ์ ํธ์
๋๋ค.
|
| 245 |
+
์ด๋ด ๋๋, ๋๋กญ์์์ ๋น์จ์ ๋์ด๊ฑฐ๋ ํ์ต์จ์ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
|
| 246 |
+
|
| 247 |
+
**4๋จ๊ณ : ํ์ต๋ ๋ชจ๋ธ ์ ์ฅ ๋ฐ ์ฌ์ฌ์ฉ**
|
| 248 |
+
ํ์ต์ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋ชจ๋ธ์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด๋๊ณ ํ์ํ ๋๋ง๋ค ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์
๋๋ค.
|
| 249 |
+
|
| 250 |
+
```python
|
| 251 |
+
# ๋ชจ๋ธ์ ๊ตฌ์กฐ, ๊ฐ์ค์น, ํ์ต ์ค์ ์ ๋ชจ๋ '.keras' ํ์ผ ํ๋์ ์ ์ฅ
|
| 252 |
+
model.save("my_rnn_model_imdb.keras")
|
| 253 |
+
|
| 254 |
+
# ์ ์ฅ๋ ๋ชจ๋ธ ๋ถ๋ฌ์ค๊ธฐ
|
| 255 |
+
loaded_model = keras.models.load_model("my_rnn_model_imdb.keras")
|
| 256 |
+
```
|
| 257 |
+
|
| 258 |
+
**5๋จ๊ณ : ๋๋ง์ ๋ฌธ์ฅ์ผ๋ก ๋ชจ๋ธ ํ
์คํธํ๊ธฐ (์ค์ ์์ธก)**
|
| 259 |
+
์ค์ ๋ฌธ์ฅ์ ์์ธกํ๋ ค๋ฉด, ํ๋ จ ๋ฐ์ดํฐ์ ๋์ผํ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
|
| 260 |
+
|
| 261 |
+
```python
|
| 262 |
+
# IMDB ๋ฐ์ดํฐ์
์ ๋จ์ด-์ธ๋ฑ์ค ์ฌ์ ๋ก๋
|
| 263 |
+
word_index = keras.datasets.imdb.get_word_index()
|
| 264 |
+
|
| 265 |
+
# ์๋ก์ด ๋ฆฌ๋ทฐ ๋ฌธ์ฅ
|
| 266 |
+
review = "This movie was fantastic and wonderful"
|
| 267 |
+
|
| 268 |
+
# 1. ์๋ฌธ์ ๋ณํ ๋ฐ ๋จ์ด ๋ถ๋ฆฌ -> 2. ๋จ์ด ์ธ๋ฑ์ค๋ก ๋ณํ
|
| 269 |
+
tokens = [word_index.get(word, 2) for word in review.lower().split()]
|
| 270 |
+
|
| 271 |
+
# 3. ํจ๋ฉ ์ฒ๋ฆฌ
|
| 272 |
+
padded_tokens = keras.preprocessing.sequence.pad_sequences([tokens], maxlen=256)
|
| 273 |
+
|
| 274 |
+
# 4. ์์ธก
|
| 275 |
+
prediction = loaded_model.predict(padded_tokens)
|
| 276 |
+
print(f"๋ฆฌ๋ทฐ: '{review}'")
|
| 277 |
+
print(f"๊ธ์ ํ๋ฅ : {prediction[0][0] * 100:.2f}%")
|
| 278 |
+
```
|
| 279 |
+
|
| 280 |
+
4. ๋๋ง์ RNN ๋ชจ๋ธ ์
๊ทธ๋ ์ด๋ํ๊ธฐ
|
| 281 |
+
๊ธฐ๋ณธ RNN๋ ์ข์ง๋ง, ๋ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋ช ๊ฐ์ง ํ๊ณ๋ฅผ ๊ทน๋ณตํด์ผ ํฉ๋๋ค.
|
| 282 |
+
|
| 283 |
+
**RNN์ ์น๋ช
์ ์ฝ์ : ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์ (Vanishing Gradients)**
|
| 284 |
+
"๋๋ ํ๋์ค์์ ํ์ด๋ ์๋๋ค. ... (์ค๋ต) ... ๊ทธ๋์ ๋๋ ___๋ฅผ ์ ์ฐฝํ๊ฒ ๊ตฌ์ฌํ๋ค."
|
| 285 |
+
๋น์นธ์ ๋ค์ด๊ฐ ๋ง์ 'ํ๋์ค์ด'์
๋๋ค.
|
| 286 |
+
์ฌ๋์ ๋ฌธ์ฅ ๋งจ ์์ 'ํ๋์ค'๋ผ๋ ๋จ์ด๋ฅผ ๊ธฐ์ตํ์ฌ ์ฝ๊ฒ ๋ต์ ์ฐพ์ต๋๋ค.
|
| 287 |
+
ํ์ง๋ง ๊ธฐ๋ณธ RNN์ ์ํ์ค๊ฐ ๊ธธ์ด์ง์๋ก, ์ญ์ ํ ๊ณผ์ ์์ ๊ทธ๋๋์ธํธ(๊ธฐ์ธ๊ธฐ)๊ฐ ๊ณ์ ๊ณฑํด์ง๋ฉด์ 0์ ๊ฐ๊น์์ ธ ์ฌ๋ผ์ง๋ ๊ทธ๋๋์ธํธ ์์ค(Vanishing Gradient) ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
|
| 288 |
+
์ด๋ก ์ธํด ๋ฌธ์ฅ ์๋ถ๋ถ์ ์ค์ํ ์ ๋ณด๋ฅผ ํ์ตํ์ง ๋ชปํ๊ฒ ๋ฉ๋๋ค.
|
| 289 |
+
์ด๋ฅผ ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์ ๋ผ๊ณ ํฉ๋๋ค.
|
| 290 |
+
|
| 291 |
+
**๊ธฐ์ต๋ ฅ ๊ฐํ : LSTM๊ณผ GRU์ ๋ฑ์ฅ**
|
| 292 |
+
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด **LSTM(Long Short-Term Memory)**๊ณผ **GRU(Gated Recurrent Unit)**๊ฐ ๋ฑ์ฅํ์ต๋๋ค.
|
| 293 |
+
์ด๋ค์ RNN ๋ด๋ถ์ **๊ฒ์ดํธ(Gate)**๋ผ๋ ์ ๊ตํ ์ฅ์น๋ฅผ ์ถ๊ฐํ์ฌ ์ ๋ณด์ ํ๋ฆ์ ์ ์ดํฉ๋๋ค.
|
| 294 |
+
- LSTM: '์
์ํ(Cell State)'๋ผ๋ ๋ณ๋์ ๊ธฐ์ต ์ปจ๋ฒ ์ด์ด ๋ฒจํธ๋ฅผ ๋๊ณ , ๋ง๊ฐ ๊ฒ์ดํธ(Forget Gate), ์
๋ ฅ ๊ฒ์ดํธ(Input Gate), ์ถ๋ ฅ ๊ฒ์ดํธ(Output Gate) 3๊ฐ์ ๊ฒ์ดํธ๋ฅผ ํตํด ์ด๋ค ์ ๋ณด๋ฅผ ๋ฒ๋ฆฌ๊ณ , ์ด๋ค ์ ๋ณด๋ฅผ ์๋ก ๊ธฐ์ตํ๊ณ , ์ด๋ค ์ ๋ณด๋ฅผ ์ถ๋ ฅํ ์ง ํ์ตํฉ๋๋ค.
|
| 295 |
+
์ฅ๊ธฐ ๊ธฐ์ต์ ๋งค์ฐ ํจ๊ณผ์ ์
๋๋ค.
|
| 296 |
+
- GRU: LSTM์ ๋ ๋จ์ํํ ๋ชจ๋ธ๋ก, **๋ฆฌ์
๊ฒ์ดํธ(Reset Gate)**์ ์
๋ฐ์ดํธ ๊ฒ์ดํธ(Update Gate) 2๊ฐ์ ๊ฒ์ดํธ๋ง ์ฌ์ฉํฉ๋๋ค.
|
| 297 |
+
ํ๋ผ๋ฏธํฐ ์๊ฐ ์ ์ด ๊ณ์ฐ ํจ์จ์ฑ์ด ๋๊ณ , ๋ง์ ๊ฒฝ์ฐ LSTM๊ณผ ๋น์ทํ ์ฑ๋ฅ์ ๋ณด์
๋๋ค.
|
| 298 |
+
|
| 299 |
+
```python
|
| 300 |
+
# LSTM์ 2๊ฐ ์ธต์ผ๋ก ์์ ๋ชจ๋ธ
|
| 301 |
+
model_lstm = keras.Sequential([
|
| 302 |
+
layers.Embedding(input_dim=10000, output_dim=64),
|
| 303 |
+
# return_sequences=True: ๋ค์ LSTM ์ธต์ผ๋ก ์ ์ฒด ์ํ์ค๋ฅผ ์ ๋ฌ
|
| 304 |
+
layers.LSTM(64, return_sequences=True),
|
| 305 |
+
layers.LSTM(32),
|
| 306 |
+
layers.Dense(1, activation='sigmoid')
|
| 307 |
+
])
|
| 308 |
+
```
|
| 309 |
+
|
| 310 |
+
**๊ณผ๊ฑฐ์ ๋ฏธ๋๋ฅผ ๋์์ : ์๋ฐฉํฅ RNN (Bidirectional RNN)**
|
| 311 |
+
"์ค๋ ์๋ก ์จ ___ ์ ์๋์ ์ ๋ง ๋ฉ์ง๋ค."
|
| 312 |
+
๋น์นธ์ ๋ค์ด๊ฐ '์์ด'๋ผ๋ ๋จ์ด๋ ๋ท๋ถ๋ถ์ '์ ์๋'์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ด์ผ ๋ ์ ํํ ์ ์ถํ ์ ์์ต๋๋ค.
|
| 313 |
+
์ด์ฒ๋ผ ๋ฌธ๋งฅ์ ์๋ฐฉํฅ๋ฟ๋ง ์๋๋ผ ์ญ๋ฐฉํฅ์ ์ ๋ณด๋ ์ค์ํฉ๋๋ค.
|
| 314 |
+
**์๋ฐฉํฅ RNN(Bidirectional RNN)**์ ์ํ์ค๋ฅผ ์ ๋ฐฉํฅ์ผ๋ก ํ๋ฒ, ์ญ๋ฐฉํฅ์ผ๋ก ํ๋ฒ ๏ฟฝ๏ฟฝ๏ฟฝ๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํ ํ, ๋ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ์ ์ต์ข
์ถ๋ ฅ์ ๋ง๋ญ๋๋ค.
|
| 315 |
+
์ด๋ฅผ ํตํด ๋ฌธ๋งฅ์ ํจ์ฌ ๋ ํ๋ถํ๊ฒ ์ดํดํ ์ ์์ต๋๋ค.
|
| 316 |
+
|
| 317 |
+
```python
|
| 318 |
+
model_bidirectional = keras.Sequential([
|
| 319 |
+
layers.Embedding(input_dim=10000, output_dim=64),
|
| 320 |
+
# LSTM ๋ ์ด์ด๋ฅผ Bidirectional ๋ํผ๋ก ๊ฐ์ธ๊ธฐ๋ง ํ๋ฉด ๋จ
|
| 321 |
+
layers.Bidirectional(layers.LSTM(64)),
|
| 322 |
+
layers.Dropout(0.5), # ๊ณผ์ ํฉ ๋ฐฉ์ง๋ฅผ ์ํ ๋๋กญ์์ ์ถ๊ฐ
|
| 323 |
+
layers.Dense(1, activation='sigmoid')
|
| 324 |
+
])
|
| 325 |
+
```
|
| 326 |
+
|
| 327 |
+
## 5. ๊ฒฐ๋ก
|
| 328 |
+
์ค๋์ ์์ฐจ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ทผ๊ฐ์ด ๋๋ RNN์ ํต์ฌ ์๋ฆฌ๋ถํฐ ์์ํ์ฌ, ์ค์ ์ฝ๋๋ก ๋ชจ๋ธ์ ๊ตฌํํ๊ณ , LSTM, GRU, ์๋ฐฉํฅ RNN๊ณผ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฒ์ ํตํด ์ฑ๋ฅ์ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ๊น์ง ์์ธํ๊ฒ ์์๋ณด์์ต๋๋ค.
|
| 329 |
+
RNN์ ๊ทธ ์์ฒด๋ก๋ ๊ฐ๋ ฅํ์ง๋ง, ์์ฐ์ด ์ฒ๋ฆฌ ๋ถ์ผ์ ๋ฐ์ ์ ์์ฒญ๋ ๊ธฐ์ฌ๋ฅผ ํ ๊ธฐ๋
๋น์ ์ธ ๋ชจ๋ธ์
๋๋ค.
|
| 330 |
+
ํนํ RNN์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๋ ค๋ ์๋ ์์์ ํ์ํ ์ดํ
์
(Attention) ๋ฉ์ปค๋์ฆ์ ์ดํ ํธ๋์คํฌ๋จธ(Transformer)๋ผ๋ ํ์ ์ ์ธ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ด ๋์์ต๋๋ค.
|
| 331 |
+
๋ค์์๋ ์ดํ
์
๊ธฐ๋ฒ๊ณผ ํธ๋์คํฌ๋จธ ๋ชจ๋ธ, ์ธ์ฝ๋, ๋์ฝ๋๋ก ๋์์ค๊ฒ ์ต๋๋ค!!
|
| 332 |
์ค๋๋ ์ข์ํ๋ฃจ ๋ณด๋ด์ธ์!!
|