神经网络基础-GRU和LSTM
在深度学习的路上,从头开始了解一下各项技术。本人是DL小白,连续记录我自己看的一些东西,大家可以互相交流。
本文参考:本文参考吴恩达老师的Coursera深度学习课程,很棒的课,推荐
本文默认你已经大致了解深度学习的简单概念,如果需要更简单的例子,可以参考吴恩达老师的入门课程:
http://study.163.com/courses-search?keyword=%E5%90%B4%E6%81%A9%E8%BE%BE#/?ot=5
转载请注明出处,其他的随你便咯
一、前言
在之前的文章中,我们对RNN(循环神经网络)做了一个大致的介绍,同时也提到了在普通模型中,RNN只能根据之前的内容来预测y值,于是我们提出了LSTM单元和GRU单元这样的特殊RNN,来增加一个记忆模块,改善RNN系统效果。此处我们用了新的符号记法,用h<t>来代替上文的a<t>。
二、RNN中难以解决问题
上图是一个简单RNN的模型,我们假设这个RNN是在处理一个文本预测的工作,在较长的环境中,可能会损失很久之前的一些“记忆”,举个例子:
I grew up in France… I speak fluent French
当我们要预测最后一个单词的时候,根据前文的“I speak fluent”,模型会推荐一种语言的名字,但是在确定具体是哪一个语言的时候就需要知道语句最开始的“France”,在这种长环境中相关的信息和预测的词之间有多的时间步。理论上RNN是可以处理这一类的多时间步问题,但是在实践中发现,RNN并不能够成功的学习到这些知识。所以我们通过修改RNN中的单元结构,来为其加上一个记忆模块,即为LSTM。
三、LSTM模型概述
长短时记忆(Long Short-Term Memory,:LSTM)模型,改变了RNN的隐层(即普通神经网络部分),使其能够更好的完成多时间步问题,并且改善了梯度消失问题。此处我们用了新的符号记法,用h<t>来代替上文的a<t>,如果需要获得Yhat<t>,只需要将h<t>再经过一个输出层。
如上是一个RNN模型,其中A部分为隐层,使用tanh**函数,我们根据给出的x<t>和h<t-1>来计算新的a<t>和h<t>。
在LSTM中,我们对隐层部分做了修改,其核心内容是增加了“记忆细胞(cell)”变量,用于提供长期的记忆功能。c<t>跟h<t>一起在时间步之间传播,是对h<t>的一个补充,存储一切我们觉得有效的内容。
如上图所示,我们给出一个LSTM隐层的单元模型,通过使用x<t>,c<t-1>,h<t-1>来计算Yhat<t>,c<t>,h<t>。
四、LSTM详解
LSTM中引用了“门”的结构,来去除或者更新细胞的状态,门结构是一种让信息选择式通过的方法,包含一个sigmoid函数和一个元素乘积操作。用sigmoid函数输出一个[0,1]的值,通过元素乘积来更新细胞矩阵中的值。在LSTM中通过遗忘门、更新门和输出门来控制。
遗忘门:决定丢弃信息
如上图所示,遗忘门通过h<t-1>和x<t>来决定,在之前的预测例子中,我们的C<t-1>中记忆了主语,当我们看到了新的主语时,可能需要忘记旧的主语。
更新门:确定更新的信息
接下来,我们需要决定什么信息要添加(更新)到记忆细胞中,这里包括两个部分。首先,是用sigmoid函数决定什么值需要更新,其次,用tanh函数来创建一个新的候选值向量(C~<t>)。比如我们需要用“France”来替代“I”。
更新细胞状态
现在我们用之前的C<t-1>和遗忘门元素乘积加上新的候选值向量C~<t>和更新门元素乘积,即可得到我们该时间步的C<t>。
输出信息
最后,我们需要确定输出的结果(h<t>),这个输出会基础我们的记忆细胞c<t>。
首先,我们确定输出门,用一个sigmoid函数来决定记忆细胞的哪部分将被输出。接着我们把记忆细胞c<t>通过一个tanh函数得到一个[-1,1]的值,并将它与输出门元素乘积,得到我们的输出部分h<t>。
总计而言
LSTM是通过遗忘门和更新门来确定我们记忆细胞参数,需要记住和遗忘哪些部分,然后通过输出门来输出结果h<t>。通过记忆细胞在时间步中传递我们需要长时间记住的内容。
五、简化GRU单元
门控循环单元(Gated Recurrent Unit,GRU)。是对于LSTM的一个变体。LSTM模型的重复网络模块结构复杂,实现了三个门来计算。GRU是对LSTM模型的一种改进,只用了一个门,即可实现LSTM的功能。
在这个简化的GRU单元中,我们只用一个Γu更新门来控制细胞的更新,同时让c<t>和a<t>相同,简化操作过程。
整个计算过程为:
计算新的候选值向量:
c~<t> = tanh(Wc[c<t-1>, x<t>] + bc)
计算更新门:
Γu = sigmoid(Wu[c<t-1>, x<t>] + bu)
计算记忆细胞:
c<t> = Γu*c~<t> + (1 - Γu)*c<t-1>
这里思路很巧妙,用一个更新门,代替了LSTM中的遗忘门和更新门。如果不需要更新的内容,即是需要遗忘的内容。
六、完整的GRU单元
上述是一个简化版的GRU,能够简单实现LSTM的功能,如果需要一个功能介于二者之间的,可以在增加一个门Γr,用来确定C~<t>的值。
公式如下:
总结而言:
至此,我们已经讲解完了LSTM和其变体GRU,事实上对于LSTM的改进还在不断的提出。GRU的简化方式,是牺牲精准度的情况下来简化参数的数量,是一个精准度和结构复杂度的选择。
我们在深度学习过程中,会经常遇到这种选择。比如在超参数的确定中,如果学习率过高,我们会在最优解点处震荡,甚至没办法取到那个值,如果学习率过低,我们的学习速率又会低的离谱。在模型和超参数的选择中,需要依靠我们的经验在加上一点运气。