1106 ์ค์ต (RNN)
๋จธ์ ๋ฌ๋์์๋ BOW, TF-IDF ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ฃผ๋ก ์ฌ์ฉํ๊ณ ๋ฅ๋ฌ๋์์๋ ์ฌ์ฉํ๊ธฐ๋ ํฉ๋๋ค.
RNN์์๋ ์์ฐจ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ธ์ฝ๋ฉํด์ฃผ๋ ์ํ์ค์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ข ๋ ๋์ ์ฑ๋ฅ์ ๋ด๊ธฐ๋ ํฉ๋๋ค.
๐ RNN
: ์์๊ฐ ์๋ ์๊ณ์ด ๋ฐ์ดํฐ์ ์ฌ์ฉ
- ์ธต์ ๊น๊ฒ ์์ง ์์
RNN Explanier
RNN์ ์๊ฐํ ์ค๋ช
์ด ์ ๋์ด ์๋ ๋ธ๋ก๊ทธ
์
(cell): RNN์ ์๋์ธต์์ ํ์ฑํ ํจ์๋ฅผ ํตํด ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ณด๋ด๋ ์ญํ ์ ํ๋ ๋
ธ๋(RNN์ ๋ฐ๋ณต ๋จ์, ๊ฐ๋ณ)
๋ฉ๋ชจ๋ฆฌ์
(memory cell): ์ด์ ์ ๊ฐ์ ๊ธฐ์ตํ๋ ์ผ์ข
์ ๋ฉ๋ชจ๋ฆฌ ์ญํ ์ ์ํํ๋ ์
(์ ์ฒด, RNNcell์ด๋ผ๊ณ ๋ ํจ)
์๋์ํ(hidden state): ์๋์ธต์ ๋ฉ๋ชจ๋ฆฌ ์
์์ ๋์จ ๊ฐ์ด ์ถ๋ ฅ์ธต ๋ฐฉํฅ ๋๋ ๋ค์ ์์ ์ ์์ (๋ค์ ๋ฉ๋ชจ๋ฆฌ ์
)์๊ฒ ๋ณด๋ด๋ ์ํ
- RNN์ ์๋์ธต์ ๋
ธ๋์์ ํ์ฑํ ํจ์๋ฅผ ํตํด ๋์จ ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅ์ธต ๋ฐฉํฅ์ผ๋ก๋ ๋ณด๋ด๋ฉด์,
๋ค์ ์๋์ธต ๋
ธ๋์ ๋ค์ ๊ณ์ฐ์ ์
๋ ฅ์ผ๋ก ๋ณด๋ด๋ ํน์ง
๋ค์ํ ๊ธธ์ด์ ์
๋ ฅ ์ํ์ค๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ ์ธ๊ณต ์ ๊ฒฝ๋ง
ํ์์คํ
(timesteps)
: ์
๋ ฅ ์ํ์ค์ ๊ธธ์ด(input_length)๋ผ๊ณ ํํํ๊ธฐ๋ ํจ. ์์ ์ ์
- ์ํ๋คํธ์ํฌ์์๋ ์๋์ธต์ด ์
๋ ฅ์ธต๊ณผ ์ด์ ํ์์คํ
์ ์๋์ธต์ผ๋ก๋ถํฐ ์ ๋ณด๋ฅผ ๋ฐ์
- ์ธ์ ํ ํ์ ์คํ
์ ์ ๋ณด๊ฐ ์๋์ธต์ ํ๋ฅด๊ธฐ ๋๋ฌธ์ ์ด์ ์ด๋ฒคํธ๋ฅผ ๊ธฐ์ต๊ฐ๋ฅ(์ ๊ฒฝ๋ง ๋ด๋ถ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ฉ)
โ
BPTT (BackPropagation Through Time), RNN์ ์ญ์ ํ
- ๊ธฐ์ธ๊ธฐ๋ ์ค์ฐจ์ ๋ณํ์ ๋ํ ๊ฐ์ค์น์ ๋ณํ์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ธ์ ๋ง๋ ์ญ์ ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ธฐ์ธ๊ธฐ๋ฅผ ์ฐพ์์ผ ์ฑ๋ฅ์ ๋์ผ ์ ์์
- ๋ค๋ฅธ ์ ๊ฒฝ๋ง๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก RNN ์ญ์ ๊ฒฝ์ฌ ํ๊ฐ๋ฒ(Gradient Descent)๊ณผ ์ค์ฐจ ์ญ์ ํ(backpropagation)๋ฅผ ์ด์ฉํด ํ์ต
- ์ ํํ๊ฒ๋ ์๊ฐ ํ๋ฆ์ ๋ฐ๋ฅธ ์์
์ ํ๊ธฐ ๋๋ฌธ์ ์ญ์ ํ๋ฅผ ํ์ฅํ BPTT(Back-Propagation Through Time)๋ฅผ ์ฌ์ฉํด์ ํ์ต
โ
RNN์ ํ๊ณ์ : ๊ธฐ์ธ๊ธฐ ์์ค
:๋ณต์กํ ์ฐ์ฐ์ผ๋ก ์ธํ ๊ธฐ์ธ๊ธฐ ๋ฌธ์ ๋ฐ์
=> ์์ฃผ ์ค๋ ์ ์ ๋ค์ด์จ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ตํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์
๐ก ๋ฌธ์ ์ : ๊ธฐ์ธ๊ธฐ ์์ค ๋๋ ํญ๋ฐ ๋ฌธ์ (Vanishing-Exploding Gradient Problem)
- ์๊ฐ์ ํตํ ์ญ์ ํ( Backpropagation Through Time)์ ํ๋ก์ธ์ค๋ ์ผ๋ฐ ์ญ์ ํ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ๊ณฑ์
๊ณผ ์ฐ์ฐ์ ๋์
๐กํด๊ฒฐ์ฑ
: Truncated-Backpropagation Through Time(์๋ต๋ BPTT, ํ์ฌ time step์์ 5 time step ์ด์ ๊น์ง ํ์ธ)
๐ RNN์ ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
โ
LSTM (Long Short-Term Memory)
: ์ํ ์ ๊ฒฝ๋ง(RNN) ๊ธฐ๋ฒ์ ํ๋
- ๋ฉ๋ชจ๋ฆฌ ์
, ์
๋ ฅ ๊ฒ์ดํธ, ์ถ๋ ฅ ๊ฒ์ดํธ, ๋ง๊ฐ ๊ฒ์ดํธ๋ฅผ ์ด์ฉํด ๊ธฐ์กด ์ํ ์ ๊ฒฝ๋ง(RNN)์ ๋ฌธ์ ์ธ ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์ ๋ฅผ ๋ฐฉ์ง
- LSTM์๊ณ ๋ฆฌ์ฆ์ Cell State๋ผ๊ณ ๋ถ๋ฆฌ๋ ํน์ง์ธต์ ํ๋ ๋ ๋ฃ์ด Weight๋ฅผ ๊ณ์ ๊ธฐ์ตํ ๊ฒ์ธ์ง ๊ฒฐ์
- ์
์ํ(Cell state)๋ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ๋ ๊ธฐ๋ฅ์ ๋ด๋น >> LSTM์ ๊ณผ๊ฑฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ํด์ ์
๋ฐ์ดํธ
- ๊ธฐ์กด RNN์ ๊ฒฝ์ฐ, ์ ๋ณด์ ์ ๋ณด์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ฉด, ์ด๊ธฐ์ Weight๊ฐ์ด ์ ์ง๋์ง ์์ ํ์ต๋ฅ๋ ฅ์ด ์ ํ
๐ก ์ฅ์ :
- ๊ฐ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ปจํธ๋กค ๊ฐ๋ฅ
- ๊ฒฐ๊ณผ๊ฐ ์ปจํธ๋กค ๊ฐ๋ฅ
๐ก ๋จ์ :
- ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ฎ์ด์์ ์ง ๊ฐ๋ฅ์ฑ
- ์ฐ์ฐ์๋๊ฐ ๋๋ฆผ
โ
GRU (Gated Recurrent Units)
: LSTM์ ๋ณํ์ํจ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, Gradient Vanishing์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
- LSTM์ ์ด๊ธฐ์ weight๊ฐ ๊ณ์ ์ง์์ ์ผ๋ก ์
๋ฐ์ดํธ๋์์ง๋ง, GRUs๋
Update Gate์ Reset Gate๋ฅผ ์ถ๊ฐํ์ฌ, ๊ณผ๊ฑฐ์ ์ ๋ณด๋ฅผ ์ด๋ป๊ฒ ๋ฐ์ํ ๊ฒ์ธ์ง
๊ฒฐ์ (GRU๋ ๊ฒ์ดํธ๊ฐ 2๊ฐ, LSTM์ 3๊ฐ)
- Update Gate๋ ๊ณผ๊ฑฐ์ ์ํ๋ฅผ ๋ฐ์ํ๋ Gate์ด๋ฉฐ, Reset Gate๋ ํ ์์ ์ ๋ณด์ ๊ณผ๊ฑฐ ์์ ์ ๋ณด์ ๋ฐ์ ์ฌ๋ถ๋ฅผ ๊ฒฐ์
๐ก ์ฅ์ :
- ์ฐ์ฐ์๋๊ฐ ๋น ๋ฆ
- LSTM์ฒ๋ผ ๋ฎ์ด์์ ์ง ๊ฐ๋ฅ์ฑ์ด ์์
๐ก ๋จ์ :
- ๋ฉ๋ชจ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์ปจํธ๋กค ๋ถ๊ฐ
๐ก ๊ธฐ์กด์ RNN์ธต์ LSTM ๋๋ GRU๋ก ์ด๋ฆ๋ง ๋ณ๊ฒฝํ๋ฉด ๋จ.
GRU๋ณด๋ค๋ LSTM์ด ๋ ๋ง์ด ์ฌ์ฉ๋จ.
๐ Modelling
- Keras์ ์ธ ๊ฐ์ ๋ด์ฅ RNN
keras.layers.SimpleRNN
: ์ด์ ํ์์คํ
์ ์ถ๋ ฅ์ด ๋ค์ ํ์์คํ
์ผ๋ก ๊ณต๊ธ๋๋ ์์ ํ ์ฐ๊ฒฐ๋ RNN์
๋๋ค.
keras.layers.GRU
keras.layers.LSTM
- ๋ด์ฅ RNN์ ์ฃผ์ ๊ธฐ๋ฅ
- dropout ๋ฐ recurrent_dropout ์ธ์๋ฅผ ํตํ ๋ฐ๋ณต ๋๋กญ์์
- go_backwards ์ธ์๋ฅผ ํตํด ์
๋ ฅ ์ํ์ค๋ฅผ ๋ฐ๋๋ก ์ฒ๋ฆฌํ ์ ์์
- unroll ์ธ์๋ฅผ ํตํ ๋ฃจํ ์ธ๋กค๋ง(CPU์์ ์งง์ ์ํ์ค๋ฅผ ์ฒ๋ฆฌํ ๋ ์๋๊ฐ ํฌ๊ฒ ํฅ์๋ ์ ์์)

์ถ์ฒ: https://www.tensorflow.org/text/tutorials/text_classification_rnn
โ
TextVectorization (์ธ์ฝ๋ฉ), 1์ฐจ์
VOCAB_SIZE = 1000
encoder = tf.keras.layers.TextVectorization(
max_tokens=VOCAB_SIZE)
encoder.adapt(train_dataset.map(lambda text, label: text))
๐ก adapt()
== fit_transform()
โ
Embedding (๋ค์ฐจ์์ผ๋ก ๋จ์ด์ ์ ์ฌ๋์ ๋ฐ๋ฅธ ๊ฑฐ๋ฆฌ ๊ณ์ฐ)
: ๋จ์ด ์๋ฒ ๋ฉ์ ์ ์ฌํ ๋จ์ด๊ฐ ์ ์ฌํ ์ธ์ฝ๋ฉ์ ๊ฐ๋ ํจ์จ์ ์ด๊ณ ์กฐ๋ฐํ ํํ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- ์ค์ํ ๊ฒ์ ์ด ์ธ์ฝ๋ฉ์ ์ง์ ์ง์ ํ ํ์๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ์๋ฒ ๋ฉ์ ๋ถ๋ ์์์ ๊ฐ์ ์กฐ๋ฐํ ๋ฒกํฐ์
๋๋ค(๋ฒกํฐ์ ๊ธธ์ด๋ ์ฌ์ฉ์๊ฐ ์ง์ ํ๋ ๋งค๊ฐ๋ณ์).

์ถ์ฒ: https://www.tensorflow.org/text/guide/word_embeddings
Embedding(vocab_size, embedding_dim)
- Embedding layer: ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ซ์ํ์ผ๋ก๋ง ๋ฐ๊ฟ ๋ฃ์ผ๋ฉด ๋จ์ด ์ฌ์ด์ ์ ์ฌ๋๋ฅผ ํ์
ํ๊ธฐ ์ด๋ ค์ ์ซ์ํ์ ๋ฒกํฐํ์ผ๋ก ๋ณํํด์ฃผ๋ ์์
์ด ํ์ํฉ๋๋ค. ๋ชจ๋ธ ๊ตฌ์ฑ์ธต ์ค ๊ฐ ๋จ์ด์ ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ์ฌ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์ ํด์ง ๊ธธ์ด๋ก ์์ถํด์ฃผ๋ ์ธต
- Embedding layer์ ํตํด ์ถ๋ ฅ๋ ์๋ฒ ๋ฉ ๋ฒกํฐ์ ์ต์ข
์ฐจ์์ (batch_size, vocab_size, embedding_dim)์ด ๋ฉ๋๋ค.
โ
Bidirectional (์๋ฐฉํฅ ํ์ต)
: ์์ฐจ RNN ํ์ต ๋ฐฉํฅ์๋ ํ๊ณ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ฐฉํฅ์ ํ์ต์ ํตํด์ ํด๊ฒฐํ๋ ๊ธฐ๋ฒ์
๋๋ค.

์์ฐจ RNN์ผ๋ก๋ง ํ๋ฉด ๋ ์ด, ๋๋ฌด๋ง ๋ณด๊ณ ๋ ์จ์ ์ํ๋ฅผ ํ์
ํด์ผํ์ง๋ง ์๋ฐฉํฅ ํ์ต์ ์ด์ฉํ๋ฉด ์ผฐ๋ค, ์์ด์ปจ์ ๋ณด๊ณ ๋ ์จ์ ์ํ๋ฅผ ๋ ์ ์ ์ถํ ์ ์์ต๋๋ค
๐ก validation_split ์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ด ์ ์ ๋์ต๋๋ค. ๊ทธ๋ฐ๋ฐ train_test_split ์ผ๋ก train ์ train, valid๋ก ๋๋ ์ค ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ข ๋ ๋์ ์ฑ๋ฅ์ ๋
๋๋ค.
๐ค ์ ์ผ๊น์?
stratify ์ ๋ฌด์ ์ฐจ์ด (class๊ฐ ๊ท ์ผํ๊ฒ ํ์ต๋์ง ์๋ ๋ฌธ์ ๋ฐ์)
model = Sequential()
model.add(Embedding(input_dim=vocab_size, output_dim=embedding_dim,
name="embedding", input_length=max_length))
model.add(SimpleRNN(units=32, return_sequences=True))
model.add(SimpleRNN(units=32))
model.add(Dense(units=n_class, activation="softmax"))
return_sequences=True
๋ Dense layer์ ์ถ๋ ฅ์ธต์๋ ์ฌ์ฉํ์ง ์๋๋ค.
๐ SUMMARY
๐ก ํ
์คํธ ๋ฐ์ดํฐ ๋ฒกํฐํ ํ๋ ๋ฐฉ๋ฒ
- ํ ํฐํ(str.split()) => one-hot-encoding => bag of words(min_df, max_df, analyzer, stopwords, n-gram)
=> TF-IDF(๋๋ฌด ์์ฃผ ๋ฑ์ฅํ๋ ๋จ์ด๋ ๋ฎ์ ๊ฐ์ค์น, ํน์ ๋ฌธ์์๋ง ์์ฃผ ๋ฑ์ฅํ๋ ๋จ์ด๋ ๋์ ๊ฐ์ค์น)
- RNN ์ ์์๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ์์ธกํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋๋ฐ BOW ์์๋ฅผ ๋ณด์กดํ์ง ์์ต๋๋ค. ๊ทธ๋์ ์ํ์ค ๋ฐฉ์์ ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ์ต๋๋ค.
- Embedding => ์ฌ๋ฌ ๊ฐ๋์์ ๋จ์ด์ ๋จ์ด ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ด
๋๋ค. ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ์ ์๋ ๋จ์ด๋ ์ ์ฌํ ๋จ์ด์ด๊ณ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ ์๋ก ์๋ฏธ๊ฐ ๋จผ ๋จ์ด ์
๋๋ค.
=> ์๋ฏธ๋ฅผ ์ข ๋ ๋ณด์กดํ ์ ์๊ฒ ๋์์ต๋๋ค.
๐ก ํ
์คํธ ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
- ์ ๊ทํํ์ => ํ
์คํธ ์ ๊ทํ
- ๋ถ์ฉ์ด => ๋, ๋, ๊ทธ๊ฒ, ์ด๊ฒ, ์ ๊ฒ ์ฒ๋ผ ์์ฃผ ๋ฑ์ฅํ์ง๋ง ํฐ ์๋ฏธ๋ฅผ ๊ฐ์ง ์๋ ๋จ์ด ์ ์ธ
- ํํ์ ๋ถ์ => ์๋ฏธ๊ฐ ์๋ ์กฐ์ฌ, ์ด๋ฏธ, ๊ตฌ๋์ ๋ฑ์ ์ ์ธ
- ์ด๊ฐ์ถ์ถ(stemming ์ํ์ ๋ณด์กดํ์ง ์์), ํ์ ์ดํ๊ธฐ๋ฒ(lemmatization, ์ํ์ ๋ณด์กด)
๐ก RNN
- time-step ์ ๊ฐ๋ ๋ฐ์ดํฐ์ ์ฃผ๋ก ์ฌ์ฉ, ์) ์์ฐ์ด(์ฑ๋ด), ์์ฑ, ์๊ณ์ด๋ฐ์ดํฐ(์ฃผ๊ฐ ๋ฐ์ดํฐ), ์ฌ์ ๋ ๋ฐ์ดํฐ
- RNN, LSTM, GRU
- BPTT
๐ก
์ฝ๋ฐฑ(callback) ์ค ์กฐ๊ธฐ์ข
๋ฃ(early stopping)
์ ์ ๊ฒฝ๋ง์ ๊ณผ๋์ ํฉ์ ํํผํ๋๋ก ๋ง๋๋ ์ ๊ทํ(regularization) ๊ธฐ๋ฒ ์ค ํ๋์
๋๋ค.
โ
GPU์ ์ฐ๊ฒฐ์ด ๋์ด์๋์ง ํ์ธํ๊ธฐ ์ํ ์ฝ๋
gpu_info = !nvidia-smi
gpu_info = '\n'.join(gpu_info)
if gpu_info.find('failed') >= 0:
print('Not connected to a GPU')
else:
print(gpu_info)
๐๐ปโโ๏ธ ์ง๋ฌธ
Q: ์ถ๋ ฅ๊ฐ์ด ์ด๋ค ํํ๋ก ๋์ฌ๊น์?

A: 0~1 ์ฌ์ด์ ํ๋ฅ ๊ฐ
๐ฆ ์ง๋ฌธ
Q: Bidirectional ๊ณผ์ ์์ ์ฐจ์์ถ์ ๊ธฐ๋ฅ์ด ์๋์?
A: Bidirectional์๋ ์ฐจ์์ถ์ ๊ธฐ๋ฅ์ด ๋ฐ๋ก ์์ง ์๋ค.
โ๏ธ TIL
- ์ฌ์ค(Fact): RNN, LSTM๊ณผ GRU๋ฅผ ์ด์ฉํด ์์ฐ์ด ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ฐฐ์ ๋ค.
- ๋๋(Feeling): ์ค๋๋ ์ด๋ ต๋ค.
- ๊ตํ(Finding): ์ด๋ฒ์ฃผ ๋ด์ฉ ์๋ฒฝ ๋ณต์ตํด์ ๋ฏธ๋ํ๋ก์ ํธ ์ ํ์!