时序数据处理模型:RNN与LSTM总结

1、RNN的原理

在使用深度学习处理时序数据时,RNN是经常用到的模型之一。RNN之所以在时序数据上有着优异的表现是因为RNN在 t t t 时间片时会将 t − 1 t-1 t1时间片的隐节点作为当前时间片的输入。这样有效的原因是之前时间片的信息也用于计算当前时间片的内容,而传统DNN模型的隐节点的输出只取决于当前时间片的输入特征。RNN结构如下图:

图1:RNN结构图

公式如下( W , U , b W,U,b W,U,b均为参数):

h t = σ ( W t ⋅ x t + U t ⋅ h t − 1 + b ) \begin{aligned} & h_t=\sigma (W_{t}·x_t+U_{t}·h_{t-1} +b) \end{aligned} ht=σ(Wtxt+Utht1+b)

其中隐节点 h t − 1 h_{t-1} ht1主要有两个作用:

  1. 计算下个时间片的隐节点状态 h t h_t ht
  2. 计算在该时刻的预测值 y ^ = σ ( w ∗ h t + b ) \hat y=\sigma(w*h_t+b) y^=σ(wht+b)

RNN的优缺点:

在深度学习领域中(尤其是RNN),“长期依赖“问题是普遍存在的。长期依赖产生的原因是当神经网络的节点经过许多阶段的计算后,之前比较长的时间片的特征已经被覆盖,导致产生梯度消失/爆炸

产生梯度消失和梯度爆炸是由于RNN的权值矩阵循环相乘导致的,相同函数的多次组合会导致极端的非线性行为。梯度消失和梯度爆炸主要存在RNN中,因为RNN中每个时间片使用相同的权值矩阵。对于一个DNN,虽然也涉及多个矩阵的相乘,但是通过精心设计权值的比例可以避免梯度消失和梯度爆炸的问题 。

处理梯度爆炸可以采用梯度截断的方法。所谓梯度截断是指将梯度值超过阈值 θ \theta θ的梯度手动降到 θ \theta θ

梯度消失不能简单的通过类似梯度截断的阈值式方法来解决,因为长期依赖的现象也会产生很小的梯度。例如,对于时序数据 [ t 1 , t 2 , t 3 , . . . , t 8 , t 9 , t 10 ] [t1,t2,t3,...,t8,t9,t10] [t1,t2,t3,...,t8,t9,t10],我们希望 t 9 t9 t9时刻能够读到 t 1 t1 t1时刻的特征,在这期间内我们自然不希望隐层节点状态发生很大的变化,所以 [ t 2 , t 8 ] [t2,t8] [t2,t8]时刻的梯度要尽可能的小才能保证梯度变化小。很明显,如果我们刻意提高小梯度的值将会使模型失去捕捉长期依赖的能力。

2、LSTM

LSTM全称是Long Short Term Memory,顾名思义,它是具有记忆长短期信息的神经网络。LSTM提出的动机是为了解决上面我们提到的长期依赖问题。

而LSTM之所以能够解决RNN的长期依赖问题,是因为LSTM引入了门(gate)机制用于控制特征的流通和损失。对于上面的例子,LSTM可以做到在 t 9 t9 t9时刻将 t 1 t1 t1时刻的特征传过来,这样就可以非常有效的判断 t 9 t9 t9时刻使用单数还是复数了。LSTM是由一系列LSTM单元(LSTM Unit)组成,其链式结构如下图。

图3:LSTM单元
其中,每个黄色方框表示一个神经网络层,由权值,偏置以及激活函数组成;每个粉色圆圈表示元素级别操作;箭头表示向量流向;相交的箭头表示向量的拼接;分叉的箭头表示向量的复制。总结如下图:
图4:LSTM的符号含义

LSTM的核心部分是在图3中最上边类似于传送带的部分(图5),这一部分一般叫做单元状态(cell state)它自始至终存在于LSTM的整个链式系统中。

图5:LSTM的单元状态

其中
C t = f t ∗ C t − 1 + i t ∗ C t ~ C_t = f_t*C_{t-1}+i_t*\tilde{C_t} Ct=ftCt1+itCt~

其中 f t f_t ft叫做遗忘门,表示 C t − 1 C_{t-1} Ct1的哪些特征被用于计算 C t C_t Ct f t f_t ft 是一个向量,向量的每个元素均位于 [ 0 , 1 ] [0,1] [0,1]范围内。通常我们使用 s i g m o i d sigmoid sigmoid作为激活函数, s i g m o i d sigmoid sigmoid的输出是一个介于 [ 0 , 1 ] [0,1] [0,1]区间内的值,但是当你观察一个训练好的LSTM时,你会发现门的值绝大多数都非常接近0或者1,其余的值少之又少。其中 × \times × 是LSTM最重要的门机制,表示 f t f_t ft C t − 1 C_{t-1} Ct1 之间的单位乘关系。

图6:LSTM的遗忘门

输入门(如下图7所示), C t ~ \widetilde{C_t} Ct 表示单元状态更新值,由输入数据 x t x_t xt和隐节点 h t − 1 h_{t-1} ht1经由一个神经网络层得到,单元状态更新值的激活函数通常使用 t a n h tanh tanh i t i_t it叫做输入门,同 f t f_t ft一样也是一个元素介于 [ 0 , 1 ] [0,1] [0,1]区间内的向量,同样由 x t x_t xt h t − 1 h_{t-1} ht1经由 s i g m o i d sigmoid sigmoid激活函数计算而成。

图7:LSTM的输入门和单元状态更新值计算方式

i t i_t it用于控制 C t ~ \widetilde{C_t} Ct 的哪些特征用于更新 C t C_t Ct,使用方式和 f t f_t ft相同(图8)。

图8:LSTM的输入门作用方式

最后,为了计算预测值 y ^ \hat{y} y^和生成下个时间片完整的输入,我们需要计算隐节点的输出 h t h_t ht(图9)。

图9:LSTM的输出门

h t h_t ht由输出门 o t o_t ot和单元状态 C t C_t Ct得到,其中 o t o_t ot的计算方式和 f t f_t ft以及 i t i_t it相同。有论文指出,通过将 b o b_o bo的均值初始化为 1 1 1,可以使LSTM达到同GRU近似的效果。在LSTM中,门的重要性排序是遗忘门 > 输入门 > 输出门。

图10:LSTM计算全流程
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于pytorch的RNNLSTM模型构建,RNN进行MNIST数据集分类,LSTM进行古诗生成LSTM (Long Short-Term Memory) 是一种特殊的循环神经网络(RNN)架构,用于处理具有长期依赖关系的序列数据。传统的RNN处理长序列时往往会遇到梯度消失或梯度爆炸的问题,导致无法有效地捕捉长期依赖。LSTM通过引入门控机制(Gating Mechanism)和记忆单元(Memory Cell)来克服这些问题。 以下是LSTM的基本结构和主要组件: 记忆单元(Memory Cell):记忆单元是LSTM的核心,用于存储长期信息。它像一个传送带一样,在整个链上运行,只有一些小的线性交互。信息很容易地在其上保持不变。 输入门(Input Gate):输入门决定了哪些新的信息会被加入到记忆单元中。它由当前时刻的输入和上一时刻的隐藏状态共同决定。 遗忘门(Forget Gate):遗忘门决定了哪些信息会从记忆单元中被丢弃或遗忘。它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 输出门(Output Gate):输出门决定了哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。同样地,它也由当前时刻的输入和上一时刻的隐藏状态共同决定。 LSTM的计算过程可以大致描述为: 通过遗忘门决定从记忆单元中丢弃哪些信息。 通过输入门决定哪些新的信息会被加入到记忆单元中。 更新记忆单元的状态。 通过输出门决定哪些信息会从记忆单元中输出到当前时刻的隐藏状态中。 由于LSTM能够有效地处理长期依赖关系,它在许多序列建模任务中都取得了很好的效果,如语音识别、文本生成、机器翻译、时序预测等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值