GRU单元(Gated Recurrent Unit(GRU))
你已经了解了基础的RNN模型的运行机制,在本节中你将会学习门控循环单元,它改变了RNN的隐藏层,使其可以更好地捕捉深层连接,并改善了梯度消失问题,让我们看一看。
你已经见过了这个公式,
a^(
我把这个画个图,把RNN的单元画个图,画一个方框,输入a^(
然后激活值a^(
许多GRU的想法都来分别自于Yu Young Chang, Kagawa,Gaza Hera, Chang Hung Chu和 Jose Banjo的两篇论文。
我再引用上个笔记中你已经见过的这个句子,“The cat, which already ate……, was full.”,你需要记得猫是单数的,为了确保你已经理解了为什么这里是was而不是were,“The cat was full.”或者是“The cats were full”。
当我们从左到右读这个句子,GRU单元将会有个新的变量称为c,代表细胞(cell),即记忆细胞(下图编号1所示)。记忆细胞的作用是提供了记忆的能力,比如说一只猫是单数还是复数,所以当它看到之后的句子的时候,它仍能够判断句子的主语是单数还是复数。于是在时间t处,有记忆细胞c^(
于是我们想要使用不同的符号c和a来表示记忆细胞的值和输出的激活值,即使它们是一样的。我现在使用这个标记是因为当我们等会说到LSTMs的时候,这两个会是不同的值,但是现在对于GRU,c^(
所以这些等式表示了GRU单元的计算,在每个时间步,我们将用一个候选值重写记忆细胞,即̃c^(
重点来了,在GRU中真正重要的思想是我们有一个门,我先把这个门叫做Γ_u(上图编号4所示),这是个下标为u的大写希腊字母Γ,u代表更新门,这是一个0到1之间的值。
为了让你直观思考GRU的工作机制,先思考Γ_u,这个一直在0到1之间的门值,实际上这个值是把这个式子带入sigmoid函数得到的,Γ_u=σ(W_u [c^(
我们还记得sigmoid函数是上图编号5所示这样的,它的输出值总是在0到1之间,对于大多数可能的输入,sigmoid函数的输出总是非常接近0或者非常接近1。
在这样的直觉下,可以想到Γ_u在大多数的情况下非常接近0或1。然后这个字母u表示“update”,我选了字母Γ是因为它看起来像门。还有希腊字母G,G是门的首字母,所以G表示门。
然后GRU的关键部分就是上图编号3所示的等式,我们刚才写出来的用̃c更新c的等式。然后门决定是否要真的更新它。于是我们这么看待它,记忆细胞c^(
所以我们接下来要给GRU用的式子就是c^(
对于所有在这中间的值,你应该把门的值设为0,即Γ_u=0,意思就是说不更新它,就用旧的值。因为如果Γ_u=0,则c^(
让我再画个图来(下图所示)解释一下GRU单元,顺便说一下,当你在看网络上的博客或者教科书或者教程之类的,这些图对于解释GRU和我们稍后会讲的LSTM是相当流行的,我个人感觉式子在图片中比较容易理解,那么即使看不懂图片也没关系,我就画画,万一能帮得上忙就最好了。
GRU单元输入c^(
再用一个不同的参数集,通过sigmoid激活函数算出Γ_u,Γ_u=σ(W_u [c^(
这就是GRU单元或者说是一个简化过的GRU单元,它的优点就是通过门决定,当你从左(上图编号10所示)到右扫描一个句子的时候,这个时机是要更新某个记忆细胞,还是不更新,不更新(上图编号11所示,中间Γ_u=0一直为0,表示一直不更新)直到你到你真的需要使用记忆细胞的时候(上图编号12所示),这可能在句子之前就决定了。
因为sigmoid的值,现在因为门很容易取到0值,只要这个值是一个很大的负数,再由于数值上的四舍五入,上面这些门大体上就是0,或者说非常非常非常接近0。
所以在这样的情况下,这个更新式子(上图编号13所示的等式)就会变成c^(
现在我想说下一些实现的细节,在这个我写下的式子中c^(
当然在实际应用中Γ_u不会真的等于0或者1,有时候它是0到1的一个中间值(上图编号5所示),但是这对于直观思考是很方便的,就把它当成确切的0,完全确切的0或者就是确切的1。元素对应的乘积做的就是告诉GRU单元哪个记忆细胞的向量维度在每个时间步要做更新,所以你可以选择保存一些比特不变,而去更新其他的比特。比如说你可能需要一个比特来记忆猫是单数还是复数,其他比特来理解你正在谈论食物,因为你在谈论吃饭或者食物,然后你稍后可能就会谈论“The cat was full.”,你可以每个时间点只改变一些比特。
你现在已经理解GRU最重要的思想了,幻灯片中展示的实际上只是简化过的GRU单元,现在来描述一下完整的GRU单元。
对于完整的GRU单元我要做的一个改变就是在我们计算的第一个式子中给记忆细胞的新候选值加上一个新的项,我要添加一个门Γ_r(下图编号1所示),你可以认为r代表相关性(relevance)。这个Γ_r门告诉你计算出的下一个c^(
正如你所见,有很多方法可以来设计这些类型的神经网络,然后我们为什么有Γ_r?为什么不用上一张幻灯片里的简单的版本?这是因为多年来研究者们试验过很多很多不同可能的方法来设计这些单元,去尝试让神经网络有更深层的连接,去尝试产生更大范围的影响,还有解决梯度消失的问题,GRU就是其中一个研究者们最常使用的版本,也被发现在很多不同的问题上也是非常健壮和实用的。你可以尝试发明新版本的单元,只要你愿意。但是GRU是一个标准版本,也就是最常使用的。你可以想象到研究者们也尝试了很多其他版本,类似这样的但不完全是,比如我这里写的这个。然后另一个常用的版本被称为LSTM,表示长短时记忆网络,这个我们会在下节中讲到,但是GRU和LSTM是在神经网络结构中最常用的两个具体实例。
还有在符号上的一点,我尝试去定义固定的符号让这些概念容易理解,如果你看学术文章的话,你有的时候会看到有些人使用另一种符号̃x,u,r和h表示这些量。但我试着在GRU和LSTM之间用一种更固定的符号,比如使用更固定的符号Γ来表示门,所以希望这能让这些概念更好理解。
所以这就是GRU,即门控循环单元,这是RNN的其中之一。
这个结构可以更好捕捉非常长范围的依赖,让RNN更加有效。然后我简单提一下其他常用的神经网络,比较经典的是这个叫做LSTM,即长短时记忆网络,我们在下节中讲解。
(Chung J, Gulcehre C, Cho K H, et al. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling[J]. Eprint Arxiv, 2014.
Cho K, Merrienboer B V, Bahdanau D, et al. On the Properties of Neural Machine Translation: Encoder-Decoder Approaches[J]. Computer Science, 2014.)
閱讀更多 極客Array 的文章