1、有向图,主要是引入了复合函数链式求导的知识,分别引入了单变量的链式求导和多变量的链式求导。
引入这个,主要是为了后面神经网络后向传播时,更新参数使用的
为什么引入
为什么要引入RNN?
因为之前介绍多层感知机、CNN都只能够处理结构化的数据,在某个时刻的数据,输入到一个模型中去,我们能够利用这些数据对因变量的状态进行预测(分类和回归),但是现实生活中往往存在跟时间相关的、且长短不一(非固定长度)数据,所以我们引入了RNN循环神经网络来处理序列类型的数据。通过循环神经网络,不仅能够利用当前的数据进行预测,而且也能够利用到之前的数据。从对数据利用率的角度来讲,对数据的利用率增大。
RNN原理
首先介绍RNN循环神经网络的原理。
所谓的网络,依旧是多层的,从前面的层往后面层进行矩阵相乘,并且加上激活函数,输出预测值,并且估计出预测值和实际值之间的损失,利用损失计算出梯度,使用一些参数更新方法(Adam, RMSprop)更优化器来反向传播更新参数。最后得到一个理想的输出。
所谓的“循环”,在于权值不停地在不同的时间点(t-1, t, t+1)上进行乘积,每个事件序列使用到的对输入数据的处理U,对向向下一个神经元的传播W、以及对每个时刻输出的权重矩阵V, 其中U, W, V都是一致的。不同权重之间有差异,但是这些权重不会随着时间的推移发生改变,并且,上一个神经元的信息,可以通过中间的传递矩阵W传递到下一个时刻的神经元中去。
![5.24](https://www.researchgate.net/profile/Tao_Jiang10/publication/320441691/figure/download/fig4/AS:631629156454420@1527603534434/A-RNN-architecture-that-considers-the-extracted-features-in-the-former-state-as-the-one.png)
其中每一个RNN的层是第一个图片这里所示,多个层,如第二个图片这里所示。
关于一层神经元传递的方式,如下所示:
h
t
=
ϕ
(
Y
x
t
+
W
h
t
−
1
+
b
)
o
t
=
V
h
t
+
c
y
t
=
σ
(
o
t
)
\begin{aligned} h_t &= \phi(Y x_t + W h_{t-1} + b) \\ o_t &= V h_t + c \\ y_t &= \sigma (o_t) \end{aligned}
htotyt=ϕ(Yxt+Wht−1+b)=Vht+c=σ(ot)
其中
h
t
h_t
ht是隐藏层单元的取值,
o
t
o_t
ot是当前的加权和,
y
t
y_t
yt是被激活后的输出值,j激活函数
σ
\sigma
σ一般是softmax,
TODO:介绍前向和后向传播的原理(主要是公式推导)
RNN 的变体
因为RNN有两个问题,一个是梯度爆炸,一个是梯度消失。
关于梯度爆炸,解决的方式比较粗暴,使用简单的剪切法,当变量超出某个边界时,可以将这个变量的取值设置为边界;
关于梯度消失,解决的方法一般有两个,一个是改变激活函数,一个是改变网络的结构。
关于改变激活函数,因为sigmoid激活函数大部分的激活函数的导数取值都在(0, 0.25]之间,当网络层数变深时,乘积的基数都小于0,这会导致后向传播更新参数时会使得参数趋于0,进而导致参数不再变化,这不利于找到最优的参数。
激活函数,可以使用导数不小于0的,比如使用ReLU激活函数,当变量取值大于0时,导数等于1。
注意:因为当取值小于0时,ReLU激活函数取值为0,这回造成某些单元永远都不会被激活。所以,之后在选择学习率时,尽可能选择小的学习率,让参数减小的速度尽可能缓慢。
另一个可以改变网络结构,这就是之后介绍的LSTM网络,LSTM网络引入了两个门,并且引入了带有前面神经元信息的神经元输出。它能够记忆的信息会变多,缓解了梯度消失的问题。
再接着介绍peephole LSM, GRU等基于LSTM的循环神经网络。前者主要是允许查看们曾单元状态,后者将隐藏状态和单元状态合并为一个信息通道。
RNN的应用
语音识别、情感分析、机器翻译、机器创作等。