详解循环神经网络(Recurrent Neural Network)
本文结构:
- 模型
- 训练算法
- 基于 RNN 的语言模型例子
- 代码实现
1. 模型
- 和全连接网络的区别
- 更细致到向量级的连接图
- 为什么循环神经网络可以往前看任意多个输入值
循环神经网络种类繁多,今天只看最基本的循环神经网络,这个基础攻克下来,理解拓展形式也不是问题。
首先看它和全连接网络的区别:
下图是一个全连接网络:
它的隐藏层的值只取决于输入的 x

而 RNN 的隐藏层的值 s 不仅仅取决于当前这次的输入 x,还取决于上一次隐藏层的值 s:
这个过程画成简图是这个样子:

其中,t 是时刻, x 是输入层, s 是隐藏层, o 是输出层,矩阵 W 就是隐藏层上一次的值作为这一次的输入的权重。
上面的简图还不能够说明细节,来看一下更细致到向量级的连接图:

Elman and Jordan networks are also known as "simple recurrent networks" (SRN).
其中各变量含义:

输出层是一个全连接层,它的每个节点都和隐藏层的每个节点相连,
隐藏层是循环层。
图来自wiki:https://en.wikipedia.org/wiki/Recurrent_neural_network#Gated_recurrent_unit
为什么循环神经网络可以往前看任意多个输入值呢?
来看下面的公式,即 RNN 的输出层 o 和 隐藏层 s 的计算方法:

如果反复把式 2 带入到式 1,将得到:

这就是原因。
2. 训练算法
RNN 的训练算法为:BPTT
BPTT 的基本原理和 BP 算法是一样的,同样是三步:
- 前向计算每个神经元的输出值;
- 反向计算每个神经元的误差项值,它是误差函数E对神经元j的加权输入的偏导数;
- 计算每个权重的梯度。
最后再用随机梯度下降算法更新权重。
BP 算法的详细推导可以看这篇:
手写,纯享版反向传播算法公式推导
http://www.jianshu.com/p/9e217cfd8a49
下面详细解析各步骤:
1. 前向计算
计算隐藏层 S 以及它的矩阵形式:
注意下图中,各变量的维度,标在右下角了,
s 的上标代表时刻,下标代表这个向量的第几个元素。
2. 误差项的计算
BTPP 算法就是将第 l 层 t 时刻的误差值沿两个方向传播:
- 一个方向是,传递到上一层网络,这部分只和权重矩阵 U 有关;(就相当于把全连接网络旋转90度来看)
- 另一个是方向是,沿时间线传递到初始时刻,这部分只和权重矩阵 W 有关。
如下图所示:

所以,就是要求这两个方向的误差项的公式:
学习资料中式 3 就是将误差项沿时间反向传播的算法,求到了任意时刻k的误差项

下面是具体的推导过程:
主要就是用了 链锁反应 和 Jacobian 矩阵
其中 s 和 net 的关系如下,有助于理解求导公式:

学习资料中式 4 就是将误差项传递到上一层算法:

这一步和普通的全连接层的算法是完全一样的,具体的推导过程如下:
其中 net 的 l 层 和 l-1 层的关系如下:

BPTT 算法的最后一步:计算每个权重的梯度
学习资料中式 6 就是计算循环层权重矩阵 W 的梯度的公式:

具体的推导过程如下:
和权重矩阵 W 的梯度计算方式一样,可以得到误差函数在 t 时刻对权重矩阵 U 的梯度:

3. 基于 RNN 的语言模型例子
我们要用 RNN 做这样一件事情,每输入一个词,循环神经网络就输出截止到目前为止,下一个最可能的词,如下图所示:

首先,要把词表达为向量的形式:
- 建立一个包含所有词的词典,每个词在词典里面有一个唯一的编号。
- 任意一个词都可以用一个N维的one-hot向量来表示。

这种向量化方法,我们就得到了一个高维、稀疏的向量,这之后需要使用一些降维方法,将高维的稀疏向量转变为低维的稠密向量。
为了输出 “最可能” 的词,所以需要计算词典中每个词是当前词的下一个词的概率,再选择概率最大的那一个。
因此,神经网络的输出向量也是一个 N 维向量,向量中的每个元素对应着词典中相应的词是下一个词的概率:

为了让神经网络输出概率,就要用到 softmax 层作为输出层。
softmax函数的定义:
因为和概率的特征是一样的,所以可以把它们看做是概率。

例:

计算过程为:

含义就是:
模型预测下一个词是词典中第一个词的概率是 0.03,是词典中第二个词的概率是 0.09。
语言模型如何训练?
把语料转换成语言模型的训练数据集,即对输入 x 和标签 y 进行向量化,y 也是一个 one-hot 向量

接下来,对概率进行建模,一般用交叉熵误差函数作为优化目标。
交叉熵误差函数,其定义如下:

用上面例子就是:

计算过程如下:

有了模型,优化目标,梯度表达式,就可以用梯度下降算法进行训练了。
4. 代码实现
RNN 的 Python 实现代码可以在学习资料中找到。
详解循环神经网络(Recurrent Neural Network)的更多相关文章
- 循环神经网络(Recurrent Neural Networks, RNN)介绍
目录 1 什么是RNNs 2 RNNs能干什么 2.1 语言模型与文本生成Language Modeling and Generating Text 2.2 机器翻译Machine Translati ...
- Recurrent Neural Network系列1--RNN(循环神经网络)概述
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- Recurrent Neural Network(循环神经网络)
Reference: Alex Graves的[Supervised Sequence Labelling with RecurrentNeural Networks] Alex是RNN最著名变种 ...
- 循环神经网络(Recurrent Neural Network,RNN)
为什么使用序列模型(sequence model)?标准的全连接神经网络(fully connected neural network)处理序列会有两个问题:1)全连接神经网络输入层和输出层长度固定, ...
- 4.5 RNN循环神经网络(recurrent neural network)
自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1 RNN循环神经网络 ...
- Recurrent Neural Network系列3--理解RNN的BPTT算法和梯度消失
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 这是RNN教程的第三部分. 在前面的教程中,我们从头实现了一个循环 ...
- Recurrent Neural Network(递归神经网络)
递归神经网络(RNN),是两种人工神经网络的总称,一种是时间递归神经网络(recurrent neural network),另一种是结构递归神经网络(recursive neural network ...
- Recurrent Neural Network系列2--利用Python,Theano实现RNN
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORKS T ...
- Recurrent Neural Network系列4--利用Python,Theano实现GRU或LSTM
yi作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 本文翻译自 RECURRENT NEURAL NETWORK ...
随机推荐
- yii处理cookie
/** * 设置用户cookie会话 */ public function setCookie() { //set loginName $cookies = Yii::app()->reques ...
- 搞不懂的算法-排序篇<1>
最近在学习算法,跟着<Algorithms>这本书,可能是自己水平不够吧,看完排序算法后各种,希尔,归并,快排,堆的实现在脑子里乱成一锅粥,所以就打算大概总结一下,不求精确,全面,只想用平 ...
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用
http://www.cnblogs.com/wuhuacong/p/3343967.html 大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随 ...
- 自动化构建之bower
官网地址:https://bower.io/ 网站由很多东西组成 - 框架,库,一个大型网站有很多人一块创建,那么因为版本或者其他的原因导致文件重复,或者不是最新的.例如:jq的版本不一样但是都是jq ...
- PowerDesigner工具
PowerDesigner是一款数据库设计与建模工具,开发人员可以在上面设计表结构,而不用一开始就创建数据库中的表,因为设计阶段数据库表结构会经常变动.设计完后可以导出创建所有表的SQL脚本,直接执行 ...
- 面试题1-----SVM和LR的异同
1.异(加下划线是工程上的不同) (1)两者损失函数不一样 (2)LR无约束.SVM有约束 (3)SVM仅考虑支持向量. (4)LR的可解释性更强,SVM先投影到更高维分类再投影到低维空间. (5)S ...
- 在asyncio 中跳出正在执行的task
需求描述 代码在asyncio的框架中运行, 但是一旦一个task出现了长时间的堵塞,我们要跳过这个task(代码可能是用户输入的,例如用户编写的插件) 代码如下 (其中大部分代码出自官方的 asyn ...
- Tab切换效果(修改)
前几天我写了这个切换效果,但是是只传一个值的函数,经过各位大牛的指点发现还是有些问题的,于是经过我不懈的努力,完善了代码: 传递多个参数替代函数里面包含事件这个问题: html代码: <div ...
- jsp js action之间传值
1.struts2 action如何向JSP的JS函数传值 action中定义变量 public class TestAction extends ActionSupport implements S ...
- 2015 Multi-University Training Contest 10 hdu 5406 CRB and Apple
CRB and Apple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...