循环神经网络简介

循环神经网络(recurrent neural network)源自于1982年由Saratha Sathasivam 提出的霍普菲尔德网络。
RNN用于解决训练样本输入是连续的序列,且序列的长短不一的问题,比如基于时间序列的问题。基础的神经网络只在层与层之间建立了权连接,RNN最大的不同之处就是在层之间的神经元之间也建立的权连接。RNN神经网络的结构如下:

X
RNN
Y
h0
Func_W
X_t-1
h_t-1
Func_W
X_t
h_t
Func_W
X_t+1
h_t+1

RNN每个神经元的计算使用相同的权重参数和函数。图中的Func_W 表示:
   h t = f W ( h t 1 ,    x t ) h_t = f_W(h_{t-1},\; x_t)

当前隐藏层状态h(t)由当前的输入x(t)和上一层的输出h(t-1)决定。

一个简单的示例:

在这里插入图片描述

RNN的种类和常见用途

在这里插入图片描述
用途:

  • 语言模型与文本生成(Language Modeling and Generating Text)
  • 机器翻译(Machine Translation)
  • 情感分类(Sentiment Classification)
  • 语音识别(Speech Recognition)
  • Image Captioning (Generating Image Descriptions)
  • 时间序列分析

设网络在t时刻接收到输入 X t X_t 之后,隐藏层的值是 S t S_t ,输出值是 O t O_t ,那么
经典RNN的运算过程可以表示为:
     O t = g ( V s t ) ( 1 ) S t = f ( U x t + W s t 1 ( 2 ) \begin{aligned} O_t &=g(V s_t) \qquad\qquad\quad (1)\\ S_t &= f(U x_t+W s_{t-1} \quad (2)\\ \end{aligned}
式1是输出层的计算公式,输出层是一个全连接层,也就是它的每个节点都和隐藏层的每个节点相连。V是输出层的权重矩阵,g是激活函数。式2是隐藏层的计算公式,它是循环层。U是输入x的权重矩阵,W是上一次的值 S t 1 S_{t-1} 作为这一次的输入的权重矩阵,f是激活函数。
如果反复把式2带入到式1,我们将得到:
     o t = g ( V s t ) = V f ( U x t + W s t 1 ) = V f ( U x t + W f ( U x t 1 + W s t 2 ) ) = V f ( U x t + W f ( U x t 1 + W f ( U x t 2 + W s t 3 ) ) ) = V f ( U x t + W f ( U x t 1 + W f ( U x t 2 + W f ( U x t 3 + . . . ) ) ) ) \begin{aligned} o_t &= g(Vs_t)\\ &=Vf(Ux_t+Ws_{t-1})\\ &=Vf(Ux_t+Wf(Ux_{t-1}+Ws_{t-2}))\\ &=Vf(Ux_t+Wf(Ux_{t-1}+Wf(Ux_{t-2}+Ws_{t-3})))\\ &=Vf(Ux_t+Wf(Ux_{t-1}+Wf(Ux_{t-2}+Wf(Ux_{t-3}+...)))) \end{aligned}

从上面可以看出,循环神经网络的输出值,是受前面历次输入值 x t , x t 2 , x t 3 , . . . x_t,x_{t-2},x_{t-3},... 影响的,这就是为什么循环神经网络可以往前看任意多个输入值的原因。

simple RNN参数个数的计算
在这里插入图片描述
The entities W , U and V are shared by all steps of the RNN and these are the only parameters in the model described in the figure. Hence number of parameters to be learnt while training =
d i m ( W ) + d i m ( V ) + d i m ( U ) dim(W)+ dim(V)+ dim(U)

Suppose input size is m, hidden size is n, output size is k.
Then the parameters you need to train is:
n^2 + mn + kn

RNN的局限

理论上循环神经网络可以支持任意长度的序列,然而在实际中,如果序列过长会导致优化时出现梯度消散的问题(the vanishing gradient problem),所以实际中一般会规定一个最大长度,当序列长度超过规定长度之后会对序列进行截断。

梯度弥散,在RNN属于重要问题,为此便提出了以LSTM、GRU等结构的变种,来解决RNN短期记忆的瓶颈。
梯度反向传播时,若初始参数较大,则较大数相乘,将导致梯度爆炸,然而梯度爆炸相对于梯度弥散较容易解决,通常加入梯度裁剪即可一定程度缓解。

Ref:
https://www.cnblogs.com/wuliytTaotao/p/9512963.html
零基础入门-循环神经网络

More:

RNN用于文本生成可以写歌词,写诗等,已经被Andrew Karpathy基于RNNs的字符级别的语言模型实现了。
这有个项目可以玩玩:
Tensorflow实现Multi-language Char RNN

使用[github.com/wandouduoduo/SunRnn]用金庸的小说训练一下,生成效果如下:

  沐剑屏道:“你们不是你们的事,我是你的老婆。”
  阿珂道:“我们的师太说了,我们是不是?”
  韦小宝笑道:“我说,我这个小丫头,不知道是不是?”
  白衣尼道:“那么这是不是的。我说这些人说,你这样一时,你不是,不是他们一个个不好。”韦小宝笑道:“这位老婆,你这样不能,我说是什么?”阿珂道:“那可不用。”韦小宝道:“你是什么事?”沐剑屏道:“你……你说我不是你的?”韦小宝道:“你不是不是,你们不会说。”阿珂怒道:“你说你不知道,不能说,我不知道了。”
  韦小宝道:“这一辈子,你们一定也不能跟他说话,你是你是你的老婆?这位女施主,你这样一个个是什么人?”
  阿珂怒道:“我说不是,我不是我的老婆。”
  白衣尼微微一笑,说道:“我们的武功是不能当了。”阿珂一怔,道:“不是!”韦小宝道:“我不是,这一招也不是不错,我们也不会说,我是谁?”阿珂道:“我们是不是?”韦小宝道:“这些喇嘛是一个个,也不会去,不知道了,那是谁?”
  那喇嘛笑道:“我这样好,我们不是,是我们的师叔。”那喇嘛道:“是。”
  韦小宝道:“那是不好。我们这样是不能说。”

跟原著挺像的哈哈。

猜你喜欢

转载自blog.csdn.net/rover2002/article/details/106219871