ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ ํ๋ ์ธ๊ณต์ง๋ฅ ํ์ต 2๋จ๊ณ: ์ํ ์ ๊ฒฝ๋ง(RNN)๊ณผ ์๊ณ์ด ๋ฐ์ดํฐ ์ฒ๋ฆฌ
octo54 2025. 5. 19. 10:06๐ ํ๋ ์ธ๊ณต์ง๋ฅ ํ์ต 2๋จ๊ณ: ์ํ ์ ๊ฒฝ๋ง(RNN)๊ณผ ์๊ณ์ด ๋ฐ์ดํฐ ์ฒ๋ฆฌ
๐ ํ์ต ๊ธฐ๊ฐ: 7~9๊ฐ์
๐ฏ ํ์ต ๋ชฉํ: ์๊ณ์ด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ์ํ ์ ๊ฒฝ๋ง ์ดํด
๐ 1. ์ํ ์ ๊ฒฝ๋ง(RNN) ๊ธฐ์ด
์ํ ์ ๊ฒฝ๋ง(RNN, Recurrent Neural Network)์ ์์ฐจ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ํนํ๋ ์ ๊ฒฝ๋ง์ ๋๋ค.
- ์ ๋ ฅ์ด ์ฐ์์ ์ธ ๊ฒฝ์ฐ์ ์ ํฉ (์: ์ฃผ๊ฐ ์์ธก, ์์ฐ์ด ์ฒ๋ฆฌ)
- ์ด์ ์ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๊ณ์ฐ์ ํผ๋๋ฐฑํ์ฌ ํ์ฉ
๐ 1-1. RNN ๊ตฌ์กฐ ์ดํด
RNN์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ ์ฌ์ด์ ๊ด๊ณ๋ฟ ์๋๋ผ ์๊ฐ์ ํ๋ฆ๋ ํ์ตํฉ๋๋ค.
- ์ ๋ ฅ: ์๊ณ์ด ๋ฐ์ดํฐ ๋๋ ์์ฐจ์ ๋ฐ์ดํฐ
- ์ํ ๋ ธ๋: ์ด์ ์ํ๋ฅผ ๋ค์ ์ํ๋ก ์ ๋ฌ
- ์ถ๋ ฅ: ์ฐ์์ ๋ฐ์ดํฐ ์์ธก ๋๋ ๋ถ๋ฅ
๐ 1) RNN์ ์ํ์ ํํ
RNN์์๋ ์๋ ์ํ(hth_t)๊ฐ ์๊ฐ์ ๋ฐ๋ผ ๋ณํํฉ๋๋ค.
ht=f(Wx⋅xt+Wh⋅ht−1+b)h_t = f(W_x \cdot x_t + W_h \cdot h_{t-1} + b)
์ฌ๊ธฐ์,
- xtx_t: ํ์ฌ ์ ๋ ฅ
- ht−1h_{t-1}: ์ด์ ์๋ ์ํ
- WxW_x, WhW_h: ๊ฐ์ค์น ํ๋ ฌ
- bb: ๋ฐ์ด์ด์ค
- ff: ํ์ฑํ ํจ์ (์ฃผ๋ก tanhtanh ์ฌ์ฉ)
๐ป ์ฝ๋ ์ค์ต: ๊ฐ๋จํ RNN ๊ตฌํ
import torch
import torch.nn as nn
# RNN ๋ชจ๋ธ ์ ์
class SimpleRNN(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleRNN, self).__init__()
self.rnn = nn.RNN(input_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, _ = self.rnn(x)
out = self.fc(out[:, -1, :]) # ๋ง์ง๋ง ํ์์คํ
์ถ๋ ฅ
return out
# ๋ชจ๋ธ ์์ฑ
model = SimpleRNN(input_size=1, hidden_size=10, output_size=1)
print(model)
๐ 1-2. RNN์ ํ๊ณ์ ๊ฐ์
๐ 1) RNN์ ํ๊ณ
- ์ฅ๊ธฐ ์ข ์์ฑ ๋ฌธ์ : ๊ธด ๋ฌธ๋งฅ์ ํ์ตํ๊ธฐ ์ด๋ ค์
- ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์ : ์ญ์ ํ ์ ๊ธฐ์ธ๊ธฐ๊ฐ 0์ ๊ฐ๊น์์ง
๐ก ๊ฐ์ ๋ฐฉ์:
- LSTM(Long Short-Term Memory)
- ์ ์ํ๋ฅผ ์ถ๊ฐํ์ฌ ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์ ํด๊ฒฐ
- GRU(Gated Recurrent Unit)
- LSTM๋ณด๋ค ๊ฐ๊ฒฐํ์ง๋ง ์ ์ฌํ ์ฑ๋ฅ
๐ 2. LSTM๊ณผ GRU: ๊ฐ์ ๋ ์ํ ์ ๊ฒฝ๋ง
๐ 2-1. LSTM (Long Short-Term Memory)
LSTM์ RNN์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด **์ ์ํ(Cell State)**๋ฅผ ์ถ๊ฐํ ๊ตฌ์กฐ์ ๋๋ค.
- ๊ฒ์ดํธ ๊ตฌ์กฐ: ์ ๋ ฅ ๊ฒ์ดํธ, ๋ง๊ฐ ๊ฒ์ดํธ, ์ถ๋ ฅ ๊ฒ์ดํธ
- ์ ์ํ: ์ค์ํ ์ ๋ณด๋ฅผ ์ฅ๊ธฐ์ ์ผ๋ก ๊ธฐ์ต
๐ป ์ฝ๋ ์ค์ต: LSTM ๊ตฌํ
class SimpleLSTM(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleLSTM, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, _ = self.lstm(x)
out = self.fc(out[:, -1, :])
return out
model = SimpleLSTM(input_size=1, hidden_size=10, output_size=1)
print(model)
๐ 2-2. GRU (Gated Recurrent Unit)
GRU๋ LSTM์ ๊ฐ์ํํ ํํ๋ก ๊ธฐ์ต ์ ๊ณผ ๊ฒ์ดํธ ๊ตฌ์กฐ๋ฅผ ํตํฉํ์์ต๋๋ค.
- ์ฅ์ : ๊ณ์ฐ๋ ๊ฐ์
- ๋จ์ : ๋ณต์กํ ํจํด ์ฒ๋ฆฌ ๋ฅ๋ ฅ ๊ฐ์
๐ป ์ฝ๋ ์ค์ต: GRU ๊ตฌํ
class SimpleGRU(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleGRU, self).__init__()
self.gru = nn.GRU(input_size, hidden_size, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
out, _ = self.gru(x)
out = self.fc(out[:, -1, :])
return out
model = SimpleGRU(input_size=1, hidden_size=10, output_size=1)
print(model)
๐ 3. ์๊ณ์ด ๋ฐ์ดํฐ ๋ถ์๊ณผ RNN ํ์ฉ ์ฌ๋ก
๐ 3-1. ์ฃผ๊ฐ ์์ธก ๋ชจ๋ธ (LSTM ํ์ฉ)
๋ชฉํ: ์ฃผ๊ฐ ๋ณ๋ ์์ธก
๋ฐ์ดํฐ: Yahoo Finance์์ ๊ฐ์ ธ์จ ์ฃผ๊ฐ ๋ฐ์ดํฐ
๐ป ์ฝ๋ ์ค์ต: ์ฃผ๊ฐ ์์ธก ๋ชจ๋ธ
import yfinance as yf
from sklearn.preprocessing import MinMaxScaler
import numpy as np
# ๋ฐ์ดํฐ ๋ก๋
stock = yf.download("AAPL", start="2022-01-01", end="2023-01-01")
close_prices = stock['Close'].values
# ๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(close_prices.reshape(-1, 1))
# ๋ฐ์ดํฐ์
์์ฑ
def create_sequences(data, seq_length):
sequences = []
for i in range(len(data) - seq_length):
seq = data[i:i + seq_length]
label = data[i + seq_length]
sequences.append((seq, label))
return sequences
sequences = create_sequences(scaled_data, 5)
# RNN ๋ชจ๋ธ ์ ์ ๋ฐ ํ์ต
model = SimpleLSTM(input_size=1, hidden_size=50, output_size=1)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
# ํ์ต ๋ฃจํ
for epoch in range(50):
for seq, label in sequences:
seq = torch.tensor(seq, dtype=torch.float32).unsqueeze(0)
label = torch.tensor(label, dtype=torch.float32)
optimizer.zero_grad()
output = model(seq)
loss = criterion(output, label)
loss.backward()
optimizer.step()
if (epoch+1) % 10 == 0:
print(f"Epoch {epoch+1}, Loss: {loss.item():.4f}")
๐ ํ์ต ์ฒดํฌ๋ฆฌ์คํธ:
- RNN์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ๊ตฌํํ ์ ์๋ค.
- LSTM๊ณผ GRU์ ์ฐจ์ด์ ์ ์ดํดํ๊ณ ์ง์ ๊ตฌํํ ์ ์๋ค.
- ์๊ณ์ด ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ํ์ ํ๊ณ ์์ธก ๋ชจ๋ธ์ ๊ตฌ์ถํ ์ ์๋ค.
- ์ฃผ๊ฐ ์์ธก ๋ชจ๋ธ์ ํตํด ์๊ณ์ด ๋ฐ์ดํฐ ํ์ต์ ์ค์ตํ ์ ์๋ค.
RNN, LSTM, GRU, ์๊ณ์ด ๋ฐ์ดํฐ, ์ฃผ๊ฐ ์์ธก, ๋ฅ๋ฌ๋, PyTorch, ์ํ ์ ๊ฒฝ๋ง, ์๊ณ์ด ๋ถ์, ์ฅ๊ธฐ ์์กด์ฑ ๋ฌธ์ , ๊ธฐ์ธ๊ธฐ ์์ค ๋ฌธ์
'Programming > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- SEO ์ต์ ํ
- rag
- ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ
- ๋ฅ๋ฌ๋
- gatsbyjs
- Webpack
- ํ๋ก ํธ์๋๋ฉด์
- SEO์ต์ ํ
- ํ๋ก ํธ์๋
- Ktor
- NestJS
- AI์ฑ๋ด
- CI/CD
- Docker
- REACT
- nodejs
- Next.js
- github
- kotlin
- Python
- ์น๊ฐ๋ฐ
- nextJS
- PostgreSQL
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- Prisma
- ๋ฐฑ์๋๊ฐ๋ฐ
- App Router
- llm
- fastapi
- seo ์ต์ ํ 10๊ฐ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |