1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai

1.9 GRU 单元 Gated Recurrent Unit (GRU)

你已经了解了基础的RNN模型的运行机制,在本节课中你将会学习门控循环单元,它改变了RNN的隐藏层,使其可以更好地捕捉深层连接,并改善了梯度消失问题,让我们看一看。

你已经见过了这个公式
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的时间ttt处,计算激活值aaa。

我把这个RNN的单元画个图,如上图,画一个方框,输入a<t−1>a^{<t-1>}a<t−1>,即上一个时间步的激活值。再输入x<t>x^{<t>}x<t>,再把这两个并起来,然后乘上权重项,在这个线性计算之后(g(Wa[a<t−1>,x<t>]+ba)g(W_a[a^{<t-1>},x^{<t>}]+b_a)g(Wa​[a<t−1>,x<t>]+ba​)),如果ggg是一个tanh激活函数,经过tanh计算之后,它会计算出激活值a<t>a^{<t>}a<t>。然后激活值a<t>a^{<t>}a<t>将会传softmax单元,或者其他用于产生输出y<t>y^{<t>}y<t>的东西。

就这张图而言,这就是RNN隐藏层单元的可视化呈现。我向大家展示这张图,因为我们将使用相似的图来讲解门控循环单元Gated Recurrent Unit (GRU)。

许多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单元将会有个新的变量称为ccc,代表细胞(cell),即记忆细胞。记忆细胞的作用是提供了记忆的能力,比如说一只猫是单数还是复数,所以当它看到之后的句子的时候,它仍能够判断句子的主语是单数还是复数。

于是在时间ttt处,有记忆细胞c<t>c^{<t>}c<t>,然后我们看的是,GRU实际上输出了激活值a<t>a^{<t>}a<t>,c<t>=a<t>c^{<t>}=a^{<t>}c<t>=a<t>。于是我们想要使用不同的符号ccc和aaa来表示记忆细胞的值和输出的激活值,即使它们是一样的。

我现在使用这个标记是因为当我们等会说到LSTMs的时候,这两个会是不同的值,但是现在对于GRU,c<t>c^{<t>}c<t>的值等于a<t>a^{<t>}a<t>的激活值。

GRU单元的计算,在每个时间步,我们将用一个候选值重写记忆细胞,即c~<t>\tilde 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_cc~<t>=tanh(Wc​[c<t−1>,x<t>])+bc​

其中c~<t>\tilde c^{<t>}c~<t>就是个候选值,替代了c<t>c^{<t>}c<t>的值。

重点

重点来了,在GRU中真正重要的思想是我们有一个门,我先把这个门叫做Γu\Gamma _uΓu​,uuu代表更新门,这是一个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之间,对于大多数可能的输入,sigmoid函数的输出总是非常接近0或者非常接近1。在这样的直觉下,可以想到在Γ\GammaΓ大多数的情况下非常接近0或1。然后这个字母u表示“update”,我选了字母Γ\GammaΓ是因为它看起来像门。还有希腊字母G,G是门的首字母,所以G表示门。

GRU的关键部分就是下面这个用c~\tilde cc~更新ccc的等式,然后门决定是否要真的更新它。

于是我们这么看待它,记忆细胞c<t>c^{<t>}c<t>将被设定为0或者1,这取决于你考虑的单词在句子中是单数还是复数,因为下图这里是单数情况(cat),所以我们先假定它被设为了1,或者如果是复数的情况我们就把它设为0。

GRU单元将会一直记住c<t>c^{<t>}c<t>的值,直到上图右边的位置,c<t>c^{<t>}c<t>的值还是1,这就告诉它,噢,这是单数,所以我们用was。

门,即Γu\Gamma_uΓu​的作用就是决定什么时候你会更新c<t>c^{<t>}c<t>这个值,特别是当你看到词组the cat,即句子的主语–猫,这就是一个好时机去更新c<t>c^{<t>}c<t>这个值。当你使用完它的时候(到了句子尾部),“The cat, which already ate……, was full.”,然后你就知道,我不需要记住它了,我可以忘记它了。

我们接下来要给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>c^{<t>}c<t>设为候选值c~<t>\tilde c^{<t>}c~<t>。

将门值设为1,然后往后再更新c<t>c^{<t>}c<t>值。对于所有在这中间的值,你应该把门的值设为0,意思就是说不更新c<t>c^{<t>}c<t>,就用旧的值。

因为如果Γu=0\Gamma_u=0Γu​=0,则
c<t>=Γu∗c~<t>+(1−Γu)∗c<t−1>=c<t−1>c^{<t>}=\Gamma_u * \tilde c^{<t>}+(1-\Gamma_u) * c^{<t-1>}=c^{<t-1>}c<t>=Γu​∗c~<t>+(1−Γu​)∗c<t−1>=c<t−1>
也就是c<t>c^{<t>}c<t>等于旧的值c<t−1>c^{<t-1>}c<t−1>。

你从左到右扫描本例的句子,当门值为0的时候,就是说不更新c<t>c^{<t>}c<t>的时候,就用旧的值,这样也不会忘记这个值是什么。这样即使你一直处理句子的最后,c<t>c^{<t>}c<t>应该会一直等于c<t−1>c^{<t-1>}c<t−1>,于是它仍然记得猫是单数的。

让我再画个图来解释一下GRU单元。
顺便说一下,当你在看网络上的博客或者教科书或者教程之类的,这些图对于解释GRU和我们稍后会讲的LSTM是相当流行的,我个人感觉公式在图片中比较容易理解,所以即使看不懂图片也没关系,我就画画,万一能帮得上忙就最好了。

如上图,GRU单元输入c<t−1>c^{<t-1>}c<t−1>,对于上一个时间步,先假设它正好等于a<t−1>a^{<t-1>}a<t−1>,把这个作为输入。然后x<t>x^{<t>}x<t>也作为输入,然后把这两个用合适权重结合在一起,再用tanh计算,算出c~<t>\tilde c^{<t>}c~<t>,c~<t>=tanh(Wc[c<t−1>,x<t>])+bc\tilde c^{<t>}=tanh(W_c[c^{<t-1>},x^{<t>}])+b_cc~<t>=tanh(Wc​[c<t−1>,x<t>])+bc​,即c<t>c^{<t>}c<t>的替代值。

再用一个不同的参数集,通过sigmoid激活函数算出Γu\Gamma_uΓu​,Γ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>),上图中我用紫色阴影标注的这个方框,代表了这个式子。

所以紫色运算符所表示的是,它输入一个门值Γu\Gamma_uΓu​,新的候选值c~<t>\tilde c^{<t>}c~<t>,这再有一个门值Γu\Gamma_uΓu​和c<t>c^{<t>}c<t>的旧值c<t−1>c^{<t-1>}c<t−1>,所以它把Γu\Gamma_uΓu​、c~<t>\tilde c^{<t>}c~<t>和c<t−1>c^{<t-1>}c<t−1>作为输入一起产生记忆细胞的新值c<t>c^{<t>}c<t>,所以c<t>c^{<t>}c<t>等于a<t>a^{<t>}a<t>。如果你想,你也可以也把这个代入softmax或者其他预测y<t>y^{<t>}y<t>的东西。

这就是GRU单元或者说是一个简化过的GRU单元。

优点

它的优点就是通过门决定,当你从左到右扫描一个句子的时候,这个时机是要更新某个记忆细胞,还是不更新,不更新,直到你到你真的需要使用记忆细胞的时候,这可能在句子之前就决定了。

因为sigmoid的值,门很容易取到0值,只要Wu[c<t−1>,x<t>]W_u[c^{<t-1>},x^{<t>}]Wu​[c<t−1>,x<t>]这个值是一个很大的负数,再由于数值上的四舍五入,上面例句中间部分这些门大体上就是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>}c<t>几乎就等于c<t−1>c^{<t-1>}c<t−1>,而且c<t>c^{<t>}c<t>的值也很好地被维持了,即使经过很多很多的时间步。

这就是缓解梯度消失问题的关键,因此允许NN运行在非常庞大的依赖词上,比如说cat和was单词即使被中间的很多单词分割开。

现在我想说下一些实现的细节。

在上面的式子中c<t>c^{<t>}c<t>可以是一个向量,如果你有100维的隐藏的激活值,那么

  • c<t>c^{<t>}c<t>也是100维的,c~<t>\tilde c^{<t>}c~<t>也是相同的维度(c~<t>=tanh(Wc[c<t−1>,x<t>])+bc\tilde c^{<t>}=tanh(W_c[c^{<t-1>},x^{<t>}])+b_cc~<t>=tanh(Wc​[c<t−1>,x<t>])+bc​),
  • Γu\Gamma_uΓu​也是相同的维度(Γ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>中的符号“*”实际上就是元素对应的乘积。

即如果门是一个100维的向量,Γu\Gamma_uΓu​也就100维的向量,里面的值几乎都是0或者1,就是说这100维的记忆细胞(c<t>c^{<t>}c<t>)就是你要更新的比特。

当然在实际应用中Γu\Gamma_uΓu​不会真的等于0或者1,有时候它是0到1的一个中间值,但是这对于直观思考是很方便的,就把它当成确切的0,完全确切的0或者就是确切的1。

元素对应的乘积做的就是告诉GRU单元哪个记忆细胞的向量维度在每个时间步要做更新,所以你可以选择保存一些比特不变,而去更新其他的比特。比如说你可能需要一个比特来记忆猫是单数还是复数,其他比特来理解你正在谈论食物,因为你在谈论吃饭或者食物,然后你稍后可能就会谈论“The cat was full.”,你可以每个时间点只改变一些比特。

你现在已经理解GRU最重要的思想了,上面介绍中展示的实际上只是简化过的GRU单元,现在来描述一下完整的GRU单元。

完整的GRU单元

对于完整的GRU单元我要做的一个改变就是,在上图中我们计算的第一个式子中给记忆细胞的新候选值加上一个新的项,一个门Γr\Gamma_rΓr​,你可以认为rrr代表相关性(relevance)。这个门告诉你计算出的下一个的候选值跟有多大的相关性。

计算这个门Γr\Gamma_rΓr​需要参数,正如你看到的这个,一个新的参数矩阵WrW_rWr​
Γr=σ(Wr[c<t−1>,x<t>])+br\Gamma_r=\sigma (W_r[c^{<t-1>},x^{<t>}])+b_rΓr​=σ(Wr​[c<t−1>,x<t>])+br​
正如你所见,有很多方法可以来设计这些类型的NN,然后我们为什么有Γr\Gamma_rΓr​?为什么不用上面的简单的版本?

这是因为多年来研究者们试验过很多很多不同可能的方法来设计这些单元,去尝试让NN有更深层的连接,去尝试产生更大范围的影响,还有解决梯度消失的问题,GRU就是其中一个研究者们最常使用的版本,也被发现在很多不同的问题上也是非常健壮和实用的。

你可以尝试发明新版本的单元,只要你愿意。但是GRU是一个标准版本,也就是最常使用的。你可以想象到研究者们也尝试了很多其他版本,类似这样的但不完全是,比如我这里写的这个。然后另一个常用的版本被称为LSTM,表示长短时记忆网络,这个我们会在下节课中讲到,但是GRU和LSTM是在NN结构中最常用的两个具体实例。

还有在符号上的一点,我尝试去定义固定的符号让这些概念容易理解,如果你看学术文章的话,你有的时候会看到有些人使用另一种符号x~\tilde xx~,uuu,rrr和hhh表示这些量。但我试着在GRU和LSTM之间用一种更固定的符号,比如使用更固定的符号Γ\GammaΓ来表示门,所以希望这能让这些概念更好理解。

所以这就是GRU,即门控循环单元,这是RNN的其中之一。这个结构可以更好捕捉非常长范围的依赖,让RNN更加有效。然后我简单提一下其他常用的神经网络,比较经典的是这个叫做LSTM,即长短时记忆网络,我们在下节课中讲解。

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

  1. 吴恩达老师经验:80%的数据+20%的模型=更好的机器学习

    点上方计算机视觉联盟获取更多干货 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:新智元 AI博士笔记系列推荐 周志华<机器学习>手推笔记正式开源!可打印版本附pdf下载链接 机器 ...

  2. 2020-8-25 吴恩达DL学习-C4 卷积神经网络-第二周 CNN实例探究(2.7Inception 网络)

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

  3. 2020-11-11 吴恩达DL学习-C5 序列模型-W2 自然语言处理与词嵌入(2.9 情绪分类-使用RNN模型,考虑词序)

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

  4. 2020-11-19 吴恩达DL学习-C5 序列模型-W3 序列模型和注意力机制(3.4 改进定向搜索-长度归一化,称为归一化的对数似然目标函数。取每个单词的概率对数值的平均。非精确搜索,速度快)

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

  5. 吴恩达机器学习【第五天】逻辑回归模型

    想不到又过了几天 前几天在忙一个项目,需要用前端实现一个页面,遇到跨域的问题,一直弄不出来 逻辑回归 分类 假设陈述(Hypothesis Representation) 决策边界 代价函数 简化代价 ...

  6. 吴恩达机器学习【第四天】多元线性规划模型

    文章目录 多元线性模型 找到满足假设的参数 梯度下降法 单纯的公式推导 特征放缩 学习率的判断和选择 正规方程 两种方法的比较 多元线性模型 这一节的内容可以看作是之前一元线性模型的提高, 其中要明白 ...

  7. 【吴恩达deeplearning.ai】深度学习(7):卷积神经网络

    计算机视觉(Computer Vision)是一门研究如何教机器"看"的科学,计算机视觉研究相关的理论和技术,试图创建能够从图像或者多维数据中获取"信息"的人工 ...

  8. 吴恩达机器学习--学习笔记

    1. Introduction 1.1 Welcome 如今机器学习被大规模应用于: 数据挖掘(网站点击,医学记录,生物学,工程) 一些无法通过编程实现的功能(自动驾驶,手写识别,NLP,CV) se ...

  9. 吴恩达深度学习之二《改善深层神经网络:超参数调试、正则化以及优化》学习笔记

    一.深度学习的实用层面 1.1 训练/开发/测试集 机器学习时代,数据集很小,可能100.1000.10000条,这种级别.可以按 70%.30% 划分训练集和测试集,训练后直接用测试集评估.或者按 ...

最新文章

  1. ORCLE 表中列的修改(非常全面哦)
  2. Firebug入门指南
  3. gan神经网络_神经联觉:当艺术遇见GAN
  4. 1644E. Expand the Path
  5. js 判断字符是否以汉字开头
  6. 在IIS上部署.net core的webapi项目 以及502.5错误的两种解决方法
  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(28)-系统小结
  8. 便于理解假设检验的好例子
  9. STM32固件库的下载
  10. 论文笔记:针对盲化的 RSA算法的水平聚类侧信道攻击
  11. synchronized与ReentrantLock的介绍、使用、适合场景及比较
  12. Unity开发 MMORPG类游戏引导系统
  13. iOS小技能:短信验证码的Checklist、格式校验、获取验证码处理流程(限制60s)
  14. 【Al TIME】博硕论坛064期 | 清华计算机系大佬齐论Al
  15. 苹果cms怎么一键删除所有视频
  16. CSS入门二、美化页面元素
  17. 威马D轮敲定,「造车新势力」四小龙已定
  18. echart报错echarts/lib/visual/dataColor in ./node_modules/echarts-liquidfill/src/liquidFill.js
  19. Henri Bergson and the Perception of Time
  20. EBC动作片 记录EBC 的 景 和 人

热门文章

  1. sqlplus常用命令,不解释
  2. AM335x LCD驱动解析
  3. 如何挑选笔记本电脑?
  4. 如何进行“花式”HTTP接口测试
  5. 2021-2027中国无霜翅片蒸发器市场现状及未来发展趋势
  6. “大服务器”拥有大智慧
  7. 诚之和:使用Java+Swing实现医院管理系统的实战练习 附完整实例代码
  8. 网页游戏《魔兽王座》在极限挑战中挑战BOSS
  9. python学习笔记霍兰德人格分析与错误解决
  10. 基于51单片机的双机串口通信排队叫号系统(LCD显示)设计