递归神经网络(Recurrent Neural Networks,RNN)
在深度学习领域,传统的多层感知机(MLP)具有出色的表现,取得了许多成功,它曾在许多不同的任务上——包括手写数字识别和目标分类上创造了记录。甚至到了今天,MLP在解决分类任务上始终都比其他方法要略胜一筹。尽管如此,大多数专家还是会达成共识:MLP可以实现的功能仍然相当有限。究其原因,人类的大脑有着惊人的计算功能,而“分类”任务仅仅是其中很小的一个组成部分。我们不仅能够识别个体案例,更能分析输入信息之间的整体逻辑序列。这些信息序列富含有大量的内容,信息彼此间有着复杂的时间关联性,并且信息长度各种各样。这是传统的MLP所无法解决的,RNN 正式为了解决这种序列问题应运而生,其关键之处在于当前网络的隐藏状态会保留先前的输入信息,用来作当前网络的输出。
许多任务需要处理序列数据,比如Image captioning, speech synthesis, and music generation 均需要模型生成序列数据,其他领域比如 time series prediction, video analysis, and musical information retrieval 等要求模型的输入为序列数据,其他任务比如 机器翻译,人机对话,controlling a robot 的模型要求输入输出均为序列数据。 RNN 模型可以用来处理序列数据, RNN 包含了大量参数,且难于训练(时间维度的 vanishing/exploding),所以出现一系列对 RNN 优化 ,比如网络结构、求解算法与并行化。今年来 bidirectional RNN (BRNN)与 LSTM 在 image captioning, language translation, and handwriting recognition 这几个方向上有了突破性进展 。下面从 RNN 开始来逐一介绍这些网络模型。
RNN 的结构不同于 MLP ,输入层与来自序列中上一元素隐层的信号共同作用到当前的隐藏层,如下图所示:

下图能更清楚的展示 RNN 的结构:
看下面关于 RNN BP分析之前,请确保之前看过 多层感知机及其BP算法(Multi-Layer Perceptron),此文为 RNN BP 的基础,现在来看 RNN 的 BP 算法,对于长度为 $T$ 的序列 $x$ ,RNN 的输入层大小为 $I$ ,隐层大小为 $H$ ,输出层大小为 $K$ ,可以得到上图中三个矩阵的维度分别为 : $U \in \mathbb{R}^{I \times H} , W \in \mathbb{R}^{H \times H} , V \in \mathbb{R}^{H \times K} $ ,这里 $x^t$ 代表序列第 $t$ 项 的输入, $a^t$ 代表第 $t$ 项隐层的输入,$b^t$ 代表对 $a^t$ 做非线性激活也即为神经网络的输出 ,这里 $a^t$ 由输入层 $x^t$ 与 上一层隐层的输出 $b^{t-1}$ 共同决定:
\[a_h^t =\sum_iw_{ih}x_i^t +\sum_{h'}w_{h'h}b_{h'}^{t-1}\]
\[b_h^t = f(a_h^t)\]
这里 序列从状态 $t=1$开始,一般设置 $b^0 = 0 $ 即可,接下来将隐层传导至输出层即可,通常 RNN 的输出层采用与传统 MLP 的类似的 $softmax$ 来进行分类任务.即输出层的输出为:
\[a_k^t = \sum_hw_{hk}b_h^t\]
\[y_k^t = \frac{e^{a_k^t}}{\sum_j e^{a_j^t}}\]
注意 RNN 中由于输入时叠加了之前的信号,所以反向传导时不同于传统的 MLP ,因为对于时刻 $t$ 的输入层,其残差不仅来自于输出,还来自于之后的隐层入下图所示:

时刻 $t$ ,RNN 输出层的算残差项同 MLP 为 $ \delta_k^t = y_k^t-z^t_k$,由于前向传导时隐层需要接受上一个时刻隐层的信号,所以反向传导时根据 BPTT 算法,隐层还需接收下一时刻的隐层的反馈:
\[\delta_h^t = f'(a_h^t) \left (\sum_k\delta_k^tw_{hk} + \sum_{h'} \delta^{t+1}_{h'}w_{hh'} \right )\]
当序列长度为 $T$ ,则残差 $\delta^{T+1}$ 均为 0 。并且整个网络其实就只有一套参数 $U$、$V$、$W$ , 对于时刻 $t$ 其倒数分别为:
\[U: \ \frac{\partial O}{\partial w_{ih}}= \frac{\partial O}{\partial a_h^t}\frac{\partial a_h^t}{\partial w_{ih}}=\delta_h^tx_i^t\]
\[V: \ \frac{\partial O}{\partial w_{hk}}= \frac{\partial O}{\partial a_k^t}\frac{\partial a_k^t}{\partial w_{hk}}=\delta_k^tb_h^t\]
\[W: \ \frac{\partial O}{\partial w_{h'h}}= \frac{\partial O}{\partial a_h^t}\frac{\partial a_h^t}{\partial w_{h'h}}=\delta_k^tb_{h'}^t \]
为了方便表示,写成统一的形式(假设对输入层有 $x_i^t = a_i^t =b_i^t$):
\[\frac{\partial O}{\partial w_{hij}}= \frac{\partial O}{\partial a_j^t}\frac{\partial a_j^t}{\partial w_{ij}}=\delta_j^tb_i^t\]
最后,由于 RNN 的递归性 ,对于时刻 $t = 1,2,...,T$ ,将其进行求和即可,下面为最终得 RNN 网络的关于权重参数的导数:
\[\frac{\partial O}{\partial w_{ij}}= \sum_t\frac{\partial O}{\partial a_j^t}\frac{\partial a_j^t}{\partial w_{ij}} = \sum _t \delta_j^tb_i^t\]
Bidirectional RNNs
RNN 中对于当前时刻 t 通常会考虑之前时刻的信息而没有考虑下文的信息,Bidirectional RNNs 克服了这一缺点,其引入了对下文的考虑,其结构如下:

可见 BRNN 引入了一套额外的隐层,但是输入与输出层是共享的,多了一个隐层意味着多了三套参数分别为 $U'$、$V'$、$W'$ 。BRNN 的训练算法类似于 RNN ,forward pass 的过程如下:

backward pass 的过程如下:

计算完残差后,分别对前向参数 $U$、$V$、$W$ 后向参数 $U'$、$V'$、$W'$ 求导即可,至此 BRNN 的训练算法介绍完毕, 目前 ,BRNN 在 NLP 的序列标注任务中取得了极大的成功。
递归神经网络(Recurrent Neural Networks,RNN)的更多相关文章
- 循环神经网络(Recurrent Neural Networks, RNN)介绍
目录 1 什么是RNNs 2 RNNs能干什么 2.1 语言模型与文本生成Language Modeling and Generating Text 2.2 机器翻译Machine Translati ...
- 递归神经网络(Recursive Neural Network, RNN)
信息往往还存在着诸如树结构.图结构等更复杂的结构.这就需要用到递归神经网络 (Recursive Neural Network, RNN),巧合的是递归神经网络的缩写和循环神经网络一样,也是RNN,递 ...
- The Unreasonable Effectiveness of Recurrent Neural Networks (RNN)
http://karpathy.github.io/2015/05/21/rnn-effectiveness/ There’s something magical about Recurrent Ne ...
- Recurrent Neural Networks(RNN) 循环神经网络初探
1. 针对机器学习/深度神经网络“记忆能力”的讨论 0x1:数据规律的本质是能代表此类数据的通用模式 - 数据挖掘的本质是在进行模式提取 数据的本质是存储信息的介质,而模式(pattern)是信息的一 ...
- 《转》循环神经网络(RNN, Recurrent Neural Networks)学习笔记:基础理论
转自 http://blog.csdn.net/xingzhedai/article/details/53144126 更多参考:http://blog.csdn.net/mafeiyu80/arti ...
- 循环神经网络(RNN, Recurrent Neural Networks)介绍(转载)
循环神经网络(RNN, Recurrent Neural Networks)介绍 这篇文章很多内容是参考:http://www.wildml.com/2015/09/recurrent-neur ...
- 循环神经网络(RNN, Recurrent Neural Networks)介绍
原文地址: http://blog.csdn.net/heyongluoyao8/article/details/48636251# 循环神经网络(RNN, Recurrent Neural Netw ...
- 课程五(Sequence Models),第一 周(Recurrent Neural Networks) —— 1.Programming assignments:Building a recurrent neural network - step by step
Building your Recurrent Neural Network - Step by Step Welcome to Course 5's first assignment! In thi ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第一部分)
由于本章过长,分为两个部分,这是第一部分. 这几年提到RNN,一般指Recurrent Neural Networks,至于翻译成循环神经网络还是递归神经网络都可以.wiki上面把Recurrent ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)
本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...
随机推荐
- 数据库(.udl)简单测试连接
当我们烦于打开数据库进行连接的时候,我们可以用udl进行测试连接,并可以获得连接字符串. 1.新建一个txt文件,然后将后缀改成udl保存. 2.双击打开udl文件. 3.进行数据库连接测试. 4.用 ...
- NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64
http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别 ...
- 妙味课堂——HTML+CSS(第四课)(二)
单开一篇来讲一个大点的话题——清浮动 来看下例: <!DOCTYPE html> <html> <head> <meta charset="U ...
- sql server 2008 评估期已过期解决办法
开始-->所有程序-->Microsoft SQL Server 2008-->配置工具-->SQL Server 安装中心-->维护-->版本升级,接着按照提示一 ...
- hdu 1847 Good Luck in CET-4 Everybody!(简单博弈SG)
#include<stdio.h> #include<string.h> #define N 1010 int hash[N]; int sg[N]; void GetSG() ...
- java三种调用方式(同步调用/回调/异步调用)
1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制 ...
- CentOS系统安装tomcat
按照以下步骤操作即可wget http://mirrors.noc.im/apache/tomcat/tomcat-9/v9.0.0.M6/bin/apache-tomcat-9.0.0.M6.tar ...
- sftp的安装和使用
http://blog.srmklive.com/2013/04/24/how-to-setup-sftp-server-ftp-over-ssh-in-ubuntu/ In my previous ...
- 一个字典通过dictionaryWithDictionary 他们的内存指针是不同的
一个字典通过dictionaryWithDictionary 他们的内存指针是不同的 来自为知笔记(Wiz)
- ssh2框架搭建
原文:ssh2框架搭建 struts2+spring4.0+hibernate4.0 4.x版本与3.x版本有较大区别,要配置方法须要注意,用到的jar包如下 文件结构 src/application ...