1. GRU Model์ ๋ฌด์์ผ๊น?
GRU (Gated Recurrent Unit)๋ ์ํ ์ ๊ฒฝ๋ง(RNN)์ ํ ์ข ๋ฅ๋ก, ์์์ ์ค๋ช ํ LSTM(Long Short-Term Memory)๋ชจ๋ธ์ ๋จ์ํ๋ ํํ๋ก ๋ณผ ์ ์์ต๋๋ค.
- GRU Model์ LSTM Model๊ณผ ๋น์ทํ ๋ฐฉ์์ผ๋ก ์๋ํ์ง๋ง, ๋ ๊ฐ๋จํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- LSTM Model์ ์ฅ์ ์ ์ ์งํ๋, Gate(๊ฒ์ดํธ)์ ๊ตฌ์กฐ๋ฅผ ๋จ์ํ๊ฒ ๋ง๋ ๋ชจ๋ธ์ด GRU Model ์ ๋๋ค.
- ๋ํ GRU, LSTM Model์ ๋๋ค Long-Term Dependency(์ฅ๊ธฐ ์์กด์ฑ) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ์ฌ ๋ง๋ค์ด ์ก์ต๋๋ค.
- LSTM Model์ ์ค๋ช ํ ๊ธ์์ ์ค๋ช ํ์ง๋ง LSTM Model์ "Cell State(์ ์ํ)"์ "Hidden state(์จ๊ฒจ์ง ์ํ)"๋ฅผ ๊ฐ๊ฐ ๋ค๋ฃน๋๋ค. ๊ทธ๋ฆฌ๊ณ 4๊ฐ์ "Gate" ์ ๋ ฅ, ๋ง๊ฐ, ์ถ๋ ฅ, ๊ธฐ์ต ๊ฒ์ดํธ๋ฅผ ๊ฐ์ง๋๋ค.
+ ์ ๊ฐ ์ฐพ์๋ณด๋ฉด์ ์ ๋ด์ฉ์ธ๋ฐ, ๊ธฐ์ต ๊ฒ์ดํธ๋ ๋ฌธํ์ ๋ฐ๋ผ ๊ฒ์ดํธ๋ผ๊ณ ์ธ๊ธ ๋๊ธฐ๋ ํ๊ณ ์๋๋ค๊ณ ํ๊ธฐ๋ ํฉ๋๋ค.
์ ๋ ฅ ๊ฒ์ดํธ์์ ํต๊ณผํ ์ ๋ณด & ๋ง๊ฐ ๊ฒ์ดํธ์์ ์ ๊ฑฐ๋์ง ์์ ์ ๋ณด๋ฅผ ํฉ์ณ Cell State(์ ์ํ)๋ก ์ ๋ฐ์ดํธ ํ๋ ๊ณผ์ ์ "๊ธฐ์ต" ๋จ๊ณ๋ผ๊ณ ํ๋๋ฐ ์ด ๊ณผ์ ์ "๊ธฐ์ต ๊ฒ์ดํธ"๋ผ๊ณ ํ๋ค๊ณ ํ๋ค์.
- ๊ทผ๋ฐ GRU Model์ LSTM Model๊ณผ ๋ค๋ฅธ์ ์ด ํ๋์ "Hidden state(์จ๊ฒจ์ง ์ํ)" ๋ง ์ ์งํฉ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ LSTM์ 4๊ฐ์ ๊ฒ์ดํธ๋ฅผ ๊ฐ์ง๊ฒ๊ณผ ๋ฌ๋ฆฌ 2๊ฐ์ ๊ฒ์ดํธ "Update Gate(์ ๋ฐ์ดํธ ๊ฒ์ดํธ)", "Reset Gate(๋ฆฌ์ ๊ฒ์ดํธ)"๋ง ๊ฐ์ง๋๋ค.
2. Update Gate(์ ๋ฐ์ดํธ ๊ฒ์ดํธ), Reset Gate(๋ฆฌ์ ๊ฒ์ดํธ)
๊ทธ๋ฌ๋ฉด ํ๋ฒ "Update Gate(์ ๋ฐ์ดํธ ๊ฒ์ดํธ)", "Reset Gate(๋ฆฌ์ ๊ฒ์ดํธ)"์ ๋ฐํ์ฌ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
Update Gate(์ ๋ฐ์ดํธ ๊ฒ์ดํธ)
- ์ด ๊ฒ์ดํธ๋ ์๋ก์ด input(์ ๋ ฅ)๊ฐ์ ์ผ๋ง๋ "Hidden state(์จ๊ฒจ์ง ์ํ)"์ ๋ฐ์ํ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ๋ํ "Update Gate(์ ๋ฐ์ดํธ ๊ฒ์ดํธ)"๋ LSTM Model์ "Input Gate(์ ๋ ฅ ๊ฒ์ดํธ)" ์ "Forget Gate(๋ง๊ฐ ๊ฒ์ดํธ)"์ ์ญํ ์ ํฉ์น ๊ฒ์ผ๋ก ๋ณผ ์ ์์ต๋๋ค.
Reset Gate(๋ฆฌ์ ๊ฒ์ดํธ)
- ์ด ๊ฒ์ดํธ๋ ๊ณผ๊ฑฐ์ "Hidden state(์จ๊ฒจ์ง ์ํ)"๋ฅผ ์ผ๋ง๋ '์์ด๋ฒ๋ฆด(Forget)'์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ์ด๊ฑด LSTM Model์ "Cell State(์ ์ํ)"๋ฅผ ์ด๋ป๊ฒ ์ ๋ฐ์ดํธ๋ฅผ ํ ์ง ๊ฒฐ์ ํ๋ ์ญํ ์ ํฉ๋๋ค.
3. GRU Model ์์ ๋ค์ด๊ฐ๋ณด๊ธฐ
LSTM์ ๋ชจ๋ธ๊ณผ ๋ค๋ฅธ์ ์ "Cell State(์ ์ํ)"๋ฅผ ์์ ๊ณ , "Hidden state(์จ๊ฒจ์ง ์ํ, ๊ทธ๋ฆผ์์ h)"๊ฐ ๊ทธ ์ญํ ์ ํ๋๋ก ์์ ํ๊ฒ ์ ๋๋ค.
- ์ค๋ช
ํด๋ณด์๋ฉด ์ฌ๊ธฐ์ "ht"๋ t ์์ ์์์ Hidden state(์จ๊ฒจ์ง ์ํ)๋ฅผ ์๋ฏธํ๊ณ ์ฃผ๋ก ์ํ์ ๊ฒฝ๋ง(LSTM, GRU)๋ชจ๋ธ์์ ์ฌ์ฉ๋ฉ๋๋ค.
- Hidden state(์จ๊ฒจ์ง ์ํ)๋ Sequence์ ๊ฐ Element(์์)๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ง๋ค ์ ๋ฐ์ดํธ ๋๋ ์ ๊ฒฝ๋ง์ "๊ธฐ์ต"์ ์๋ฏธํฉ๋๋ค.
- ๋ํ ์ด์ Element์ ์ ๋ณด๋ค์ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ์ด ์ ๋ณด๋ค์ ๋ค์ Element๋ฅผ ์ฒ๋ฆฌํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ํ "ht"๋ t -1 ์์ ์ Hidden state & "ht -1"์ t ์์ ์ input(์ ๋ ฅ)๊ฐ์ ๊ธฐ๋ฐํ์ฌ ๊ณ์ฐ๋ฉ๋๋ค.
- "rt"๋ Reset Gate(๋ฆฌ์
๊ฒ์ดํธ)๋ฅผ ๋ํ๋ด๋ฉฐ ๋ค์ ์ํ "ht", Hidden state(์จ๊ฒจ์ง ์ํ)๋ฅผ ๊ณ์ฐ ํ๊ธฐ ์ํด ์ด์ ์ํ"ht-1"๊ฐ์์ ์ฌ์ฉํ ๋ถ๋ถ์ ์ ์ด ํฉ๋๋ค.
- ์ด๋ ํ์ฌ input(์ ๋ ฅ)๊ฐ๊ณผ ์ด์ Hidden state(์จ๊ฒจ์ง ์ํ)์ ๊ธฐ๋ฐํ์ฌ ๊ณ์ฐ๋๋ฉฐ, 0~ 1 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๋๋ค.
- Reset Gate(๋ฆฌ์ ๊ฒ์ดํธ)์ ๊ฐ์ด 0์ ๊ฐ๊น์์ง๋ฉด ์ด์ Hidden state(์จ๊ฒจ์ง ์ํ)์ ์ ๋ณด๋ "Forget" ๋ฉ๋๋ค.
- Reset Gate(๋ฆฌ์ ๊ฒ์ดํธ)์ ๊ฐ์ด 1์ ๊ฐ๊น์์ง๋ฉด ์ด์ Hidden state(์จ๊ฒจ์ง ์ํ)์ ์ ๋ณด๋ ์ ์ง๋ฉ๋๋ค.
- "zt"๋ Update Gate(์
๋ฐ์ดํธ ๊ฒ์ดํธ)๋ฅผ ๋ํ๋ด๋ฉฐ ์ด์ ์ํ "ht-1"๊ฐ์ ์ ์งํ ์ง, ์๋๋ฉด ์๋ก์ด ์ํ "ht"๋ก ๋์ฒดํ ์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ์ด๋ ํ์ฌ input(์ ๋ ฅ)๊ฐ๊ณผ ์ด์ Hidden state(์จ๊ฒจ์ง ์ํ)์ ๊ธฐ๋ฐํ์ฌ ๊ณ์ฐ๋๋ฉฐ, 0~ 1 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๋๋ค.
- Update Gate(์ ๋ฐ์ดํธ ๊ฒ์ดํธ)์ ๊ฐ์ด 1์ ๊ฐ๊น์์ง๋ฉด ์ด์ Hidden state(์จ๊ฒจ์ง ์ํ)์ ์ ๋ณด๊ฐ ์ ์ง๋ฉ๋๋ค.
- Update Gate(์ ๋ฐ์ดํธ ๊ฒ์ดํธ)์ ๊ฐ์ด 0์ ๊ฐ๊น์์ง๋ฉด ์๋ก์ด Hidden state(์จ๊ฒจ์ง ์ํ)์ ์ ๋ณด๋ ๋์ฒด๋ฉ๋๋ค.
4. GRU Model ์ฝ๋ ์์
ํ๋ฒ GRU Model์ ์ฝ๋ ์์๋ฅผ ํ๋ฒ ๋ณด๊ฒ ์ต๋๋ค.
from keras.models import Sequential
from keras.layers import GRU, Dense
# ๋ชจ๋ธ ์ด๊ธฐํ
model = Sequential()
# GRU layer add
# ์
๋ ฅ ์ฐจ์์ ํน์ฑ์ ์์ ๋ฐ๋ผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค. 100 - hidden unit ๊ฐ์
model.add(GRU(100, input_shape=(timesteps, input_dim)))
# fully connected layer add, ์ถ๋ ฅ Node ๊ฐ์๊ฐ 1๊ฐ ์ด๋ฏ๋ก 1์ด๋ผ๊ณ ํจ
model.add(Dense(1, activation='sigmoid'))
# model compile
# ์ด์ง ๋ถ๋ฅ ๋ฌธ์ ์ด๋ฏ๋ก ์์ค ํจ์๋ก 'binary_crossentropy'๋ฅผ ์ฌ์ฉํฉ๋๋ค.
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
- GRU layer๋ฅผ ์ ์ธํด์ค๋, "model.add(GRU(100, input_shape=(timesteps, input_dim)))" ์ด๋ฐ ํ์์ผ๋ก ์ ์ธ์ ํด์ค์ผ ํฉ๋๋ค.
- ์ฌ๊ธฐ์๋ 100์ hidden Unit์ ๊ฐ์์ ๋๋ค.
- ์ฌ๊ธฐ์ "timesteps"์ Sequence์ Length(๊ธธ์ด), input_dim์ ๊ฐ Sequence ์์์ ํน์ฑ ๊ฐ์๋ฅผ ๋ํ๋ ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ํ๋์ ์ถ๋ ฅ ๋
ธ๋๋ฅผ ๊ฐ์ง Dense Layer(์์ ์ฐ๊ฒฐ ๋ ์ด์ด)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- "model.add(Dense(1, activation='sigmoid'))" -> ์ถ๋ ฅ Node์ ๊ฐ์๊ฐ ํ๋์ด๋ฏ๋ก, activation ์ผ์ชฝ ์์ ์ถ๋ ฅ๋ ธ๋์ ๊ฐ์๋ฅผ ์ ๋ ํ๋ผ๋ฏธํฐ ๊ณต๊ฐ์ 1์ ์ ์ด์ฃผ์์ต๋๋ค.
- ๋ํ ์ ๊ฐ ๊ฐ๋จํ ๋ง๋ ๋ชจ๋ธ์ Binary(์ด์ง)๋ถ๋ฅ ๋ฌธ์ ์ ์ ํฉํ๊ฒ ๋ง๋ค์์ต๋๋ค.
- ๊ทธ๋์ ์ถ๋ ฅ Dense Layer์ 0~1์ฌ์ด์ ํ๋ฅ ๊ฐ์ ์ถ๋ ฅํด์ฃผ๋ "Sigmoid ํจ์", Compile ์ฝ๋์์๋ Binary(์ด์ง)๋ถ๋ฅ๋ฅผ ์ํด์ "binary_crossentropy"๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- ๋ง์ฝ์ ๋ค์ค Class๋ฅผ ๋ถ๋ฅํ๋ ๋ฌธ์ ๋ผ๋ฉด ํ์ฑํ ํจ์ -> "activation"์ "softmax"ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ
- ๋ชจ๋ธ Compile ์ฝ๋์์ ์์ค ํจ์ -> "loss" ๋ฅผ 'categorical_crossentropy'๋ก ์ค์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
+ Softmax ํจ์: Vector๋ฅผ input์ผ๋ก ๋ฐ์์ ๊ฐ ์์์ ๊ฐ์ 0~1 ์ฌ์ด์ ๊ฐ์ผ๋ก ๋ฐํํ์ฌ, ์ด ๊ฐ๋ค์ ํฉ์ด 1์ด ๋๋๋ก ๋ง๋๋ ํจ์์ ๋๋ค. ์ฃผ๋ก ํ๋ฅ ๋ถํฌ๋ฅผ ๋ํ๋ด๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- ๊ณต์๋ฌธ์์ ์ด๋ ํ parameter๊ฐ ๋ค์ด๊ฐ์ ์๋์ง ๋์์์ผ๋๊น ์ฐธ๊ณ ํด์ฃผ์ธ์.
tf.keras.layers.GRU | TensorFlow v2.15.0.post1
Gated Recurrent Unit - Cho et al. 2014.
www.tensorflow.org
'๐ NLP (์์ฐ์ด์ฒ๋ฆฌ) > ๐ Natural Language Processing' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[NLP] Word Embedding - ์๋ ์๋ฒ ๋ฉ (0) | 2024.02.12 |
---|---|
[NLP] Word2Vec, CBOW, Skip-Gram - ๊ฐ๋ & Model (0) | 2024.02.03 |
[NLP] LSTM - Long Short Term Memory Model (0) | 2024.01.29 |
[NLP] Vanilla RNN Model, Long-Term Dependency - ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์ (0) | 2024.01.23 |
[NLP] RNN (Recurrent Netural Network) - ์ํ์ ๊ฒฝ๋ง (0) | 2024.01.22 |