机器学习入门--双向长短期记忆神经网络(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的基本知识和使用方法。

相关推荐
GocNeverGiveUp2 小时前
机器学习1-简单神经网络
人工智能·机器学习
終不似少年遊*6 小时前
美国加州房价数据分析02
人工智能·python·机器学习·数据挖掘·数据分析·回归算法
三月七(爱看动漫的程序员)7 小时前
HiQA: A Hierarchical Contextual Augmentation RAG for Multi-Documents QA---附录
人工智能·单片机·嵌入式硬件·物联网·机器学习·语言模型·自然语言处理
MUTA️7 小时前
RT-DETR学习笔记(2)
人工智能·笔记·深度学习·学习·机器学习·计算机视觉
ROBOT玲玉9 小时前
Milvus 中,FieldSchema 的 dim 参数和索引参数中的 “nlist“ 的区别
python·机器学习·numpy
GocNeverGiveUp9 小时前
机器学习2-NumPy
人工智能·机器学习·numpy
浊酒南街10 小时前
决策树(理论知识1)
算法·决策树·机器学习
B站计算机毕业设计超人10 小时前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
学术头条10 小时前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
18号房客10 小时前
一个简单的机器学习实战例程,使用Scikit-Learn库来完成一个常见的分类任务——**鸢尾花数据集(Iris Dataset)**的分类
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·sklearn