搭建简单网站,微信app小程序,wordpress写公式,一个网站用多个域名GRU模型
随着深度学习领域的快速发展#xff0c;循环神经网络#xff08;RNN#xff09;已成为自然语言处理#xff08;NLP#xff09;等领域中常用的模型之一。但是#xff0c;在RNN中#xff0c;如果时间步数较大#xff0c;会导致梯度消失或爆炸的问题#xff0c;…GRU模型
随着深度学习领域的快速发展循环神经网络RNN已成为自然语言处理NLP等领域中常用的模型之一。但是在RNN中如果时间步数较大会导致梯度消失或爆炸的问题这影响了模型的训练效果。为了解决这个问题研究人员提出了新的模型其中GRU是其中的一种。
本文将介绍GRU的数学原理、代码实现并通过pytorch和sklearn的数据集进行试验最后对该模型进行总结。
数学原理
GRU是一种门控循环单元Gated Recurrent Unit模型。与传统的RNN相比它具有更强的建模能力和更好的性能。
重置门和更新门
在GRU中每个时间步有两个状态隐藏状态 h t h_t ht和更新门 r t r_t rt。。更新门控制如何从先前的状态中获得信息而隐藏状态捕捉序列中的长期依赖关系。
GRU的核心思想是使用“门”来控制信息的流动。这些门是由sigmoid激活函数控制的它们决定了哪些信息被保留和传递。 在每个时间步 t t tGRU模型执行以下操作
1.计算重置门 r t σ ( W r [ x t , h t − 1 ] ) r_t \sigma(W_r[x_t, h_{t-1}]) rtσ(Wr[xt,ht−1]) 其中 W r W_r Wr是权重矩阵 σ \sigma σ表示sigmoid函数。重置门 r t r_t rt告诉模型是否要忽略先前的隐藏状态 h t − 1 h_{t-1} ht−1并只依赖于当前输入 x t x_t xt。
2.计算更新门 z t σ ( W z [ x t , h t − 1 ] ) z_t \sigma(W_z[x_t, h_{t-1}]) ztσ(Wz[xt,ht−1]) 其中更新门 z t z_t zt告诉模型新的隐藏状态 h t h_t ht在多大程度上应该使用先前的状态 h t − 1 h_{t-1} ht−1。
候选隐藏状态和隐藏状态
在计算完重置门和更新门之后我们可以计算候选隐藏状态 h ~ t \tilde{h}_{t} h~t和隐藏状态 h t h_t ht。
1.计算候选隐藏状态 h ~ t tanh ( W [ x t , r t ∗ h t − 1 ] ) \tilde{h}_{t} \tanh(W[x_t, r_t * h_{t-1}]) h~ttanh(W[xt,rt∗ht−1]) 其中 W W W是权重矩阵。候选隐藏状态 h ~ t \tilde{h}_{t} h~t利用当前输入 x t x_t xt和重置门 r t r_t rt来估计下一个可能的隐藏状态。
2.计算隐藏状态 h t ( 1 − z t ) ∗ h t − 1 z t ∗ h ~ t h_{t} (1 - z_t) * h_{t-1} z_t * \tilde{h}_{t} ht(1−zt)∗ht−1zt∗h~t 这是GRU的最终隐藏状态公式。它在候选隐藏状态 h ~ t \tilde{h}_{t} h~t和先前的隐藏状态 h t h_t ht之间进行加权其中权重由更新门 z t z_t zt控制。
代码实现
下面是使用pytorch和sklearn的房价数据集实现GRU的示例代码
import torch
import torch.nn as nn
import torch.optim as optim
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, dtypetorch.float32).unsqueeze(1)
y torch.tensor(y, dtypetorch.float32)# 定义GRU模型
class GRUNet(nn.Module):def __init__(self, input_size, hidden_size, output_size):super(GRUNet, self).__init__()self.hidden_size hidden_sizeself.gru nn.GRU(input_size, hidden_size, batch_firstTrue)self.fc nn.Linear(hidden_size, output_size)def forward(self, x):out, _ self.gru(x)out self.fc(out[:, -1, :])return outinput_size X.shape[2]
hidden_size 32
output_size 1
model GRUNet(input_size, hidden_size, output_size)# 定义损失函数和优化器
criterion nn.MSELoss()
optimizer optim.Adam(model.parameters(), lr0.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 (epoch1) % 100 0:loss_list.append(loss.item())print(fEpoch [{epoch1}/{num_epochs}], Loss: {loss.item()})# 可视化损失曲线
plt.plot(range(100), loss_list)
plt.xlabel(num_epochs)
plt.ylabel(loss of GRU Training)
plt.show()# 预测新数据
new_data_point X[0].reshape(1, 1, -1)
prediction model(new_data_point)
print(fPredicted value: {prediction.item()})上述代码首先加载并标准化房价数据集然后定义了一个包含GRU层和全连接层的GRUNet模型并使用均方误差作为损失函数和Adam优化器进行训练。训练完成后使用matplotlib库绘制损失曲线如下图所示并使用训练好的模型对新的数据点进行预测。
总结
GRU是一种门控循环单元模型它通过更新门和重置门有效地解决了梯度消失或爆炸的问题。在本文中我们介绍了GRU的数学原理、代码实现和代码解释并通过pytorch和sklearn的房价数据集进行了试验。