您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

3.1循环神经网络数学理解

文章目录

    • 1、给网络增加记忆能力
      • 1.1、延时神经网络
    • 1.2、有外部输入的非线性自回归模型
    • 2. 基本循环神经网络
    • 3. 双向循环神经网络
      • 3.1 双向循环神经网络的介绍
    • 4.循环网络在的应用
      • 4.1序列到类别的模式
      • 4.2同步的序列到序列模式
    • 4.3异步的序列到序列模式
    • 5.参数学习
    • 6、长程依赖问题
      • 6.1、梯度爆炸解决方法
      • 6.2、梯度消失解决方法
    • 参考

在前馈神经网络中,信息的传递是单向的,这种限制虽然使得网络变得更容易学习,但在一定程度上也减弱了神经网络模型的能力。在生物神经网络中,神经元之间的连接关系要复杂的多。 前馈神经网络可以看作是一个复杂的函数,每次输入都是独立的,即网络的输出只依赖于当前的输入。但是在很多现实任务中,网络的输入不仅和当前时刻的输入相关,也和其过去一段时间的输出相关。因此,前馈网络难以处理时序数据,比如视频、语音、文本等。时序数据的长度一般是不固定的,而前馈神经网络要求输入和输出的维数都是固定的,不能任意改变。因此,当处理这一类和时序相关的问题时,就需要一种能力更强的模型。

循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络。在循环神经网络中,神经元不但可以接受其它神经元的信息,也可以接受自身的信息,形成具有环路的网络结构。和前馈神经网络相比,循环神经网络更加符合生物神经网络的结构。循环神经网络已经被广泛应用在语音识别、语言模型以及自然语言生成等任务上。循环神经网络的参数学习可以通过随时间反向传播算法来学习。

1、给网络增加记忆能力

为了处理这些时序数据并利用其历史信息,我们需要让网络具有短期记忆能力。而前馈网络是一个静态网络,不具备这种记忆能力。

1.1、延时神经网络

一种简单的利用历史信息的方法是建立一个额外的延时单元,用来存储网络的历史信息(可以包括输入、输出、隐状态等)。比较有代表性的模型是延时神经网络。

延时神经网络是在前馈网络中的非输出层都添加一个延时器,记录最近几次神经元的输出。在第 t t t 个时刻,第 l + 1 l+1 l+1 层神经元和第 l l l 层神经元的最近 p p p 次输出相关,即:
h t ( l + 1 ) = f ( h t ( l ) , h t − 1 ( l ) , . . . , h t − p ( l ) ) h_t^{(l+1)}=f(h_t^{(l)},h_{t-1}^{(l)},...,h_{t-p}^{(l)}) ht(l+1)=f(ht(l),ht1(l),...,htp(l))
延时神经网络在时间维度上共享权值,以降低参数数量。因此对于序列输入来讲,延时神经网络就相当于卷积神经网络

1.2、有外部输入的非线性自回归模型

**自回归模型(Autoregressive Model,AR)**是统计学上常用的一类时间序列模型,用一个变量 y t y_t yt的历史信息来预测自己:
y t = w 0 + ∑ i = 1 p w p y t − i + ϵ t y_t=w_0+\sum_{i=1}^{p}{w_py_{t-i}}+\epsilon_t yt=w0+i=1pwpyti+ϵt
其中 p p p为超参数, w p w_p wp为参数, ϵ t ∼ N ( 0 , σ 2 ) \epsilon_t\sim N(0,\sigma^2) ϵtN(0,σ2)为第t个时刻的噪声,方差 σ 2 \sigma^2 σ2和时间无关。

有外部输入的非线性自回归模型(Nonlinear Autoregressive with Exogenous Inputs Model,NARX)是自回归模型的扩展,在每个时刻 t t t都有一个外部输入 x t x_t xt ,产生一个输出 y t y_t yt 。NARX通过一个延时器记录最近几次的外部输入和输出,第 t t t个时刻的输出 y t y_t yt 为:
y t = f ( x t , x t − 1 , . . . , x t − p , y t − 1 , y t − 2 , . . . , y t − q ) y_t=f(x_t,x_{t-1},...,x_{t-p},y_{t-1},y_{t-2},...,y_{t-q}) yt=f(xt,xt1,...,xtp,yt1,yt2,...,ytq)
其中 f ( ⋅ ) f(·) f() 表示非线性函数,可以是一个前馈网络, p p p q q q为超参数。

2. 基本循环神经网络

循环神经网络在隐藏层会对之前的信息进行存储记忆,然后输入到当前计算的隐藏单元中,也就是隐藏层的内部节点不再是相互独立的,而是互相有消息传递。隐藏层的输入不仅可以由两部分组成,输入层的输出和隐藏层上一时刻的输出,即隐藏层内的节点自连;隐藏层的输入还可以由三部分组成,输入层的输出、隐藏层上一时刻的输出、上一隐藏层的状态,即隐藏层内的节点不仅自连还互连。结构如图1所示。

图 1 : 循 环 神 经 网 络 结 构 图 图1:循环神经网络结构图 1

如果我们把上图右边部分展开,循环神经网络也可以画成下面这个样子:

图2:循环神经网络展开图

图 2 : 循 环 神 经 网 络 展 开 图 图2:循环神经网络展开图 2

对于图2的网络,计算过程如下:

  • x t x^t xt表示第 t t t步(step)的输入。比如 x 1 x^1 x1为第二个词的词向量( x 0 x^0 x0为第一个词);

  • h t h^t ht为隐藏层的第 t t t步的状态,它是网络的记忆单元。 h t h^t ht根据当前输入层的输出与上一时刻隐藏层的状态 h t − 1 h^{t-1} ht1 进行计算,如公式1所示。其中, U U U是输入层到隐藏层的权重矩阵权重矩阵W就是隐藏层上一次的值作为这一次的输入的权重, b b b为偏置。 f ( x ) f(x) f(x)一般是非线性的激活函数,如 t a n h tanh tanh R e L U ReLU ReLU
    h t = f ( U x t + W h t − 1 + b ) (1) h_t=f(Ux^{t}+Wh^{t-1}+b)\tag{1} ht=f(Uxt+Wht1+b)(1)

  • o t o^t ot是第 t t t步的输出。输出层是全连接层,即它的每个节点和隐含层的每个节点都互相连接,V是隐藏层到输出层的权重矩阵 g ( x ) g(x) g(x)是激活函数。
    o t = g ( V ∗ h t ) (2) o^t=g(V*h^t)\tag{2} ot=g(Vht)(2)
    如果将(1)式循环带入(2)式可得:
    KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ \begin{split}…

由式(3)可以看出,循环神经网络的输出值与前面多个时刻的历史输入值有关,这就是为何循环神经网络能够往前看任意多个输入值的原因,也就是为何循环神经网络能够对序列数据建模的原因。

3. 双向循环神经网络

3.1 双向循环神经网络的介绍

对于语言模型来说,很多时候单向循环神经网络表现是不好的,比如下面这句话:

我的手机坏了,我打算____一部新手机。

可以想象,如果我们只看横线前面的词,手机坏了,那么我是打算修一修?换一部新的?还是大哭一场?这些都是无法确定的。但如果我们也看到了横线后面的词是『一部新手机』,那么,横线上的词填『买』的概率就大得多了。

对于上面的语言模型,单向循环神经网络是无法对此进行建模的。因此,我们需要用双向循环神经网络,如图3所示。

图3:双向循环神经网络

图 3 : 双 向 循 环 神 经 网 络 图3:双向循环神经网络 3

从图3中可以看出,双向循环神经网络的隐藏层要保存两个值,一个 h ( 1 ) h^{(1)} h(1) 参与正向计算,另一个值 h ( 2 ) h^{(2)} h(2) 参与反向计算。我们以 y 2 y_{2} y2 的计算为例,推出循环神经网络的一般规律。最终的输出值 y 2 y_{2} y2 取决于 h 2 ( 1 ) h^{(1)}_2 h2(1) h 2 ( 2 ) h^{(2)}_2 h2(2) 。其计算方式为公式4:
y 2 = g ( V ( 1 ) h 2 ( 1 ) + V ( 2 ) h 2 ( 2 ) ) (4) y_{2} = g(V^{(1)}h^{(1)}_2+V^{(2)}h^{(2)}_2)\tag{4} y2=g(V(1)h2(1)+V(2)h2(2))(4)
h 2 ( 1 ) h^{(1)}_2 h2(1) h 2 ( 2 ) h^{(2)}_2 h2(2)则分别计算为:
h 2 ( 1 ) = f ( W ( 1 ) h 1 ( 1 ) + U ( 1 ) x 2 + b 2 ( 1 ) ) (5) h^{(1)}_2 = f(W^{(1)}h^{(1)}_1 +U^{(1)}x_{2}+b^{(1)}_2 )\tag{5} h2(1)=f(W(1)h1(1)+U(1)x2+b2(1))(5)

h 2 ( 2 ) = f ( W ( 2 ) h 3 ( 2 ) + U ( 2 ) x 2 + b 2 ( 2 ) ) (6) h^{(2)}_2= f(W^{(2)}h^{(2)}_3+U^{(2)}x_{2}+b^{(2)}_2)\tag{6} h2(2)=f(W(2)h3(2)+U(2)x2+b2(2))(6)

最终的输出取决于正向和反向计算的加和。现在,我们仿照式5式6,写出双向循环神经网络的计算方法:
y t = g ( V ( 1 ) h t ( 1 ) + V ( 2 ) h t ( 2 ) ) (4) y_{t} = g(V^{(1)}h^{(1)}_t+V^{(2)}h^{(2)}_t)\tag{4} yt=g(V(1)ht(1)+V(2)ht(2))(4)

h t ( 1 ) = f ( W ( 1 ) h t − 1 ( 1 ) + U ( 1 ) x t + b ( 1 ) ) (5) h^{(1)}_t = f(W^{(1)}h^{(1)}_{t-1} +U^{(1)}x_{t}+b^{(1)} )\tag{5} ht(1)=f(W(1)ht1(1)+U(1)xt+b(1))(5)

h t ( 2 ) = f ( W ( 2 ) h t + 1 ( 2 ) + U ( 2 ) x t + b ( 2 ) ) (6) h^{(2)}_t= f(W^{(2)}h^{(2)}_{t+1}+U^{(2)}x_{t}+b^{(2)})\tag{6} ht(2)=f(W(2)ht+1(2)+U(2)xt+b(2))(6)

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

4.循环网络在的应用

4.1序列到类别的模式

序列到类别模式主要用于序列数据的分类问题:输入为序列,输出为类别。比如在文本分类中,输入数据为单词的序列,输出为该文本的类别。

假设一个样本 x 1 : T = ( x 1 , . . . , x T ) x_{1:T}=(x_1,...,x_T) x1:T=(x1,...,xT) 为一个长度为 T T T 的序列,输出为一个类别 y ∈ { 1 , 2 , . . . , C } y\in \{1,2,...,C\} y{1,2,...,C} 。可以将样本 x x x 按不同时刻输入到RNN中,得到不同时刻的隐藏状态 h 1 , . . . , h T h_1,...,h_T h1,...,hT 。可以将 h T h_T hT 看作整个序列的最终表示,并输入给分类器 g ( ⋅ ) g(·) g()进行分类,
y ^ = g ( h T ) (8) \hat{y}=g(h_T)\\\tag{8} y^=g(hT)(8)
其中 g ( ⋅ ) g(·) g() 可以是简单的线性分类器如Logistic回归,或复杂分类器如前馈神经网络

除了将最后时刻的状态作为整个序列的表示之外,我们还可以对整个序列的所有状态进行平均,并用这个平均状态来作为整个序列的表示(如图4所示),即
y ^ = g ( 1 T ∑ t = 1 T h t ) (9) \hat{y}=g(\frac{1}{T}\sum_{t=1}^{T}{h_t})\tag{9} y^=g(T1t=1Tht)(9)
图4

图 4 图4 4

4.2同步的序列到序列模式

同步的序列到序列模式主要用于序列标注(Sequence Labeling)任务,即每一时刻都有输入和输出,输入序列和输出序列的长度相同。比如词性标注(Partof-Speech Tagging)中,每一个单词都需要标注其对应的词性标签。

输入为一个长度为 T T T的序列 x 1 : T = ( x 1 , . . . , x T ) x_{1:T}=(x_1,...,x_T) x1:T=(x1,...,xT) ,输出为序列 y 1 : T = ( y 1 , . . . , y T ) y_{1:T}=(y_1,...,y_T) y1:T=(y1,...,yT) 。样本 x x x按不同时刻输入到RNN中,并得到不同时刻的隐状态 h 1 , . . . , h T h_1,...,h_T h1,...,hT 。每个时刻的隐状态 h t h_t ht代表了当前时刻和历史的信息,并输入给分类器 g ( ⋅ ) g(·) g() 得到当前时刻的标签 y ^ t \hat{y}_t y^t
y ^ t = g ( h t ) , ∀ t ∈ [ 1 , T ] (10) \hat{y}_t=g(h_t),\forall t\in [1,T]\tag{10} y^t=g(ht)t[1,T](10)

同步的序列到序列模式

同 步 的 序 列 到 序 列 模 式 同步的序列到序列模式

4.3异步的序列到序列模式

异步的序列到序列模式也称为**编码器-解码器(Encoder-Decoder)模型,即输入序列和输出序列不需要有严格的对应关系,也不需要保持相同的长度。**比如在机器翻译中,输入为源语言的单词序列,输出为目标语言的单词序列。 输入为一个长度为 T T T 的序列 x 1 : T = ( x 1 , . . . x T ) x_{1:T}=(x_1,...x_T) x1:T=(x1,...xT) ,输出长度为 M M M 的序列 y 1 : M = ( y 1 , . . . y M ) y_{1:M}=(y_1,...y_M) y1:M=(y1,...yM) 。先将样本 x x x 按不同时刻输入到RNN中(编码器),得到其编码 h T h_T hT ,然后使用另一个RNN(解码器),得到输出序列 y ^ 1 : M \hat{y}_{1:M} y^1:M ,为了建立输出序列之间的依赖关系,在解码器中通常使用非线性的自回归模型。
h t = f 1 ( h t − 1 , x t ) ,    ∀ t ∈ [ 1 , T ] h T + t = f 2 ( h T + t − 1 , y ^ t − 1 ) ,    ∀ t ∈ [ 1 , M ] y ^ t = g ( h T + t ) ,    ∀ t ∈ [ 1 , M ] (11) h_t=f_1(h_{t-1},x_t), \ \ \forall t\in[1,T]\\ h_{T+t}=f_2(h_{T+t-1},\hat{y}_{t-1}),\ \ \forall t\in[1,M]\\ \hat{y}_t=g(h_{T+t}),\ \ \forall t\in[1,M]\tag{11} ht=f1(ht1,xt),  t[1,T]hT+t=f2(hT+t1,y^t1),  t[1,M]y^t=g(hT+t),  t[1,M](11)
其中 f 1 ( ⋅ ) , f 2 ( ⋅ ) f_1(·),f_2(·) f1(),f2() 为编码器和解码器的神经网络, g ( ⋅ ) g(·) g() 为分类器, Y ^ t \hat{Y}_t Y^t 为预测输出 y ^ t \hat{y}_t y^t 的向量表示。

5.参数学习

5.1 循环神经网络的时间步长和参数共享

5.1.1 循环神经网络的time steps

**time steps 就是循环神经网络认为每个输入数据与前多少个陆续输入的数据有联系。**例如具有这样一段序列数据 “…ABCDBCEDF…”,当 time steps 为 3 时,在模型预测中如果输入数据为“D”,那么之前接收的数据如果为“B”和“C”则此时的预测输出为 B 的概率更大,之前接收的数据如果为“C”和“E”,则此时的预测输出为 F 的概率更大。

5.1.2 循环神经网络的参数共享

循环神经网络参数共享指的是:在每一个时间步上,所对应的参数是共享的。参数共享的目的有两个:一、用这些参数来捕获序列上的特征;二、共享参数减少模型的复杂度。

如图2所示,在RNN中每输入一步,每一层各自都共享参数U、V、W。其反映着RNN中每一时刻都在做相同的事情,只是输入不同,因此大大减少了网络中需要学习的参数。

对于RNN的参数共享,我们可以理解为对于一个句子或者文本,参数U可以看成是语法结构、参数W是一般规律,而下一个单词的预测必须是上一个单词和一般规律W与语法结构U共同作用的结果。我们知道,语法结构和一般规律在语言当中是共享的。所以,参数自然就是共享的!

CNN和RNN参数共享的区别:

我们需要记住的是,深度学习是怎么减少参数的,很大原因就是参数共享,而CNN是在空间上共享参数,RNN是在时间序列上共享参数。

循环神经网络中关于参数共享比较好的文章推荐:

【1】YJango的循环神经网络——介绍 - YJango的文章 - 知乎 https://zhuanlan.zhihu.com/p/24720659

【2】全面理解RNN及其不同架构 - Evan的文章 - 知乎 https://zhuanlan.zhihu.com/p/34152808

5.2 .前向传播

5.2 .1、 t 时刻隐藏状态 h t h_{t} ht

对于任意一个索引序号 t t t ,隐藏状态 h t h^{t} ht 由序列 t t t 对应的输入 x t x^{t} xt 和前一时刻的隐藏状态 h t − 1 h^{t-1} ht1共同决定:

h t = σ ( U x t + W h t − 1 + b ) (12) h^{t}=\sigma (Ux^{t}+Wh^{t-1}+b)\\\tag{12} ht=σ(Uxt+Wht1+b)(12)
其中, U 、 W U、W UW为系数矩阵,全局共享。b为偏置向量。 σ \sigma σ 为激活函数,一般为gelu,Leaky ReLU,SELU。

5.2 .2、 t 时刻的预测值 y ^ t \widehat{y}^{t} y t

y ^ t = σ ( V h t + c ) (13) \widehat{y}^{t}=\sigma (\mathbf{V}h^{t}+c)\\\tag{13} y t=σ(Vht+c)(13)

V V V W 、 U W、U WU一样,是全局共享的系数矩阵,c为偏置向量, σ \sigma σ 一般为softmax函数。

5.3 . 反向传播

5.3.1、损失函数

模型的整体损失定义为各个时刻损失的和:

L = ∑ t = 1 T L t (14) L= \sum_{t=1}^{T}L^{t}\\\tag{14} L=t=1TLt(14)
t t t 时刻的损失一般定义为交叉熵损失:
L t = − ( y t ) T log ⁡ y ^ t (15) L^{t}=-(y^{t})^{T}\log \hat{y}^{t}\\\tag{15} Lt=(yt)Tlogy^t(15)
其中, y t y^{t} ytone-hot编码的0-1向量, y ^ t \hat{y}^{t} y^t 为各个类别的预测概率值。

为计算方便,引入中间量 o t = V h t + c o^{t}=\mathbf{V}h^{t}+c ot=Vht+c ,则 y ^ t = σ ( o t ) = σ ( V h t + c ) \widehat{y}^{t}=\sigma (o^{t})=\sigma(\mathbf{V}h^{t}+c) y t=σ(ot)=σ(Vht+c) σ \sigma σ 为softmax函数时:

y ^ t = S o f t m a x   ( o t ) = e o t 1 K T e o t (16) \hat{y}^{t}=Softmax~(o^{t})=\frac{e^{o^{t}}}{1_{K}^{T}e^{o^{t}}}\\ \tag{16} y^t=Softmax (ot)=1KTeoteot(16)
上式中, 1 K T 1_{K}^{T} 1KT 为全1行向量, K K K 为类别数,分子为向量,分母为标量, y ^ t \hat{y}^{t} y^t 为向量,带入损失函数:

L t = − ( y t ) T ln ⁡ e o t 1 K T e o t = ( y t ) T 1 k ln ⁡ 1 K T e o t − ( y t ) T ln ⁡ e o t = ln ⁡ 1 K T e o t − ( y t ) T o t (17) \begin{aligned} L^{t}&=-(y^{t})^{T}\ln \frac{e^{o^{t}}}{1_{K}^{T}e^{o^{t}}} \\ &=(y^{t})^{T}1_{k}\ln 1_{K}^{T}e^{o^{t}}-(y^{t})^{T}\ln e^{o^{t}}\\ &=\ln 1_{K}^{T}e^{o^{t}}-(y^{t})^{T} o^{t} \end{aligned}\\\tag{17} Lt=(yt)Tln1KTeoteot=(yt)T1kln1KTeot(yt)Tlneot=ln1KTeot(yt)Tot(17)
上式中, ( y t ) T 1 k = 1 (y^{t})^{T}1_{k}=1 (yt)T1k=1 ln ⁡ 1 K T e o t , ( y t ) T o t \ln 1_{K}^{T}e^{o^{t}},(y^{t})^{T} o^{t} ln1KTeot,(yt)Tot 为标量,最终结果 L t L^{t} Lt 为标量。

5.3.2、对V、c求梯度

标量对矩阵、向量求导,使用矩阵微分和迹函数公式:
d L t = t r [ d ln ⁡ 1 K T e o t − d ( y t ) T o t ] = t r [ 1 1 K T e o t d 1 K T e o t − ( y t ) T d o t ] = t r [ 1 K T e o t 1 K T e o t ⊙ d o t − ( y t ) T d o t ] = t r [ ( 1 K T ⊙ e o t ) T 1 K T e o t d o t − ( y t ) T d o t ] = t r [ ( e o t ) T 1 K T e o t d o t − ( y t ) T d o t = t r [ ( ( y ^ ) T − ( y t ) T ) d ( V h t + c ) ] = t r [ h t ( ( y ^ ) T − ( y t ) T ) d V + ( ( y ^ ) T − ( y t ) T ) d c ] \begin{aligned} dL^{t}&=tr[d\ln 1_{K}^{T}e^{o^{t}}-d(y^{t})^{T} o^{t}]\\ &=tr[\frac{1}{1_{K}^{T}e^{o^{t}}}d1_{K}^{T}e^{o^{t}}-(y^{t})^{T}do^{t}] \\ &= tr[\frac{1_{K}^{T}e^{o^{t}}}{1_{K}^{T}e^{o^{t}}}\odot do^{t}-(y^{t})^{T}do^{t}]\\ &= tr[\frac{(1_{K}^{T}\odot e^{o^{t}})^{T}}{1_{K}^{T}e^{o^{t}}}do^{t}-(y^{t})^{T}do^{t}]\\ &=tr[\frac{(e^{o^{t}})^{T}}{1_{K}^{T}e^{o^{t}}}do^{t}-(y^{t})^{T}do^{t}\\ &=tr[((\hat {y})^{T}-(y^{t})^{T})d(Vh^{t}+c)]\\ &=tr[h^{t}((\hat {y})^{T}-(y^{t})^{T})dV+((\hat {y})^{T}-(y^{t})^{T})dc] \end{aligned}\\ dLt=tr[dln1KTeotd(yt)Tot]=tr[1KTeot1d1KTeot(yt)Tdot]=tr[1KTeot1KTeotdot(yt)Tdot]=tr[1KTeot(1KTeot)Tdot(yt)Tdot]=tr[1KTeot(eot)Tdot(yt)Tdot=tr[((y^)T(yt)T)d(Vht+c)]=tr[ht((y^)T(yt)T)dV+((y^)T(yt)T)dc]
所以:
∂ L ∂ V = ∑ t = 1 T ∂ L t ∂ V = ∑ t = 1 T [ h t ( ( y ^ ) T − ( y t ) T ) ] T = ∑ t = 1 T ( y ^ − y t ) ( h t ) T \frac{\partial L}{\partial V}=\sum_{t=1}^{T}\frac{\partial L^{t}}{\partial V}=\sum_{t=1}^{T}[h^{t}((\hat {y})^{T}-(y^{t})^{T})]^{T}=\sum_{t=1}^{T}(\hat {y}-y^{t})(h^{t})^{T} VL=t=1TVLt=t=1T[ht((y^)T(yt)T)]T=t=1T(y^yt)(ht)T

∂ L ∂ c = ∑ t = 1 T ∂ L t ∂ c = ∑ t = 1 T [ ( ( y ^ ) T − ( y t ) T ) ] T = ∑ t = 1 T y ^ − y t \frac{\partial L}{\partial c}=\sum_{t=1}^{T}\frac{\partial L^{t}}{\partial c}=\sum_{t=1}^{T}[((\hat {y})^{T}-(y^{t})^{T})]^{T}=\sum_{t=1}^{T}\hat {y}-y^{t} cL=t=1TcLt=t=1T[((y^)T(yt)T)]T=t=1Ty^yt

5.3.3. 对 W,U,b 求梯度:

已知:
h t = t a n h ( U x t + W h t − 1 + b ) ( h t ) ′ = 1 − ( h t ) 2 h^{t}=tanh(Ux^{t}+Wh^{t-1}+b)\\ (h^{t})^{'}=1-(h^{t})^{2} ht=tanh(Uxt+Wht1+b)(ht)=1(ht)2
可得:

d L t = t r [ ( ∂ L t ∂ h t ) T d t a n h ( U x t + W h t − 1 + b ) ] = t r [ ( ∂ L t ∂ h t ) T d i a g ( 1 − ( h t ) 2 ) d ( U x t + W h t − 1 + b ) ] = t r [ ( ∂ L t ∂ h t ) T d i a g ( 1 − ( h t ) 2 ) ) d ( U ) x t + ( ∂ L t ∂ h t ) T d i a g ( 1 − ( h t ) 2 ) ) d ( W ) h t − 1 + ( ∂ L t ∂ h t ) T d i a g ( 1 − ( h t ) 2 ) ) d b ] = t r [ x t ( ∂ L t ∂ h t ) T d i a g ( 1 − ( h t ) 2 ) d U + h t − 1 ( ∂ L t ∂ h t ) T d i a g ( 1 − ( h t ) 2 ) d W + ( ∂ L t ∂ h t ) T d i a g ( 1 − ( h t ) 2 ) d b ] \begin{aligned} dL^{t} &=tr[(\frac{\partial L^{t}}{\partial h^{t}})^{T}dtanh(Ux^{t}+Wh^{t-1}+b)] \\ &= tr[(\frac{\partial L^{t}}{\partial h^{t}})^{T}diag(1-(h^{t})^{2})d(Ux^{t}+Wh^{t-1}+b)]\\ &=tr[(\frac{\partial L^{t}}{\partial h^{t}})^{T}diag (1-(h^{t})^{2}))d(U)x^{t}+(\frac{\partial L^{t}}{\partial h^{t}})^{T}diag (1-(h^{t})^{2}))d(W)h^{t-1} \\&+(\frac{\partial L^{t}}{\partial h^{t}})^{T}diag (1-(h^{t})^{2}))db] \\&=tr[x^{t}(\frac{\partial L^{t}}{\partial h^{t}})^{T}diag (1-(h^{t})^{2})dU+h^{t-1}(\frac{\partial L^{t}}{\partial h^{t}})^{T}diag (1-(h^{t})^{2})dW\\&+(\frac{\partial L^{t}}{\partial h^{t}})^{T}diag (1-(h^{t})^{2})db]\end{aligned} dLt=tr[(htLt)Tdtanh(Uxt+Wht1+b)]=tr[(htLt)Tdiag(1(ht)2)d(Uxt+Wht1+b)]=tr[(htLt)Tdiag(1(ht)2))d(U)xt+(htLt)Tdiag(1(ht)2))d(W)ht1+(htLt)Tdiag(1(ht)2))db]=tr[xt(htLt)Tdiag(1(ht)2)dU+ht1(htLt)Tdiag(1(ht)2)dW+(htLt)Tdiag(1(ht)2)db]
综上:
∂ L t ∂ U = ( x t ( ∂ L t ∂ h t ) T d i a g ( 1 − ( h t ) 2 ) ) T = d i a g ( 1 − ( h t ) 2 ) ∂ L t ∂ h t ( x t ) T ∂ L t ∂ W = ( h t − 1 ( ∂ L t ∂ h t ) T d i a g ( 1 − ( h t ) 2 ) ) T = d i a g ( 1 − ( h t ) 2 ) ∂ L t ∂ h t ( h t − 1 ) T ∂ L t ∂ b = ( ( ∂ L t ∂ h t ) T d i a g ( 1 − ( h t ) 2 ) ) T = d i a g ( 1 − ( h t ) 2 ) ∂ L t ∂ h t \begin{aligned} &\frac{\partial L^{t}}{\partial U}=(x^{t}(\frac{\partial L^{t}}{\partial h^{t}})^{T}diag (1-(h^{t})^{2}))^{T}=diag (1-(h^{t})^{2})\frac{\partial L^{t}}{\partial h^{t}}(x^{t})^{T}\\ &\frac{\partial L^{t}}{\partial W}=(h^{t-1}(\frac{\partial L^{t}}{\partial h^{t}})^{T}diag (1-(h^{t})^{2}))^{T}=diag (1-(h^{t})^{2})\frac{\partial L^{t}}{\partial h^{t}}(h^{t-1})^{T} \\ &\frac{\partial L^{t}}{\partial b}=((\frac{\partial L^{t}}{\partial h^{t}})^{T}diag (1-(h^{t})^{2}))^{T}=diag (1-(h^{t})^{2})\frac{\partial L^{t}}{\partial h^{t}} \end{aligned}\\ ULt=(xt(htLt)Tdiag(1(ht)2))T=diag(1(ht)2)htLt(xt)TWLt=(ht1(htLt)Tdiag(1(ht)2))T=diag(1(ht)2)htLt(ht1)TbLt=((htLt)Tdiag(1(ht)2))T=diag(1(ht)2)htLt
令公共项 ∂ L t ∂ h t \frac{\partial L^{t}}{\partial h^{t}} htLt 为误差项 δ l \delta ^{l} δl ,求误差项。由RNN模型的求解过程可知,在某一序列位置t的梯度损失由当前位置的输出对应的梯度损失和序列索引位置t+1时的梯度损失两部分共同决定:
d L t = t r [ ( ∂ L t ∂ o t ) T d o t + ( ∂ L t + 1 ∂ h t + 1 ) T d h t + 1 ] = t r [ ( y ^ − y ) T d ( V h t + c ) + ( δ t + 1 ) T d t a n h ( U x t + W h t + b ) ] = t r [ ( y ^ − y ) T V d h t + ( δ t + 1 ) T d i a g ( 1 − ( h t + 1 ) 2 ) d ( U x t + W h t + b ) ] = t r [ ( y ^ − y ) T V + ( δ t + 1 ) T d i a g ( 1 − ( h t + 1 ) 2 ) W d h t ] \begin{aligned} dL^{t}&=tr[(\frac{\partial L^{t}}{\partial o^{t}})^{T}do^{t}+(\frac{\partial L^{t+1}}{\partial h^{t+1}})^{T}dh^{t+1}] \\ &= tr[(\hat{y}-y)^{T}d(Vh^{t}+c)+(\delta ^{t+1})^{T}dtanh(Ux^{t}+Wh^{t}+b)]\\ &=tr[(\hat{y}-y)^{T}Vdh^{t}+(\delta ^{t+1})^{T}diag(1-(h^{t+1})^{2})d(Ux^{t}+Wh^{t}+b)]\\ &=tr[(\hat{y}-y)^{T}V+(\delta ^{t+1})^{T}diag (1-(h^{t+1})^{2})Wdh^{t}] \end{aligned}\\ dLt=tr[(otLt)Tdot+(ht+1Lt+1)Tdht+1]=tr[(y^y)Td(Vht+c)+(δt+1)Tdtanh(Uxt+Wht+b)]=tr[(y^y)TVdht+(δt+1)Tdiag(1(ht+1)2)d(Uxt+Wht+b)]=tr[(y^y)TV+(δt+1)Tdiag(1(ht+1)2)Wdht]
所以:

δ t = ∂ L t ∂ h t = ( ( y ^ − y ) T V + ( δ t + 1 ) T d i a g ( 1 − ( h t + 1 ) 2 W ) T = V T ( y ^ − y ) + W T d i a g ( 1 − ( h t + 1 ) 2 ) δ t + 1 \begin{aligned} \delta ^{t}&=\frac{\partial L^{t}}{\partial h^{t}}=((\hat{y}-y)^{T}V+(\delta ^{t+1})^{T}diag (1-(h^{t+1})^{2}W)^{T}\\ &= V^{T}(\hat{y}-y)+W^{T}diag (1-(h^{t+1})^{2})\delta ^{t+1} \end{aligned}\\ δt=htLt=((y^y)TV+(δt+1)Tdiag(1(ht+1)2W)T=VT(y^y)+WTdiag(1(ht+1)2)δt+1
更新 W , U , b W,U,b W,U,b 梯度公式:

∂ L ∂ U = ∑ t = 1 T d i a g ( 1 − ( h t ) 2 ) δ t ( x t ) T ∂ L ∂ W = ∑ t = 1 T d i a g ( 1 − ( h t ) 2 ) δ t ( h t − 1 ) T ∂ L ∂ b = ∑ t = 1 T d i a g ( 1 − ( h t ) 2 ) δ t \begin{aligned} &\frac{\partial L}{\partial U}=\sum_{t=1}^{T}diag (1-(h^{t})^{2})\delta ^{t}(x^{t})^{T}\\ &\frac{\partial L}{\partial W}=\sum_{t=1}^{T}diag (1-(h^{t})^{2})\delta ^{t}(h^{t-1})^{T} \\ &\frac{\partial L}{\partial b}=\sum_{t=1}^{T}diag (1-(h^{t})^{2})\delta ^{t} \end{aligned}\\ UL=t=1Tdiag(1(ht)2)δt(xt)TWL=t=1Tdiag(1(ht)2)δt(ht1)TbL=t=1Tdiag(1(ht)2)δt
因此,可以由后一层的梯度误差 δ t + 1 \delta ^{t+1} δt+1 求出前一层的梯度误差 δ t \delta ^{t} δt ,那么最后一层的梯度误差 δ T \delta ^{T} δT 怎么求?

对于最后一层T层,后边没有 h T + 1 h^{T+1} hT+1 ,所以, δ T \delta ^{T} δT 与当前层的输出 o T o^{T} oT 相关,因此:

δ T = V T ( y ^ − y ) \delta ^{T}=V^{T}(\hat{y}-y)\\ δT=VT(y^y)

5.4 参数学习

循环神经网络的参数可以通过梯度下降方法来进行学习。给定一个训练样本(x,y),其中 x 1 : T = ( x 1 , . . . , x T ) x_{1:T}=(x_1,...,x_T) x1:T=(x1,...,xT) 为长度是 T T T的输入序列, y 1 : T = ( y 1 , . . . , y T ) y_{1:T}=(y_1,...,y_T) y1:T=(y1,...,yT) 是长度为 T T T的标签序列。即在每个时刻t,都有一个监督信息 y t y_t yt,定义时刻 t t t的损失函数为:
Γ t = Γ ( y t , g ( h t ) ) \Gamma_t=\Gamma(y_t,g(h_t)) Γt=Γ(yt,g(ht))
其中 g ( h t ) g(h_t) g(ht) 为第t时刻的输出, Γ \Gamma Γ 为可微分的损失函数,比如交叉熵,整个序列上损失函数为
Γ = ∑ t = 1 T Γ t \Gamma=\sum_{t=1}^{T}{\Gamma_t} Γ=t=1TΓt
整个序列的损失函数 Γ \Gamma Γ 关于参数 W W W 的梯度为:
∂ Γ ∂ W = ∑ t = 1 T ∂ Γ t ∂ W \frac{\partial \Gamma}{\partial W}=\sum_{t=1}^{T}{\frac{\partial \Gamma_t}{\partial W}} WΓ=t=1TWΓt
即每个时刻损失 Γ t \Gamma_t Γt 对参数 W W W 的偏导数之和。

循环神经网络中存在一个递归调用的函数 f ( ⋅ ) f(\cdot) f() ,因此其计算参数梯度的方式和前馈神经网络不太相同。在循环神经网络中主要有两种计算梯度的方式:随时间反向传播(BPTT)和实时循环学习(RTRL)算法。

5.4 .1随时间反向传播算法

**随时间反向传播(Backpropagation Through Time,BPTT)**算法的主要思想是通过类似前馈神经网络的错误反向传播算法来进行计算梯度。

BPTT算法将循环神经网络看作是一个展开的多层前馈网络,其中“每一层”对应循环网络中的“每个时刻”。在“展开”的前馈网络中,所有层的参数是共享的,因此参数的真实梯度是将所有“展开层”的参数梯度之和

因为参数U和隐藏层在每个时刻 k ( 1 ≤ k ≤ t ) k(1\le k\le t) k(1kt) 的净输入 z k = W h k − 1 + U x k + b z_k=Wh_{k-1}+Ux_k+b zk=Whk1+Uxk+b ,因此第t时刻的损失函数 Γ t \Gamma_t Γt 关于参数 w i j w_{ij} wij 的梯度为:
∂ Γ t ∂ w i j = ∑ k = 1 t ∂ + z k ∂ Γ t ∂ w i j ∂ z k \frac{\partial \Gamma_t}{\partial w_{ij}}=\sum_{k=1}^{t}{\frac{\partial^+z_k\partial\Gamma_t}{\partial w_{ij}\partial z_k}} wijΓt=k=1twijzk+zkΓt
其中 ∂ + z k ∂ w i j \frac{\partial^+z_k}{\partial w_{ij}} wij+zk 表示“直接”偏导数,即公式 z k = W h k − 1 + U x k + b z_k=Wh_{k-1}+Ux_k+b zk=Whk1+Uxk+b中保持 h k − 1 h_{k-1} hk1 不变,对 w i j w_{ij} wij进行求偏导数,得到:

∂ + z k ∂ w i j = [ 0 , . . . , [ h k − 1 ] j , . . . , 0 ] \frac{\partial^+z_k}{\partial w_{ij}}=[0,...,[h_{k-1}]_j,...,0] wij+zk=[0,...,[hk1]j,...,0] ,其中 [ h k − 1 ] j [h_{k-1}]_j [hk1]j 为第 k − 1 k-1 k1 时刻隐状态的第 j j j 维;

定义误差项 δ t , k = ∂ Γ t ∂ z k \delta_{t,k}=\frac{\partial \Gamma_t}{\partial z_k} δt,k=zkΓt 为第 t t t 时刻的损失对第 k k k 时刻隐藏神经层的净输入 z k z_k zk 的导数,则当 1 ≤ k ≤ t 1\le k \le t 1kt 时:
δ t , k = ∂ Γ t ∂ z k = ∂ h k ∂ z k ∂ z k + 1 ∂ h k ∂ Γ t ∂ z k + 1 = d i a g ( f ′ ( z k ) ) W T δ t , k + 1 \delta_{t,k}=\frac{\partial\Gamma_t}{\partial z_k}=\frac{\partial h_k}{\partial z_k}\frac{\partial z_{k+1}}{\partial h_k}\frac{\partial\Gamma_t}{\partial z_{k+1}}=diag(f^{'}(z_k))W^T\delta_{t,k+1} δt,k=zkΓt=zkhkhkzk+1zk+1Γt=diag(f(zk))WTδt,k+1
将其与之前的式子合并可得到:
∂ Γ t ∂ w i , j = ∑ k = 1 t [ δ t , k ] i [ h k − 1 ] j \frac{\partial\Gamma_t}{\partial w_{i,j}}=\sum_{k=1}^{t}{[\delta_{t,k}]_i[h_{k-1}]_j} wi,jΓt=k=1t[δt,k]i[hk1]j
参数梯度 结合上式得到整个序列的损失函数 Γ \Gamma Γ 关于参数 U U U 的梯度为:
∂ Γ ∂ W = ∑ t = 1 T ∑ k = 1 t δ t , k h k − 1 T \frac{\partial\Gamma}{\partial W}=\sum_{t=1}^{T}\sum_{k=1}^{t}{\delta_{t,k}h_{k-1}^T} WΓ=t=1Tk=1tδt,khk1T
同理, Γ \Gamma Γ 关于权重 U U U 和偏置 b b b 的梯度为:
∂ Γ ∂ U = ∑ t = 1 T ∑ k = 1 t δ t , k x k T \frac{\partial\Gamma}{\partial U}=\sum_{t=1}^{T}\sum_{k=1}^{t}{\delta_{t,k}x_k^T} UΓ=t=1Tk=1tδt,kxkT

∂ Γ ∂ b = ∑ t = 1 T ∑ k = 1 t δ t , k \frac{\partial\Gamma}{\partial b}=\sum_{t=1}^{T}\sum_{k=1}^{t}{\delta_{t,k}} bΓ=t=1Tk=1tδt,k

在BPTT算法中,参数的梯度需要在一个完整的“前向”计算和“反向”计算后才能得到并进行参数更新。如下图所示。

5.4 .2实时循环学习算法

与反向传播的BPTT算法不同的是,实时循环学习(Real-Time Recurrent Learning)是通过前向传播的方式来计算梯度。

假设循环神经网络中第t+1时刻的状态 h t + 1 h_{t+1} ht+1 为:
h t + 1 = f ( z t + 1 ) = f ( W h t + U x t + 1 + b ) h_{t+1}=f(z_{t+1})=f(Wh_t+U_{x_{t+1}}+b) ht+1=f(zt+1)=f(Wht+Uxt+1+b)
其关于参数 w i j w_{ij} wij 的偏导数为:
∂ h t + 1 ∂ w i j = ( ∂ + z t + 1 ∂ w i j + ∂ h t ∂ w i j W T ) ∂ h t + 1 ∂ z t + 1 \frac{\partial h_{t+1}}{\partial w_{ij}}=\left( \frac{\partial^+z_{t+1}}{\partial w_{ij}}+\frac{\partial h_t}{\partial w_{ij}}W^T \right)\frac{\partial h_{t+1}}{\partial z_{t+1}} wijht+1=(wij+zt+1+wijhtWT)zt+1ht+1

利用上式可以以此前向计算偏导数: ∂ h 1 ∂ w i , j \frac{\partial h_1}{\partial w_{i,j}} wi,jh1 ∂ h 2 ∂ w i j \frac{\partial h_2}{\partial w_{ij}} wijh2

两种学习算法比较:

RTRL算法和BPTT算法都是基于梯度下降的算法,分别通过前向模式和反向模式应用链式法则来计算梯度。在循环神经网络中,一般网络输出维度远低于输入维度,因此BPTT算法的计算量会更小,但BPTT算法需要保存所有时刻的中间梯度,空间复杂度较高。RTRL算法不需要梯度回传,因此非常适合于需要在线学习或无限序列的任务中

6、长程依赖问题

循环神经网络在学习过程中的主要问题是由于梯度消失或爆炸问题,很难建模长时间间隔(Long Range)的状态之间的依赖关系。

在BPTT算法中,我们有:
KaTeX parse error: Undefined control sequence: \ at position 74: …\delta_{t,\tau}\̲ ̲
如果定义 γ ≃ ∣ ∣ d i a g ( f ′ ( z τ ) ) W T ∣ ∣ \gamma\simeq \left| \left| diag(f^{'}(z_\tau))W^T \right|\right| γdiag(f(zτ))WT,则: δ t , τ ≃ γ t − k δ t , τ \delta_{t,\tau}\simeq\gamma^{t-k}\delta_{t,\tau} δt,τγtkδt,τ

γ > 1 \gamma>1 γ>1 ,当 t − k → ∞ , γ t − k → ∞ t-k\rightarrow \infty,\gamma^{t-k}\rightarrow \infty tkγtk ,间隔 t − k t-k tk较大时,梯度也会变得很大,造成系统不稳定,成为梯度爆炸问题。相反如果 γ < 1 \gamma<1 γ<1 ,当 t − k → ∞ , γ t − k → 0 t-k\rightarrow \infty,\gamma^{t-k}\rightarrow0 tkγtk0 ,当间隔 t − k t-k tk比较大时,梯度变得非常小,出现梯度消失问题。

要注意的是,在循环神经网络中的梯度消失不是说 ∂ Γ t ∂ W \frac{\partial\Gamma_t}{\partial W} WΓt 的梯度消失了, 而是 ∂ Γ t ∂ h k \frac{\partial\Gamma_t}{\partial h_k} hkΓt 的梯度消失了(当间隔t-k比较大时)。也就是说,参数W的更新主要靠当前时刻t的几个相邻状态 h k h_k hk 来更新,长距离的状态对W没有影响。

由于RNN经常使用非线性激活函数为Logistic函或Tanh函数作为非线性激活函数,其导数值都小于1,并且权重矩阵||W||也不会太大,因此如果时间间隔t-k过大, δ t , k \delta_{t,k} δt,k 会趋向于0,因此经常会出现梯度消失问题

简单循环网络理论上可以建立长时间间隔的状态之间的依赖关系,但是由于梯度爆炸和梯度消失问题,实际上只能学习到短期的依赖关系。这样,如果时刻t的输出 y t y_t yt 依赖于时刻k的输入 x k x_k xk ,当间隔t-k比较大时,简单神经网络很难建模这种长距离的依赖关系,成为长期依赖问题。(Long-Term Dependencies Problem)。

6.1、梯度爆炸解决方法

一般而言,循环网络的梯度爆炸问题比较容易解决,一般**通过权重衰减或梯度截断来避免。**权重衰减是通过给参数增加 l 1 , l 2 l_1,l_2 l1,l2范数的正则化项来限制参数的取值范围,从而使得 γ ≤ 1 \gamma\le 1 γ1。梯度截断是另一种有效的启发式方法,当梯度的模大于一定阈值时,就将它截断成为一个较小的数。

6.2、梯度消失解决方法

为了避免梯度爆炸或消失问题,一种最直接的方式是选取合适的参数,同时使用非饱和的激活函数,尽量使得 d i a g ( f ′ ( z ) ) U T ≈ 1 diag(f^{'}(z))U^T\approx 1 diag(f(z))UT1.

梯度消失是循环网络的主要问题,除了使用一些优化技巧,更有效地方式为改变模型,比如让 W = I W=I W=I ,同时令 ∂ h t ∂ h t − 1 = I \frac{\partial h_t}{\partial h_{t-1}}=I ht1ht=I ,即
h t = h t − 1 + g ( x t ; θ ) h_t=h_{t-1}+g(x_t;\theta) ht=ht1+g(xt;θ)
将W改变为单位矩阵虽然能够缓解梯度消失或爆炸问题,但是也丢失了神经元在反馈边上的非线性激活的性质,也降低了模型的表示能力。

可以采用一种更加有效的改进测率:
h t = h t − 1 + g ( x t , h t − 1 ; θ ) h_t=h_{t-1}+g(x_t,h_{t-1};\theta) ht=ht1+g(xt,ht1;θ)
这样 h t h_t ht h t − 1 h_{t-1} ht1 之间既有线性关系,也有非线性关系,并且可以缓解梯度消失问题但依然有两个问题:

(1)梯度爆炸问题:令 z k = W h k − 1 + U x k + b z_k=Wh_{k-1}+U {x_k}+b zk=Whk1+Uxk+b 为在第k时刻函数 g ( ⋅ ) g(·) g() 的输入,在计算公式误差项 δ t , k = ∂ Γ k ∂ z k \delta_{t,k}=\frac{\partial\Gamma_k}{\partial z_k} δt,k=zkΓk ,梯度可能会过大,从而导致梯度爆炸问题。

(2)记忆容量问题:随着 h t h_t ht 不断积累存储新的输入信息,会发生饱和现象。假设 g ( ⋅ ) g(·) g() 为Logistic函数,随着时间t的增长, h t h_t ht 会变得越来越大,从而导致h变得饱和。隐状态 h t h_t ht 可以存储的信息是有限的,随着记忆单元的内容越来越多,其丢失的信息也越来越多。

为了解决这两个问题,可以通过引入门控机制 代表作有LSTM,GRU来进一步改进模型。

参考

《神经网络与深度学习》 邱锡鹏


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进