我是靠谱客的博主 结实西牛,最近开发中收集的这篇文章主要介绍深度学习算法原理——循环神经网络RNN1. 概述2. 算法原理参考文献,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. 概述

循环神经网络(Recurrent Neural Networks, RNN)主要用于时序数据,最常见的时序数据如文章,视频等, t t t时刻的数据与 t − 1 t-1 t1时刻的数据存在内在的联系。RNN模型能够对这样的时序数据建模。

2. 算法原理

RNN模型的基本结构如下所示(图片来自参考文献):

在这里插入图片描述
如上图所示,循环神经网络通过使用自带反馈的神经元,能够处理任意长度的时序数据,对此结构按照时间展开的形式如下所示(图片来自参考文献):

在这里插入图片描述

2.1. RNN的结构

上图中给出了RNN的内部结构,RNN根据输入输出主要可以分为以下三种:

  • 多输入单输出,如文本的分类问题;
  • 单输入多输出,如描述图像;
  • 多输入多输出,又分为等长或者不等长两种情况,等长如机器作诗,不等长如seq2seq模型;

这里以多输入单输出的情况为例,多输入单输出的具体结构如下所示:

在这里插入图片描述

2.2. RNN的计算过程

假设对于一个长度为 T T T的序列 { x 1 , x 2 , ⋯   , x T } left { x_1,x_2,cdots ,x_T right } {x1,x2,,xT},其中 x i = ( x i , 1 , x i , 2 , ⋯   , x i , n ) x_i=left ( x_{i,1},x_{i,2},cdots ,x_{i,n} right ) xi=(xi,1,xi,2,,xi,n)是一个 n n n维的向量,假设RNN的输入 x x x的维度为 n × 1 ntimes 1 n×1,隐含层状态 h t h_t ht的维度为 H × 1 Htimes 1 H×1,RNN的状态更新公式为:

h t = f ( U h t − 1 + W x t + b ) h_t=fleft ( Uh_{t-1}+Wx_t+b right ) ht=f(Uht1+Wxt+b)

通常 h 0 h_0 h0会设置为全 0 0 0的向量。模型中的参数 U U U的维度为 H × H Htimes H H×H W W W的维度为 H × n Htimes n H×n b b b的维度为 H × 1 Htimes 1 H×1,对于具体的分类问题,其输出为:

y ^ = s o f t m a x ( W o h t + b o ) hat{y}=softmax(W_oh_t + b_o) y^=softmax(Woht+bo)

假设对于分类问题有 c c c个类别,则参数 W o W_o Wo的维度为 c × H ctimes H c×H b o b_o bo的维度为 c × 1 ctimes 1 c×1。最终的损失函数为:

J ( U , W , b , W o , b o ) = 1 m ∑ i = 1 m L ( y ( i ) , y ^ ( i ) ) Jleft ( U,W,b,W_o,b_o right )=frac{1}{m}sum _{i=1}^mLleft ( y^{(i)},hat{y}^{(i)} right ) J(U,W,b,Wo,bo)=m1i=1mL(y(i),y^(i))

其中

L ( y ( i ) , y ^ ( i ) ) = − ∑ j = 1 c y j ( i ) l o g   y ^ j ( i ) Lleft ( y^{(i)},hat{y}^{(i)} right )=-sum_{j=1}^{c}y_j^{(i)}log: hat{y}_j^{(i)} L(y(i),y^(i))=j=1cyj(i)logy^j(i)

2.3. RNN中参数的求解

对于RNN模型,通常使用BPTT(BackPropagation Through Time)的训练方式,BPTT也是重复的使用链式法则,对于RNN而言,损失函数不仅依赖于当前时刻的输出层,也依赖于下一时刻。为了简单起见,以一个样本为例,此时的损失函数可以记为 L ( y , y ^ ) Lleft ( y,hat{y} right ) L(y,y^),模型的参数为 U , W , b , W o , b o U,W,b,W_o,b_o U,W,b,Wo,bo,具体的求解过程如下所示:

首先对 y ^ hat{y} y^重新定义,样本属于第 ( i ) (i) (i)个类别的预测值为:

y ^ ( i ) = e W o i h t + b o i ∑ l = 1 c e W o l h t + b o l hat{y}_{(i)}=frac{e^{W_{oi}h_t+b_{oi}}}{sum _{l=1}^{c}e^{W_{ol}h_t+b_{ol}}} y^(i)=l=1ceWolht+boleWoiht+boi

∂ L ∂ W o i frac{partial L}{partial W_{oi}} WoiL ∂ L ∂ b o i frac{partial L}{partial b_{oi}} boiL分别为:

∂ L ∂ W o i = − ( y ( i ) − y ^ ( i ) ) h t frac{partial L}{partial W_{oi}}=-left ( y_{(i)}-hat{y}_{(i)} right )h_t WoiL=(y(i)y^(i))ht

∂ L ∂ b o i = − ( y ( i ) − y ^ ( i ) ) frac{partial L}{partial b_{oi}}=-left ( y_{(i)}-hat{y}_{(i)} right ) boiL=(y(i)y^(i))

假设 f f f为tanh,而 t a n h ( a ) tanh(a) tanh(a)的导数为 1 − t a n h ( a ) 2 1-tanh(a)^2 1tanh(a)2,以 ∂ L ∂ U frac{partial L}{partial U} UL为例:

∂ L ∂ U = ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ h t ⋅ ∂ h t ∂ U + ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ h t ⋅ ∂ h t ∂ h t − 1 ⋅ ∂ h t − 1 ∂ U + ⋯ + ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ h t ⋅ ∂ h t ∂ h t − 1 ⋯ ∂ h 1 ∂ h 0 frac{partial L}{partial U}=frac{partial L}{partial hat{y}}cdot frac{partial hat{y}}{partial h_t}cdot frac{partial h_t}{partial U}+frac{partial L}{partial hat{y}}cdot frac{partial hat{y}}{partial h_t}cdot frac{partial h_t}{partial h_{t-1}}cdot frac{partial h_{t-1}}{partial U}+cdots +frac{partial L}{partial hat{y}}cdot frac{partial hat{y}}{partial h_t}cdot frac{partial h_t}{partial h_{t-1}}cdots frac{partial h_1}{partial h_0} UL=y^Lhty^Uht+y^Lhty^ht1htUht1++y^Lhty^ht1hth0h1

∂ h t ∂ h t − 1 = [ 1 − t a n h ( h t ) 2 ] ⋅ U frac{partial h_t}{partial h_{t-1}}=left [ 1-tanhleft ( h_t right )^2 right ]cdot U ht1ht=[1tanh(ht)2]U,这是个小于1的数,从上面的公式我们发现,时序数据越长,后面的梯度就趋于0。

2.4. RNN存在的问题

从上述的BPTT过程来看,RNN存在长期依赖的问题,由于反向传播的过程中存在梯度消失或者爆炸的问题,简单的RNN很难建模长距离的依赖关系。

参考文献

  • Understanding LSTM Networks

最后

以上就是结实西牛为你收集整理的深度学习算法原理——循环神经网络RNN1. 概述2. 算法原理参考文献的全部内容,希望文章能够帮你解决深度学习算法原理——循环神经网络RNN1. 概述2. 算法原理参考文献所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部