循环神经网络(RNN)模型与前向反向传播算法

作者:刘建平

编辑:黄俊嘉

前 言

在前面我们讲到了DNN,以及DNN的特例CNN的模型和前向反向传播算法,这些算法都是前向反馈的,模型的输出和模型本身没有关联关系。今天我们就讨论另一类输出和模型间有反馈的神经网络:循环神经网络(Recurrent Neural Networks ,以下简称RNN),它广泛的用于自然语言处理中的语音识别,手写书别以及机器翻译等领域。

01

RNN概述

在前面讲到的DNN和CNN中,训练样本的输入和输出是比较的确定的。但是有一类问题DNN和CNN不好解决,就是训练样本输入是连续的序列,且序列的长短不一,比如基于时间的序列:一段段连续的语音,一段段连续的手写文字。这些序列比较长,且长度不一,比较难直接的拆分成一个个独立的样本来通过DNN/CNN进行训练。

而对于这类问题,RNN则比较的擅长。那么RNN是怎么做到的呢?RNN假设我们的样本是基于序列的。比如是从序列索引1到序列索引τ的。对于这其中的任意序列索引号t,它对应的输入是对应的样本序列中的x(t)。而模型在序列索引号t位置的隐藏状态h(t),则由x(t)和在t−1位置的隐藏状态h(t−1)共同决定。在任意序列索引号t,我们也有对应的模型预测输出o(t)。通过预测输出o(t)和训练序列真实输出y(t),以及损失函数L(t),我们就可以用DNN类似的方法来训练模型,接着用来预测测试序列中的一些位置的输出。

下面我们来看看RNN的模型。

02

RNN模型

RNN模型有比较多的变种,这里介绍最主流的RNN模型结构如下:

上图中左边是RNN模型没有按时间展开的图,如果按时间序列展开,则是上图中的右边部分。我们重点观察右边部分的图。

这幅图描述了在序列索引号t 附近RNN的模型。其中:

1)x(t)

代表在序列索引号t时训练样本的输入。同样的,x(t−1)和x(t+1)代表在序列索引号t−1和t+1时训练样本的输入。

2)h(t)

代表在序列索引号t时模型的隐藏状态。h(t)由x(t)和h(t−1)共同决定。

3)o(t)

代表在序列索引号t时模型的输出。o(t)只由模型当前的隐藏状态h(t)决定。

4)L(t)

代表在序列索引号t 时模型的损失函数。

5)y(t)

代表在序列索引号t 时训练样本序列的真实输出。

6)U,W,V

这三个矩阵是我们的模型的线性关系参数,它在整个RNN网络中是共享的,这点和DNN很不相同。 也正因为是共享了,它体现了RNN的模型的“循环反馈”的思想。

03

RNN前向传播算法

有了上面的模型,RNN的前向传播算法就很容易得到了。

对于任意一个序列索引号t,我们隐藏状态h(t)由x(t)和h(t−1)得到:

其中σ为RNN的激活函数,一般为tanh, b为线性关系的偏倚。序列索引号t时模型的输出o(t)的表达式比较简单:

在最终在序列索引号t时我们的预测输出为:

通常由于RNN是识别类的分类模型,所以上面这个激活函数一般是softmax。

通过损失函数L(t),比如对数似然损失函数,我们可以量化模型在当前位置的损失,即y^(t)和y(t)的差距。

04

RNN反向传播算法推导

有了RNN前向传播算法的基础,就容易推导出RNN反向传播算法的流程了。RNN反向传播算法的思路和DNN是一样的,即通过梯度下降法一轮轮的迭代,得到合适的RNN模型参数U,W,V,b,c。由于我们是基于时间反向传播,所以RNN的反向传播有时也叫做BPTT(back-propagation through time)。当然这里的BPTT和DNN也有很大的不同点,即这里所有的U,W,V,b,c在序列的各个位置是共享的,反向传播时我们更新的是相同的参数。

为了简化描述,这里的损失函数我们为对数损失函数,输出的激活函数为softmax函数,隐藏层的激活函数为tanh函数。

对于RNN,由于我们在序列的每个位置都有损失函数,因此最终的损失L为:

其中V,c,的梯度计算是比较简单的:

但是W,U,b的梯度计算就比较的复杂了。从RNN的模型可以看出,在反向传播时,在在某一序列位置t的梯度损失由当前位置的输出对应的梯度损失和序列索引位置t+1时的梯度损失两部分共同决定。对于W在某一序列位置t的梯度损失需要反向传播一步步的计算。我们定义序列索引t位置的隐藏状态的梯度为:

这样我们可以像DNN一样从

递推

对于

,由于它的后面没有其他的序列索引了,因此有:

有了

,计算W,U,b就容易了,这里给出W,U,b的梯度计算表达式:

除了梯度表达式不同,RNN的反向传播算法和DNN区别不大,因此这里就不再重复总结了。

05

RNN小结

上面总结了通用的RNN模型和前向反向传播算法。当然,有些RNN模型会有些不同,自然前向反向传播的公式会有些不一样,但是原理基本类似。

RNN虽然理论上可以很漂亮的解决序列数据的训练,但是它也像DNN一样有梯度消失时的问题,当序列很长的时候问题尤其严重。因此,上面的RNN模型一般不能直接用于应用领域。在语音识别,手写书别以及机器翻译等NLP领域实际应用比较广泛的是基于RNN模型的一个特例LSTM,下一篇我们就来讨论LSTM模型。

06

参考资料

  • Neural Networks and Deep Learning by By Michael Nielsen (http://neuralnetworksanddeeplearning.com/index.html)
  • Deep Learning, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville
  • UFLDL Tutorial (http://ufldl.stanford.edu/tutorial/)
  • CS231n Convolutional Neural Networks for Visual Recognition, Stanford (http://cs231n.github.io/convolutional-networks/)
  • 转载于:

https://www.cnblogs.com/pinard/p/6509630.html

END

原文发布于微信公众号 - 机器学习算法工程师(Jeemy110)

原文发表时间:2018-08-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法与Python学习

干货 | 深度学习之CNN反向传播算法详解

微信公众号 关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 前言 在卷积神经网络(C...

1.3K70
来自专栏YoungGy

风格转换简介

风格转换,是把一张图片转化成同内容但包含某风格的新图片。本文将介绍如何让机器学习风格转换,包含两种方法:优化问题求解、转化网络求解。

46350
来自专栏磐创AI技术团队的专栏

一文带你读懂激活函数

Sigmoid函数本质上是一种常用的激活函数,是神经元最重要的组成部分。那什么是激活函数呢?激活函数有什么作用呢?常见的激活函数都有哪些?以及如何选择合适的...

32240
来自专栏机器学习算法与Python学习

线性分类器

线性分类 上一篇笔记介绍了图像分类问题。图像分类的任务,就是从已有的固定分类标签集合中选择一个并分配给一张图像。我们还介绍了k-Nearest Neighbor...

38990
来自专栏计算机视觉战队

每日一学——线性分类笔记(上)

线性分类 上一篇笔记介绍了图像分类问题。图像分类的任务,就是从已有的固定分类标签集合中选择一个并分配给一张图像。我们还介绍了k-Nearest Neighbor...

34650
来自专栏机器学习和数学

[深度学习] AlexNet,GoogLeNet,VGG,ResNet简化版

总结了一下这几个网络的比较重要的点,像这些经典的网络,面试的时候,估计会经常问到,怎么用自己的话说出来?不知道大家想过没有。 今天有空就总结了一下,尽量简单和通...

59690
来自专栏重庆的技术分享区

吴恩达-神经网络和深度学习( 第三周 浅层神经网络:)

17640
来自专栏Petrichor的专栏

深度学习: 目标函数

目标函数 (object function) = 损失函数 (loss function) = 代价函数 (cost function)

45940
来自专栏机器学习算法原理与实践

卷积神经网络(CNN)反向传播算法

    在卷积神经网络(CNN)前向传播算法中,我们对CNN的前向传播算法做了总结,基于CNN前向传播算法的基础,我们下面就对CNN的反向传播算法做一个总结。在...

24100
来自专栏瓜大三哥

图像分割(一) 之简介

图像分割就是将图像划分为若干个互不相交的小区域的过程,所谓小区域是某种意义下具有共同属性的像素的连通集合。 基于阈值分割方法实际上是输入图像f到输出图像g的变换...

39450

扫码关注云+社区

领取腾讯云代金券