注:本文转载自https://github.com/exacity/simplified-deeplearning/blob/master/%E5%BE%AA%E7%8E%AF%E9%80%92%E5%BD%92%E7%BD%91%E7%BB%9C/RNN.md
因为github上的makedown格式显示的不够完全,看的非常不方便,因此放到CSDN上比较好查阅学习。

循环神经网络

RNN简介

  循环神经网络(recurren neural network RNN)是一类用来处理序列数据的神经网络。就像卷积网络专门用来处理网格化数据X(如一个图像)的神经网络,循环神经网络是专门来处理序列x(1),x(2),...x(τ)x(1),x(2),...x(τ)x^{(1)},x^{(2)},...x^{(\tau)}的神经网络。正如卷积网络可以很容易地扩展到具有很大宽度和高度的图像,以及处理大小可变的图像,循环网络可以扩展到更长的序列,大多数循环网络也可以处理可变长度的序列。目前RNN已经广泛的用于自然语言处理中的语音识别,机器翻译等领域。

RNN模型原理

  RNN模型有比较多的变种,最主流的RNN模型结构如下图所示:

  图中损失函数LLL衡量每个o" role="presentation">ooo与相应的训练目标yyy的距离。当使用softmax输出时,我们假设o" role="presentation">ooo是未归一化的对数概率。损失函数LLL内部计算y^=softmax(o)" role="presentation">y^=softmax(o)y^=softmax(o)\hat y= softmax(o),并将其与目标yyy比较。RNN输入到隐藏的连接由权重矩阵U" role="presentation">UUU参数化,隐藏到隐藏的循环连接由权重矩阵WWW参数化以及隐藏到输出的连接由权重矩阵V" role="presentation">VVV参数化。(左)使用循环连接绘制的RNN和它的损失。(右)同一网络被视为展开的计算图,其中每个节点现在与一个特定的与一个特定的时间实例相关联。

RNN向前传播算法

  现在我们研究上图中RNN的向前传播公式,假设该图隐藏层使用双曲正切函数作为激活函数,此外图中没有明确指定何种形式的输出和激活函数。假定输出是离散的,如用于预测词或者字符的RNN。表示离散变量的常规方式是把输出οο{\omicron}作为每个离散变量可能值的非标准化对数概率。然后,应用softmax函数后续处理,获得标准化后概率的输出向量y^y^\hat{y}。RNN从特定初始状态h(0)h(0)h^{(0)}开始向前传播。从ttt=1到t" role="presentation">ttt=ττ\tau的每个时间步,我们应用以下更新方程:

a=b+Wh(t−1)+Ux(t)a=b+Wh(t−1)+Ux(t)

a = b + Wh^{(t-1)} + Ux^{(t)}

h(t)=tanh(a(h))h(t)=tanh(a(h))

h^{(t)} = tanh(a^{(h)})

o(t)=c+Vh(t)o(t)=c+Vh(t)

o^{(t)} = c + Vh^{(t)}

y^=softmax(o(t))y^=softmax(o(t))

\hat{y} = softmax(o^{(t)})
其中的参数的偏置 bbb和c" role="presentation">ccc连接权重矩阵 UUU、V" role="presentation">VVV和 WWW,分别对应于输入到隐藏、隐藏到输出和隐藏到隐藏的连接。这个循环网络将一个输入序列映射到相同长度的输出序列。与x" role="presentation">xxx序列配对的 yyy的总损失就是所有时间步的损失之和,例如L(t)" role="presentation">L(t)L(t)L^{(t)}为给定的 x(1),x(2),...x(τ)x(1),x(2),...x(τ)x^{(1)},x^{(2)},...x^{(\tau)}后 y(t)y(t)y^{(t)}的负对数似然则

L({x(1),...,x(τ)},{y(1),...,y(τ)})=∑tL(t)L({x(1),...,x(τ)},{y(1),...,y(τ)})=∑tL(t)

L(\{ x^{(1)},...,x^{(\tau)}\},\{ y^{(1)},...,y^{(\tau)}\}) = \sum\limits_t L^{(t)}

=−∑tlog pmodel(y(t)|{x(1),...,x(τ)})=−∑tlogpmodel(y(t)|{x(1),...,x(τ)})

= -\sum\limits_t log\ pmodel(y^{(t)}|\{ x^{(1)},...,x^{(\tau)}\})
其中 pmodel(y(t)|{x(1),...,x(τ)})pmodel(y(t)|{x(1),...,x(τ)})pmodel(y^{(t)}|\{ x^{(1)},...,x^{(\tau)}\})需要读取模型的输出向量 y^y^\hat y中对应于 y(t)y(t)y^{(t)}的项。

基于反向传播计算RNN梯度

  计算循环神经网络的梯度是容易的,可以将反向传播算法应用于展开的计算图,由反向传播计算得到梯度,并结合任何通用的基于梯度的技术可以训练RNN。计算图的节点包括参数UUU、V" role="presentation">VVV、WWW、b" role="presentation">bbb和ccc,以及t" role="presentation">ttt为索引的节点序列x(t)x(t)x^{(t)},h(t)h(t)h^{(t)},o(t)o(t)o^{(t)},L(t)L(t)L^{(t)}。对于每一个节点N,基于N后面的节点,递归的计算梯度∇NL∇NL\nabla_NL。从紧着的最终的损失节点开始递归:

∂L∂L(t)=1∂L∂L(t)=1

\frac{\partial L}{\partial L^{(t)}} = 1
在这个导数中,假设输出 o(t)o(t)o^{(t)}作为softmax函数的参数, y^y^\hat y作为softmax函数输出的概率。同时假设损失是迄今为止给定了输入后的真是目标 y(t)y(t)y^{(t)}的负对数似然。对于所有 i,ti,ti,t,关于时间同步输出的梯度 ∇o(t)L∇o(t)L\nabla_{o^{(t)}}L如下:

(∇o(t)L)i=∂L∂o(t)i=∂L∂L(t)∂L(t)∂o(t)i=y^(t)i−y(t)(∇o(t)L)i=∂L∂oi(t)=∂L∂L(t)∂L(t)∂oi(t)=y^i(t)−y(t)

(\nabla_{o^{(t)}}L)_i=\frac{\partial L}{\partial o_i^{(t)}} =\frac{\partial L}{\partial L^{(t)}} \frac{\partial L^{(t)}}{\partial o_i^{(t)}} ={\hat y}_i^{(t)} - y^{(t)}
从序列的末尾开始,反向进行计算。在最后的时间步 ττ\tau, h(τ)h(τ)h^{(\tau)}只有 o(τ)o(τ)o^{(\tau)}作为后续节点,计算梯度。

∇h(τ)L=VT∇o(τ)L∇h(τ)L=VT∇o(τ)L

\nabla_{h^{(\tau)}}L = V^{T}\nabla_{o^{(\tau)}}L
然后从 t=τ−1t=τ−1t = \tau -1 到 t=1t=1t =1反向迭代,通过时间反向迭代梯度, h(t) (t<τ)h(t)(t<τ)h^{(t)} \ (t 同时具有 o(t)o(t)o^{(t)}和 h(t+1)h(t+1)h^{(t+1)}两个后续节点,梯度计算公式如下:

∇h(t)L=(∂h(t)∂h(t+1))T(∇h(t+1)L)+(∂o(t)∂h(t))T(∇o(t)L)∇h(t)L=(∂h(t)∂h(t+1))T(∇h(t+1)L)+(∂o(t)∂h(t))T(∇o(t)L)

\nabla_{h^{(t)}}L= {\left( \frac{\partial h^{(t)}}{\partial h^{(t+1)}}\right)}^{T} (\nabla_{h^{(t+1)}}L) + {\left( \frac{\partial o^{(t)}}{\partial h^{(t)}}\right)}^{T} (\nabla_{o^{(t)}}L)

=WT(∇h(t+1)L)diag(1−(h(t+1))2)+VT(∇o(t)L)=WT(∇h(t+1)L)diag(1−(h(t+1))2)+VT(∇o(t)L)

=W^{T}(\nabla_{h^{(t+1)}}L)diag\left( 1- (h^{(t+1)})^2\right) +V^{T}(\nabla_{o ^{(t)}}L)
其中 diag(1−(h(t+1))2)diag(1−(h(t+1))2)diag\left( 1- (h^{(t+1)})^2\right)表示包含元素 (1−(h(t+1)i)2)(1−(hi(t+1))2)\left( 1- (h_i^{(t+1)})^2\right)的对角矩阵,它是关于时刻 t+1t+1t+1与隐藏单元 iii关联的双曲正切Jacobian矩阵,一旦获得了计算图内部节点的梯度,就可以得出关于各个参数节点的梯度。

∇cL=∑t(∂o(t)∂c)T∇o(t)L=∑t∇o(t)L                               " role="presentation">∇cL=∑t(∂o(t)∂c)T∇o(t)L=∑t∇o(t)L                               ∇cL=∑t(∂o(t)∂c)T∇o(t)L=∑t∇o(t)L                               

\nabla_cL=\sum\limits_t {\left( \frac{\partial o^{(t)}}{\partial c}\right)}^{T} \nabla_{o^{(t)}}L =\sum\limits_t \nabla_{o^{(t)}}L \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \

∇bL=∑t(∂h(t)∂b(t))T∇h(t)L=∑tdiag(1−(h(t))2)∇h(t)L∇bL=∑t(∂h(t)∂b(t))T∇h(t)L=∑tdiag(1−(h(t))2)∇h(t)L

\nabla_bL=\sum\limits_t {\left( \frac{\partial h^{(t)}}{\partial b^{(t)}}\right)}^{T} \nabla_{h^{(t)}}L =\sum\limits_t diag\left( 1- (h^{(t)})^2\right) \nabla_{h^{(t)}}L

∇VL=∑t∑i(∂L∂o(t)i)T∇VL=∇Vo(t)i=∑t(∇o(t)L)h(t)T∇VL=∑t∑i(∂L∂oi(t))T∇VL=∇Voi(t)=∑t(∇o(t)L)h(t)T

\nabla_VL=\sum\limits_t\sum\limits_i {\left( \frac{\partial L}{\partial o_i^{(t)}}\right)}^{T} \nabla_{V}L =\nabla_Vo_i^{(t)} =\sum\limits_t (\nabla_{o^{(t)}}L)h^{(t)^T}

∇WL=∑t∑i(∂L∂h(t)i)T∇W(t)h(t)i                                        ∇WL=∑t∑i(∂L∂hi(t))T∇W(t)hi(t)

\nabla_WL=\sum\limits_t\sum\limits_i {\left( \frac{\partial L}{\partial h_i^{(t)}}\right)}^{T} \nabla_{W^{(t)}}h_i^{(t)} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \

=∑tdiag(1−(h(t))2)(∇h(t)L)h(t−1)T            =∑tdiag(1−(h(t))2)(∇h(t)L)h(t−1)T

=\sum\limits_t diag\left( 1- (h^{(t)})^2\right) (\nabla_{h^{(t)}}L) h^{(t-1)^T} \ \ \ \ \ \ \ \ \ \ \ \

∇UL=∑t∑i(∂L∂h(t)i)T∇U(t)h(t)i                                        ∇UL=∑t∑i(∂L∂hi(t))T∇U(t)hi(t)

\nabla_UL=\sum\limits_t\sum\limits_i {\left( \frac{\partial L}{\partial h_i^{(t)}}\right)}^{T} \nabla_{U^{(t)}}h_i^{(t)} \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \

=∑tdiag(1−(h(t))2)(∇h(t)L)x(t)T              =∑tdiag(1−(h(t))2)(∇h(t)L)x(t)T

=\sum\limits_t diag\left( 1- (h^{(t)})^2\right) (\nabla_{h^{(t)}}L) x^{(t)^T} \ \ \ \ \ \ \ \ \ \ \ \ \ \
除了梯度表达式不同,RNN的反向传播算法和DNN区别不大。

RNN梯度消失问题

  在深度学习中的优化章节曾提到过 在一些算中,当计算图变得非常深的时候,会面临一个长期依赖的问题。循环神经网络需要在很长的时间序列的各个时刻重复应用相同操作来构建非常深的计算图。经过多阶传到后的梯度倾向于消失或爆炸(多数情况下会消失)。假如某个计算图包含一条反复与矩阵 WWW 相乘的路径,那么 t" role="presentation">ttt 步之后,相当于乘以 WtWtW^t。假设WWW 有特征分解:
W=Vdiag(λ)V−1" role="presentation">W=Vdiag(λ)V−1W=Vdiag(λ)V−1 W = Vdiag(\lambda)V^{-1}
则:

Wt=(Vdiag(λ)V−1)t=Vdiag(λ)tV−1Wt=(Vdiag(λ)V−1)t=Vdiag(λ)tV−1

W^t = (Vdiag(\lambda)V^{-1})^t = Vdiag(\lambda)^tV^{-1}

当特征值 λiλi\lambda_i 不在 1 附近时,若大于1,则会爆炸,若小于1,则会消失。梯度消失与爆炸问题是指该计算图上面的梯度会因 diag(λ)tdiag(λ)tdiag(\lambda)^t 发生大幅度的变化。

RNN总结

  本章节介绍了最经典的RNN模型结构,RNN的向前传播算法,反向梯度计算,以及RNN的梯度消失问题。RNN还有很多拓展,例如双向RNN、基于编码-解码的序列到序列的架构、深度循环网络、递归神经网络等。

  RNN虽然理论上可以很漂亮的解决序列数据的训练,但是由于梯度消失的问题,无法应用到很长的序列。在语音识别,手写识别以及机器翻译等NLP领域实际应用比较广泛的是基于RNN模型的一个拓展LSTM,接下来我们就来讨论LSTM模型。

非监督特征学习与深度学习(十四)--------循环神经网络相关推荐

  1. 非人工智能方向粗糙理解深度学习

    非人工智能方向粗糙理解深度学习 线性模型基本形式 线性回归 数据集 学习目标 均方误差 监督学习 弱监督学习 不完全监督 主动学习 半监督学习 迁移学习 不确切监督 不准确监督 线性模型基本形式 你要 ...

  2. 深度学习入门笔记(十四):Softmax

    欢迎关注WX公众号:[程序员管小亮] 专栏--深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献. 2)本文仅供学术交流,非商用.所以每一部分具 ...

  3. 机器学习、监督学习、非监督学习、强化学习、深度学习、迁移学习

    机器学习.监督学习.非监督学习.强化学习.深度学习.迁移学习 机器学习(machine learning) 监督学习(supervised learning) 非监督学习(unsupervised l ...

  4. 深度学习入门(六十四)循环神经网络——编码器-解码器架构

    深度学习入门(六十四)循环神经网络--编码器-解码器架构 前言 循环神经网络--编码器-解码器架构 课件 重新考察CNN 重新考察RNN 编码器-解码器架构 总结 教材 1 编码器 2 解码器 3 合 ...

  5. 深度学习入门(三十)卷积神经网络——NiN

    深度学习入门(三十)卷积神经网络--NiN 前言 卷积神经网络--NiN 课件 网络中的网络NiN 全连接层的问题 NiN块 NiN架构 NiN Networks 总结 教材 1 NiN块 2 NiN ...

  6. 深度学习之图像分类(十四)--ShuffleNetV2 网络结构

    深度学习之图像分类(十四)ShuffleNetV2 网络结构 目录 深度学习之图像分类(十四)ShuffleNetV2 网络结构 1. 前言 2. Several Practical Guidelin ...

  7. 深度学习入门(二十四)卷积神经网络——填充和步幅

    深度学习入门(二十四)卷积神经网络--填充和步幅 前言 卷积神经网络--填充和步幅 课件 填充 步幅 总结 课本 1 填充 2 步幅 3 小结 前言 核心内容来自博客链接1博客连接2希望大家多多支持作 ...

  8. 探讨使用UML设计机器学习特征工程与深度学习建模等大数据分析软件

    大数据人工智能软件产品研发,是在传统软件工程的基础上,增加了数据特征分析.人工智能算法建模及模型训练过程,同时也增加了很大的不确定性. 0. 前言 本文以程序员视角,以客户流失为案例,使用UML方式设 ...

  9. 强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现

    强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现 TD3算法简介 TD3是Twin Delayed Deep Deterministic policy gradie ...

  10. 【深度学习】深度学习和经典统计学是一回事?

    器之心编译 编辑:rome rome 深度学习和简单的统计学是一回事吗?很多人可能都有这个疑问,毕竟二者连术语都有很多相似的地方.在这篇文章中,理论计算机科学家.哈佛大学知名教授 Boaz Barak ...

最新文章

  1. [Linux学习]虚拟机系统与实际系统共享文件的方式
  2. java jtable刷新_使用Swing timer实现Jtable数据定时更新
  3. html5自动添加数据库,HTML5本地存储之如果没有数据库究竟会怎样
  4. 线性表及其逻辑和存储结构(二级)
  5. 简单使用Boost线程池threadpool
  6. 前端学习(2051)vue之电商管理系统电商系统之开启gzip文件传输
  7. arcengine遍历属性表_Redis源码解析四--跳跃表
  8. python tkinter 中文文档_Python实现中文文档的简体与繁体互相转换
  9. 软件工程课堂练习购买图书
  10. Linux---弹球游戏
  11. JVM stack与Heap的区别
  12. Ackerman阿克曼函数的递归与非递归(栈)实现
  13. 中国石油大学《输气管道设计与管理(含课程设计)》第三阶段在线作业
  14. 【node.js】报错Cannot mix different versions of joi schemas解决方法
  15. Android 之自定义表情
  16. 中物院计划建国内一流科学仪器研发基地
  17. PyCharm 的调试功能
  18. riser服务key/value服务介绍-基于leveldb
  19. Pocket PC如何与PC机联网
  20. 青少年编程scratch一级-熟悉编程软件(答案及详解+线上题库答题)

热门文章

  1. 世纪佳缘水分有多大?
  2. 使用imagick将PDF转换成图片时报Fatal error: Uncaught exception 'ImagickException' with message 'FailedToExecute
  3. 电话骚扰 【响完一声开始没有任何声音】
  4. 百度地图根据经纬度获取该地点所在城市信息
  5. Office2016官方下载 | Microsoft Office Professional Plus 2016完整版下载
  6. i7 11700k、i7 11700f和i7 11700KF选哪个
  7. Windows操作系统安全加固基线检测脚本
  8. 前端分享到推特,脸书
  9. Salvage Robot[agc-004E]
  10. java生成word文档(最简单)