์ํ ์ ๊ฒฝ๋ง(RNN) RNN์ด ์์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ '๊ธฐ์ต'ํ๊ณ ์ฒ๋ฆฌํ๋์ง ์๋ฆฌ๋ฅผ ์์๋ณด๊ณ , ๊ฐ๋จํ ์๊ณ์ด ์์ธก ๋ชจ๋ธ์ ์ง์ ๊ตฌํํ๋ค.
๋ค์ด๊ฐ๋ฉฐ
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ์ธ์ด, ์ฃผ์ ์์ฅ์ ๊ฐ๊ฒฉ ๋ณ๋, ์ฌ์ฅ ๋ฐ๋ ๋ฐ์ดํฐ ๋ฑ ์ธ์์๋ ์์(sequence)๊ฐ ๋งค์ฐ ์ค์ํ ๋ฐ์ดํฐ๊ฐ ๋ง๋ค. "๋๋ ๋ฐฅ์ ๋จน๋๋ค"์ "๋ฐฅ์ ๋๋ฅผ ๋จน๋๋ค"๊ฐ ์ ํ ๋ค๋ฅธ ์๋ฏธ์ธ ๊ฒ์ฒ๋ผ, ์์ ์ ๋ณด๋ ๋ฐ์ดํฐ์ ๋ณธ์ง์ ์ดํดํ๋ ๋ฐ ํต์ฌ์ ์ธ ์ญํ ์ ํ๋ค.
MLP๋ CNN๊ณผ ๊ฐ์ ๋ชจ๋ธ๋ค์ ์ ๋ ฅ ๋ฐ์ดํฐ ๊ฐ์ ์์๋ ์๊ฐ์ ๊ด๊ณ๋ฅผ ๊ณ ๋ คํ์ง ์๋๋ค. ์ด๋ฌํ ์์ฐจ ๋ฐ์ดํฐ(Sequential Data)๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ณ ์๋ ๋ชจ๋ธ์ด ๋ฐ๋ก ์ํ ์ ๊ฒฝ๋ง(Recurrent Neural Network, RNN)์ด๋ค. ์ด๋ฒ ํฌ์คํ ์์๋ RNN์ด ์ด๋ป๊ฒ ๊ณผ๊ฑฐ์ ์ ๋ณด๋ฅผ '๊ธฐ์ต'ํ์ฌ ํ์ฌ์ ์ ๋ ฅ๊ณผ ์ฐ๊ฒฐ ์ง๋์ง ๊ทธ ์๋ฆฌ๋ฅผ ์์๋ณด๊ณ , ๊ฐ๋จํ ์๊ณ์ด ์์ธก ๋ชจ๋ธ์ ์ง์ ๊ตฌํํด๋ณด์๋ค.
1. ์ํ ์ ๊ฒฝ๋ง(RNN)์ด๋?
RNN์ ์์๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ค๊ณ๋ ์ธ๊ณต์ ๊ฒฝ๋ง์ด๋ค.
๋ชจ๋ธ ๋ด๋ถ์ ์ํํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด,
์ด์ ์์ (time step)์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ ํ์ฌ์ ์ ๋ ฅ๊ณผ ํจ๊ป ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ํฐ ํน์ง์ด๋ค.
RNN์ ์ด์ ๋จ๊ณ์ ์ถ๋ ฅ์ ํ์ฌ ๋จ๊ณ์ ์ ๋ ฅ์ผ๋ก ๋ค์ ์ฌ์ฉํ๋ ์ฌ๊ท์ ์ธ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค. ๋ชจ๋ธ์ ๊ฐ ์์ ์์ ์ ๋ ฅ๊ฐ๊ณผ ์ด์ ์์ ์ ์๋ ์ํ(Hidden State)๋ฅผ ํจ๊ป ๋ฐ์ ํ์ฌ ์์ ์ ์๋ ์ํ๋ฅผ ๊ฐฑ์ ํ๋ค. ์ด ์๋ ์ํ๊ฐ ๋ฐ๋ก RNN์ด ๊ณผ๊ฑฐ์ ์ ๋ณด๋ฅผ ์์ฝํ์ฌ ์ ์ฅํ๋ '๋ฉ๋ชจ๋ฆฌ' ์ญํ ์ ํ๋ค.


2. RNN์ ํ๊ณ์ LSTM์ ๋ฑ์ฅ
๊ธฐ๋ณธ์ ์ธ RNN ๊ตฌ์กฐ๋ ๊ฐ๋จํ์ง๋ง, ์น๋ช ์ ์ธ ๋จ์ ์ด ์์๋ค. ๋ฐ๋ก ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์ (Long-term Dependency Problem)๋ค. ์ํ์ค๊ฐ ๊ธธ์ด์ง์๋ก, ์ญ์ ํ ๊ณผ์ ์์ ๊ธฐ์ธ๊ธฐ๊ฐ ์ ์ฐจ ์ฌ๋ผ์ง๊ฑฐ๋(Vanishing Gradient) ํญ๋ฐํ๋(Exploding Gradient) ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ ์์ฃผ ๋จผ ๊ณผ๊ฑฐ์ ์ ๋ณด๋ ํ์ฌ๊น์ง ์ ๋ฌ๋๊ธฐ ์ด๋ ค์ ๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ ๊ฒ์ด LSTM(Long Short-Term Memory)์ด๋ค. LSTM์ RNN์ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ ์ ์ํ(Cell State)์ 3๊ฐ์ ๊ฒ์ดํธ(Gate)๋ฅผ ์ถ๊ฐํ์ฌ, ์ด๋ค ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ , ์ด๋ค ์ ๋ณด๋ฅผ ์์ด๋ฒ๋ฆด์ง๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ ์ดํ๋ค.
- Forget Gate: ๊ณผ๊ฑฐ์ ์ ๋ณด ์ค ๋ฌด์์ ์์์ง ๊ฒฐ์ ํ๋ค.
- Input Gate: ํ์ฌ ์ ๋ณด ์ค ๋ฌด์์ ์ ์ํ์ ์ ์ฅํ ์ง ๊ฒฐ์ ํ๋ค.
- Output Gate: ์ ์ํ๋ก๋ถํฐ ์ด๋ค ์ ๋ณด๋ฅผ ์ถ๋ ฅ์ผ๋ก ๋ด๋ณด๋ผ์ง ๊ฒฐ์ ํ๋ค.
์ด๋ฌํ ๊ฒ์ดํธ ๊ตฌ์กฐ ๋๋ถ์ LSTM์ ํจ์ฌ ๋ ๊ธด ์ํ์ค์ ์์กด์ฑ์ ํ์ตํ ์ ์๊ฒ ๋์๋ค.
3. Python์ผ๋ก RNN(LSTM) ๊ตฌํํ๊ธฐ
์ด๋ฒ์๋ TensorFlow/Keras๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์ฌ์ธ(Sine)ํํ์ ์์ธกํ๋ LSTM ๋ชจ๋ธ์ ๋ง๋ค์ด๋ณด์๋ค. ๊ณผ๊ฑฐ์ ์ฌ์ธํ ๊ฐ์ ๋ณด๊ณ ๋ค์ ์์ ์ ๊ฐ์ ์์ธกํ๋ ์๊ณ์ด ์์ธก ๋ฌธ์ ๋ค.
๊ฐ. ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
tensorflow์ scikit-learn์ด ์ด๋ฏธ ์ค์น๋์ด ์๋ค๋ฉด ๋ณ๋์ ์ค์น๋ ํ์ ์๋ค.
๋. ์์ ์์ค ์ฝ๋
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 1. ๋ฐ์ดํฐ ์์ฑ
# ์ฌ์ธํ ๋ฐ์ดํฐ ์์ฑ
def create_sequence_data(timesteps=50):
# 0๋ถํฐ 100๊น์ง 0.1 ๊ฐ๊ฒฉ์ผ๋ก 1000๊ฐ์ ๋ฐ์ดํฐ ํฌ์ธํธ ์์ฑ
data = np.sin(np.arange(0, 100, 0.1))
X, y = [], []
for i in range(len(data) - timesteps):
# timesteps ๋งํผ์ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅ(X)์ผ๋ก, ๊ทธ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ต(y)์ผ๋ก
X.append(data[i:(i + timesteps)])
y.append(data[i + timesteps])
return np.array(X), np.array(y)
TIMESTEPS = 50
X, y = create_sequence_data(TIMESTEPS)
# RNN/LSTM ์
๋ ฅ์ ์ํด ๋ฐ์ดํฐ ํํ ๋ณ๊ฒฝ (samples, timesteps, features)
X = X.reshape(X.shape[0], X.shape[1], 1)
# ํ์ต ๋ฐ์ดํฐ์ ํ
์คํธ ๋ฐ์ดํฐ ๋ถ๋ฆฌ (๋ง์ง๋ง 100๊ฐ๋ฅผ ํ
์คํธ์ฉ์ผ๋ก ์ฌ์ฉ)
X_train, X_test = X[:-100], X[-100:]
y_train, y_test = y[:-100], y[-100:]
# 2. LSTM ๋ชจ๋ธ ๊ตฌ์ถ
model = tf.keras.Sequential([
# ์
๋ ฅ ํํ: (TIMESTEPS, 1)
# 50๊ฐ์ LSTM ์ ๋์ ๊ฐ์ง ์ธต
tf.keras.layers.LSTM(50, input_shape=(TIMESTEPS, 1)),
# ์ถ๋ ฅ์ธต (1๊ฐ์ ๊ฐ์ ์์ธก)
tf.keras.layers.Dense(1)
])
# 3. ๋ชจ๋ธ ์ปดํ์ผ
# ์์ค ํจ์: mean_squared_error (ํ๊ท ๋ฌธ์ ์ฉ)
model.compile(optimizer='adam', loss='mean_squared_error')
# ๋ชจ๋ธ ๊ตฌ์กฐ ์์ฝ
model.summary()
# 4. ๋ชจ๋ธ ํ์ต
model.fit(X_train, y_train, epochs=20, batch_size=32)
# ์คํ ๊ฒฐ๊ณผ
20 ์ํฌํฌ(epoch) ํ์ต ํ, ๋ชจ๋ธ์ ๋งค์ฐ ๋ฎ์ MSE(ํ๊ท ์ ๊ณฑ ์ค์ฐจ)๋ฅผ ๋ณด์ด๋ฉฐ ์ฌ์ธํํ์ ์ฑ๊ณต์ ์ผ๋ก ์์ธกํ๋ค. ์๋๋ ๋ชจ๋ธ์ ๊ตฌ์กฐ์ ํ์ต ๊ณผ์ , ๊ทธ๋ฆฌ๊ณ ์ค์ ๊ฐ๊ณผ ์์ธก ๊ฐ์ ๋น๊ตํ ์๊ฐํ ๊ฒฐ๊ณผ์ด๋ค.
Model: "sequential"
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโณโโโโโโโโโโโโโโโโโโโโโโโโโณโโโโโโโโโโโโโโโโ
โ Layer (type) โ Output Shape โ Param # โ
โกโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฉ
โ lstm (LSTM) โ (None, 50) โ 10,400 โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโค
โ dense (Dense) โ (None, 1) โ 51 โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโ
Total params: 10,451 (40.82 KB)
Trainable params: 10,451 (40.82 KB)
Non-trainable params: 0 (0.00 B)
Epoch 1/20
27/27 โโโโโโโโโโโโโโโโโโโโ 2s 16ms/step - loss: 0.2361
Epoch 2/20
27/27 โโโโโโโโโโโโโโโโโโโโ 0s 14ms/step - loss: 0.0167
...
Epoch 20/20
27/27 โโโโโโโโโโโโโโโโโโโโ 0s 15ms/step - loss: 2.6237e-07
Test MSE: 0.000000
Test RMSE: 0.000481
ํ์ต์ด ์งํ๋ ์๋ก ์์ค(MSE Loss)์ด ๊ธ๊ฒฉํ ๊ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

# 5. ๋ชจ๋ธ ํ๊ฐ ๋ฐ ์์ธก
# ํ
์คํธ ๋ฐ์ดํฐ๋ก ์์ธก ์ํ
predicted_values = model.predict(X_test)
# 6. ๊ฒฐ๊ณผ ์๊ฐํ
plt.figure(figsize=(12, 6))
plt.plot(np.arange(len(y_train), len(y_train) + len(y_test)), y_test, label='Actual')
plt.plot(np.arange(len(y_train), len(y_train) + len(y_test)), predicted_values, label='Predicted', linestyle='--')
plt.title('Sine Wave Prediction')
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend()
plt.show()
์๋ ๊ทธ๋ํ๋ ์ค์ ์ฌ์ธํํ๊ณผ ๋ชจ๋ธ์ด ์์ธกํ ๊ฐ์ ๋น๊ตํ ๊ฒ์ด๋ค.
์ฃผํฉ์ ์ค์ ์ด ์ค์ ๊ฐ, ๋ถ์์ ์ ์ ์ด ๋ชจ๋ธ์ ์์ธก๊ฐ์ธ๋ฐ, ๊ฑฐ์ ์๋ฒฝํ๊ฒ ์ผ์นํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.

๋ง์น๋ฉฐ
RNN๊ณผ ๊ทธ ๋ฐ์ ํ์ธ LSTM, GRU๋ ์์๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ฐ ๋งค์ฐ ๊ฐ๋ ฅํ ๋๊ตฌ๋ค. ์์ฐ์ด ์ฒ๋ฆฌ(๊ธฐ๊ณ ๋ฒ์ญ, ์ฑ๋ด, ๊ฐ์ฑ ๋ถ์), ์๊ณ์ด ์์ธก(์ฃผ๊ฐ ์์ธก, ์์ ์์ธก), ์์ฑ ์ธ์ ๋ฑ ๋ค์ํ ๋ถ์ผ์์ ํต์ฌ์ ์ธ ์ญํ ์ ์ํํ๊ณ ์๋ค.
์ต๊ทผ์๋ Transformer ์ํคํ ์ฒ๊ฐ ์์ฐ์ด ์ฒ๋ฆฌ ๋ถ์ผ์์ RNN์ ์๋ฆฌ๋ฅผ ๋์ฒดํ๊ณ ์์ง๋ง, RNN์ ๊ธฐ๋ณธ ์์ด๋์ด์ธ '์ํ'๊ณผ '๊ธฐ์ต'์ ๊ฐ๋ ์ ์ฌ์ ํ ๋ฅ๋ฌ๋์ ์ค์ํ ์ถ์ ์ด๋ฃจ๊ณ ์๋ค.
์ฐธ๊ณ ์๋ฃ
- TensorFlow Core, Text generation with an RNN
- colah's blog, Understanding LSTM Networks
'๐ Data Science & AI > Deep Learning' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํธ๋์คํฌ๋จธ(Transformer)์ ์ดํ ์ (Attention) (1) | 2026.06.07 |
|---|---|
| ํฉ์ฑ๊ณฑ ์ ๊ฒฝ๋ง(Convolutional Neural Network, CNN) (0) | 2026.03.02 |
| ๋ค์ธต ํผ์ ํธ๋ก (Multilayer Perceptron, MLP) (0) | 2026.03.02 |