机器学习入门--双向长短期记忆神经网络(BiLSTM)原理与实践

双向长短记忆网络(BiLSTM)

BiLSTM(双向长短时记忆网络)是一种特殊的循环神经网络(RNN),它能够处理序列数据并保持长期记忆。与传统的RNN模型不同的是,BiLSTM同时考虑了过去和未来的信息,使得模型能够更好地捕捉序列数据中的上下文关系。在本文中,我们将详细介绍BiLSTM的数学原理、代码实现以及应用场景。

数学原理

LSTM(长短期记忆网络)是一种递归神经网络(RNN),通过引入门控机制来解决传统RNN中的梯度消失或梯度爆炸问题。BiLSTM是LSTM的一个变体,它在时间序列上同时运行两个LSTM,一个从前向后处理,一个从后向前处理。

LSTM的关键部分是单元状态(cell state)和各种门控机制,包括遗忘门、输入门和输出门。这些门控机制使用sigmoid函数来控制信息流动的程度。

具体来说,对于给定的时间步 t t t和输入 X t X_t Xt,LSTM计算以下值:

1.遗忘门(forget gate):
f t = σ ( W f ⋅ h t − 1 , X t + b f ) f_t = σ(W_f \cdot h_{t-1}, X_t + b_f) ft=σ(Wf⋅ht−1,Xt+bf)

2.输入门(input gate):
i t = σ ( W i ⋅ h t − 1 , X t + b i ) i_t = \sigma(W_i \cdot h_{t-1}, X_t + b_i) it=σ(Wi⋅ht−1,Xt+bi)

3.更新单元状态(new cell state):
C ~ t = t a n h ( W c ⋅ h t − 1 , X t + b c ) \tilde{C}_t = tanh(W_c \cdot h_{t-1}, X_t + b_c) C~t=tanh(Wc⋅ht−1,Xt+bc)

4.单元状态(cell state):
C t = f t ∗ C t − 1 + i t ∗ C ~ t C_t = f_t * C_{t-1} + i_t * \tilde{C}_t Ct=ft∗Ct−1+it∗C~t

5.输出门(output gate):
o t = σ ( W o ⋅ h t − 1 , X t + b o ) o_t = \sigma(W_o \cdot h_{t-1}, X_t + b_o) ot=σ(Wo⋅ht−1,Xt+bo)

6.隐状态(hidden state)更新:
h t = o t ∗ tanh ⁡ ( C t ) h_t = o_t * \tanh(C_t) ht=ot∗tanh(Ct)

其中, σ \sigma σ表示sigmoid函数

BiLSTM通过将LSTM层沿着时间轴前向和后向运行来计算双向隐藏状态。前向LSTM从序列的第一个元素到最后一个元素顺序计算,而后向LSTM则相反。这两个隐藏状态被连接在一起形成最终的双向隐藏状态。

双向LSTM的输出可以用于各种任务,如序列标注、文本分类等。它能够捕捉到序列中每个时间步之前和之后的上下文信息,从而提供更全面的特征表示。

代码实现

python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt

# 加载数据集并进行标准化
data = load_boston()
X = data.data
y = data.target
scaler = StandardScaler()
X = scaler.fit_transform(X)
y = y.reshape(-1, 1)

# 转换为张量
X = torch.tensor(X, dtype=torch.float32).unsqueeze(1)
y = torch.tensor(y, dtype=torch.float32)

# 定义BiLSTM模型
class BiLSTMNet(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, dropout,output_size):
        super(BiLSTMNet, self).__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.num_layers = num_layers
        self.dropout = dropout
        self.output_size = output_size
        
        self.lstm = nn.LSTM(input_size = self.input_size, 
                            hidden_size = self.hidden_size,
                            num_layers = self.num_layers,
                            bidirectional = True,
                            batch_first=True,
                            dropout = self.dropout)
        
        self.fc1 = nn.Linear(self.hidden_size * 2, self.hidden_size)
        self.fc2 = nn.Linear(self.hidden_size, self.output_size)

    def forward(self, x):
        output, (h_n, c_n) = self.lstm(x)
        out = torch.concat([h_n[-1,:,:], h_n[-2, :, :]], dim=-1)
        out = F.relu(out)
        out = self.fc1(out)
        out = F.relu(out)
        out = self.fc2(out)
        return out

input_size = X.shape[2]
hidden_size = 32
output_size = 1
model = BiLSTMNet(input_size=input_size, 
                  hidden_size=hidden_size, 
                  num_layers=4,
                  dropout=0, 
                  output_size=output_size)

# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
num_epochs = 10000
loss_list = []
for epoch in range(num_epochs):
    optimizer.zero_grad()
    outputs = model(X)
    loss = criterion(outputs, y)
    loss.backward()
    optimizer.step()

    if (epoch+1) % 100 == 0:
        loss_list.append(loss.item())
        print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}')

# 可视化损失曲线
plt.plot(range(100), loss_list)
plt.xlabel('num_epochs')
plt.ylabel('loss of LSTM Training')
plt.show()

# 预测新数据
new_data_point = X[0].reshape(1, 1, -1)
prediction = model(new_data_point)
print(f'Predicted value: {prediction.item()}')

上述代码实现了一个双向LSTM模型,用于预测波士顿房价数据集中的房价。其中,首先加载并标准化数据集,然后定义了一个自定义的BiLSTMNet模型类,该类包含了一个双向LSTM层和两个全连接层,并使用MSELoss作为损失函数和Adam作为优化器进行模型训练。在训练过程中,每100个epoch将损失值记录下来,最后使用Matplotlib将损失曲线可视化(如下图所示)。最后,使用模型对新数据点进行预测并输出结果。整个代码实现了一个简单的房价预测模型,可以通过调节模型参数和超参数进行进一步优化。

总结

BiLSTM是一种强大的序列建模工具,它能够处理序列数据并捕捉长期依赖关系。在实践中,BiLSTM已被广泛应用于语音识别、自然语言处理和股票预测等领域。本文介绍了BiLSTM的数学原理、代码实现以及应用场景,希望读者能够通过本文了解到BiLSTM的基本知识和使用方法。

相关推荐
郝学胜-神的一滴1 小时前
AI 编程智能体 17:四步搞定专属AI智能体
大数据·人工智能·python·神经网络·算法·langchain·强化学习
七牛开发者1 小时前
TokenGate:端到端可训练的 Token 剪枝机制,让大模型 Prefill 提速 11.3 倍
算法·机器学习·剪枝·长上下文·tokengate
白露与泡影2 小时前
从 GLM 到 GPT,HarnessPro 如何用 RSI 降低 Agent 成本
人工智能·gpt·机器学习
高洁013 小时前
知识图谱:结构化表达实体与关系的知识组织技术
人工智能·python·深度学习·机器学习·迁移学习
硅谷秋水3 小时前
Agentic World Action Models(AW-0)贡献与不足分析
人工智能·机器学习·计算机视觉·语言模型·机器人
zh路西法4 小时前
【深入理解 LSTM】从时间反向传播(BPTT)到长时记忆:门控机制与实验验证
pytorch·python·rnn·gru·lstm·bptt
腾讯云大数据5 小时前
腾讯云+TBDS+智算平台:多模态数据处理与机器学习一体化实践
大数据·机器学习·云计算·腾讯云
DFT计算杂谈5 小时前
GSAS-II X 射线衍射(XRD)数据转换为对分布函数(PDF,Pair Distribution Function)
算法·机器学习·pdf
小蒋观天下6 小时前
太阳能低功耗AI相机专项:AOV值守、唤醒时序、ISP启停时序BUG
深度学习·数码相机·算法·机器学习
程序猿编码6 小时前
告别 GPU 空转!token 级调度,Qwen/Llama 高并发推理引擎
人工智能·机器学习·llm·llama·大模型推理