循环神经网络(RNN)

1.单向RNN结构


RNN结构图

         上图为一个普通的RNN结构,和DNN不同的是,RNN可以保留之前的信息,也就是在计算t石时刻隐藏层s_t的值时上一时刻s_{t-1}也要参与计算,即当前时刻的隐藏层的值由当前时刻的输入和上一时刻的隐藏层值共同决定,由递推的思想就可以得出,t-1时刻值与t-2关,t-2与t-3有关,....即可以将前面的信息一直保存到当前时刻(取决于权重W)

        以t时刻的数据为例,其他的计算方式与上述一样,x_t表示的是t时刻的输入,s_t表示的是t时刻隐藏层的值,o_t表示的是t时刻的输出。

                                                             o_t=g(Vs_t) \tag{1}

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

          上式中V,U,W均为矩阵,故用大写字母表示,s_t,x_t,s_{t-1}均为向量,故用小写字母表示.(1)式是输出层的计算公式,输出层是一个全连接层,它的每个节点都与循环层的每个节点相连,V是输出层的权重矩阵,g是激活函数,(2)式是循环层的计算公式,U是输入x的权重矩阵,W是上一次的值s_{t-1}作为这一次的输入的权重矩阵,f是激活函数。

将(1)与(2)合并,可以得到:

o_t=g(Vs_t)=g(Vf(Ux_t+Ws_{t-1}))=g(Vf(Ux_t+Wf(Ux_{t-1}+Ws_{t-2})))=.... \tag{3}

从(3)式可以发现,t时刻的输出,与前面的x_{t},x_{t-1},x_{t-2},...,x_1都有关,这就是为什么循环神经网络可以往前看任意多个值的原因。


2.双向RNN

        在机器翻译和其他自然语言处理方面,有时候当前的输出不仅和前面的输入有关,有时与后面的输入也有关,此时就衍生出双向RNN,其结构如下所示:

双向RNN结构图

         双向RNN结构中,隐藏层要保存两个值,一个A参数正向计算,一个A‘参与反向计算,最终的输出y2取决于A2和A2’。以y2为例,说明双向RNN的计算过程:(由于latex水平太烂,A'在公式中打不出来,所以全部用\widetilde{A}来表示)

y_2=g(VA_2+\widetilde{V}\widetilde{A}_2) \tag{4}

A_2和 \widetilde{A}_2的计算过程如下:

A_2=f(WA_1+Ux_2) \tag{5}

\widetilde{A}_2 =f(\widetilde{W}\widetilde{A}_3+\widetilde{U}x_2) \tag{6}

          正向计算时,隐藏层的值s_ts_{t-1}有关,反向计算时(此时的反向计算不是指梯度的反向传播),隐藏层的\widetilde{s}_t\widetilde{s}_{t+1}有关;最终的输出取决于正向与反向计算的加和。将其推广到一般形式,则双向RNN的计算公式如下所示:

o_t=g(Vs_t+\widetilde{V}\widetilde{s}_t) \tag{7}

s_t=f(Ws_{t-1}+Ux_t) \tag{8}

\widetilde{s}_t=f(\widetilde{W}\widetilde{s}_{t+1}+\widetilde{U}s_t) \tag{9}

       从上面三个公式我们可以看到,正向计算和反向计算不共享权重,也就是说U\widetilde{U}W和\widetilde{W}V和\widetilde{V}都是不同的权重矩阵

循环神经网络的训练:BPTT算法

BPTT算法是针对循环层的训练算法,它的基本原理和BP算法是一样的,也包含同样的三个步骤:

前向计算每个神经元的输出值;

反向计算每个神经元的误差项\delta_j值,它是误差函数E对神经元j的加权输入net_j的偏导数;

计算每个权重的梯度。

最后再用随机梯度下降算法更新权重。

用动图讲RNN

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容