深度学习 |
您所在的位置:网站首页 › ISSUELIST最简单三个公式 › 深度学习 |
深度学习——循环神经网络RNN公式推导
1、循环神经网络引入
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=21t=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=21t=1∑Tj=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时刻没有激活的隐藏层的向量值。 为了清晰,我们再之前单个神经元中的结构拿过来: 进一步,转换成矩阵的形式: δ 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)Vjif′(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∑LVjiδ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δothtT 注意: 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δhtXtT 注意: 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δotht−1T 注意: h t − 1 T h_{t-1}^T ht−1T中的T表示转置。 3、参考资料 知乎——RNN前向传播与后向传播公式推导 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |