GRU网络

1、简介

随着 LSTM 在自然语言处理特别是文本分类任务的广泛应 用,人们逐渐发现 LSTM 具有训练时间长、参数较多、内部计 算复杂的缺点。Cho 等人在 2014 年进一步提出了更加简单的、 将 LSTM 的单元状态和隐层状态进行合并的、还有一些其他的变动的 GRU 模型。将忘记门和输入门合成了一个单一的更新门。同样还混合了细胞状态和隐藏状态。GRU把LSTM中的遗忘门和输入们用更新门来替代。 把cell state和隐状态ht进行合并,在计算当前时刻新信息的方法和LSTM有所不同。

GRU 模型是一种保持了 LSTM 效果、具有 更加简单的结构、更少的参数、更好的收敛性的模型。GRU 模 型由更新门和重置门两个门组成。

 

2、更新门和重置门

前一个时刻的输出隐层对当前隐层的影响程度由更新门控制,更新门的值越大说明前一时刻的隐层输出对当前隐层的影响越大

前一时刻的隐层信息被忽略的程度由重置门控制,重置门的值越小说明忽略得越多。 GRU 结构更加精简

使用LSTM的原因之一是解决RNN Deep Network的Gradient错误累积太多,以至于Gradient归零或者成为无穷大,所以无法继续进行优化的问题。GRU的构造更简单:比LSTM少一个gate,这样就少几个矩阵乘法。在训练数据很大的情况下GRU能节省很多时间。GRU ,简便了计算方法(简化运算),也避免了梯度消失优化LSTM。

 

3、GRU模型

与LSTM不同,GRU只有两个门了,分别为更新门重置门,即图中的ztrt

更新门用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多。

重置门用于控制忽略前一时刻的状态信息的程度,重置门的值越小说明忽略得越多。

 

4、前向传播

 

5、GRU的训练过程

从前向传播过程中的公式可以看出要学习的参数有Wr、Wz、Wh、Wo。其中前三个参数都是拼接的(因为后先的向量也是拼接的),所以在训练的过程中需要将他们分割出来:

    

    

    

输出层的输入:

    

输出层的输出:

    

在得到最终的输出后,就可以写出网络传递的损失,单个样本某时刻的损失为:

    

则单个样本的在所有时刻的损失为:

    

采用后向误差传播算法来学习网络,所以先得求损失函数对各参数的偏导(总共有7个)

    

    

    

    

    

    

    

其中各中间参数为:

    

    

    

    

    

在算出了对各参数的偏导之后,就可以更新参数,依次迭代知道损失收敛。

概括来说,LSTM和CRU都是通过各种门函数来将重要特征保留下来,这样就保证了在long-term传播的时候也不会丢失。此外GRU相对于LSTM少了一个门函数,因此在参数的数量上也是要少于LSTM的,所以整体上GRU的训练速度要快于LSTM的。不过对于两个网络的好坏还是得看具体的应用场景。

 

参考文章:

https://blog.csdn.net/qq_40900196/article/details/88997049

https://www.cnblogs.com/jiangxinyang/p/9376021.html

 

  • 9
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Gru网络(Gated Recurrent Unit,门控循环单元)是一种循环神经网络(RNN)的变种。它可以用于处理序列数据,如文本、音频和时间序列数据。 Gru网络在pytorch库中有提供相应的实现。首先,需要导入pytorch库: ```python import torch import torch.nn as nn ``` 然后,我们可以定义一个简单的Gru网络模型。以下是一个示例: ```python class GruModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(GruModel, self).__init__() self.hidden_size = hidden_size self.num_layers = num_layers self.gru = nn.GRU(input_size, hidden_size, num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device) # 初始化隐含状态 out, _ = self.gru(x, h0.detach()) # Gru前向传播 out = self.fc(out[:, -1, :]) # 取最后一个时间步的输出 return out ``` 在上述代码中,我们定义了一个GruModel类,继承自nn.Module类。在类的初始化函数中,我们定义了Gru网络的各个层次结构。然后,forward函数进行前向传播操作。最后,我们可以使用该模型进行训练和预测。 需要注意的是,上述代码仅提供了一个基础的Gru网络模型,可以根据具体的问题进行修改和扩展。在实际应用中,可以使用更深的网络结构、添加Dropout层或使用不同的激活函数等来改进模型性能。 希望以上回答对您有所帮助,如有任何问题,请随时追问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值