了解RNN以前,神经网络的知识是前提,若是想了解神经网络,能够去参考一下我以前写的博客:数据挖掘入门系列教程(七点五)之神经网络介绍 and 数据挖掘入门系列教程(八)之使用神经网络(基于pybrain)识别数字手写集MNISThtml
这篇博客介绍RNN的原理,同时推荐你们去看李宏毅老师的课程:ML Lecture 21-1: Recurrent Neural Network (Part I)。基本上看完他的课程,也就没有必要看这篇博客了。算法
RNN全称Recurrent Neural Network ,中文名为循环神经网络(亦或称递归神经网络)。相信你们在看这篇博客以前都已经简单的了解过RNN。将RNN说的简单一点,就是进行预测(或者回归)的时候,不只要考虑到当前时刻的输入,还要考虑上一个时刻的输入(甚至有些RNN的变种还会考虑将来的状况)。换句话说,预测的结果不只与当前状态有关,还与上一个时刻的状态有关。网络
RNN用于处理时序信息 。而在传统的神经网络中,咱们认为输入的 \(x_1,x_2,x_3\),是相互独立的:好比说在Iris分类中,咱们认为鸢尾花的长宽是独立的,之间不存在先后序列逻辑关系。架构
尽管传统的神经网络在预测中可以取得不错的成绩(好比说人脸识别等等),可是对于如下方式情景可能就心有余而力不足了。框架
当咱们想要预测一段话“小丑竟是我自____”时,咱们必须根据前文的意思来predict。而RNN之因此叫作循环(recurrent),这是由于它的预测会考虑之前的信息。换句话说,也就是RNN具备memory,它“记得”以前计算后的状况。函数
在知乎全面理解RNN及其不一样架构上,说了一个很形象的例子:学习
以捏陶瓷为例,不一样角度至关于不一样的时刻:ui
- 若用前馈网络:网络训练过程至关于不用转盘,而是徒手将各个角度捏成想要的形状。不只工做量大,效果也难以保证。
- 若用递归网络(RNN):网络训练过程至关于在不断旋转的转盘上,以一种手势捏造全部角度。工做量下降,效果也可保证。
RNN的原理图,咱们最常见的即是如左图所示,可是实际上将它展开,即是以下右图所示。spa
在RNN中,咱们能够将黄框称之为一个layer,全部的layer的参数在一个batch中是相同的(参数共享),也就是说,上图中的 \(U,W,V\) 等参数在某个batch所有相同。(经过一个batch的训练以后,通过反向传播,参数会发生改变)3d
Layer的层数根据本身的须要来定,举个例子,好比说咱们分析的句子是5个单词构成的句子,那么layer的层数即是5,每个layer对应一个单词。
上图既有多个输入\(X_{t-1},X_{t},X_{t+1}\) , 也能够有多个输出\(O_{t-1},O_{t},O_{t+1}\) , 可是实际上输出能够根据实际的须要而定,既能够为多个输出,也能够只有一个输出,有以下几种:
Type of RNN | Illustration | Example |
---|---|---|
One-to-one \(T_x=T_y=1\) | ![]() |
Traditional neural network |
One-to-many \(T_x=1, T_y>1\) | ![]() |
Music generation |
Many-to-one \(T_x>1, T_y=1\) | ![]() |
Sentiment classification |
Many-to-many \(T_x=T_y\) | ![]() |
Name entity recognition |
Many-to-many \(T_x\neq T_y\) | ![]() |
Machine translation |
Gif图以下所示:
下图是李宏毅老师在课堂上讲的一个例子。
下面是来自Recurrent Neural Networks cheatsheet对RNN原理的解释:
\(a^{<t>}\) 和 \(y^{<t>}\) 的表达式以下所示:
\(W_{a x}, W_{a a}, W_{y a}, b_{a}, b_{y}\) 在时间上是共享的:也就是说,在一个batch中,不管是哪个layer,其\(W_{a x}, W_{a a}, W_{y a}, b_{a}, b_{y}\)都是相同的(shared temporally)。固然,通过一个batch的训练以后,其值会由于反向传播而发生改变。
\(g_{1}, g_{2}\) 皆为激活函数(好比说tanh,sigmoid)
$ \mathcal{L}$ 为可微分的损失函数,好比交叉熵,其中\(y^{<t>}\)为t时刻正确的词语,\(\hat{y}^{<t>}\)为t时刻预测的词语。
反向传播目的就是求预测偏差 \(E\) 关于全部参数 \((U, V, W)\) 的梯度, 即 \(\frac{\partial E}{\partial U}, \frac{\partial E}{\partial V}\) 和 \(\frac{\partial E}{\partial W}\) 。关于具体的推导能够参考循环神经网络(RNN)模型与前向反向传播算法。
知道梯度后,即可以对参数系数进行迭代更新了。
在上述博客中,简单的对RNN进行了介绍,介绍了RNN做用,以及部分原理。而在下篇博客中,我将介绍如何使用keras构建RNN模型写唐诗。🤭