来源:Coursera吴恩达深度学习课程
接下来我们将会学习门控循环单元(Gated Recurrent Unit),它改变了RNN的隐藏层,使其可以更好地捕捉深层连接,并改善了梯度消失问题,让我们看一看。
如上图的公式,在RNN的时间t处,计算激活值,把这个RNN的单元用图形表示(上图左)。
备注:不知道为什么右上角的符号就是显示不出来,这篇文章都会()代替,有时间会解决这个bug,望谅解。
输入(input)上一个时间步激活值a^(t-1)和x^(t),并起来乘上权重项,在这个线性计算之后,经过激活函数g(这里是tanh激活函数)后,得到激活值a^(t),然后将激活值a^(t)传入softmax单元,用于输出y^(t)。这张图就是RNN隐藏层的单元的可视化呈现。展示这张图是为了使用相似的图来讲解门控循环单元。
注:许多GRU的想法都来分别自于Yu Young Chang, Kagawa,Gaza Hera, Chang Hung Chu和 Jose Banjo的两篇论文。
①Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling
②On the Properties of Neural Machine Translation: Encoder-Decoder Approaches
如上图,还是之前的句子“The cat, which already ate……, was full.”,当我们从左到右读这个句子,GRU单元将会有个新的变量称为c,代表细胞(cell),即记忆细胞(memory cell)。记忆细胞的作用是提供了记忆的能力,比如说一只猫是单数(singular)还是复数(plural),所以当它看到之后的句子的时候,它仍能够判断句子的主语是单数还是复数。在时间t处,有记忆细胞c^(t),GRU实际输出了激活值a^(t),于是有:
于是我们想要使用不同的符号c和a来表示记忆细胞的值和输出的激活值,即使它们是一样的。Andrew 现在使用这个标记是因为等会说到LSTM的时候,这两个会是不同的值。
所以这些等式表示了GRU单元的计算,在每个时间步,我们将用一个候选值(candidate)重写记忆细胞,它替代了c^(t)的值,我们用tanh激活函数来计算,公式如下:
重点(key)来了,在GRU中真正重要的思想是我们有一个门,把这个门叫做gamma u,这是一个下标为u(字母u代表update)的大写希腊字母Γ,是一个0到1之间的值。实际上这个值是把这个式子带入sigmoid函数得到的,公式如下:
对于大多数可能的输入,sigmoid函数的输出总是非常接近0或者非常接近1。
注意GRU的关键部分(key part)就是之前候选值的计算:
首先我们得到候选值,然后门决定是否要更新它。①于是记忆细胞c^(t)被设定为0或者1,这取决于你考虑的单词在句子中是单数还是复数,这里单数情况我们先假定它被设为了1,如果是复数的情况我们就把它设为0。②GRU单元会一直记住记忆细胞c^(t)的值。③门Γ_u的作用就是决定什么时候会更新这个值,特别是当你看到词组the cat,即句子的主语猫,这就是一个好时机去更新这个值。然后当你使用完它的时候,“The cat, which already ate…, was full.”,然后你就可以忘记它了。
我们接下来要给GRU用的式子就是:
注意到,①当更新值Γ_u = 1时,表示更新它,有:
②当更新值Γ_u = 0时,意味着不更新它,则有:
下面再画个图来(下图左侧所示)解释一下GRU单元。Andrew个人感觉式子在图片中比较容易理解,那么即使看不懂图片也没关系。
这就是GRU单元或者说是一个简化过的GRU单元,它的优点就是通过门决定,当从左到右扫描一个句子的时候,这个时机决定是否要更新某个记忆细胞,不更新(中间一直为0,表示一直不更新)直到你真的需要使用记忆细胞的时候再更新。
因为sigmoid的值,现在因为门很容易取到0值,只要这个值是一个很大的负数,再由于数值上的四舍五入,上面这些门大体上就是0,或者说非常非常非常接近0。所以在这样的情况下,这个更新式子就会变成:
这非常有利于维持记忆细胞的值。因为Γ_u很接近0,这样就不会有梯度消失的问题。这就是缓解梯度消失问题的关键,因此允许神经网络运行在非常庞大的依赖词上,比如说cat和was单词即使被中间的很多单词分割开。
如上图,我们关注一些细节。记忆细胞c^(t)可以是一个向量(vector),假设有一个100维的隐藏的激活值,那么记忆细胞、替代值和更新门(上图红色标记)的维度也是100维。
在实际应用中Γ_u不会真的等于0或者1,有时候它是0到1的一个中间值,元素对应的乘积做的就是告诉GRU单元哪个记忆细胞的向量维度在每个时间步要做更新,所以你可以选择保存一些比特不变,而去更新其他的比特。比如说你可能需要一个比特来记忆猫是单数还是复数,其他比特来理解你正在谈论食物,因为你在谈论吃饭或者食物,然后你稍后可能就会谈论“The cat was full.”,你可以每个时间点只改变一些比特。
我们已经理解GRU最重要的思想了。注意下图的三个式子:
目前为止幻灯片中展示的实际上只是简化过的GRU单元,现在来描述一下完整的GRU单元,如下图:
对于完整的GRU单元,在我们计算的第一个式子中给记忆细胞的新候选值加上一个新的门Γ_r,r代表相关性(relevance),表示下一个记忆细胞c^的候选值跟上一个记忆细胞c^有多大相关性。这里引入一个新的参数矩阵W_r,计算公式如下:
为什么要引入一个新的门呢?这是因为多年来研究者们试验过很多不同可能的方法来设计这些单元,去尝试让神经网络有更深层的连接,去尝试产生更大范围的影响,还有解决梯度消失的问题,GRU就是其中一个研究者们最常使用的版本,也被发现在很多不同的问题上也是非常健壮和实用的。另一个常用的版本被称为LSTM(长短时记忆网络),这个我们会之后讲到,但是GRU和LSTM是在神经网络结构中最常用的两个具体实例。
还有在符号上的一点,Andrew尝试去定义固定的符号让这些概念容易理解。总的来说,这就是GRU,即门控循环单元,这是RNN的其中之一。这个结构可以更好捕捉非常长范围的依赖,让RNN更加有效。
还有其他常用的神经网络,比较经典的是这个叫做LSTM,即长短时记忆网络,我们在下篇文章中讲解。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。