机器学习入门--双向长短期记忆神经网络(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 小时前
(论文速读)LogSAD:无需训练的结构异常与逻辑异常统一检测
人工智能·机器学习·计算机视觉·大模型·多模态·异常检测
Rocky Ding*5 小时前
深入浅出完整解析FLUX.2、Seedream(即梦)、Z-image、Qwen-Image、GLM-Image核心基础知识
论文阅读·人工智能·深度学习·机器学习·aigc·扩散模型·ai-native
Ivanqhz5 小时前
MLA、DSA、CSA、HCA
人工智能·算法·机器学习
RockHopper20256 小时前
数字机制与未来企业运行模式(概要版)
人工智能·机器学习·智能体·agent 工程
CAE虚拟与现实7 小时前
MLP多层感知机(Multilayer Perceptron)
人工智能·机器学习·mlp
凡达Ai派8 小时前
AI画布交付文件总是混在一起?用源文件、预览图和发布图三层目录分开管理
图像处理·深度学习·神经网络·自然语言处理·知识图谱
薛定e的猫咪9 小时前
(AISTATS 2023)BaCaDI 逐章阅读
人工智能·深度学习·算法·机器学习
凡达Ai派9 小时前
AI画布里的文字总是错位或乱码?把生成、排版和校对拆成三段
图像处理·人工智能·深度学习·神经网络·自然语言处理·知识图谱
accept 99%9 小时前
拆开Jev 的原理和本地跑法 Jev科普(二)
人工智能·机器学习
Ivanqhz10 小时前
MQA、GQA、稀疏/滑动窗口注意力及混合范式
人工智能·算法·机器学习