深度学习

您所在的位置:网站首页 ISSUELIST最简单三个公式 深度学习

深度学习

2024-07-06 03:55| 来源: 网络整理| 查看: 265

深度学习——循环神经网络RNN公式推导 1、循环神经网络引入 1.1 从传统网络到循环网络

对于传统的神经网络,在我们之前介绍的传统的神经网络中,主要包含输入层、隐藏层、输出层三个部分。其基本的图示如下: 在这里插入图片描述 X表示输入层的向量,H表示隐藏层的向量,O表示输出层的向量。W表示从输入层到隐藏层的权重矩阵,V表示从隐藏层到输出层的权重矩阵。其中,每一层可以有多个神经元。每一层神经元的个数代表的是每一层的维度。

我们将该网络展开成神经元的形式如下: 在这里插入图片描述 我们可以看到的是,对于每一个隐藏层的神经元,其结果是由输入层的向量和权重W来决定的。似乎是有这样的一种可能,每一个隐藏层的神经元是和其排列在前面的神经元之间是有关系的,也就是排列在前面隐藏层的神经元也作为当前隐藏层神经元的一个输入。这就引出来了循环神经网络。

我们先给出循环神经网络的基本结构: 在这里插入图片描述

在上面的结构中,我们能够发现,对于隐藏层的神经元,其中有一个自我传递信息的过程,下面是具体的展开图: 在这里插入图片描述 可以理解为,网络的输入通过时间进行向后传播,每次输入一个X,产生一个St和一个O,然后下一个时刻的X和前一个时刻的H作为当前时刻的输入,其中X通过W来控制权重,H通过U来控制权重。我们将上述的神经网络结构成为:单向循环神经网络。

在对于该神经网络进行进一步的展开(这里,我们只展开一个时刻的神经单元) 在这里插入图片描述

2 BPTT算法以及前向和后向传播算法 2.1 前向传播过程 从输入层神经元到隐藏层神经元。从隐藏层神经元到隐藏层神经元。隐藏层神经元整合两个部分的输入。从隐藏层神经元到输出层神经元。 2.1.1 从输入层神经元到隐藏层神经元

这个部分的前向传播主要是输入神经元信息和对应的权重矩阵W来决定的。具体的计算公式为: W T X t W^TX_t WTXt​ 注意,这个部分中,X是一个向量,W是一个权重矩阵,通过W来将X转换成另外的向量。

2.1.2 从隐藏层神经元到隐藏层神经元

这个部分主要是前一个时刻的隐藏层神经元向当前时刻的神经元的信息传递,其值有 S t − 1 S_{t-1} St−1​和对应的权重矩阵U来决定。公式如下: U T S t − 1 U^TS_{t-1} UTSt−1​ 注意,这个部分中, S t − 1 S_{t-1} St−1​是一个向量,U是一个权重矩阵,通过U来将 S t − 1 S_{t-1} St−1​转换成另外的向量。

2.1.3 隐藏层神经元整合两个部分的输入

这一部分,主要是当前时刻的神经元 h t h_t ht​,将两个部分的输入整合,激活生成当前时刻隐藏层神经元的输出。 整合的过程就是向量相加,对应的公式为: W T X t + U T S t − 1 W^TX_t+U^TS_{t-1} WTXt​+UTSt−1​ 在假设激活函数为f,则激活后生成当前时刻神经元的值: S t = f ( W T X t + U T S t − 1 ) S_t = f(W^TX_t+U^TS_{t-1}) St​=f(WTXt​+UTSt−1​)

2.1.4 从隐藏层神经元到输出层神经元

这一部分的信息传递主要是将当前时刻隐藏层神经元的值传递到当前时刻的输出神经元中去。计算公式为: O t = g ( V T S t ) O_t = g(V^TS_t) Ot​=g(VTSt​) 其中g表示的也是激活函数。

2.2 前向过程总结

前向过程相对来说比较简单,用两个公式就可以总结其基本的传播过程: S t = f ( W T X t + U T S t − 1 ) S_t = f(W^TX_t+U^TS_{t-1}) St​=f(WTXt​+UTSt−1​) O t = g ( V T S t ) = g ( V T f ( W T X t + U T S t − 1 ) ) O_t = g(V^TS_t)=g(V^Tf(W^TX_t+U^TS_{t-1})) Ot​=g(VTSt​)=g(VTf(WTXt​+UTSt−1​))

2.3 参数权重说明:

在整个神经网络中,一共包含的三中权重矩阵,第一个矩阵是W,给矩阵的维度为(N,K),N表示隐藏层神经元值的向量维度,K表示输入神经单元的向量的维度。第二个权重矩阵是V,该矩阵的维度为(L,N),其中P表示输出层的神经元的向量维度。第三个是权重矩阵U,该矩阵的维度是(N,N)。

2.4 反向传播过程 2.4.1 误差函数

关于误差函数的选择,可以根据具体的任务进行,我们这里选择MSE作为误差计算函数: J = 1 2 ∑ t = 1 T ∣ ∣ R t − O t ∣ ∣ 2 J=\frac{1}{2}∑_{t=1}^T||R_t-O_t||^2 J=21​t=1∑T​∣∣Rt​−Ot​∣∣2 注意,我们这里在算误差的时候, R t 和 O t R_t和O_t Rt​和Ot​对应的是t时刻真实标签向量是预测输出的向量,所有采用的了取模计算的|| ||。

将上面的式子展开后得到 J = 1 2 ∑ t = 1 T ∑ j = 1 L ( R t ( j ) − O t ( j ) ) 2 J = \frac{1}{2}∑_{t=1}^T∑_{j=1}^L(R_t(j)-O_t(j))^2 J=21​t=1∑T​j=1∑L​(Rt​(j)−Ot​(j))2 L表示输入向量的属性值的个数。

2.4.2 反向传播过程

对于最后一个时刻的节点 X T , H T , O T X_T,H_T,O_T XT​,HT​,OT​,我们首先计算这一个时刻的相关误差。我们在这里设置两个临时函数: n e t o t = V T f ( W T X t + U T S t − 1 ) neto_t = V^Tf(W^TX_t+U^TS_{t-1}) netot​=VTf(WTXt​+UTSt−1​) n e t h t = W T X t + U T S t − 1 neth_t = W^TX_t+U^TS_{t-1} netht​=WTXt​+UTSt−1​

其中 n e t o ( t ) net_o(t) neto​(t)表示t时刻没有激活的输出层的向量值, n e t h ( t ) net_h(t) neth​(t)表示t时刻没有激活的隐藏层的向量值。

为了清晰,我们再之前单个神经元中的结构拿过来: 在这里插入图片描述 根据公式和图示,我们能够知道 n e t h ( t ) neth(t) neth(t),表示的是t时刻 [ h 1 , h 2 , h 3 ] [h_1,h_2,h_3] [h1​,h2​,h3​]组成的没有激活时的向量, n e t o ( t ) neto(t) neto(t)表示的是没有激活的 [ o 1 , o 2 ] [o_1,o_2] [o1​,o2​]构成的向量。

对于最后时刻T,我们计算出来的误差是J,首先我们计算: ∂ J ∂ n e t o 1 ( T ) = ∂ J ∂ O T ( 1 ) ∂ O T ( 1 ) ∂ n e t o T ( 1 ) = ( R T ( 1 ) − O T ( 1 ) ) g ′ ( n e t o T ( 1 ) ) \frac{∂J}{∂neto_1(T)}=\frac{∂J}{∂O_T(1)}\frac{∂O_T(1)}{∂neto_T(1)}=(R_T(1)-O_T(1))g'(neto_T(1)) ∂neto1​(T)∂J​=∂OT​(1)∂J​∂netoT​(1)∂OT​(1)​=(RT​(1)−OT​(1))g′(netoT​(1)) 整理一下有: δ T O ( j ) = ∂ J ∂ n e t o T ( j ) = ∂ J ∂ O T ( j ) ∂ O T ( j ) ∂ n e t o T ( j ) = ( R T ( j ) − O T ( j ) ) g ′ ( n e t o T ( j ) ) 其 中 j ∈ [ 1 , L ] δ_T^O(j)=\frac{∂J}{∂neto_T(j)}=\frac{∂J}{∂O_T(j)}\frac{∂O_T(j)}{∂neto_T(j)}=(R_T(j)-O_T(j))g'(neto_T(j)) 其中j∈[1,L] δTO​(j)=∂netoT​(j)∂J​=∂OT​(j)∂J​∂netoT​(j)∂OT​(j)​=(RT​(j)−OT​(j))g′(netoT​(j))其中j∈[1,L]

进一步,转换成矩阵的形式: δ T O = ∂ J ∂ n e t o T = ∂ J ∂ O T ∂ O T ∂ n e t o T = ( R T − O T ) ∗ g ′ ( n e t o T ) 公 式 1 δ_T^O=\frac{∂J}{∂neto_T}=\frac{∂J}{∂O_T}\frac{∂O_T}{∂neto_T}=(R_T-O_T)*g'(neto_T) 公式1 δTO​=∂netoT​∂J​=∂OT​∂J​∂netoT​∂OT​​=(RT​−OT​)∗g′(netoT​)公式1

然后我们计算 ∂ J ∂ n e t h T ( 1 ) = ∂ J ∂ O T ( 1 ) ∂ O T ( 1 ) ∂ n e t o T ( 1 ) ∂ n e t o T ( 1 ) ∂ h T ( 1 ) ∂ h T ( 1 ) ∂ n e t h T ( 1 ) + ∂ J ∂ O T ( 2 ) ∂ O T ( 2 ) ∂ n e t o T ( 2 ) ∂ n e t o T ( 2 ) ∂ h T ( 1 ) ∂ h T ( 2 ) ∂ n e t h T ( 1 ) \frac{∂J}{∂neth_T(1)}=\frac{∂J}{∂O_T(1)}\frac{∂O_T(1)}{∂neto_T(1)}\frac{∂neto_T(1)}{∂h_T(1)}\frac{∂h_T(1)}{∂neth_T(1)}+\frac{∂J}{∂O_T(2)}\frac{∂O_T(2)}{∂neto_T(2)}\frac{∂neto_T(2)}{∂h_T(1)}\frac{∂h_T(2)}{∂neth_T(1)} ∂nethT​(1)∂J​=∂OT​(1)∂J​∂netoT​(1)∂OT​(1)​∂hT​(1)∂netoT​(1)​∂nethT​(1)∂hT​(1)​+∂OT​(2)∂J​∂netoT​(2)∂OT​(2)​∂hT​(1)∂netoT​(2)​∂nethT​(1)∂hT​(2)​

整理一下就是: ∂ J ∂ n e t h T ( 1 ) = ∑ i = 1 2 ∂ J ∂ O T ( i ) ∂ O T ( i ) ∂ n e t o T ( i ) ∂ n e t o T ( i ) ∂ h T ( 1 ) ∂ h T ( 1 ) ∂ n e t h T ( 1 ) \frac{∂J}{∂neth_T(1)}=∑_{i=1}^2\frac{∂J}{∂O_T(i)}\frac{∂O_T(i)}{∂neto_T(i)}\frac{∂neto_T(i)}{∂h_T(1)}\frac{∂h_T(1)}{∂neth_T(1)} ∂nethT​(1)∂J​=i=1∑2​∂OT​(i)∂J​∂netoT​(i)∂OT​(i)​∂hT​(1)∂netoT​(i)​∂nethT​(1)∂hT​(1)​

进一步可以推广为: ∂ J ∂ n e t h T ( i ) = ∑ i = 1 L ∂ J ∂ O T ( i ) ∂ O T ( i ) ∂ n e t o T ( i ) ∂ n e t o T ( i ) ∂ h T ( j ) ∂ h T ( j ) ∂ n e t h T ( j ) \frac{∂J}{∂neth_T(i)}=∑_{i=1}^L\frac{∂J}{∂O_T(i)}\frac{∂O_T(i)}{∂neto_T(i)}\frac{∂neto_T(i)}{∂h_T(j)}\frac{∂h_T(j)}{∂neth_T(j)} ∂nethT​(i)∂J​=i=1∑L​∂OT​(i)∂J​∂netoT​(i)∂OT​(i)​∂hT​(j)∂netoT​(i)​∂nethT​(j)∂hT​(j)​

计算出来的结果为: δ T h ( j ) = ∂ J ∂ n e t h j ( T ) = ∑ i = 1 L δ T O ( i ) V j i f ′ ( n e t h j ( T ) ) δ_T^h(j)=\frac{∂J}{∂neth_j(T)}=∑_{i=1}^Lδ_T^O(i)V_{ji}f'(neth_j(T)) δTh​(j)=∂nethj​(T)∂J​=i=1∑L​δTO​(i)Vji​f′(nethj​(T))

在整理成矩阵的形式: δ T h = V T δ T O ∗ f ′ ( n e t h ( T ) ) 公 式 2 δ_T^h=V^Tδ_T^O*f'(neth(T))公式2 δTh​=VTδTO​∗f′(neth(T))公式2

对于其他时刻t的关于 δ t O δ_t^O δtO​梯度计算,也最后一个时刻T的计算方式类似:

δ t O = ∂ J ∂ n e t o t = ∂ J ∂ O t ∂ O t ∂ n e t o t = ( R t − O t ) ∗ g ′ ( n e t o t ) δ_t^O=\frac{∂J}{∂neto_t}=\frac{∂J}{∂O_t}\frac{∂O_t}{∂neto_t}=(R_t-O_t)*g'(neto_t) δtO​=∂netot​∂J​=∂Ot​∂J​∂netot​∂Ot​​=(Rt​−Ot​)∗g′(netot​)

注意:最重要的计算部分在于其他时刻关于 δ T h ( j ) δ_T^h(j) δTh​(j)的计算,下面进行具体的介绍

对于不是最后一个时刻T的 δ t h ( j ) δ_t^h(j) δth​(j),其主要包含的两个部分,一个部分是从输出层传递回来的误差,另外一个部分是从t+1时刻传递回来的误差。(因为 h t h_t ht​计算的结果是 h t + 1 h_{t+1} ht+1​的一个输入)

形式化描述为: δ t h ( j ) = [ 输 出 层 误 差 + t + 1 时 刻 的 误 差 ] f ′ ( n e t h t ( j ) ) δ_t^h(j)=[输出层误差 +t+1时刻的误差]f'(neth_t(j)) δth​(j)=[输出层误差+t+1时刻的误差]f′(netht​(j)) 在之前的计算中,我们已经知道了t时刻从输出层传递回来的误差为: V t δ t O ∗ f ′ ( n e t h ( t ) ) V^tδ_t^O*f'(neth(t)) VtδtO​∗f′(neth(t)) 则有,原式为: δ t h ( j ) = [ V t δ t O + t + 1 时 刻 的 误 差 ] f ′ ( n e t h t ( j ) ) δ_t^h(j)=[V^tδ_t^O +t+1时刻的误差]f'(neth_t(j)) δth​(j)=[VtδtO​+t+1时刻的误差]f′(netht​(j))

下面,我们具体来计算T到T-1时刻的误差传递,根据正向传播的方式有: S T = f ( W T X T + U T S T − 1 ) S_{T} = f(W^TX_{T}+U^TS_{T-1}) ST​=f(WTXT​+UTST−1​) S T − 1 = f ( W T − 1 X T − 1 + U T S T − 2 ) S_{T-1}=f(W^{T-1}X_{T-1}+U^TS_{T-2}) ST−1​=f(WT−1XT−1​+UTST−2​) 根据上面的两个公式我们可以看出,在求 δ T − 1 h ( j ) δ_{T-1}^h(j) δT−1h​(j)的时候,需要的另外一部分是 δ T h δ T − 1 h ( j ) \frac{δ_{T}^h}{δ_{T-1}^h(j)} δT−1h​(j)δTh​​,也就是 ∑ i = 1 N δ T h ( i ) U j i ∑_{i=1}^Nδ_{T}^h(i)U_{ji} i=1∑N​δTh​(i)Uji​,则总结上面的公式有 δ T − 1 h ( j ) = [ ∑ i = 1 L V j i δ t O ( i ) + ∑ i = 1 N δ T h ( i ) U j i ] f ′ ( n e t h T − 1 ( j ) ) δ_{T-1}^h(j)=[∑_{i=1}^LV_{ji}δ_t^O(i)+∑_{i=1}^Nδ_{T}^h(i)U_{ji}]f'(neth_{T-1}(j)) δT−1h​(j)=[i=1∑L​Vji​δtO​(i)+i=1∑N​δTh​(i)Uji​]f′(nethT−1​(j)) δ T − 1 h = [ V T δ T O + U T δ T h ] ∗ f ′ ( n e t h T − 1 ) δ_{T-1}^h=[V^Tδ_T^O+U^Tδ_{T}^h]*f'(neth_{T-1}) δT−1h​=[VTδTO​+UTδTh​]∗f′(nethT−1​)

进而可以推广到其他时刻 δ t − 1 h = [ V T δ t O + U T δ t h ] ∗ f ′ ( n e t h t − 1 ) δ_{t-1}^h=[V^Tδ_t^O+U^Tδ_{t}^h]*f'(neth_{t-1}) δt−1h​=[VTδtO​+UTδth​]∗f′(netht−1​)

2.5 权重更新 2.5.1 隐藏层到输出层V更新

V j i ( n e w ) = V j i ( o l d ) − α ∑ t = 1 T ∂ J ∂ n e t o t ( i ) ∂ n e t o t ( i ) ∂ V j i = V j i − α ∑ t = 1 T δ o t ( i ) h t ( j ) V_{ji}(new)=V_{ji}(old)-α∑_{t=1}^T\frac{∂J}{∂neto_t(i)}\frac{∂neto_t(i)}{∂V_{ji}}=V_{ji}-α∑_{t=1}^Tδ_o^t(i)h_t(j) Vji​(new)=Vji​(old)−αt=1∑T​∂netot​(i)∂J​∂Vji​∂netot​(i)​=Vji​−αt=1∑T​δot​(i)ht​(j) 整理成矩阵的形式: V ( n e w ) = V ( o l d ) + α ∑ t = 1 T δ o t h t T V(new)=V(old)+α∑_{t=1}^Tδ_o^th_t^T V(new)=V(old)+αt=1∑T​δot​htT​ 注意: h t T h_t^T htT​中的T表示转置。

2.5.2 输入层到隐藏层的W更新

W j i ( n e w ) = W j i ( o l d ) − α ∑ t − 1 T ∂ J ∂ n e t h t ( i ) ∂ n e t h t ( i ) ∂ W j i = W j i ( o l d ) − α ∑ t − 1 T δ h t ( i ) X t ( j ) W_{ji}(new)=W_{ji}(old)-α∑_{t-1}^{T}\frac{∂J}{∂neth_t(i)}\frac{∂neth_t(i)}{∂W_{ji}}=W_{ji}(old)-α∑_{t-1}^{T}δ_h^t(i)X_t(j) Wji​(new)=Wji​(old)−αt−1∑T​∂netht​(i)∂J​∂Wji​∂netht​(i)​=Wji​(old)−αt−1∑T​δht​(i)Xt​(j) 整理成矩阵的形式 W ( n e w ) = W ( o l d ) + α ∑ t = 1 T δ h t X t T W(new)=W(old)+α∑_{t=1}^Tδ_h^tX_t^T W(new)=W(old)+αt=1∑T​δht​XtT​ 注意: X t T X_t^T XtT​中的T表示转置。添加链接描述

2.5.3 隐藏层到隐藏层的U的更新

U j i ( n e w ) = U j i ( o l d ) − α ∑ t − 1 T ∂ J ∂ n e t h t ( i ) ∂ n e t h t ( i ) ∂ U j i = U j i ( o l d ) − α ∑ t − 1 T δ h t ( i ) h t − 1 ( j ) U_{ji}(new)=U_{ji}(old)-α∑_{t-1}^{T}\frac{∂J}{∂neth_t(i)}\frac{∂neth_t(i)}{∂U_{ji}}=U_{ji}(old)-α∑_{t-1}^{T}δ_h^t(i)h_{t-1}(j) Uji​(new)=Uji​(old)−αt−1∑T​∂netht​(i)∂J​∂Uji​∂netht​(i)​=Uji​(old)−αt−1∑T​δht​(i)ht−1​(j) 整理成矩阵的形式: U ( n e w ) = U ( o l d ) + α ∑ t = 1 T δ o t h t − 1 T U(new)=U(old)+α∑_{t=1}^Tδ_o^th_{t-1}^T U(new)=U(old)+αt=1∑T​δot​ht−1T​ 注意: h t − 1 T h_{t-1}^T ht−1T​中的T表示转置。

3、参考资料 知乎——RNN前向传播与后向传播公式推导


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3