循环神经网络RNN

循环神经网络(Recurrent Neural Networks)

RNNs 主要处理时序数据,比如一句话,词与词之间都是有顺序的,因此经常用在NLP领域,比如机器翻译,情感分析等。

一般的RNNs有多个FNN横向连接而成,其中中间有个rnn-cell, 存储的是前面序列的隐含状态s。

最基本的形式,如下图 就相当于三层,第一层是输入x到rnn-cell的连接,第二层是rnn-cell,得到的是隐藏状态s,第三层是rnn-cell到输出o的连接层。

循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵W就是隐藏层上一次的值作为这一次的输入的权重。

把上面的图展开,可以看作是按时间序列展开, 循环神经网络也可以画成下面这个样子

这个网络在t时刻接收到输入Xt之后,隐藏层的值是St,输出值是ot。关键一点是,st的值不仅仅取决于Xt,还取决于St−1。

使用下面的公式来表示循环神经网络的计算方法:

$o_t=g(Vs_t)$ (1)

$s_t=f(Ux_t+Ws_{t-1})$(2)

式1是输出层的计算公式,输出层是一个全连接层,也就是它的每个节点都和隐藏层的每个节点相连。V是输出层的权重矩阵,g是激活函数。

式2是隐藏层的计算公式,它是循环层。U是输入x的权重矩阵,W是上一次的值st−1作为这一次的输入的权重矩阵,f是激活函数。

从上面的公式可以看出,循环层和全连接层的区别就是多了一个权重矩阵W。
若反复把式2代入带式1,我们将得到:

$o_t=g(Vs_t)=g(Vf(Ux_t+Ws_{t-1}))$

$=g(Vf(Ux_t+Wf(Ux_{t-1}+Ws_{t-2 })))$

$=g(Vf(Ux_t+Wf(Ux_{t-1}+Wf(Ux_{t-2}+Ws_{t-3 }))))$

从上面可以看出,循环神经网络的输出值ot,是受前面历次输入值xt、xt−1、xt−2…的影响的,这就是为什么循环神经网络可以往前看任意多个输入值的原因。

原文地址:https://www.cnblogs.com/xmeo/p/7235074.html