欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    2022年2022年零基础入门深度学习-循环神经网络 .pdf

    • 资源ID:34261104       资源大小:1.74MB        全文页数:13页
    • 资源格式: PDF        下载积分:4.3金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要4.3金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    2022年2022年零基础入门深度学习-循环神经网络 .pdf

    关闭零基础入门深度学习 (5) - 循环神经网络机器学习深度学习入门无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning )这个超热的技术,会不会感觉马上就out了?现在救命稻草来了,零基础入门深度学习系列文章旨在讲帮助爱编程的你从零基础达到入门级水平。零基础意味着你不需要太多的数学知识,只要会写程序就行了,没错,这是专门为程序员写的文章。虽然文中会有很多公式你也许看不懂,但同时也会有更多的代码,程序员的你一定能看懂的(我周围是一群狂热的Clean Code程序员,所以我写的代码也不会很差)。文章列表零基础入门深度学习 (1) - 感知器零基础入门深度学习 (2) - 线性单元和梯度下降零基础入门深度学习 (3) - 神经网络和反向传播算法零基础入门深度学习 (4) - 卷积神经网络零基础入门深度学习 (5) - 循环神经网络零基础入门深度学习 (6) - 长短时记忆网络 (LSTM)零基础入门深度学习 (7) - 递归神经网络往期回顾在前面的文章系列文章中,我们介绍了全连接神经网络和卷积神经网络,以及它们的训练和使用。他们都只能单独的取处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。比如,当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列 ;当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列 。这时,就需要用到深度学习领域中另一类非常重要神经网络:循环神经网络 (Recurrent Neural Network)。RNN 种类很多,也比较绕脑子。不过读者不用担心,本文将一如既往的对复杂的东西剥茧抽丝,帮助您理解 RNNs 以及它的训练算法,并动手实现一个循环神经网络 。语言模型RNN 是在自然语言处理领域中最先被用起来的,比如,RNN 可以为 语言模型 来建模。那么,什么是语言模型呢?我们可以和电脑玩一个游戏,我们写出一个句子前面的一些词,然后,让电脑帮我们写下接下来的一个词。比如下面这句:我昨天上学迟到了,老师批评了_。我们给电脑展示了这句话前面这些词,然后,让电脑写下接下来的一个词。在这个例子中,接下来的这个词最有可能是我,而不太可能是小明,甚至是吃饭。语言模型 就是这样的东西:给定一个一句话前面的部分,预测接下来最有可能的一个词是什么。语言模型 是对一种语言的特征进行建模,它有很多很多用处。比如在语音转文本(STT)的应用中,声学模型输出的结果,往往是若干个可能的候选词,这时候就需要语言模型 来从这些候选词中选择一个最可能的。当然,它同样也可以用在图像到文本的识别中(OCR) 。使用RNN 之前,语言模型主要是采用N-Gram 。N 可以是一个自然数,比如 2或者3。它的含义是,假设一个词出现的概率只与前面N 个词相关。我名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 13 页 - - - - - - - - - 们以2-Gram 为例。首先,对前面的一句话进行切词:我 昨天 上学 迟到 了 ,老师 批评 了 _。如果用2-Gram 进行建模,那么电脑在预测的时候,只会看到前面的了,然后,电脑会在语料库中,搜索了后面最可能的一个词。不管最后电脑选的是不是我,我们都知道这个模型是不靠谱的,因为了前面说了那么一大堆实际上是没有用到的。如果是3-Gram 模型呢,会搜索批评了后面最可能的词,感觉上比2-Gram 靠谱了不少,但还是远远不够的。因为这句话最关键的信息我,远在9个词之前!现在读者可能会想,可以提升继续提升N 的值呀,比如 4-Gram 、5-Gram.。实际上,这个想法是没有实用性的。因为我们想处理任意长度的句子, N 设为多少都不合适;另外,模型的大小和N 的关系是指数级的, 4-Gram 模型就会占用海量的存储空间。所以,该轮到 RNN 出场了, RNN 理论上可以往前看 (往后看)任意多个词。循环神经网络是啥循环神经网络种类繁多,我们先从最简单的基本循环神经网络开始吧。基本循环神经网络下图是一个简单的循环神经网络如,它由输入层、一个隐藏层和一个输出层组成:纳尼?!相信第一次看到这个玩意的读者内心和我一样是崩溃的。因为循环神经网络实在是太难画出来了,网上所有大神们都不得不用了这种抽象艺术手法。不过,静下心来仔细看看的话,其实也是很好理解的。如果把上面有W 的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络 。x是一个向量,它表示 输入层 的值(这里面没有画出来表示神经元节点的圆圈);s是一个向量,它表示 隐藏层 的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同); U 是输入层到隐藏层的权重矩阵 (读者可以回到第三篇文章 零基础入门深度学习 (3) - 神经网络和反向传播算法,看看我们是怎样用矩阵来表示全连接神经网络的计算的); o也是一个向量,它表示 输出层 的值;V是隐藏层到输出层的权重矩阵 。那么,现在我们来看看 W 是什么。 循环神经网络的隐藏层 的值s不仅仅取决于当前这次的输入 x,还取决于上一次 隐藏层 的值s。权重矩阵 W 就是 隐藏层 上一次的值作为这一次的输入的权重。如果我们把上面的图展开,循环神经网络也可以画成下面这个样子:现在看上去就比较清楚了,这个网络在t 时刻接收到输入之后,隐藏层的值是,输出值是。关键一点是,的值不仅仅取决于,还取决于。我们可以用下面的公式来表示循环神经网络 的计算方法:式1 是输出层 的计算公式,输出层是一个全连接层 ,也就是它的每个节点都和隐藏层的每个节点相连。V是输出层的 权重矩阵 ,g是激活函数。式2是隐藏层的计算公式,它是循环层 。U 是输入x的权重矩阵, W 是上一次的值作为这一次的输入的 权重矩阵 ,f 是激活函数 。从上面的公式我们可以看出,循环层 和全连接层 的区别就是 循环层 多了一个 权重矩阵 W 。如果反复把 式2带入到 式1,我们将得到:式式名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 13 页 - - - - - - - - - 从上面可以看出, 循环神经网络的输出值,是受前面历次输入值、. 影响的,这就是为什么循环神经网络可以往前看任意多个 输入值 的原因。双向循环神经网络对于语言模型 来说,很多时候光看前面的词是不够的,比如下面这句话:我的手机坏了,我打算 _一部新手机。可以想象,如果我们只看横线前面的词,手机坏了,那么我是打算修一修?换一部新的?还是大哭一场?这些都是无法确定的。但如果我们也看到了横线后面的词是一部新手机,那么,横线上的词填买的概率就大得多了。在上一小节中的 基本循环神经网络是无法对此进行建模的,因此,我们需要双向循环神经网络,如下图所示:当遇到这种从未来穿越回来的场景时,难免处于懵逼的状态。不过我们还是可以用屡试不爽的老办法:先分析一个特殊场景,然后再总结一般规律。我们先考虑上图中,的计算。从上图可以看出, 双向卷积神经网络的隐藏层要保存两个值,一个A参与正向计算,另一个值 A参与反向计算。最终的输出值取决于和。其计算方法为:和则分别计算:现在,我们已经可以看出一般的规律:正向计算时,隐藏层的值与有关;反向计算时,隐藏层的值与有关;最终的输出取决于正向和反向计算的 加和 。现在,我们仿照 式1和式2,写出双向循环神经网络的计算方法:从上面三个公式我们可以看到,正向计算和反向计算不共享权重 ,也就是说 U 和U、W 和W、V和V都是不同的权重矩阵 。深度循环神经网络前面我们介绍的 循环神经网络只有一个隐藏层,我们当然也可以堆叠两个以上的隐藏层,这样就得到了深度循环神经网络。如下图所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 13 页 - - - - - - - - - 我们把第 i 个隐藏层的值表示为、,则深度循环神经网络的计算方式可以表示为:循环神经网络的训练循环神经网络的训练算法:BPTTBPTT 算法是针对 循环层 的训练算法,它的基本原理和BP 算法是一样的,也包含同样的三个步骤:1. 前向计算每个神经元的输出值;2. 反向计算每个神经元的 误差项值,它是误差函数 E对神经元 j 的 加权输入的偏导数;3. 计算每个权重的梯度。最后再用 随机梯度下降算法更新权重。循环层如下图所示:前向计算使用前面的 式2对循环层进行前向计算:注意,上面的、都是向量,用 黑体字母 表示;而 U 、V是 矩阵 ,用大写字母表示。 向量的下标 表示时刻 ,例如,表示在t 时刻向量s的值。我们假设输入向量 x的维度是 m ,输出向量 s的维度是 n,则矩阵 U 的维度是,矩阵W 的维度是。下面是上式展开成矩阵的样子,看起来更直观一些:在这里我们用 手写体字母 表示向量的一个 元素 ,它的下标表示它是这个向量的第几个元素,它的上标表示第几个时刻 。例如,表示向量s的第j 个元素在 t 时刻的值。表示输入层 第i 个神经元到 循环层 第j 个神经元的权重。表示循环层 第t-1 时刻的第 i 个神经元到 循环层 第t个时刻的第 j 个神经元的权重。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 13 页 - - - - - - - - - 误差项的计算BTPP 算法将第 l 层t 时刻的 误差项值沿两个方向传播,一个方向是其传递到上一层网络,得到,这部分只和权重矩阵 U 有关;另一个是方向是将其沿时间线传递到初始时刻,得到,这部分只和权重矩阵 W 有关。我们用向量表示神经元在 t 时刻的 加权输入 ,因为:因此:我们用a表示列向量,用表示行向量。上式的第一项是向量函数对向量求导,其结果为Jacobian 矩阵:同理,上式第二项也是一个Jacobian 矩阵:其中,diaga 表示根据向量 a创建一个对角矩阵,即最后,将两项合在一起,可得:上式描述了将沿时间往前传递一个时刻的规律,有了这个规律,我们就可以求得任意时刻k的 误差项:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 13 页 - - - - - - - - - 式3 就是将误差项沿时间反向传播的算法。循环层 将误差项 反向传递到上一层网络,与普通的全连接层 是完全一样的,这在前面的文章零基础入门深度学习 (3) - 神经网络和反向传播算法 中已经详细讲过了,在此仅简要描述一下。循环层 的加权输入与上一层的 加权输入关系如下:上式中是第l 层神经元的 加权输入 (假设第l 层是 循环层 );是第l-1 层神经元的 加权输入 ;是第l-1 层神经元的输出;是第l-1 层的激活函数 。所以,式4 就是将误差项传递到上一层算法。权重梯度的计算现在,我们终于来到了 BPTT 算法的最后一步:计算每个权重的梯度。首先,我们计算误差函数 E对权重矩阵 W 的梯度。上图展示了我们到目前为止,在前两步中已经计算得到的量,包括每个时刻t 循环层 的输出值,以及误差项。回忆一下我们在文章 零基础入门深度学习 (3) - 神经网络和反向传播算法介绍的全连接网络的权重梯度计算算法:只要知道了任意一个时刻的误差项,以及上一个时刻循环层的输出值,就可以按照下面的公式求出权重矩阵在t 时刻的梯度:在式5中,表示t 时刻 误差项 向量的第 i 个分量;表示t-1 时刻循环层 第i 个神经元的输出值。我们下面可以简单推导一下式5。我们知道:式式式名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 13 页 - - - - - - - - - 因为对W 求导与无关,我们不再考虑。现在,我们考虑对权重项求导。通过观察上式我们可以看到只与有关,所以:按照上面的规律就可以生成式5里面的矩阵。我们已经求得了权重矩阵 W 在t 时刻的梯度,最终的梯度是各个时刻的梯度 之和 :式6就是计算 循环层 权重矩阵 W 的梯度的公式。- - - - - - - - - - 数学公式超高能预警- - - - - - - - -前面已经介绍了的计算方法,看上去还是比较直观的。然而,读者也许会困惑,为什么最终的梯度是各个时刻的梯度之和 呢?我们前面只是直接用了这个结论,实际上这里面是有道理的,只是这个数学推导比较绕脑子。感兴趣的同学可以仔细阅读接下来这一段,它用到了矩阵对矩阵求导、张量与向量相乘运算的一些法则。我们还是从这个式子开始:因为与W 完全无关,我们把它看做常量。现在,考虑第一个式子加号右边的部分,因为W 和都是W 的函数,因此我们要用到大学里面都学过的导数乘法运算:因此,上面第一个式子写成:我们最终需要计算的是:我们先计算 式7加号左边的部分。是矩阵对矩阵求导,其结果是一个四维 张量(tensor),如下所示:式式名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 13 页 - - - - - - - - - 接下来,我们知道,它是一个 列向量 。我们让上面的四维张量与这个向量相乘,得到了一个三维张量,再左乘行向量,最终得到一个矩阵:接下来,我们计算 式7加号右边的部分:于是,我们得到了如下递推公式:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 13 页 - - - - - - - - - 这样,我们就证明了:最终的梯度是各个时刻的梯度之和。- - - - - - - - - - 数学公式超高能预警解除- - - - - - - - -同权重矩阵 W 类似,我们可以得到权重矩阵U 的计算方法。式8是误差函数在 t 时刻对权重矩阵 U 的梯度。和权重矩阵 W 一样,最终的梯度也是各个时刻的梯度之和:具体的证明这里就不再赘述了,感兴趣的读者可以练习推导一下。RNN 的梯度爆炸和消失问题不幸的是,实践中前面介绍的几种RNNs 并不能很好的处理较长的序列。一个主要的原因是,RNN 在训练中很容易发生梯度爆炸 和梯度消失 ,这导致训练时梯度不能在较长序列中一直传递下去,从而使RNN 无法捕捉到长距离的影响。为什么RNN 会产生梯度爆炸和消失问题呢?我们接下来将详细分析一下原因。我们根据式3可得:上式的定义为矩阵的模的上界。因为上式是一个指数函数,如果t-k 很大的话(也就是向前看很远的时候),会导致对应的误差项 的值增长或缩小的非常快,这样就会导致相应的梯度爆炸 和梯度消失 问题(取决于大于1还是小于 1)。通常来说, 梯度爆炸 更容易处理一些。因为梯度爆炸的时候,我们的程序会收到NaN 错误。我们也可以设置一个梯度阈值,当梯度超过这个阈值的时候可以直接截取。梯度消失 更难检测,而且也更难处理一些。总的来说,我们有三种方法应对梯度消失问题:1. 合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。2. 使用relu 代替sigmoid 和tanh作为激活函数。原理请参考上一篇文章零基础入门深度学习 (4) - 卷积神经网络 的激活函数 一节。3. 使用其他结构的 RNNs ,比如长短时记忆网络( LTSM )和Gated Recurrent Unit(GRU ),这是最流行的做法。我们将在以后的文章中介绍这两种网络。RNN 的应用举例基于 RNN 的语言模型现在,我们介绍一下基于 RNN 语言模型。我们首先把词依次输入到循环神经网络中,每输入一个词,循环神经网络就输出截止到目前为止,下一个最可能的词。例如,当我们依次输入:我 昨天 上学 迟到 了神经网络的输出如下图所示:式名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 13 页 - - - - - - - - - 其中,s和e是两个特殊的词,分别表示一个序列的开始和结束。向量化我们知道,神经网络的输入和输出都是向量 ,为了让语言模型能够被神经网络处理,我们必须把词表达为向量的形式,这样神经网络才能处理它。神经网络的输入是 词,我们可以用下面的步骤对输入进行向量化 :1. 建立一个包含所有词的词典,每个词在词典里面有一个唯一的编号。2. 任意一个词都可以用一个 N 维的one-hot 向量来表示。其中, N 是词典中包含的词的个数。假设一个词在词典中的编号是i ,v是表示这个词的向量,是向量的第 j 个元素,则:上面这个公式的含义,可以用下面的图来直观的表示:使用这种向量化方法,我们就得到了一个高维、稀疏 的向量(稀疏是指绝大部分元素的值都是0)。处理这样的向量会导致我们的神经网络有很多的参数,带来庞大的计算量。因此,往往会需要使用一些降维方法,将高维的稀疏向量转变为低维的稠密向量。不过这个话题我们就不再这篇文章中讨论了。语言模型要求的输出是下一个最可能的词,我们可以让循环神经网络计算计算词典中每个词是下一个词的概率,这样,概率最大的词就是下一个最可能的词。因此,神经网络的输出向量也是一个N 维向量,向量中的每个元素对应着词典中相应的词是下一个词的概率。如下图所示:Softmax层前面提到, 语言模型 是对下一个词出现的 概率 进行建模。那么,怎样让神经网络输出概率呢?方法就是用softmax 层作为神经网络的输出层。我们先来看一下 softmax 函数的定义:这个公式看起来可能很晕,我们举一个例子。Softmax层如下图所示:从上图我们可以看到, softmax layer的输入是一个向量,输出也是一个向量,两个向量的维度是一样的(在这个例子里面是4)。输入向量x=1 2 3 4经过softmax 层之后,经过上面的 softmax 函数计算,转变为输出向量y=0.03 0.09 0.24 0.64。计算过程为:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 13 页 - - - - - - - - - 我们来看看输出向量 y的特征:1. 每一项为取值为 0-1之间的正数;2. 所有项的总和是 1。我们不难发现,这些特征和概率 的特征是一样的,因此我们可以把它们看做是概率。对于语言模型 来说,我们可以认为模型预测下一个词是词典中第一个词的概率是 0.03,是词典中第二个词的概率是0.09,以此类推。语言模型的训练可以使用 监督学习 的方法对语言模型进行训练,首先,需要准备训练数据集。接下来,我们介绍怎样把语料我 昨天 上学 迟到 了转换成语言模型的训练数据集。首先,我们获取 输入-标签 对:输入 标签s我我昨天昨天 上学上学 迟到迟到了了e然后,使用前面介绍过的向量化 方法,对输入 x和标签y进行 向量化 。这里面有意思的是,对标签y进行向量化,其结果也是一个one-hot 向量。例如,我们对标签我进行向量化,得到的向量中,只有第2019个元素的值是 1,其他位置的元素的值都是0。它的含义就是下一个词是我的概率是 1,是其它词的概率都是 0。最后,我们使用 交叉熵误差函数作为优化目标,对模型进行优化。在实际工程中,我们可以使用大量的语料来对模型进行训练,获取训练数据和训练的方法都是相同的。交叉熵误差一般来说,当神经网络的输出层是softmax 层时,对应的误差函数 E通常选择交叉熵误差函数,其定义如下:在上式中, N 是训练样本的个数,向量是样本的标记,向量是网络的输出。标记是一个one-hot 向量,例如,如果网络的输出,那么,交叉熵误差是(假设只有一个训练样本,即N=1 ):我们当然可以选择其他函数作为我们的误差函数,比如最小平方误差函数(MSE)。不过对概率进行建模时,选择交叉熵误差函数更makesense。具体原因,感兴趣的读者请阅读参考文献7 。RNN 的实现为了加深我们对前面介绍的知识的理解,我们来动手实现一个RNN 层。我们复用了上一篇文章零基础入门深度学习 (4) - 卷积神经网络 中的一些代码,所以先把它们导入进来。i mp or tnumpyasnpf r o m cnn i mpo r tRel u Ac t i va t or ,I d ent i t yAct i va t o r ,el em ent _wi se_op我们用RecurrentLayer 类来实现一个 循环层 。下面的代码是初始化一个循环层,可以在构造函数中设置卷积层的超参数。我们注意到,循环层有两个权重数组, U 和W 。cl a ssRecu r r en t La ye r ( obj ect ) :名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 13 页 - - - - - - - - - de f_ i ni t _( s el f ,i nput _ wi dt h,s t at e_wi d t h,ac t i vat or ,l ear ni ng_r at e) :sel f . i nput _ wi dt h = i nput _wi dt hsel f . st at e_ wi dt h = st at e_wi dt hsel f . act i va t or= a ct i vat orsel f . l ear ni ng_r at e = l ear n i ng_r at esel f . t i mes= 0# 当前时刻初始化为t0sel f . st at e_ l i st= # 保存各个时刻的st at esel f . st at e_ l i st . ap pend( np. zer os( st at e_ wi dt h,1) ) )# 初始化s 0sel f . U = np . r andom. uni f or m( - 1e- 4,1e- 4,( st at e_ wi dt h,i nput _wi dt h) )# 初始化Usel f . W = np . r andom. uni f or m( - 1e- 4,1e- 4,( st at e_ wi dt h,st at e_wi dt h) )# 初始化W在forward 方法中,实现循环层的前向计算,这部分比较简单。de ff o r war d( se l f ,i nput _a r r ay) : 根据式2 进行前向计算 sel f . t i mes+= 1st a t e = ( np . dot ( se l f . U,i n put _ar r a y)+np . dot ( se l f . W ,se l f . st at e _l i st - 1 ) )el e m ent _wi s e_op( st at e,sel f . act i va t or . f or war d )sel f . st at e_ l i st . ap pend( st a t e)在backword方法中,实现 BPTT 算法。de fba ckwar d( s el f ,sensi t i vi t y_ar r ay,ac t i vat or ) : 实现B PTT算法 sel f . cal c_d el t a( se nsi t i vi t y_ar r ay,act i vat or )sel f . cal c_g r adi ent ( )de fca l c_del t a ( sel f ,sens i t i vi t y_ ar r ay,a ct i vat o r ) :sel f . del t a_ l i st= # 用来保存各个时刻的误差项f orii n r ange( sel f . t i mes) :sel f . de l t a_l i s t . append ( np. zer o s( se l f . st at e_wi dt h,1) ) )sel f . del t a_ l i st . ap pend( sen si t i vi t y _ar r ay)# 迭代计算每个时刻的误差项f orki n r ange( sel f . t i mes -1,0,- 1) :sel f . ca l c_del t a_k( k,a ct i vat or )de fca l c_del t a _k( sel f ,k,act i vat or ) : 根据k+1时刻的d el t a 计算k时刻的d el t a st a t e = sel f . st at e _l i st k+1 . copy( )el e m ent _wi s e_op( se l f . st at e _l i st k+1 ,act i va t or . back war d)sel f . del t a_ l i st k= np. do t (np. dot ( sel f . de l t a_l i st k+1 . T,sel f . W ) ,np. di ag ( st at e : , 0 ) ) . Tde fca l c_gr adi ent ( sel f ) :sel f . gr adi e nt _l i st= # 保存各个时刻的权重梯度f orti n r ange( sel f . t i mes + 1) :sel f . gr adi ent _ l i st . app end( np. z er os( se l f . st at e_wi dt h,sel f . st at e_wi dt h) ) )f orti n r ange( sel f . t i mes,0,- 1) :sel f . ca l c _g r a di e nt _t ( t )# 实际的梯度是各个时刻梯度之和sel f . gr adi e nt= r e duce(l amb da a,b:a + b,sel f . gr adi en t _l i st ,sel f . gr adi ent _ l i st 0 )# 0 被初始化为0且没有被修改过de fca l c_ gr ad i e nt _ t ( sel f ,t ) : 计算每个时刻t权重的梯度 gr a di ent= np. dot ( sel f . del t a_l i st t ,sel f . st at e_l i s t t - 1 . T)sel f . gr adi e nt _l i st t = gr adi ent有意思的是, BPTT 算法虽然数学推导的过程很麻烦,但是写成代码却并不复杂。在update方法中,实现梯度下降算法。de fup dat e( sel f ) : 按照梯度下降,更新权重 sel f . W - = s el f . l ea r ni ng_r a t e *sel f . gr adi ent上面的代码不包含权重 U 的更新。这部分实际上和全连接神经网络是一样的,留给感兴趣的读者自己来完成吧。循环层 是一个带状态 的层,每次 forword 都会改变循环层的内部状态,这给梯度检查带来了麻烦。因此,我们需要一个reset_state方法,来重置循环层的内部状态。de fr e set _st at e( sel f ) :sel f . t i mes= 0# 当前时刻初始化为t0sel f . st at e_ l i st= # 保存各个时刻的st at e名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 13 页 - - - - - - - - - sel f . st at e_ l i st . ap pend( np. zer os( sel f . s t at e_wi dt h,1) ) )# 初始化s 0最后,是梯度检查的代码。defgr adi e nt _check ( ) : 梯度检查 # 设计一个误差函数,取所有节点输出项之和er r or _f unct i on = l ambd ao:o. sum( )r l= Re cu r r ent La ye r ( 3,2,I d en t i t yAct i va t o r ( ) ,1e- 3)# 计算f or war d值x,d = dat a_set ( )r l . f or war d( x 0 )r l . f or war d( x 1 )# 求取s ensi t i vi t y mapsensi t i vi t y_ar r ay = np . ones( r l . st at e_l i st - 1 . sha pe,dt ype=np. f l oat 64)# 计算梯度r l . back war d( sen si t i vi t y_ar r ay,I d en t i t yAct i v at o r ( ) )# 检查梯度epsi l on = 10e- 4f o rii n r an ge( r l . W. shape 0 ) :f orji n r ange( r l . W . sha pe 1 ) :r l . W i , j += e psi l onr l . r ese t _st at e ( )r l . f or war d( x 0 )r l . f or war d( x 1 )er r 1 = er r or _f unct i on( r l . st at e _l i st - 1 )r l . W i , j - = 2 *epsi l onr l . r ese t _st at e ( )r l . f or war d( x 0 )r l . f or war d( x 1 )er r 2 = er r or _f unct i on( r l . st at e _l i st - 1 )expect _ gr ad = ( er r 1 -er r 2)/( 2 *epsi l o n)r l . W i , j += e psi l onp r i n t wei g ht s( % d, %d) :expe ct ed - a ct ur al% f-% f % (i ,j ,expe ct _gr ad,r l . gr ad i ent i , j )需要注意,每次计算 error 之前,都要调用 reset_state方法重置循环层的内部状态。下面是梯度检查的结果,没问题!小节至此,我们讲完了基本的循环神经网络、它的训练算法: BPTT,以及在语言模型上的应用。RNN 比较烧脑,相信拿下前几篇文章的读者们搞定这篇文章也不在话下吧!然而,循环神经网络这个话题并没有完结。我们在前面说到过,基本的循环神经网络存在梯度爆炸和梯度消失问题,并不能真正的处理好长距离的依赖(虽然有一些技巧可以减轻这些问题)。事实上,真正得到广泛的应用的是循环神经网络的一个变体:长短时记忆网络。它内部有一些特殊的结构,可以很好的处理长距离的依赖,我们将在下一篇文章中详细的介绍它。现在,让我们稍事休息,准备挑战更为烧脑的长短时记忆网络吧。参考资料1. RECURRENT NEURAL NETWORKS TUTORIAL2. Understanding LSTM Networks3. The Unreasonable Effectiveness of Recurrent Neural Networks4. Attention and Augmented Recurrent Neural Networks5. On the difficulty of training recurrent neural networks, Bengio et al.6. Recurrent neural network based language model, Mikolov et al.7. Neural Network Classification, Categorical Data, Softmax Activation, and Cross Entropy Error, McCaffrey名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 13 页 - - - - - - - - -

    注意事项

    本文(2022年2022年零基础入门深度学习-循环神经网络 .pdf)为本站会员(Che****ry)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开