GRU与LSTM总结
Posted AI蜗牛之家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GRU与LSTM总结相关的知识,希望对你有一定的参考价值。
文章目录
1. LSTM(长短期记忆网络)
LSTM是一种特殊的RNN类型,一般的RNN结构如下图所示,是一种将以往学习的结果应用到当前学习的模型,但是这种一般的RNN存在着许多的弊端。举个例子,如果我们要预测“the clouds are in the sky”的最后一个单词,因为只在这一个句子的语境中进行预测,那么将很容易地预测出是这个单词是sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。
对应的公式
h
t
=
σ
(
W
f
⋅
[
h
t
−
1
,
x
t
]
+
b
f
)
h_t = \\sigma(W_f · [h_t-1,x_t] + b_f)
ht=σ(Wf⋅[ht−1,xt]+bf)
更多关于RNN详见链接
标准的RNN结构中只有一个神经元,一个tanh层进行重复的学习,这样会存在一些弊端。例如,在比较长的环境中,例如在“I grew up in France… I speak fluent French”中去预测最后的French,那么模型会推荐一种语言的名字,但是预测具体是哪一种语言时就需要用到很远以前的Franch,这就说明在长环境中相关的信息和预测的词之间的间隔可以是非常长的。在理论上,RNN 绝对可以处理这样的长环境问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 并不能够成功学习到这些知识。然而,LSTM模型就可以解决这一问题。
如图所示,标准LSTM模型是一种特殊的RNN类型,在每一个重复的模块中有四个特殊的结构,以一种特殊的方式进行交互。在图中,每一条黑线传输着一整个向量,粉色的圈代表一种pointwise 操作(将定义域上的每一点的函数值分别进行运算),诸如向量的和,而黄色的矩阵就是学习到的神经网络层。
LSTM模型的核心思想是“细胞状态”。“细胞状态”类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。
讲解之前先补充点图例和说明:
下面图里的解释:
- 公式中 [ h t − 1 , x t ] [h_t-1,x_t] [ht−1,xt]表示的是把两个向量的concatenate操作,也就是直接把两个向量连接起来作为一个向量
- pointwise operation就是对两个向量的对应位进行运算,我们这里用到的是对位相乘,详细介绍详见Pointwise Operations
1.1 忘记门
在LSTM模型中,第一步是决定我们从“细胞”中丢弃什么信息,这个操作由一个忘记门层来完成。该层读取当前输入x和前神经元信息h,由ft来决定丢弃的信息。输出结果1表示“完全保留”,0 表示“完全舍弃”。
1.2 输入门
第二步是确定细胞状态所存放的新信息,这一步由两层组成。sigmoid层作为“输入门层”,决定我们将要更新的值i;tanh层来创建一个新的候选值向量~Ct加入到状态中。在语言模型的例子中,我们希望增加新的主语到细胞状态中,来替代旧的需要忘记的主语。
第三步就是更新旧细胞的状态,将Ct-1更新为Ct。我们把旧状态与 ft相乘,丢弃掉我们确定需要丢弃的信息。接着加上 it * ~Ct。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的信息并添加新的信息的地方。
1.3 输出门
最后一步就是确定输出了,这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。在语言模型的例子中,因为语境中有一个代词,可能需要输出与之相关的信息。例如,输出判断是一个动词,那么我们需要根据代词是单数还是负数,进行动词的词形变化。
看完肯定有一些疑问,这些激活函数设置的秘诀是什么?为什么有些是sigmoid,有些是tanh,这里我有一些简单的认识,如果是一个门控gate( f t f_t ft, i t i_t it, o t o_t ot),那么就是sigmoid,如果是一个状态信息( c t c_t ct, h t h_t ht,),就用的tanh。因为门控肯定是要归一化到0-1的,sigmoid正好合适,而状态信息肯定是希望向量里面正负都有的,所以是tanh。个人理解哈。
看完上面的这些,你肯定会自认为好像很简单的样子哦,之前我也是,但是在读相关的paper的时候,或者是在比赛做相关模型的时候,如果在cell基础上做些改进,你会特别懵逼,乱七八糟的矩阵,乱七八糟的向量,你甚至会质疑这到底是个标量还是向量,抑或是矩阵呢?所以为了以后更清楚,我们再来捋一捋!(比如你可以通过分析LSTM和LSTMP的区别来验证自己的理解程度!)
直接上图:
ps:右上角是我整理的相关的的维数,其中V_c是cell unit的长度,也就是隐层向量长度( h t h_t ht & C t C_t Ct)
如果对相关的操作还是有点不清楚,那看下这篇帖子吧,原理篇:LSTM详解 反向传播公式推导
1.4.LSTM 的深层次理解
2. GRU( Gated Recurrent Unit,LSTM变体)
x
t
x_t
xt:Input vector
h
t
h_t
ht:output vector
z
t
z_t
zt:update gate vector
r
t
r_t
rt:reset gate vector (
maybe it can be translated to relevented vector,so use character ‘r’)
W
,
U
,
a
n
d
b
W,U,and b
W,U,andb:parameter matrices and vector
(摘自Wikipedia)
这里提供一个Ng的相关视频(偶然发现的),讲解了GRU的来龙去脉,挺不错的,详见链接
所以GRU最起源于:
then we can get the final expression:
3. 对比
概括的来说,LSTM和GRU都能通过各种Gate将重要特征保留,保证其在long-term 传播的时候也不会被丢失。
可以看出,标准LSTM和GRU的差别并不大,但是都比tanh要明显好很多,所以在选择标准LSTM或者GRU的时候还要看具体的任务是什么。
使用LSTM的原因之一是解决RNN Deep Network的Gradient错误累积太多,以至于Gradient归零或者成为无穷大,所以无法继续进行优化的问题。GRU的构造更简单:比LSTM少一个gate,这样就少几个矩阵乘法。在训练数据很大的情况下GRU能节省很多时间。
4.相关实现
小博链接地址
5.应用
样例:预测当前词。每个时刻的输入都是一个embedding向量,它的长度是输入层神经元的个数,与时间步的个数(即句子的长度)没有关系。
每个时刻的输出是一个概率分布向量,其中最大值的下标决定了输出哪个词。
RNN&LSTM实际应用:
- Language ModelThe Unreasonable Effectiveness of Recurrent Neural Networks http://karpathy.github.io/2015/05/21/rnn-effectiveness/
- Image Captioning[CVPR15]]Long-term Recurrent Convolutional Networks for Visual Recognition and DescriptionDeep Visual-Semantic Alignments for Generating Image Descriptions http://cs.stanford.edu/people/karpathy/deepimagesent/
- Speech Recognition
- Machine Translation[NIPS15]Sequence to Sequence Learning
with Neural Networks. http://papers.nips.cc/paper/5346-sequence-to-sequence-learning-with-neural-networks.pdf
参考链接:
以上是关于GRU与LSTM总结的主要内容,如果未能解决你的问题,请参考以下文章