1、引言
? ? ? ?在深度學習領域,循環神經網絡(Recurrent Neural Network, RNN)是一種專門用于處理**序列數據**的神經網絡架構。與傳統的前饋神經網絡不同,RNN 具有**記憶能力**,能夠捕捉數據中的時間依賴性,廣泛應用于自然語言處理(NLP)、語音識別、時間序列預測等任務。
2、原理
2.1 為什么需要 RNN?
? ? ? ? 傳統神經網絡(如 MLP、CNN)假設輸入數據是獨立同分布的,但現實中的許多數據(如文本、語音、股票價格)是序列化的,前后數據之間存在依賴關系。RNN 通過引入‘循環連接’,使網絡能夠記住歷史信息。
2.2 RNN 的結構
? ? ? ? RNN 的核心思想是—隱藏狀態(Hidden State),它在每個時間步更新并傳遞信息。其數學表達為:
其中:
2.3 RNN 的局限性
- 梯度消失/爆炸問題:長序列訓練時,梯度可能指數級衰減或增長,導致模型難以學習長期依賴。
- 短期記憶問題:標準 RNN 難以記住較早期的信息。
3. 改良
3.1 LSTM(長短期記憶網絡)
LSTM 通過引入**門控機制**(輸入門、遺忘門、輸出門)解決梯度消失問題:
4. 實戰:用 PyTorch 實現 RNN 進行時間序列預測
#5.1 數據準備import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt# 生成正弦波數據
time = np.arange(0, 100, 0.1)
data = np.sin(time) + np.random.normal(0, 0.1, len(time))# 構造輸入序列(前10個點預測第11個點)
seq_length = 10
X, y = [], []
for i in range(len(data) - seq_length):X.append(data[i:i+seq_length])y.append(data[i+seq_length])
X = torch.FloatTensor(np.array(X))
y = torch.FloatTensor(np.array(y))#5.2 定義 RNN 模型class RNN(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(RNN, 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: (batch, seq_len, hidden_size)out = self.fc(out[:, -1, :]) ?# 取最后一個時間步的輸出return outmodel = RNN(input_size=1, hidden_size=32, output_size=1)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)#5.3 訓練與預測# 訓練
epochs = 100
for epoch in range(epochs):optimizer.zero_grad()outputs = model(X.unsqueeze(-1))loss = criterion(outputs.squeeze(), y)loss.backward()optimizer.step()if (epoch+1) % 10 == 0:print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}')# 預測
with torch.no_grad():pred = model(X.unsqueeze(-1))plt.plot(time[seq_length:], y.numpy(), label='True')plt.plot(time[seq_length:], pred.numpy(), label='Predicted')plt.legend()plt.show()
結果展示:
5. 總結
- RNN 是處理序列數據的強大工具,但存在梯度消失問題。
- LSTM通過門控機制改進長期依賴學習。
- RNN 廣泛應用于 NLP、語音識別、自然語言處理等領域。
?