详解循环神经网络(Recurrent Neural Network)

原创 2017年06月18日 12:18:51

今天的学习资料是这篇文章,写的非常详细,有理论有代码,本文是补充一些小细节,可以二者结合看效果更好:
https://zybuluo.com/hanbingtao/note/541458

在文末有关于 RNN 的文章汇总,之前写的大多是概览式的模型结构,公式,和一些应用,今天主要放在训练算法的推导。

本文结构:

  1. 模型
  2. 训练算法
  3. 基于 RNN 的语言模型例子
  4. 代码实现

1. 模型

  • 和全连接网络的区别
  • 更细致到向量级的连接图
  • 为什么循环神经网络可以往前看任意多个输入值

循环神经网络种类繁多,今天只看最基本的循环神经网络,这个基础攻克下来,理解拓展形式也不是问题。

首先看它和全连接网络的区别:

下图是一个全连接网络:
它的隐藏层的值只取决于输入的 x

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

其中,t 是时刻, x 是输入层, s 是隐藏层, o 是输出层,矩阵 W 就是隐藏层上一次的值作为这一次的输入的权重。

上面的简图还不能够说明细节,来看一下更细致到向量级的连接图:

Elman network

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 算法是一样的,同样是三步:

    1. 前向计算每个神经元的输出值;
    1. 反向计算每个神经元的误差项值,它是误差函数E对神经元j的加权输入的偏导数;
    1. 计算每个权重的梯度。

最后再用随机梯度下降算法更新权重。

BP 算法的详细推导可以看这篇:
手写,纯享版反向传播算法公式推导
http://www.jianshu.com/p/9e217cfd8a49

下面详细解析各步骤:

1. 前向计算

计算隐藏层 S 以及它的矩阵形式:
注意下图中,各变量的维度,标在右下角了,
s 的上标代表时刻,下标代表这个向量的第几个元素。

1

2. 误差项的计算

BTPP 算法就是将第 l 层 t 时刻的误差值沿两个方向传播:

  • 一个方向是,传递到上一层网络,这部分只和权重矩阵 U 有关;(就相当于把全连接网络旋转90度来看)
  • 另一个是方向是,沿时间线传递到初始时刻,这部分只和权重矩阵 W 有关。

如下图所示:

所以,就是要求这两个方向的误差项的公式:

学习资料中式 3 就是将误差项沿时间反向传播的算法,求到了任意时刻k的误差项

下面是具体的推导过程:
主要就是用了 链锁反应 和 Jacobian 矩阵

2

其中 s 和 net 的关系如下,有助于理解求导公式:


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

这一步和普通的全连接层的算法是完全一样的,具体的推导过程如下:

3

其中 net 的 l 层 和 l-1 层的关系如下:


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

具体的推导过程如下:

4


和权重矩阵 W 的梯度计算方式一样,可以得到误差函数在 t 时刻对权重矩阵 U 的梯度:


3. 基于 RNN 的语言模型例子

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

首先,要把词表达为向量的形式:

  • 建立一个包含所有词的词典,每个词在词典里面有一个唯一的编号。
  • 任意一个词都可以用一个N维的one-hot向量来表示。

这种向量化方法,我们就得到了一个高维、稀疏的向量,这之后需要使用一些降维方法,将高维的稀疏向量转变为低维的稠密向量。

为了输出 “最可能” 的词,所以需要计算词典中每个词是当前词的下一个词的概率,再选择概率最大的那一个。

因此,神经网络的输出向量也是一个 N 维向量,向量中的每个元素对应着词典中相应的词是下一个词的概率:

为了让神经网络输出概率,就要用到 softmax 层作为输出层。

softmax函数的定义:
因为和概率的特征是一样的,所以可以把它们看做是概率。

例:

计算过程为:

含义就是:
模型预测下一个词是词典中第一个词的概率是 0.03,是词典中第二个词的概率是 0.09。

语言模型如何训练?

把语料转换成语言模型的训练数据集,即对输入 x 和标签 y 进行向量化,y 也是一个 one-hot 向量

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

交叉熵误差函数,其定义如下:

用上面例子就是:

计算过程如下:

有了模型,优化目标,梯度表达式,就可以用梯度下降算法进行训练了。


4. 代码实现

RNN 的 Python 实现代码可以在学习资料中找到。


推荐阅读
历史技术博文链接汇总
也许可以找到你想要的

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aliceyangxi1987/article/details/73421556

深度学习笔记(四):循环神经网络的概念,结构和代码注释

深度学习笔记(一):logistic分类 深度学习笔记(二):简单神经网络,后向传播算法及实现 深度学习笔记(三):激活函数和损失函数 深度学习笔记(四):循环神经网络的概念,结构和代码注释本文...
  • u014595019
  • u014595019
  • 2016年09月18日 10:13
  • 9821

循环神经网络(RNN, Recurrent Neural Networks)学习笔记:基础理论

RNN(Recurrent Neuron Network)是一种对序列数据建模的神经网络。继Bengio提出基于神经网络的概率语言模型并获得成功之后,Mikolov于2010年提出利用RNN建模语言模...
  • xingzhedai
  • xingzhedai
  • 2016年11月12日 23:00
  • 12814

循环神经网络与LSTM

1. 循环神经网络 ①基本结构 在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预...
  • u010089444
  • u010089444
  • 2017年02月21日 17:46
  • 19111

循环神经网络(RNN, Recurrent Neural Networks)介绍

循环神经网络(RNN, Recurrent Neural Networks)介绍   这篇文章很多内容是参考:http://www.wildml.com/2015/09/recurrent-neura...
  • heyongluoyao8
  • heyongluoyao8
  • 2015年09月23日 13:24
  • 305929

深度学习基础模型算法原理及编程实现--04.改进神经网络的方法

文章列表 1.深度学习基础模型算法原理及编程实现–01.感知机. 2.深度学习基础模型算法原理及编程实现–02.线性单元 . 3.深度学习基础模型算法原理及编程实现–03.全链接 . 4.深度...
  • drilistbox
  • drilistbox
  • 2018年02月24日 14:05
  • 288

零基础入门深度学习(5) - 循环神经网络

无论即将到来的是大数据时代还是人工智能时代,亦或是传统行业使用人工智能在云上处理大数据的时代,作为一个有理想有追求的程序员,不懂深度学习(Deep Learning)这个超热的技术,会不会感觉马上就o...
  • qq_27245709
  • qq_27245709
  • 2017年06月09日 13:22
  • 573

神经网络入门之矢量化

矢量化 这部分教程将介绍三部分: 矢量的反向传播梯度检查动量 在先前的教程中,我们已经使用学习了一个非常简单的神经网络:一个输入数据,一个隐藏神经元和一个输出结果。在这篇教程中,...
  • SpadgerZ
  • SpadgerZ
  • 2017年06月28日 11:26
  • 457

循环神经网络教程第3部分 BPTT

在本教程的前面部分,我们从头实现了RNN,但没有详细介绍如何通过BPTT算法计算梯度。在本部分中,我们将简要概述BPTT并解释它与传统反向传播的区别。然后我们将尝试理解消失梯度问题,这导致了LSTM和...
  • u013713117
  • u013713117
  • 2016年12月31日 12:23
  • 904

基于时间的反向传播算法和梯度消失 -part3

本文翻译自 前文从零开始实现了RNN,但是没有详细介绍Backpropagation Through Time (BPTT) 算法如何实现梯度计算。这篇文章将详细介绍BPTT。之后会分析梯度消失问题...
  • Thinking_boy1992
  • Thinking_boy1992
  • 2016年11月12日 11:33
  • 1737

《Deep Learning》学习5——循环神经网络梯度计算

很久以前看过循环神经网络的相关知识,但一直没有推梯度。这次仔细的看了一遍梯度推导。关于循环神经网络的前向理论,http://blog.csdn.net/juanjuan1314/article/det...
  • juanjuan1314
  • juanjuan1314
  • 2017年09月04日 20:19
  • 578
收藏助手
不良信息举报
您举报文章:详解循环神经网络(Recurrent Neural Network)
举报原因:
原因补充:

(最多只允许输入30个字)