RNN、LSTM、GRU学习资料记录

RNN、LSTM:人人都能看懂的LSTM
GRU:人人都能看懂的GRU
其他参考:
1、深度学习笔记——RNN(LSTM、GRU、双向RNN)学习总结
2、[tensorflow应用之路]RNN预测时间序列原理及LSTM/GRU算法实现
3、pytorch LSTM用于时间序列的分析

一、RNN

RNN:循环神经网络(Recurrent Neural Network,RNN)是一种用于处理序列数据的神经网络。

1、单个输入 x x x
在这里插入图片描述
公式: f : h ′ , y = f ( h , x ) f: h',y = f(h,x) f:h,y=f(h,x)
输入: x x x为当前状态下数据的输入, h h h为接收到上一个节点的输入
输出: y y y为当前状态下本节点的输出, h ′ h' h为传递到下一个节点的输出

公式1: h ′ = σ ( W h h + W i x ) h'=\sigma(W^hh+W^ix) h=σ(Whh+Wix)
可以看出,输出 h ′ h' h,与 h h h x x x的值都有关

公式2: y = σ ( W o h ′ ) y=\sigma(W^oh') y=σ(Woh)
y y y则常常使用 h ′ h' h投入到一个线性层(主要是进行维度映射)然后使用softmax进行分类得到需要的数据。
对这里的 y y y如何通过 h ′ h' h计算得到往往看具体模型的使用方式。

2、序列输入 x 1 , x 2 , x 3 . . . x^1,x^2,x^3... x1,x2,x3...:
在这里插入图片描述

二、LSTM

LSTM:长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。
简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。

2.1 LSTM的输入输出

LSTM结构(图右)和普通RNN(图左)的主要输入输出区别如下所示。
在这里插入图片描述
RNN只有一个传递状态 h t h^t ht,而LSTM有两个传递状态,一个 c t c^t ct(cell state),和一个 h t h^t ht(hidden state)。(Tips:RNN中的 h t h^t ht对应于LSTM中的 c t c^t ct
其中对于传递下去的 c t c^t ct改变得很慢,通常输出的 c t c^t ct是上一个状态传过来的 c t − 1 c^{t-1} ct1加上一些数值。
h t h^t ht则在不同节点下往往会有很大的区别。

2.2 LSTM的内部结构(计算公式)

1、首先使用LSTM的当前输入 x t x^t xt和上一个状态传递下来的 h t − 1 h^{t-1} ht1拼接训练,得到以下四个状态:
在这里插入图片描述
在这里插入图片描述
其中, z i z^i zi z f z^f zf z o z^o zo 是由拼接向量乘以权重矩阵之后,再通过一个 s i g m o i d sigmoid sigmoid激活函数转换成0到1之间的数值,来作为一种门控状态。
s i g m o i d : s ( x ) = 1 / ( 1 + e ( − x ) ) sigmoid:s(x)=1/(1+e^{(-x)}) sigmoid:s(x)=1/(1+e(x))
z z z则是将结果通过一个 t a n h tanh tanh激活函数将转换成-1到1之间的值(这里使用 t a n h tanh tanh是因为这里是将其做为输入数据,而不是门控信号)。

2、通过以下公式计算得到 c t c^t ct h t h^t ht y t y^t yt
在这里插入图片描述
⨀ \bigodot 是Hadamard Product,也就是操作矩阵中对应的元素相乘,因此要求两个相乘矩阵是同型的。
⨁ \bigoplus 则代表进行矩阵加法。

2.3 LSTM原理解释

LSTM内部主要有三个阶段:
1、忘记阶段。
这个阶段主要是对上一个节点传进来的输入进行选择性忘记。简单来说就是会 “忘记不重要的,记住重要的”。

具体来说是通过计算得到的 z f z^f zf(f表示forget)来作为忘记门控,来控制上一个状态的 c ( t − 1 ) c^{(t-1)} c(t1)哪些需要留哪些需要忘。

2、选择记忆阶段。
这个阶段将这个阶段的输入有选择性地进行“记忆”。主要是会对输入 x t x^t xt进行选择记忆。哪些重要则着重记录下来,哪些不重要,则少记一些。当前的输入内容由前面计算得到的 z z z表示。而选择的门控信号则是由 z i z^i zi(i代表information)来进行控制。

将上面两步得到的结果相加,即可得到传输给下一个状态的 c t c^t ct。也就是上图中的第一个公式。

3、输出阶段。
这个阶段将决定哪些将会被当成当前状态的输出。主要是通过 z o z^o zo来进行控制的。并且还对上一阶段得到的 c o c^o co进行了放缩(通过一个tanh激活函数进行变化)。(上图中的第二个公式)

与普通RNN类似,输出 y t y^t yt往往最终也是通过 h t h^t ht变化得到。(上图中的第三个公式)

三、RNN和LSTM的总结、GRU的引入

以上,就是LSTM的内部结构。通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息;而不像普通的RNN那样只能够“呆萌”地仅有一种记忆叠加方式。对很多需要“长期记忆”的任务来说,尤其好用。

但也因为引入了很多内容,导致参数变多,也使得训练难度加大了很多。因此很多时候我们往往会使用效果和LSTM相当但参数更少的GRU来构建大训练量的模型。

四、GRU

GRU(Gate Recurrent Unit)是RNN的一种。和LSTM一样,也是为了解决长期记忆和反向传播中的梯度等问题而提出来的。
相比LSTM,使用GRU能够达到相当的效果,并且相比之下更容易进行训练,能够很大程度上提高训练效率,因此很多时候会更倾向于使用GRU。

4.1 GRU的输入输出

和RNN一样:
在这里插入图片描述

4.2 GRU的内部结构(计算公式)

1、通过上一个传输下来的状态 h ( t − 1 ) h^{(t-1)} h(t1)和当前节点的输入 x t x^t xt来获取两个门控状态。
如下图所示,其中 r r r控制重置的门控(reset gate), z z z为控制更新的门控(update gate)。
在这里插入图片描述
2、得到门控信号之后,首先使用重置门控来得到“重置”之后的数据 h t − 1 ′ = h t − 1 ⨀ r {h^{t-1}}' = h^{t-1}\bigodot r ht1=ht1r
再将 h t − 1 ′ {h^{t-1}}' ht1与输入 x t x^t xt进行拼接,再通过一个tanh激活函数来将数据放缩到-1~1的范围内。即得到如下图所示的 h ′ h' h
在这里插入图片描述
这里的 h ′ h' h主要是包含了当前输入的 x t x^t xt数据。有针对性地对 h ′ h' h添加到当前的隐藏状态,相当于”记忆了当前时刻的状态“。类似于LSTM的选择记忆阶段。
在这里插入图片描述
3、最后介绍GRU最关键的一个步骤,我们可以称之为”更新记忆“阶段。

在这个阶段,我们同时进行了遗忘和记忆两个步骤。我们使用了先前得到的更新门控 z z z(update gate)。

更新表达式: h t = z ⨀ h t − 1 + ( 1 − z ) ⨀ h ′ h^t = z \bigodot h^{t-1}+(1-z) \bigodot h' ht=zht1+(1z)h
输出表达式: y t = σ ( W h t ) y^t=\sigma(Wh^t) yt=σ(Wht)

首先再次强调一下,门控信号(这里的 z z z)的范围为0~1。门控信号越接近1,代表”记忆“下来的数据越多;而越接近0则代表”遗忘“的越多。

GRU很聪明的一点就在于,我们使用了同一个门控 z z z就同时可以进行遗忘和选择记忆(LSTM则要使用多个门控)。

  • z ⨀ h t − 1 z \bigodot h^{t-1} zht1:表示对原本隐藏状态的选择性“遗忘”。这里的 z z z 可以想象成遗忘门(forget gate),忘记 h t − 1 h^{t-1} ht1 维度中一些不重要的信息。
  • ( 1 − z ) ⨀ h ′ (1-z) \bigodot h' (1z)h : 表示对包含当前节点信息的 h ′ h' h 进行选择性”记忆“。与上面类似,这里的 ( 1 − z ) (1-z) (1z) 同理会忘记 h ′ h' h 维度中的一些不重要的信息。或者,这里我们更应当看做是对 h ′ h' h 维度中的某些信息进行选择。

结合上述,这一步的操作就是忘记传递下来的 h t − 1 h^{t-1} ht1 中的某些维度信息,并加入当前节点输入 h ′ h' h 的某些维度信息。

可以看到,这里的遗忘 z z z 和选择 ( 1 − z ) (1-z) (1z) 是联动的。也就是说,对于传递进来的维度信息,我们会进行选择性遗忘,则遗忘了多少权重 ( z z z),我们就会使用包含当前输入的 h ′ h' h 中所对应的权重进行弥补 ( 1 − z ) (1-z) (1z) 。以保持一种”恒定“状态。

4.3 LSTM与GRU的关系

GRU是在2014年提出来的,而LSTM是1997年。
r r r (reset gate)实际上与他的名字有点不符。我们仅仅使用它来获得了 h ′ h' h
那么这里的 h ′ h' h 实际上可以看成对应于LSTM中的 h t h^t ht(hidden state);上一个节点传下来的 h t − 1 h^{t-1} ht1 则对应于LSTM中的 c t c^t ct(cell state)。
z z z 对应的则是LSTM中的 z f z^f zf(forget gate),那么 ( 1 − z ) (1-z) (1z) 我们似乎就可以看成是选择门 z i z^i zi 了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值