来源:投稿 作者:175
编辑:学姐
本系列非常适合刚入门深度学习的AI小白,已经学有所得的同学也可以温故知新!
要深入理解深度学习,从零开始创建的经验非常重要,从自己可以理解的角度出发,尽量不使用外部完备的框架前提下,实现我们想要的模型。本系列文章的宗旨就是通过这样的过程,让大家切实掌握深度学习底层实现,而不是仅做一个调包侠。
本文介绍RNN,一种用于处理序列数据的神经网络。
循环神经网络(Recurrent Neural Network,RNN)是包含循环连接的网络,即有些单元是直接或间接地依赖于它之前的。
本文我们学习一种叫做Elman网络的循环网络,或称为简单循环网络(本文中的RNN都代表该网络)。隐藏层包含一个循环连接作为其输入。即,基于当前输入和前一时刻隐藏状态计算当前隐藏状态。
前一时刻的隐藏层提供了一种记忆(或上下文)的功能,可以提供之前的信息为未来做决定提供帮助。重要的是,这种方法理论上不需要对前文的长度进行限制,不过实际上过远的信息很难有效的保留。
RNN中的前向传播(推理)过程和前馈网络差不多。但在使用RNN处理一个序列输入时,需要将RNN按输入时刻展开,然后将序列中的每个输入依次对应到网络不同时刻的输入上,并将当前时刻网络隐藏层的输出也作为下一时刻的输入。
循环网络处理序列输入的示意图,图片来自https://medium.com/deeplearningbrasilia/deep-learning-recurrent-neural-networks-f9482a24d010
RNN的沿着时间反向传播,图片来自https://mmuratarat.github.io/2019-02-07/bptt-of-rnn
这种改进,除了提升了模型困惑度之外,还显著减少了模型所需的参数量。
我们已经学习了RNN的基础知识,在实际应用上通常不是仅使用我们学到的这种RNN。而是会使用堆叠RNN和双向RNN。下面分别来了解它们。
我们到此为止所学的例子中,RNN的输入都是由单词嵌入向量组成,而输出是预测单词有用的向量。但是,我们也可以使用一个RNN的整个输出作为另一个RNN的输入,通过这种方向将多个RNN网络堆叠起来。
如上图所示,我们堆叠了三个RNN。
堆叠的RNN通常优于单层RNN。可能的一个原因是,网络在不同层抽象了不同的表示。堆叠RNN的初始层产生的表示可以作为深层有用的抽象——这很难在单词RNN中产生。但是,随着堆叠层数的增加,训练成本也迅速上升。
另一种应用较多的是双向RNN,我们上面学到的是从左到右依次处理序列中的每个元素。但在很多情况下,如果能访问整个序列再做决定,得到的效果会更好。此时就需要双向RNN。
一种实现方式时通过两个独立的RNN网络,一个按照之前的顺序从左往右读;另一个按照逆序从右往左读。在每个时刻t tt,拼接它们生成的表示。
Speech and Language Processing
最近发现想要入门AI的同学多了起来!那本系列一定要认真看啦!
下期会继续更新!记得收藏哦~
也可以关注【学姐带你玩AI】公众号
学习更多AI干货,还有学姐整理的论文n篇免费领取!
回复“500”300+论文PDF&讲解视频速领!