LSTM与GRU

本文深入探讨了长短期记忆网络(LSTM)和门控循环单元(GRU)的工作原理及内部结构。详细介绍了两种网络如何通过不同的门控机制处理序列数据,并提供了实战应用案例。

⨀\bigodot表示操作矩阵中对应的元素相乘,因此要求两个相乘矩阵是同型的。⨁\bigoplus则代表进行矩阵加法操作。
在这里插入图片描述
在这里插入图片描述

LSTM内部结构-输入门+遗忘门+输出门

RNN和LSTM结构图对比:
在这里插入图片描述
RNN 和 LSTM的区别:
在这里插入图片描述
LSTM比RNN多了一个输入状态,包括两个输入ctc^tct(cell state)和hth^tht(hidden state)。
首先使用LSTM的当前输入xtx^txt和上一个状态传递下来的ht−1h^{t-1}ht1拼接训练得到四个状态。
{z=tanh(Wht−1xt)zi=σ(Wiht−1xt)zf=σ(Wfht−1xt)zo=σ(Woht−1xt) \begin{cases} z &=tanh(W^{x^t}_{h^{t-1}}) \\ z^i &= \sigma({W^i}^{x^t}_{h^{t-1}}) \\ z^f &= \sigma({W^f}^{x^t}_{h^{t-1}}) \\ z^o &= \sigma({W^o}^{x^t}_{h^{t-1}}) \\ \end{cases} zzizfzo=tanh(Wht1xt)=σ(Wiht1xt)=σ(Wfht1xt)=σ(Woht1xt)
其中, 记忆ziz^izi, 忘记zfz^fzf, 输出zoz^ozo是由拼接向量乘以权重矩阵之后,再通过一个sigmoid激活函数转换成0到1之间的数值,来作为一种门控状态。而z则是将结果通过一个tanh激活函数将转换成-1到1之间的值(这里使用tanh是因为这里是将其做为输入数据,而不是门控信号)。

3个阶段

两条数据流
第一步通过遗忘和输入门计算当前的ctc^tct
第二步通过输出门计算当前的hth^tht
在这里插入图片描述

1、忘记

具体来说是通过计算得到的 zfz^fzf来作为忘记门控,来控制上一个状态的ct−1c^{t-1}ct1哪些需要留哪些需要忘。

2、记忆

主要是会对输入xtx^txt 进行选择记忆。哪些重要则着重记录下来,哪些不重要,则少记一些。当前的输入内容由前面计算得到的zzz表示。而选择的门控信号则是由ziz^izi来进行控制。

1 + 2

将上面两步得到的结果相加,即可得到传输给下一个状态的ctc^tct

3、输出

这个阶段将决定哪些将会被当成当前状态的输出。主要是通过zoz^ozo来进行控制的。并且还对上一阶段得到的coc^oco进行了放缩(通过一个tanhtanhtanh激活函数进行变化)。
与普通RNN类似,输出yty^tyt往往最终也是通过hth^tht变化得到。

LSTM实战-预测

参考之前的一篇:https://blog.youkuaiyun.com/ACBattle/article/details/85307422

GRU内部结构-更新门+重置门

主要包括三次数据的处理(三条明确的轨迹路线)红 + 黑 + 紫
在这里插入图片描述
总的公式为:
重置−计算h:{r=σ(Wrht−1xt)ht−1′=ht−1⨀rh′=tanh(Wht−1′xt) 重置-计算h : \begin{cases} r &= \sigma({W^{r}}^{x^t}_{h^{t-1}}) \\ {h^{t-1}}^{'} &= h^{t-1} \bigodot r \\ h^{'} &= tanh({W}^{x^t}_{{h^{t-1}}^{'}}) \\ \end{cases} h:rht1h=σ(Wrht1xt)=ht1r=tanh(Wht1xt)

更新−计算z:{z=σ(Wzht−1xt) 更新-计算z: \left\{ \begin{array}{c} z &= \sigma({W^{z}}^{x^t}_{h^{t-1}}) \\ \end{array} \right. z:{z=σ(Wzht1xt)

汇总输出:{ht=z⨀ht−1+(1−z)⨀h′ 汇总输出: \left\{ \begin{array}{c} h^t = z \bigodot h^{t-1} + (1 - z)\bigodot {h^{'}} \end{array} \right. :{ht=zht1+(1z)h

通过上一个传输下来的状态ht−1h^{t-1}ht1和当前节点的输入xtx^{t}xt来获取两个门控状态。

1、重置:计算hhh

reset:r=σ(Wrht−1xt)r = \sigma({W^{r}}^{x^t}_{h^{t-1}})r=σ(Wrht1xt)
首先通过重置门得到
ht−1′=ht−1⨀r{h^{t-1}}^{'} = h^{t-1} \bigodot rht1=ht1r
再将ht−1′{h^{t-1}}^{'}ht1与输入的xtx^txt进行拼接,在通过一个tanh来将数据缩到{-1, 1}之内。即可得到的h′h^{'}h
h′=tanh(Wht−1′xt)h^{'}= tanh({W}^{x^t}_{{h^{t-1}}^{'}})h=tanh(Wht1xt)
这里的h′h^{'}h主要是包含了当前输入的xtx^txt数据。有针对性的对h′h^{'}h添加到当前的隐藏状态,相当于“记忆了当前时刻的状态”。类似于LSTM的选择记忆阶段。

2、更新:计算zzz

update: z=σ(Wzht−1xt)z = \sigma({W^{z}}^{x^t}_{h^{t-1}})z=σ(Wzht1xt)
同时进行遗忘和更新。
我们使用了先前得到的更新门控 z(update gate)。
更新门:ht=z⨀ht−1+(1−z)⨀h′h^t = z \bigodot h^{t-1} + (1 - z)\bigodot h^{'}ht=zht1+(1z)h
门控信号的范围是0 10~10 1,门控信号越接近1,代表“记忆”下来的数据越多;而越接近0则代表“遗忘”的越多。
疑惑:遗忘与记忆的关系和为1?

GRU实战-文本情感分类

https://blog.youkuaiyun.com/ACBattle/article/details/101945050

### LSTM GRU 的差异、相似性应用案例 #### 差异 (Differences) 长期短期记忆网络(LSTM门控循环单元(GRU)都是为了处理序列数据而设计的神经网络结构,旨在解决传统RNN中的梯度消失问题。然而,两者在网络结构上存在显著区别。 - **内部结构复杂性** LSTM具有三个主要的门机制:输入门、遗忘门输出门,这些门协同工作来控制细胞状态的信息流动[^1]。相比之下,GRU通过简化其内部结构减少了参数数量,它仅包含两个门——重置门更新门,这使得模型更加紧凑并可能加速训练过程[^3]。 - **隐藏状态管理方式** 在LSTM中,除了隐藏状态外还维护了一个单独的细胞状态向量用于更精细地调节信息传递;而在GRU里,则取消了这种分离的设计理念,直接利用单一的状态表示来进行操作。 #### 相似之处 (Similarities) 尽管二者具体实现有所不同,但在功能层面却有许多共同点: - 都能够有效缓解标准RNN面临的长时间依赖建模难题; - 均采用“门”的概念来决定哪些部分应该被保留或者丢弃; - 可应用于多种时间序列预测任务如自然语言处理等领域内的翻译、情感分析等场景下表现良好[^2]。 #### 应用领域对比 (Use Cases Comparison) 由于上述特性上的差别,在实际工程实践中如何选择取决于特定需求考虑因素如下表所示: | 特征/方法 | LSTM | GRU | |------------------|------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------| | 参数规模 | 较大 | 更少 | | 训练速度 | 较慢 | 更快 | | 性能 | 对于非常复杂的模式识别任务通常优于GRU | 当数据集较小或计算资源有限时可能是更好的选项 | 因此,在面对大规模语料库且追求极致精度的情况下可以优先尝试使用LSTM;而对于轻量化设备部署或是希望快速迭代原型验证阶段则推荐选用GRU作为候选方案之一。 ```python import torch.nn as nn class LSTMModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(LSTMModel, self).__init__() self.lstm = nn.LSTM(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.lstm(x) out = self.fc(out[:, -1, :]) return out class GRUModel(nn.Module): def __init__(self, input_size, hidden_size, num_layers, output_size): super(GRUModel, self).__init__() self.gru = nn.GRU(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True) self.fc = nn.Linear(hidden_size, output_size) def forward(self, x): out, _ = self.gru(x) out = self.fc(out[:, -1, :]) return out ``` 以上代码展示了基于PyTorch框架构建简单的LSTMGRU模型实例。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值