先看一个公式a<t>=g(Wa[a<t−1>,x<t>]+ba)a^{<t>}=g(W_a[a^{<t-1>},x^{<t>}]+b_a)a<t>=g(Wa​[a<t−1>,x<t>]+ba​)在RNN的时间t处,计算激活值。

使用句子"The cat, whcih already ate …, was full.",需要记住猫是单数的,为什么这里是was而不是were。当我们从左到右读这个句子,GRU单元将会有个新的变量称为c,代表细胞,即记忆细胞,记忆细胞的作用是提供记忆的能力。比如说,一只猫是单数还是复数。所以当它看到之后的句子的时候,它仍能判断句子的主语是单数还是复数。

于是在时间t处,记忆细胞有关t的值c<t>c^{<t>}c<t>,然后我们可以看的是GRU实际上输出了a<t>a^{<t>}a<t>的激活值,这等于c<t>c^{<t>}c<t>的值,于是我们想要使用不同的符号c和a来表示记忆细胞的值和输出的激活值,即使它们是一样的。现在使用这个标记是因为当我们等会说到LSTMs的时候这两个代表的是两个不同的值。但是现在,对于GRU,c<t>=a<t>c^{<t>}=a^{<t>}c<t>=a<t>,所以这些等式表示了GRU单元的计算。

在每个时间步,我们将用一个候选值重写记忆细胞,即c~<t>\tilde{c}^{<t>}c~<t>的值,所以它就是个候选值,替代c<t>c^{<t>}c<t>,然后我们用tanh激活函数来计算,即c~<t>=tanh(Wc[c<t−1>,x<t>]+bc)\tilde{c}^{<t>}=tanh(W_c[c^{<t-1>},x^{<t>}]+b_c)c~<t>=tanh(Wc​[c<t−1>,x<t>]+bc​)重点来了,在GRU中真正重要的思想是,我们有一个门,先把这个门叫做Γu\Gamma_uΓu​,u代表更新门,这是一个0到1之间的值,为了让你直观思考GRU的工作机制,先思考Γu\Gamma_uΓu​,这个一直在0到1之间的门值,实际上这个值是把式子代入sigmoid函数得到的,即Γu=σ(Wu[c<t−1>,x<t>]+bu)\Gamma_u=\sigma (W_u[c^{<t-1>},x^{<t>}]+b_u)Γu​=σ(Wu​[c<t−1>,x<t>]+bu​)因为sigmoid函数大多数情况下非常接近0或者1,所以在这样的直觉下,可以想到Γ\GammaΓ在大多数的情况下非常接近0或1,Γu\Gamma_uΓu​中的u表示"update",选字母Γ\GammaΓ是因为如果你看看门的边缘,在边缘上有很多字母Γ\GammaΓ的形状,这就是为什么用它表示门,还有希腊字母G,G是门的首字母,所以G表示门也表示字母Γ\GammaΓ。

GRU的关键部分就是刚才写出来的用c~\tilde{c}c~更新c的公式,然后门决定是否真的要更新它。于是我们这么看待,记忆细胞c将被设定为0或1,这取决于你考虑的单词在句子中是单数还是复数,因为这里是单数情况,所以我们先假定它被设为了1;或者如果是复数形式,我们就把它设为0,然后GRU单元就会一直记住c<t>c^{<t>}c<t>的值,直到到指定的位置c<t>c^{<t>}c<t>的值还是1,这就告诉它,这是单数,所以我们使用was。于是门,即Γu\Gamma_uΓu​的作用就是决定什么时候你会更新这个值。特别是当你看到词组the cat,即句子的主语,你知道在说一个新的概念,这就是一个好时机去更新这个比特,然后当你使用它的时候,不需要记住它了,就可以忘记它了。所以接下来要给GRU用的式子就是c<t>=Γu∗c~<t>+(1−Γu)∗c<t−1>c^{<t>}=\Gamma_u*\tilde{c}^{<t>}+(1-\Gamma_u)*c^{<t-1>}c<t>=Γu​∗c~<t>+(1−Γu​)∗c<t−1>。你应该注意到了,如果门的更新值Γu=1\Gamma_u=1Γu​=1,也就是说把这个新值,即c~<t>\tilde{c}^{<t>}c~<t>设为候选值,然后相同的将门值设为Γu=1\Gamma_u=1Γu​=1,然后往前,再更新这个值,对所有在这中间的值,应该把门的值设为0,也就是说不更新门的值,就用旧的值,因为如果Γu=0\Gamma_u=0Γu​=0,公式c<t>=Γu∗c~<t>+(1−Γu)∗c<t−1>c^{<t>}=\Gamma_u*\tilde{c}^{<t>}+(1-\Gamma_u)*c^{<t-1>}c<t>=Γu​∗c~<t>+(1−Γu​)∗c<t−1>中的1−Γu=11-\Gamma_u=11−Γu​=1,那么就会有c<t>=c<t−1>c^{<t>}=c^{<t-1>}c<t>=c<t−1>。甚至你从左往右扫描这个句子,当门值为零时,就说不更新门值,就用旧的值,也不要忘记这个值是什么。这样即使一直在处理句子,c<t>c^{<t>}c<t>应该会一直等于前一个时刻值,于是它仍然记得猫是单数的。

GRU单元输入c<t−1>c^{<t-1>}c<t−1>,对于上一个时间步,先假设它正好等于a<t−1>a^{<t-1>}a<t−1>,然后把c<t−1>c^{<t-1>}c<t−1>作为输入,把x<t>x^{<t>}x<t>也作为输入,然后把这两个用合适权重结合在一起,再用tanh计算,算出c~<t>\tilde{c}^{<t>}c~<t>,即c<t>c^{<t>}c<t>的替代值。再用一个不同的参数值,通过sigmoid激活函数算出Γu\Gamma_uΓu​,即更新门,最后所有的值,通过另一个运算符结合,即公式c<t>=Γu∗c~<t>+(1−Γu)∗c<t−1>c^{<t>}=\Gamma_u*\tilde{c}^{<t>}+(1-\Gamma_u)*c^{<t-1>}c<t>=Γu​∗c~<t>+(1−Γu​)∗c<t−1>它输入一个门值,新的候选值,1−Γu1-\Gamma_u1−Γu​有一个门值和c<t>c^{<t>}c<t>的旧值c<t−1>c^{<t-1>}c<t−1>,通过计算产生记忆细胞的新值,所以c<t>=a<t>c^{<t>}=a^{<t>}c<t>=a<t>。如果你想,也可以把输出c<t>c^{<t>}c<t>代入softmax,或者其它预测y^\hat{y}y^​的东西,这就是GRU单元,或者说是一个简化过的GRU单元。它的优点就是通过门决定,当你从左到右扫描一个句子的时候,这个时机是要更新记忆细胞还是不更新,直到你到你真的需要使用记忆细胞的时候,这很可能在句子之前就决定了,因为sigmoid的值,现在因为门很容易取到0值,根据公式Γu=σ(Wu[c<t−1>,x<t>]+bu)\Gamma_u=\sigma (W_u[c^{<t-1>},x^{<t>}]+b_u)Γu​=σ(Wu​[c<t−1>,x<t>]+bu​)可知,只要公式中的Wu[c<t−1>,x<t>]+buW_u[c^{<t-1>},x^{<t>}]+b_uWu​[c<t−1>,x<t>]+bu​取到一个很大的负数,再由于数值上的四舍五入,扫描过程中的门一般来说大多数都是0,或者说非常非常接近0,所以在这种情况下,这个更新式子c<t>=Γu∗c~<t>+(1−Γu)∗c<t−1>c^{<t>}=\Gamma_u*\tilde{c}^{<t>}+(1-\Gamma_u)*c^{<t-1>}c<t>=Γu​∗c~<t>+(1−Γu​)∗c<t−1>就会变成c<t>=c<t−1>c^{<t>}=c^{<t-1>}c<t>=c<t−1>,这非常有利于维持记忆细胞的值,因为Γu\Gamma_uΓu​很接近0,可能是0.000001或者更小,这就不会有梯度消失问题了。因为Γu\Gamma_uΓu​很接近0,这就是说c<t>=c<t−1>c^{<t>}=c^{<t-1>}c<t>=c<t−1>,而且c<t>c^{<t>}c<t>的值也很好地被维持了,即使经历了很多很多的时间步,这就是缓解梯度消失的关键。因此允许神经网络运行在非常庞大的依赖词上,比如说cat和was单词,即使被中间的很多单词分割开。

现在说一下一些实现的细节,在公式c<t>=a<t>c^{<t>}=a^{<t>}c<t>=a<t>公式中,c<t>c^{<t>}c<t>可以是一个向量,如果你有100维的隐藏的激活值,那么ctc^{t}ct也是100维的,c~<t>\tilde{c}^{<t>}c~<t>和Γu\Gamma_uΓu​也是相同的维。这样的话,在公式c<t>=Γu∗c~<t>+(1−Γu)∗c<t−1>c^{<t>}=\Gamma_u*\tilde{c}^{<t>}+(1-\Gamma_u)*c^{<t-1>}c<t>=Γu​∗c~<t>+(1−Γu​)∗c<t−1>中,*的意思就是元素对应的乘积。

在公式Γu=σ(Wu[c<t−1>,x<t>]+bu)\Gamma_u=\sigma (W_u[c^{<t-1>},x^{<t>}]+b_u)Γu​=σ(Wu​[c<t−1>,x<t>]+bu​)中,如果门是一个100维的向量,Γu\Gamma_uΓu​就是一个100比特的向量,里面的值几乎都是0或者1,就是说这100维的记忆细胞就是你要更新的比特。当然在实际应用中,Γu\Gamma_uΓu​不会真的等于0或者1,有时候它是0到1的一个中间值,但是这对于直观思考是很方便的,就把它当成确切的0,完全确切的0或者就是完全确切的1。元素对应的乘积做的就是告诉GRU单元哪个记忆细胞的向量维度在每个时间步要做更新,所以你可以选择保存一些比特不变而去更新其它的比特,比如说你需要一个比特去记忆猫是单数还是复数,其它比特用来理解你正在讨论的食物,因为你在谈论吃饭或者食物,然后你可能就会谈论猫是否是四个字母,你可以每个时间点只改变一些比特。

以上讲的是简化的GRU的思想,下面讲一下完整的GRU的思想。将上面介绍的一些公式写下来,如下:c~<t>=tanh(Wc[c<t−1>,x<t>]+bc)\tilde{c}^{<t>}=tanh(W_c[c^{<t-1>},x^{<t>}]+b_c)c~<t>=tanh(Wc​[c<t−1>,x<t>]+bc​)Γu=σ(Wu[c<t−1>,x<t>]+bu)\Gamma_u=\sigma (W_u[c^{<t-1>},x^{<t>}]+b_u)Γu​=σ(Wu​[c<t−1>,x<t>]+bu​)c<t>=Γu∗c~<t>+(1−Γu)∗c<t−1>c^{<t>}=\Gamma_u*\tilde{c}^{<t>}+(1-\Gamma_u)*c^{<t-1>}c<t>=Γu​∗c~<t>+(1−Γu​)∗c<t−1>对于完整的GRU单元,要做的一个改变就是在计算的第一个式子中,给记忆细胞的新候选值加上一个新的项,添加一个门Γr\Gamma_rΓr​,即c~<t>=tanh(Wc[Γr∗c<t−1>,x<t>]+bc)\tilde{c}^{<t>}=tanh(W_c[\Gamma_r*c^{<t-1>},x^{<t>}]+b_c)c~<t>=tanh(Wc​[Γr​∗c<t−1>,x<t>]+bc​)你可以认为r代表相关性,这个Γr\Gamma_rΓr​告诉你计算出的下一个c~<t>\tilde{c}^{<t>}c~<t>和c<t−1>c^{<t-1>}c<t−1>有多大的相关性,计算这个门Γr\Gamma_rΓr​需要参数,正如你看到的这个,一个新的参数矩阵WrW_rWr​,计算公式为Γr=σ(Wr[c<t−1>,x<t>]+bc)\Gamma_r=\sigma(W_r[c^{<t-1>},x^{<t>}]+b_c)Γr​=σ(Wr​[c<t−1>,x<t>]+bc​)正如你所见,有很多方法可以来设计这些类型的神经网络,然后我们为什么有Γr\Gamma_rΓr​?为什么不用上门介绍的简单的GRU的版本呢?这是因为多年来研究者们实验过很多不同可能的方法来设计这些单元,去尝试让神经网络有更深层的连接,去尝试产生更大范围的影响,还有解决梯度消失的问题,GRU就是其中一个研究者们最常使用的版本。

循环序列模型 —— 1.9 GRU单元(门控循环单元)相关推荐

  1. 2020-10-21 吴恩达DL学习-C5 序列模型-W1 循环序列模型(1.9 GRU门控循环单元-改善梯度消失-在序列中学习非常深的连接-简化和完整版本-记忆细胞)

    1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c 2.详细笔记网站(中文):http://www.ai-sta ...

  2. (pytorch-深度学习)门控循环单元(GRU)

    门控循环单元(GRU) 循环神经网络中的梯度计算 当时间步数较大或者时间步较小时,循环神经网络的梯度较容易出现衰减或爆炸. 虽然裁剪梯度可以应对梯度爆炸,但无法解决梯度衰减的问题. 通常由于这个原因, ...

  3. 第五门课 序列模型(Sequence Models) 第一周 循环序列模型(Recurrent Neural Networks)

    第五门课 序列模型(Sequence Models) 第一周 循环序列模型(Recurrent Neural Networks) 文章目录 第五门课 序列模型(Sequence Models) 第一周 ...

  4. 深度学习笔记 第五门课 序列模型 第一周 循环序列模型

    本文是吴恩达老师的深度学习课程[1]笔记部分. 作者:黄海广[2] 主要编写人员:黄海广.林兴木(第四所有底稿,第五课第一二周,第三周前三节).祝彦森:(第三课所有底稿).贺志尧(第五课第三周底稿). ...

  5. 门控循环单元网络(GRU)在自然语言处理中的应用

    作者:禅与计算机程序设计艺术 1.简介 自然语言处理(NLP)是人类认知的一项重要技能,它涉及到对文本数据进行处理.提取信息并对其做出回应.传统上,文本分析方法使用基于统计模式的算法,如TF-IDF. ...

  6. 门控循环单元网络GRU详解

    为了改善循环神经网络的长程依赖问题,在 梯度消失是循环网络的主要问题除了使用一些优化技巧外更有效的方式就是改变模型比如让U = I同时令 ∂ht/∂ht= I 为单位矩阵即ht = ht−1 + g( ...

  7. 从LSTM到GRU基于门控的循环神经网络总结

    1.概述 为了改善基本RNN的长期依赖问题,一种方法是引入门控机制来控制信息的累积速度,包括有选择性地加入新的信息,并有选择性遗忘之前累积的信息.下面主要介绍两种基于门控的循环神经网络:长短时记忆网络 ...

  8. 深度学习系列 -- 序列模型之循环序列模型(Recurrent Neural Networks)

    目录 1 为什么选择序列模型?(Why Sequence Models?) 2 数学符号(Notation) 3 循环神经网络(Recurrent Neural Network Model) 4 语言 ...

  9. 吴恩达deeplearning.ai系列课程笔记+编程作业(13)序列模型(Sequence Models)-第一周 循环序列模型(Recurrent Neural Networks)

    第五门课 序列模型(Sequence Models) 第一周 循环序列模型(Recurrent Neural Networks) 文章目录 第五门课 序列模型(Sequence Models) 第一周 ...

最新文章

  1. html5div上下滚动,html5 – 在另一个div上滚动div
  2. 让AngularJS的$http 服务像jQuery.ajax()一样工作
  3. PSO DE EA算法的不同及相同之处。
  4. 高级C语言教程-编译链接调试
  5. 审查元素上传php,KindEditor上传解析漏洞/列目录/内容漏洞_PHP教程
  6. 《MySQL——加锁规则(待补全,有些没看懂)》
  7. 研究机构:特斯拉Model 3是2月份最畅销电动汽车
  8. php 递归太多报错,php – javascript太多的递归?
  9. linux配置内存buffer,调整Linux的网络栈(Buffer Size)来提升网络性能
  10. IBM AIX5.3 linux下C/C++实现HTTPS接口
  11. CSS从大图片上截取小图标的使用
  12. 使用Bartend提取K3领料数据以实现发料包装标识批量自动打印
  13. 小白白红队初成长(7)win权限提升
  14. Learn OpenCV之Heatmap
  15. Java的class是什么意思?
  16. 女性社交电商系统:聚焦女用户 收割电商半壁江山
  17. Java线程中yield与join方法的区别
  18. Linux 命令(159)—— hostname 命令
  19. 教育培训机构经营技巧
  20. CPU平均负载过高检查(iowait负载高)

热门文章

  1. windowXP 任务计划无法启动 错误代码:0X80041315
  2. Serverless 实战 —— 快速搭建 SpringBoot 应用
  3. Nginx的HTTP运行时健康检查
  4. CQRS之旅——旅程6(我们系统的版本管理)
  5. 【苹果cms10 Maccmsv10 站群深度定制版 开发日志】 数据渲染模块
  6. 【JAVA 第五章 】课后习题 删除奇数元素下标 然后再删除值为奇数的下标
  7. 解决 Windows 端口被占用问题
  8. JavaScript性能优化【上】-- 内存管理、垃圾回收
  9. Nexus9刷机全纪录
  10. C#LeetCode刷题之#485-最大连续1的个数(Max Consecutive Ones)