手搓GPT系列之 - 通过理解LSTM的反向传播过程,理解LSTM解决梯度消失的原理 - 逐条解释LSTM创始论文全部推导公式,配超多图帮助理解(上篇)

1. 前言

说起RNN和LSTM,就绕不过Sepp Hochreiter 1997年的开山大作 Long Short-term Memory。奈何这篇文章写的实在是太劝退,整篇论文就2张图,网上很多介绍LSTM的文章都对这个模型反向传播的部分避重就轻,更少见(反正我没找到)有人解析APPENDIX A.1和A.2所写的详细推导过程。笔者向来做事讲究个从心,这次不知道哪根弦打错竟然头铁硬刚这个推导过程。本文逐条参照原论文中的公式,记录整个推导过程的思路和笔者的理解,学习神经网络的同学如果不满足于仅知道LSTM里各个门的功能,本文可以帮助大家理解了这个推导过程,进而能顺利理解为什么那几个门的设置可以解决RNN里的梯度消失和梯度爆炸的问题。好了,Dig in!

2. LSTM模型

2.1 原文中的示意图

先给大家看最原汁原味的模型(LSTM论文中的图):

  • 记忆细胞模型图示:
    里插入图片描述
  • 网络拓扑图示:
    在这里插入图片描述

2.2 便于理解的示意图

上边这两个图,第一张图还好,第二张图笔者一开始是看得一头雾水,第一张图有些关键信息也没有表现出来,不看也罢,所以笔者特地画了一张全景体现论文中所涉及到的所有节点的网络示意图。

  • 总图
    在这里插入图片描述

上图展示了一个包含一个记忆单元(在一些文章中称为记忆细胞) c j c_j cj的LSTM网络。图中蓝色小方格在这里插入图片描述代表输入单元、输出单元或者用于存储中间状态的存储单元。包括输出单元 y k y^k yk,输入单元 x x x,输入门 y i n j y^{in_j} yinj,输出门 y o u t j y^{out_j} youtj,记忆单元激活状态 y c j y^{c_j} ycj,及隐藏单元的激活状态 y i y^i yi。输入门、输出门、记忆单元、隐藏单元激活等模块的输入 y u y^u yu包括输入单元、输入门激活、输出门激活、记忆单元激活等信息,输出单元的输入 y u : u   n o t   a   g a t e y^{u:u\ not\ a\ gate} yu:u not a gate,包括记忆单元激活和隐藏单元激活两项,不包括输入输出门的激活和输入单元。接下来我们逐个分析LSTM文章中,APPENDIX A.1中的公式。

3. 前向过程

APPENDIX A.1的公式从(3)开始,所以我们也从(3)开始,以便于跟原文对应:

3.1 激活函数

总图中涉及到3中激活函数,分别为 f , g , h f,g,h f,g,h,其中 f f f是输入输出门,以及隐藏节点的激活函数,是一个sigmoid函数:
f ( x ) = 1 1 + e x p ( − x ) (3) f(x) = \frac{1}{1 + exp(-x)} \tag{3} f(x)=1+exp(x)1(3)
h h h函数用于激活记忆单元的输出信息,是tanh函数:
h ( x ) = 2 1 + e x p ( − x ) − 1 (4) h(x) = \frac{2}{1 + exp(-x)} -1\tag{4} h(x)=1+exp(x)21(4)
g g g函数用于激活记忆单元的输入信息:
g ( x ) = 4 1 + e x p ( − x ) − 2 (5) g(x) = \frac{4}{1 + exp(-x)} -2\tag{5} g(x)=1+exp(x)42(5)

3.2 隐藏节点激活状态的计算

隐藏单元 i i i的激活函数计算公式:
n e t i ( t ) = ∑ u w i u y u ( t − 1 ) y i ( t ) = f i ( n e t i ( t ) ) . (6) \begin{aligned} net_i(t) &= \sum_u w_{iu}y_u(t-1) \\ y^i(t) &= f_i(net_i(t)). \end{aligned} \tag{6} neti(t)yi(t)=uwiuyu(t1)=fi(neti(t)).(6)
这个公式对应了总图中的这个部分:
在这里插入图片描述
其中 y u y_u yu包含了输入单元 x x x,输入门激活状态 y i n j y^{in_j} yinj,输出门激活状态 y o u t j y^{out_j} youtj,记忆单元激活状态 y c j y^{c_j} ycj,以及隐藏单元本身的输出 y i y^i yi。隐藏单元激活状态的输出会更新 y i y^i yi,成为下一个时间步的输入的一部分。

3.3 输入门激活状态的计算

n e t i n j ( t ) = ∑ u w i n j u y u ( t − 1 ) y i n j ( t ) = f i n j ( n e t i n j ( t ) ) . (7) \begin{aligned} net_{in_j}(t) &= \sum_u w_{{in_j}u}y_u(t-1) \\ y^{in_j}(t) &= f_{in_j}(net_{in_j}(t)). \end{aligned} \tag{7} netinj(t)yinj(t)=uwinjuyu(t1)=finj(netinj(t)).(7)
对应于总图这一部分:
在这里插入图片描述
其中输入 y u y^u yu所包含的内容与隐藏节点激活状态计算过程中的 y u y^u yu一致,输出用于更新 y i n j y^{in_j} yinj。作为记忆单元的输入,另外,也作为整个网络下一个时间步输入的一部分。

3.4 输出门激活状态的计算

n e t o u t j ( t ) = ∑ u w o u t j u y u ( t − 1 ) y o u t j ( t ) = f o u t j ( n e t o u t j ( t ) ) . (8) \begin{aligned} net_{out_j}(t) &= \sum_u w_{{out_j}u}y_u(t-1) \\ y^{out_j}(t) &= f_{out_j}(net_{out_j}(t)). \end{aligned} \tag{8} netoutj(t)youtj(t)=uwoutjuyu(t1)=foutj(netoutj(t)).(8)
对应于总图这一部分:
在这里插入图片描述
其中输入 y u y^u yu所包含的内容与隐藏节点激活状态计算过程中的 y u y^u yu一致,输出用于更新 y o u t j y^{out_j} youtj。作为记忆单元的输入,另外,也作为整个网络下一个时间步输入的一部分。

3.5 记忆单元的激活状态的计算

n e t c j ( t ) = ∑ u w c j u y u ( t − 1 ) s c j ( t ) = s c j ( t − 1 ) + y i n j ( t ) g ( n e t c j ( t ) ) y c j ( t ) = y o u t j ( t ) h ( s c j ( t ) ) . (9) \begin{aligned} net_{c_j}(t) &= \sum_u w_{{c_j}u}y_u(t-1) \\ s_{c_j}(t) &= s_{c_j}(t-1) + y^{in_j} (t) g(net_{c_j}(t)) \\ y^{c_j}(t) &=y^{out_j}(t) h(s_{c_j}(t)). \end{aligned} \tag{9} netcj(t)scj(t)ycj(t)=uwcjuyu(t1)=scj(t1)+yinj(t)g(netcj(t))=youtj(t)h(scj(t)).(9)
对应于总图的这一部分计算:
在这里插入图片描述
其中输入 y u y^u yu所包含的内容与隐藏节点激活状态计算过程中的 y u y^u yu一致,输出用于更新 y c j y^{c_j} ycj。作为整个网络下一个时间步输入的一部分。

3.6 输出单元激活状态的计算

n e t k ( t ) = ∑ u :   u   n o t   a   g a t e w k u y u ( t − 1 ) y k ( t ) = f k ( n e t k ( t ) ) . (8) \begin{aligned} net_{k}(t) &= \sum_{u:\ u\ not\ a\ gate} w_{{k}u}y_u(t-1) \\ y^{k}(t) &= f_{k}(net_{k}(t)). \end{aligned} \tag{8} netk(t)yk(t)=u: u not a gatewkuyu(t1)=fk(netk(t)).(8)
对应于总图这一部分:
在这里插入图片描述

其中输入 y u y^u yu所包含的内容仅为 y c j , y i y^{c_j},y^i ycj,yi,输出作为网络输出。

4. 截断反向传播近似求导(Approximate derivatives for truncated backprop)

在本文中通过这个技术来简化反向传播过程。直觉上来说,就是将流入门或者记忆单元的误差信息截断在门或者记忆单元之内,确保门或者记忆单元的误差信息不会继续往外流动。由此确保了恒定误差转盘(CEC, Constant Error Carrousel)的实现。LSTM一文中,通过 ≈ t r \approx_{tr} tr来表示被截断之后的近似导数。

4.1 截断求导的应用范围

应用截断后向传播之后,以下的求导公式的值会被设置为0:
∂ n e t i n j ( t ) ∂ y u ( t − 1 ) ≈ t r 0   ∀ u , ∂ n e t o u t j ( t ) ∂ y u ( t − 1 ) ≈ t r 0   ∀ u , ∂ n e t c j ( t ) ∂ y u ( t − 1 ) ≈ t r 0   ∀ u . \begin{aligned} \frac{\partial net _{in_j}(t)}{\partial y^u(t-1)} \approx_{tr} 0\ \forall{u},\\\\ \frac{\partial net _{out_j}(t)}{\partial y^u(t-1)} \approx_{tr} 0\ \forall{u},\\\\ \frac{\partial net _{c_j}(t)}{\partial y^u(t-1)} \approx_{tr} 0\ \forall{u}.\\ \end{aligned} yu(t1)netinj(t)tr0 u,yu(t1)netoutj(t)tr0 u,yu(t1)netcj(t)tr0 u.
我们举输入门为例子,解释上边这三个式子的含义:
在这里插入图片描述
当错误信号通过 y i n j y^{in_j} yinj传进输入门时,假设流到 n e t i n j net_{in_j} netinj这里的错误信号为 v v v,此时输出到 y u y^u yu的错误信号会被截断为0。同样的情况也适用于其他门和记忆单元。
因此可以推导出:
∂ y i n j ( t ) ∂ y u ( t − 1 ) = f i n j ′ ( n e t i n j ( t ) ) ∂ n e t i n j ( t ) ∂ y u ( t − 1 ) ≈ t r 0   ∀ u , ∂ y o u t j ( t ) ∂ y u ( t − 1 ) = f o u t j ′ ( n e t o u t j ( t ) ) ∂ n e t o u t j ( t ) ∂ y u ( t − 1 ) ≈ t r 0   ∀ u . \begin{aligned} \frac{\partial y^{in_j}(t)}{\partial y^u(t-1)} = f'_{in_j}(net_{in_j}(t))\frac{\partial net_{in_j}(t)}{\partial y^u(t-1)} \approx_{tr}0\ \forall u,\\\\ \frac{\partial y^{out_j}(t)}{\partial y^u(t-1)} = f'_{out_j}(net_{out_j}(t))\frac{\partial net_{out_j}(t)}{\partial y^u(t-1)} \approx_{tr}0\ \forall u. \end{aligned} yu(t1)yinj(t)=finj(netinj(t))yu(t1)netinj(t)tr0 u,yu(t1)youtj(t)=foutj(netoutj(t))yu(t1)netoutj(t)tr0 u.
以及:
∂ y c j ( t ) ∂ y u ( t − 1 ) = ∂ y c j ( t ) ∂ n e t o u t j ( t ) ∂ n e t o u t j ( t ) ∂ y u ( t − 1 ) + ∂ y c j ( t ) ∂ n e t i n j ( t ) ∂ n e t i n j ( t ) ∂ y u ( t − 1 ) + ∂ y c j ( t ) ∂ n e t c j ( t ) ∂ n e t c j ( t ) ∂ y u ( t − 1 ) ≈ t r 0   ∀ u . \frac{\partial y^{c_j}(t)}{\partial y^u(t-1)} = \frac{\partial y^{c_j}(t)}{\partial net_{out_j}(t)}\frac{\partial net_{out_j}(t)}{\partial y^u(t-1)} + \frac{\partial y^{c_j}(t)}{\partial net_{in_j}(t)}\frac{\partial net_{in_j}(t)}{\partial y^u(t-1)} + \frac{\partial y^{c_j}(t)}{\partial net_{c_j}(t)}\frac{\partial net_{c_j}(t)}{\partial y^u(t-1)}\approx_{tr}0\ \forall u. yu(t1)ycj(t)=netoutj(t)ycj(t)yu(t1)netoutj(t)+netinj(t)ycj(t)yu(t1)netinj(t)+netcj(t)ycj(t)yu(t1)netcj(t)tr0 u.
我们利用记忆单元举例说明上边这三个式子的直觉解释:
在这里插入图片描述
从记忆单元激活状态 y c j y^{c_j} ycj流入的误差信息,在记忆单元内部流转之后,经过 n e t c j net_{c_j} netcj流到 y u y^u yu处流出的误差信息被强制截断为0。同样误差信息经 y i n j y^{in_j} yinj流入输入门,再流到 y u y^u yu时,误差信息被截断为0。经 y o u t j y^{out_j} youtj流入输出门,再流到 y u y^u yu时,误差信息被截断为0。
综合上述公式,我们可以得到,对于任何 w l m w_{lm} wlm非直接与记忆单元及门( c j , i n j , o u t j c_{j},in_j,out_j cj,inj,outj)连接的,即( l ∉ { c j , i n j , o u t j } l \notin\{c_j, in_j, out_j\} l/{cj,inj,outj}):
∂ y c j ( t ) ∂ w l m = ∑ u ∂ y c j ( t ) ∂ y u ( t − 1 ) ∂ y u ( t − 1 ) ∂ w l m \frac{\partial y^{c_j}(t)}{\partial w_{lm}}= \sum_u \frac{\partial y^{c_j}(t)}{\partial y^u(t-1)} \frac{\partial y^u(t-1)}{\partial w_{lm}} wlmycj(t)=uyu(t1)ycj(t)wlmyu(t1)
上边这个式子可以理解为,所有只能通过 y u y^u yu与记忆单元、输入输出门连接的网络,都不会收到从记忆单元激活状态输出处传来的错误信号。一般来说是谁与记忆单元和门通过 y u y^u yu间接连接的呢?有几种,第一种就是上一个时间步的记忆单元、输入输出门的激活状态,记为 y i n j ( t − 1 ) , y o u t j ( t − 1 ) , y c j ( t − 1 ) y^{in_j}(t-1),y^{out_j}(t-1),y^{c_j}(t-1) yinj(t1),youtj(t1),ycj(t1);另一种就是隐藏单元激活状态。下边这张图可以帮助大家理解上边这个公式的含义:
在这里插入图片描述

红色箭头和数字,表示 t t t时间步下,从 y c j y^{c_j} ycj传入的误差信息的传播路径,绿色箭头和数字,表示 t − 1 t-1 t1时间步下的误差信息的传播路径。用一句话概括就是,误差信号被门和记忆单元隔开,不会随着时间步循环后向传播。

4.2 输出单元的截断求导

关于输出节点在t时刻的截断求导公式是:
∂ y k ( t ) w l m = f k ′ ( n e t k ( t − 1 ) ) ( ∑ u :   u   n o t   a   g a t e w k u ∂ y u ( t − 1 ) ∂ w l m + δ k l y m ( t − 1 ) ) ≈ t r f k ′ ( n e t k ( t ) ) { y m ( t − 1 ) l = k w k c j ∂ y c j ( t − 1 ) ∂ w l m l = c j w k c j ∂ y c j ( t − 1 ) ∂ w l m l = i n j   o r   l = o u t j ∑ i :   i   h i d d e n   u n i t w k i ∂ y i ( t − 1 ) ∂ w l m o t h e r w i s e (10) \begin{aligned} \frac{\partial y^k(t)}{w_{lm}} = & f'_k(net_k(t-1))( \sum_{u:\ u\ not\ a\ gate} w_{ku} \frac{\partial y^u(t-1)}{\partial w_{lm}} + \delta_{kl}y^m(t-1))\\ \approx_{tr} & f'_k(net_k(t)) \begin{cases} y^m(t-1) & l=k \\ w_{kc_{j}}\frac{\partial y^{c_j}(t-1)}{\partial w_{lm}} & l=c_j\\ w_{kc_{j}}\frac{\partial y^{c_j}(t-1)}{\partial w_{lm}} & l=in_j\ or\ l=out_j\\ \sum_{i:\ i\ hidden\ unit} w_{ki} \frac{\partial y^i(t-1)}{\partial w_{lm}} & otherwise \end{cases} \end{aligned} \tag{10} wlmyk(t)=trfk(netk(t1))(u: u not a gatewkuwlmyu(t1)+δklym(t1))fk(netk(t)) ym(t1)wkcjwlmycj(t1)wkcjwlmycj(t1)i: i hidden unitwkiwlmyi(t1)l=kl=cjl=inj or l=outjotherwise(10)
上述公式中, δ \delta δ表示克罗内克函数(kronecker delta),即 ( i = j ) ⇔ ( δ i j = 1 )   A N D   ( i ≠ j ) ⇔ ( δ i j = 0 ) (i=j) \Leftrightarrow (\delta_{ij} = 1)\ AND\ (i\ne j) \Leftrightarrow (\delta_{ij} = 0) (i=j)(δij=1) AND (i=j)(δij=0)。我们来解读上边这个式子:
l = k l=k l=k时,我们有:
∂ y k ( t ) w l m = ∂ y k ( t ) w k m = f k ′ ( n e t k ( t ) ) ∂ ∑ u :   u   n o t   a   g a t e w k u y u ( t − 1 ) ∂ w k m = f k ′ ( n e t k ( t ) ) y m ( t − 1 ) \begin{aligned} \frac{\partial y^k(t)}{w_{lm}} &= \frac{\partial y^k(t)}{w_{km}}\\ &= f'_k(net_k(t)) \frac{\partial \sum_{u:\ u\ not\ a\ gate} w_{ku}y^u(t-1)}{\partial w_{km}}\\ & = f'_k(net_k(t)) y^m(t-1) \end{aligned} wlmyk(t)=wkmyk(t)=fk(netk(t))wkmu: u not a gatewkuyu(t1)=fk(netk(t))ym(t1)
下图显示了 l = k l=k l=k ∂ y k ( t ) w l m \frac{\partial y^k(t)}{w_{lm}} wlmyk(t)的误差传播路线(红色箭头):
在这里插入图片描述

l = c j l=c_j l=cj时,也就是求 y k ( t ) y^k(t) yk(t)关于记忆单元输入(注意不是输入门)的网络的权重 w c j w_{c_j} wcj的偏导。原文是把 c j c_j cj写成 c j v c_j^v cjv,因为一个完整的LSTM网络可以包含 p p p( c ∈ [ 1 , . . . , p ] c \in [1,...,p] c[1,...,p])个记忆块(memory block),每个记忆块可以有 q q q j ∈ [ 1 , . . . , q ] j \in [1,...,q] j[1,...,q])个记忆单元。因此 c j v c_j^v cjv表示第 v v v个记忆块中的第 j j j个记忆单元。为了方便理解,笔者把LSTM网络简化成一个单记忆块,单记忆单元的网络。标记则省略记忆块的标记,只保留记忆单元的标记,因此就简化成了 c j c_j cj,表示第 j j j个记忆单元。我们现在来理解一下输出单元激活值 y k y^k yk关于记忆单元的输入权重 w c j w_{c_j} wcj的偏导:
∂ y k ( t ) w l m = ∂ y k ( t ) w c j m = f k ′ ( n e t k ( t ) ) ∂ ∑ u :   u   n o t   a   g a t e w k u y u ( t − 1 ) ∂ w c j m = f k ′ ( n e t k ( t ) ) ∂ ∑ u :   u   n o t   a   g a t e w k u y u ( t − 1 ) ∂ y c j ( t − 1 ) ∂ y c j ( t − 1 ) ∂ w c j m = f k ′ ( n e t k ( t ) ) w k c j ∂ y c j ( t − 1 ) ∂ w c j m \begin{aligned} \frac{\partial y^k(t)}{w_{lm}} &= \frac{\partial y^k(t)}{w_{{c_j}m}}\\ &= f'_k(net_k(t)) \frac{\partial \sum_{u:\ u\ not\ a\ gate} w_{{k}u}y^u(t-1)}{\partial w_{{c_j}m}}\\ &= f'_k(net_k(t)) \frac{\partial \sum_{u:\ u\ not\ a\ gate} w_{{k}u}y^u(t-1)}{\partial y^{c_j}(t-1)} \frac{\partial y^{c_j}(t-1)}{\partial w_{{c_j}m}}\\ & = f'_k(net_k(t)) w_{k{c_j}} \frac{\partial y^{c_j}(t-1)}{\partial w_{{c_j}m}} \end{aligned} wlmyk(t)=wcjmyk(t)=fk(netk(t))wcjmu: u not a gatewkuyu(t1)=fk(netk(t))ycj(t1)u: u not a gatewkuyu(t1)wcjmycj(t1)=fk(netk(t))wkcjwcjmycj(t1)
误差传播路线:
在这里插入图片描述

l = i n j l=in_j l=inj时,可以得到:
∂ y k ( t ) w l m = ∂ y k ( t ) w i n j m = f k ′ ( n e t k ( t ) ) ∂ ∑ u :   u   n o t   a   g a t e w k u y u ( t − 1 ) ∂ w i n j m = f k ′ ( n e t k ( t ) ) ∂ ∑ u :   u   n o t   a   g a t e w k u y u ( t − 1 ) ∂ y c j ( t − 1 ) ∂ y c j ( t − 1 ) ∂ w i n j m = f k ′ ( n e t k ( t ) ) w k c j ∂ y c j ( t − 1 ) ∂ w i n j m \begin{aligned} \frac{\partial y^k(t)}{w_{lm}} &= \frac{\partial y^k(t)}{w_{{in_j}m}}\\ &= f'_k(net_k(t)) \frac{\partial \sum_{u:\ u\ not\ a\ gate} w_{{k}u}y^u(t-1)}{\partial w_{{in_j}m}}\\ &= f'_k(net_k(t)) \frac{\partial \sum_{u:\ u\ not\ a\ gate} w_{{k}u}y^u(t-1)}{\partial y^{c_j}(t-1)} \frac{\partial y^{c_j}(t-1)}{\partial w_{{in_j}m}}\\ & = f'_k(net_k(t)) w_{k{c_j}} \frac{\partial y^{c_j}(t-1)}{\partial w_{{in_j}m}} \end{aligned} wlmyk(t)=winjmyk(t)=fk(netk(t))winjmu: u not a gatewkuyu(t1)=fk(netk(t))ycj(t1)u: u not a gatewkuyu(t1)winjmycj(t1)=fk(netk(t))wkcjwinjmycj(t1)
误差传播路线:
在这里插入图片描述
由于我们的例子中简化了记忆单元的结构,LSTM原文中,实际上是有多个记忆单元,并且多个记忆单元可以组成一个记忆单元块。每个记忆单元块可以直接连接其前面所有的记忆单元的输出,因此原文中,当 l = i n j l=in_j l=inj时,计算公式为:
∂ y k ( t ) w l m = ∑ v = 1 s j f k ′ ( n e t k ( t ) ) w k c j ∂ y c j v ( t − 1 ) ∂ w i n j m \begin{aligned} \frac{\partial y^k(t)}{w_{lm}} &= \sum_{v=1}^{s_j} f'_k(net_k(t)) w_{k{c_j}} \frac{\partial y^{c_j^v}(t-1)}{\partial w_{{in_j}m}} \end{aligned} wlmyk(t)=v=1sjfk(netk(t))wkcjwinjmycjv(t1)
其中 c j v c^v_j cjv表示第 v v v个记忆单元块中的第 j j j个记忆单元。

l = o u t j l=out_j l=outj时,通过与上面一样的及算法方法可以得到:
∂ y k ( t ) w l m = f k ′ ( n e t k ( t ) ) w k c j ∂ y c j ( t − 1 ) ∂ w o u t j m \begin{aligned} \frac{\partial y^k(t)}{w_{lm}} & = f'_k(net_k(t)) w_{k{c_j}} \frac{\partial y^{c_j}(t-1)}{\partial w_{{out_j}m}} \end{aligned} wlmyk(t)=fk(netk(t))wkcjwoutjmycj(t1)
误差传播路线:
在这里插入图片描述
l = i l=i l=i,我们可以得到:
∂ y k ( t ) w l m = ∂ y k ( t ) w i m = f k ′ ( n e t k ( t ) ) ∂ ∑ i :   i   h i d d e n   u n i t s w k u y u ( t − 1 ) ∂ w i m = f k ′ ( n e t k ( t ) ) ∂ ∑ i :   i   h i d d e n   u n i t s w k u y u ( t − 1 ) ∂ y i ( t − 1 ) ∂ y i ( t − 1 ) ∂ w i m = f k ′ ( n e t k ( t ) ) w k i ∂ y i ( t − 1 ) ∂ w i m \begin{aligned} \frac{\partial y^k(t)}{w_{lm}} &= \frac{\partial y^k(t)}{w_{{i}m}}\\ &= f'_k(net_k(t)) \frac{\partial \sum_{i:\ i\ hidden\ units} w_{{k}u}y^u(t-1)}{\partial w_{{i}m}}\\ &= f'_k(net_k(t)) \frac{\partial \sum_{i:\ i\ hidden\ units} w_{{k}u}y^u(t-1)}{\partial y^{i}(t-1)} \frac{\partial y^{i}(t-1)}{\partial w_{{i}m}}\\ & = f'_k(net_k(t)) w_{k{i}} \frac{\partial y^{i}(t-1)}{\partial w_{{i}m}} \end{aligned} wlmyk(t)=wimyk(t)=fk(netk(t))wimi: i hidden unitswkuyu(t1)=fk(netk(t))yi(t1)i: i hidden unitswkuyu(t1)wimyi(t1)=fk(netk(t))wkiwimyi(t1)
误差传播路线为:
在这里插入图片描述

4.3 隐藏单元的截断求导

隐藏单元的求导公式如下:
∂ y i ∂ w l m = f i ′ ( n e t i ( t ) ) n e t i ( t ) ∂ w l m ≈ t r δ l i f i ′ ( n e t i ( t ) ) y m ( t − 1 ) . (11) \frac{\partial y^i}{\partial w_{lm}} = f'_i(net_i(t))\frac{net_i(t)}{\partial w_{lm}}\approx_{tr}\delta_{li}f'_i(net_i(t))y^m(t-1). \tag{11} wlmyi=fi(neti(t))wlmneti(t)trδlifi(neti(t))ym(t1).(11)
这个求导公式比较一目了然,感觉没什么好说的,我们放一个误差传播路径的示意图上来:
在这里插入图片描述

4.4 输入输出门及记忆单元的激活状态的截断求导

先看输入门的截断求导公式:
∂ y i n j ( t ) ∂ w l m = f i n j ′ ( n e t i n j ( t ) ) ∂ n e t i n j ( t ) ∂ w l m ≈ t r δ i n j l f i n j ′ ( n e t i n j ( t ) ) y m ( t − 1 ) (12) \begin{aligned} \frac{\partial y^{in_j}(t)}{\partial w_{lm}} =& f'_{in_j}(net_{in_j}(t))\frac{\partial net_{in_j}(t)}{\partial w_{lm}} \\ \approx_{tr} & \delta_{in_jl}f'_{in_j}(net_{in_j}(t))y^m(t-1) \end{aligned} \tag{12} wlmyinj(t)=trfinj(netinj(t))wlmnetinj(t)δinjlfinj(netinj(t))ym(t1)(12)
这个公式的意思就是,当且仅当 l = i n j l=in_j l=inj时,该公式有非零的值。同样的道理也适用于输出门的求导:
∂ y o u t j ( t ) ∂ w l m = f o u t j ′ ( n e t o u t j ( t ) ) ∂ n e t o u t j ( t ) ∂ w l m ≈ t r δ o u t j l f o u t j ′ ( n e t o u t j ( t ) ) y m ( t − 1 ) (13) \begin{aligned} \frac{\partial y^{out_j}(t)}{\partial w_{lm}} =& f'_{out_j}(net_{out_j}(t))\frac{\partial net_{out_j}(t)}{\partial w_{lm}} \\ \approx_{tr} & \delta_{out_jl}f'_{out_j}(net_{out_j}(t))y^m(t-1) \end{aligned} \tag{13} wlmyoutj(t)=trfoutj(netoutj(t))wlmnetoutj(t)δoutjlfoutj(netoutj(t))ym(t1)(13)

接下来是 s c j s_{c_j} scj的求导公式:
∂ s c j ( t ) ∂ w l m = ∂ s c j ( t − 1 ) ∂ w l m + ∂ g ( n e t c j ( t ) ) f i n j ( n e t i n j ( t ) ) ∂ w l m = ∂ s c j ( t − 1 ) ∂ w l m + ∂ g ( n e t c j ( t ) ) ∂ w l m f i n j ( n e t i n j ( t ) ) + ∂ f i n j ( n e t i n j ( t ) ) ∂ w l m g ( n e t c j ( t ) ) = ∂ s c j ( t − 1 ) ∂ w l m + ∂ g ( n e t c j ( t ) ) ∂ w l m y i n j ( t ) + ∂ y i n j ( t ) ∂ w l m g ( n e t c j ( t ) ) = ∂ s c j ( t − 1 ) ∂ w l m + ∂ n e t c j ( t ) ∂ w l m g ′ ( n e t c j ( t ) ) y i n j ( t ) + ∂ y i n j ( t ) ∂ w l m g ( n e t c j ( t ) ) ≈ t r ( δ c j l + δ i n j l ) ∂ s c j ( t − 1 ) ∂ w l m + δ i n j l ∂ y i n j ( t ) ∂ w l m g ( n e t c j ( t ) ) + δ c j l y i n j ( t ) g ′ ( n e t c j ( t ) ) ∂ n e t c j ( t ) ∂ w l m = ( δ c j l + δ i n j l ) ∂ s c j ( t − 1 ) ∂ w l m + δ i n j l g ( n e t c j ( t ) ) f i n j ′ ( n e t i n j ( t ) ) y m ( t − 1 ) + δ c j l y i n j ( t ) g ′ ( n e t c j ( t ) ) y m ( t − 1 ) (14) \begin{aligned} \frac{\partial s_{c_j}(t)}{\partial w_{lm}}=&\frac{\partial s_{c_j}(t-1)}{\partial w_{lm}} + \frac{\partial g(net_{c_j}(t))f_{in_j}(net_{in_j}(t))}{\partial w_{lm}}\\ =& \frac{\partial s_{c_j}(t-1)}{\partial w_{lm}} + \frac{\partial g(net_{c_j}(t))}{\partial w_{lm}}f_{in_j}(net_{in_j}(t)) + \frac{\partial f_{in_j}(net_{in_j}(t))}{\partial w_{lm}}g(net_{c_j}(t))\\ =& \frac{\partial s_{c_j}(t-1)}{\partial w_{lm}} + \frac{\partial g(net_{c_j}(t))}{\partial w_{lm}}y^{in_j}(t) + \frac{\partial y^{in_j}(t)}{\partial w_{lm}}g(net_{c_j}(t))\\ =& \frac{\partial s_{c_j}(t-1)}{\partial w_{lm}} + \frac{\partial net_{c_j}(t)}{\partial w_{lm}}g'(net_{c_j}(t))y^{in_j}(t) + \frac{\partial y^{in_j}(t)}{\partial w_{lm}}g(net_{c_j}(t))\\ \approx_{tr}& (\delta_{{c_j}l} + \delta_{{in_j}l})\frac{\partial s_{c_j}(t-1)}{\partial w_{lm}} + \delta_{{in_j}l} \frac{\partial y^{in_j}(t)}{\partial w_{lm}}g(net_{c_j}(t)) + \delta_{{c_j}l}y^{in_j}(t)g'(net_{c_j}(t))\frac{\partial net_{c_j}(t)}{\partial w_{lm}}\\ =& (\delta_{{c_j}l} + \delta_{{in_j}l})\frac{\partial s_{c_j}(t-1)}{\partial w_{lm}} + \delta_{{in_j}l}g(net_{c_j}(t)) f'_{in_j}(net_{in_j}(t))y^m(t-1) + \delta_{{c_j}l}y^{in_j}(t)g'(net_{c_j}(t))y^{m}(t-1) \end{aligned} \tag{14} wlmscj(t)====tr=wlmscj(t1)+wlmg(netcj(t))finj(netinj(t))wlmscj(t1)+wlmg(netcj(t))finj(netinj(t))+wlmfinj(netinj(t))g(netcj(t))wlmscj(t1)+wlmg(netcj(t))yinj(t)+wlmyinj(t)g(netcj(t))wlmscj(t1)+wlmnetcj(t)g(netcj(t))yinj(t)+wlmyinj(t)g(netcj(t))(δcjl+δinjl)wlmscj(t1)+δinjlwlmyinj(t)g(netcj(t))+δcjlyinj(t)g(netcj(t))wlmnetcj(t)(δcjl+δinjl)wlmscj(t1)+δinjlg(netcj(t))finj(netinj(t))ym(t1)+δcjlyinj(t)g(netcj(t))ym(t1)(14)

最后就是记忆单元的激活状态求导:
∂ y c j ( t ) ∂ w l m = ∂ y o u t j ( t ) ∂ w l m h ( s c j ( t ) ) + ∂ h ( s c j ( t ) ) ∂ w l m y o u t j ( t ) = ∂ y o u t j ( t ) ∂ w l m h ( s c j ( t ) ) + h ′ ( s c j ( t ) ) ∂ s c j ( y ) ∂ w l m y o u t j ( t ) = f o u t j ′ ( n e t o u t j ( t ) ) y m ( t − 1 ) h ( s c j ( t ) ) + h ′ ( s c j ( t ) ) ∂ s c j ( y ) ∂ w l m y o u t j ( t ) ≈ t r δ o u t j l f o u t j ′ ( n e t o u t j ( t ) ) y m ( t − 1 ) h ( s c j ( t ) ) + ( δ c j l + δ i n j l ) h ′ ( s c j ( t ) ) ∂ s c j ( y ) ∂ w l m y o u t j ( t ) (15) \begin{aligned} \frac{\partial y^{c_j}(t)}{\partial w_{lm}} =& \frac{\partial y^{out_j}(t)}{\partial w_{lm}} h(s_{c_j}(t)) + \frac{\partial h(s_{c_j}(t))}{\partial w_{lm}} y^{out_j}(t)\\ =& \frac{\partial y^{out_j}(t)}{\partial w_{lm}} h(s_{c_j}(t)) + h'(s_{c_j}(t))\frac{\partial s_{c_j}(y)}{\partial w_{lm}}y^{out_j}(t)\\ =& f'_{out_j}(net_{out_j}(t))y^m(t-1) h(s_{c_j}(t)) + h'(s_{c_j}(t))\frac{\partial s_{c_j}(y)}{\partial w_{lm}}y^{out_j}(t)\\ \approx_{tr}& \delta_{out_jl}f'_{out_j}(net_{out_j}(t))y^m(t-1) h(s_{c_j}(t)) + (\delta_{{c_j}l} + \delta_{{in_j}l})h'(s_{c_j}(t))\frac{\partial s_{c_j}(y)}{\partial w_{lm}}y^{out_j}(t)\\ \end{aligned} \tag{15} wlmycj(t)===trwlmyoutj(t)h(scj(t))+wlmh(scj(t))youtj(t)wlmyoutj(t)h(scj(t))+h(scj(t))wlmscj(y)youtj(t)foutj(netoutj(t))ym(t1)h(scj(t))+h(scj(t))wlmscj(y)youtj(t)δoutjlfoutj(netoutj(t))ym(t1)h(scj(t))+(δcjl+δinjl)h(scj(t))wlmscj(y)youtj(t)(15)

根据公式(14),(15)可知,若要计算记忆单元 j j j t t t时间步下的激活状态 y c j ( t ) y^{c_j}(t) ycj(t)关于 w l m w_{lm} wlm的本地误差因子,需要计算如下的参数: ∂ s c j ( t − 1 ) ∂ w l m \frac{\partial s_{c_j}(t-1)}{\partial w_{lm}} wlmscj(t1) g ( n e t c j ( t ) ) g(net_{c_j}(t)) g(netcj(t)) f i n j ′ ( n e t i n j ( t ) ) f'_{in_j}(net_{in_j}(t)) finj(netinj(t)) y m ( t − 1 ) y^m(t-1) ym(t1) y i n j ( t ) y^{in_j}(t) yinj(t) g ′ ( n e t c j ( t ) ) g'(net_{c_j}(t)) g(netcj(t)) f o u t j ′ ( n e t o u t j ( t ) ) f'_{out_j}(net_{out_j}(t)) foutj(netoutj(t)) h ( s c j ( t ) ) h(s_{c_j}(t)) h(scj(t)) h ′ ( s c j ( t ) ) h'(s_{c_j}(t)) h(scj(t)) y o u t j ( t ) y^{out_j}(t) youtj(t)

参数条件获取方法
∂ s c j ( t − 1 ) ∂ w l m \frac{\partial s_{c_j}(t-1)}{\partial w_{lm}} wlmscj(t1) l = i n j   o r   l = c j l=in_{j}\ or\ l=c_j l=inj or l=cj正向传播过程中计算并保存
g ( n e t c j ( t ) ) g(net_{c_j}(t)) g(netcj(t)) l = i n j l=in_{j} l=inj实时计算
f i n j ′ ( n e t i n j ( t ) ) f'_{in_j}(net_{in_j}(t)) finj(netinj(t)) l = i n j l=in_{j} l=inj实时计算
y m ( t − 1 ) y^m(t-1) ym(t1) l = i n j   o r   l = c j   o r   l = o u t j l=in_{j}\ or\ l=c_j\ or\ l=out_j l=inj or l=cj or l=outj正向传播过程中计算并保存
y i n j ( t ) y^{in_j}(t) yinj(t) l = c j l=c_j l=cj实时计算
g ′ ( n e t c j ( t ) ) g'(net_{c_j}(t)) g(netcj(t)) l = c j l=c_j l=cj实时计算
f o u t j ′ ( n e t o u t j ( t ) ) f'_{out_j}(net_{out_j}(t)) foutj(netoutj(t)) l = o u t j l=out_j l=outj实时计算
h ( s c j ( t ) ) h(s_{c_j}(t)) h(scj(t)) l = o u t j l=out_j l=outj实时计算
h ′ ( s c j ( t ) ) h'(s_{c_j}(t)) h(scj(t)) l = i n j   o r   l = c j l=in_{j}\ or\ l=c_j l=inj or l=cj实时计算
y o u t j ( t ) y^{out_j}(t) youtj(t) l = i n j   o r   l = c j l=in_{j}\ or\ l=c_j l=inj or l=cj实时计算

需要在正向传播过程中保存偏导数的情况为:当 l = i n j   o r   l = c j l=in_{j}\ or\ l=c_j l=inj or l=cj时,保存 ∂ s c j ( t − 1 ) ∂ w l m \frac{\partial s_{c_j}(t-1)}{\partial w_{lm}} wlmscj(t1) y m ( t ) y^{m}(t) ym(t)值也需要在前向传播过程中计算并保存,后向过程中的其他参数都可以在传播过程中实时生成。

由于文章太长,我们将把整个文章分为上下两篇,上篇介绍正向传播过程的公式以及各个计算单元的截断求导公式的详细解读。下篇我将给大家介绍后向传播过程的详细解读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/19812.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

照片尺寸怎么调整大小?三个方法,高效、快捷、安全!

照片尺寸怎么调整大小?照片是我们在日常生活和办公中经常会使用的文件类型之一。在制作各种文件、讲义、PPT、视频等内容时,图片都会成为重要的一部分。不同的图片格式和大小各有特点,有些图片虽然比较大但画质清晰,有些则方便传输…

网络安全公司Dragos披露网络安全事件

工业网络安全公司 Dragos 披露了它所称的“网络安全事件”,此前一个已知的网络犯罪团伙试图突破其防御并渗透到内部网络以加密设备。 虽然 Dragos 表示威胁行为者没有破坏其网络或网络安全平台,但他们可以访问公司的 SharePoint 云服务和合同管理系统。…

Windows系统下Chromedriver.exe安装及配置

Windows系统下Chromedriver.exe安装及配置 在利用selenium工具进行Web自动化测试时,必须先要安装浏览器驱动,通常比较常用的是谷歌浏览器和火狐浏览器。 一、浏览器驱动下载地址 1.浏览器驱动官网:http://chromedriver.storage.googleapis…

【Midjourney】Midjourney 的 Prompt 指令类型 ( 画风指令 | 人物细节指令 | 灯光镜头指令 | 艺术家风格指令 )

文章目录 一、Midjourney 的 Prompt 详细指令规则二、Midjourney 的画风指令关键词1、超现实主义2、注重细节描写3、Artstation 画风4、数字绘画风格5、漫画风格6、线条艺术 三、Midjourney 的人物细节描写关键词1、面部特征描写2、身体描写3、生成示例 14、生成示例 2 四、Mid…

(MIT6.045)自动机、可计算性和复杂性-DFA和NFA

毕业论文写完了。找点事干干。 佛系更新。 这是一门讲述 什么是计算?什么能被计算?怎么高效计算? 的哲学、数学和工程问题的课程。 主要包括: 有限状态机(Finite Avtomata):简单的模型。 可…

在Linux中进行Jenkins部署(maven-3.9.1+jdk11)

Jenkins部署在公网IP为x.x.x.x的服务器上 maven-3.9.1要安装在jdk11环境中 环境准备 第一步,下载jdk-11.0.19_linux-x64_bin.tar.gz安装包。 登录地址:Java Downloads | Oracle 下载jdk-11.0.19_linux-x64_bin.tar.gz安装包,然后使用Win…

C++11

目录 一、C11的诞生 二、initializer_list 1.统一的初始化方案 2.initializer_list 三、五个关键字 1.auto 2.decltype 3.nullptr 4.final 5.override 四、STL的新容器 1.array 2.forward_list 3.unordered_map与unordered_set 4.新增成员函数 五、右值引用和移…

OPNET Modeler 例程——ALOHA和CSMA的性能对比

文章目录 概述一、创建 ALOHA 协议模型二、创建 CSMA 协议模型三、创建收信机进程和节点模型四、创建总线型链路模型五、创建网络模型六、查看仿真结果总结 概述 本例程以以太网为例论述总线型网络的建模方法,对数据链路层的 MAC 技术进行建模分析,并进…

VRRP高级特性——管理VRRP

目录 管理VRRP备份组与业务VRRP备份组 管理VRRP备份组的两种实现方式 配置管理备份组 当在设备上配置了多个VRRP备份组时,为了减少设备间交互大量的VRRP协议报文,可以将其中一个VRRP备份组配置为管理VRRP备份组(mVRRP)&#xf…

sort命令 uniq命令 tr命令 cut命令

sort命令 ——以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序 比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出 语法格式: sort [选项] 参数 cat file | sort 选项 -n按照数字进行排序…

【JAVA】黑马程序员JAVA教程笔记 基础篇 Day 1

常用命令行DOS命令 Path环境变量 用途 1. 可以理解为系统中的一个大管家,记录了很多软件的完整路径。 2. 将常用的软件都交给Path环境变量,便于用命令行打开。 设置步骤 复制要使用的软件的存储地址右键点击 此电脑,打开属性点击 高级系统…

x509证书中的Issuer和Subject

在x509标准中的位置 Issuer 颁发者字段标识已签署和颁发证书的实体。 颁发者字段必须包含一个非空的可分辨名称 (DN)。 颁发者字段定义为 X.501 类型名称 [X.501]。 名称由以下 ASN.1 结构定义: Name 描述了一个由属性组成的分层名称,例如国家名称&…

多目标优化算法求解无人机三维路径规划

一、无人机模型 无人机三维路径规划是无人机在执行任务过程中的非常关键的环节,无人机三维路径规划的主要目的是在满足任务需求和自主飞行约束的基础上,计算出发点和目标点之间的最佳航路。 1.1路径成本 无人机三维路径规划的首要目标是寻找起飞点和目…

Linux网络——Shell编程之快捷命令

Linux网络——Shell编程之快捷命令 一、快捷排序 — sort 命令二、快捷去重 — uniq 命令三、快捷替换 — tr 命令四、快速裁剪 — cut 命令五、文件拆分 — split 命令六、文件合并 —paste 命令七、变量扫描器 — eval 命令 一、快捷排序 — sort 命令 sort命令用于以行为单位…

Path如何进行环境变量的配置?

开发Java程序,需要使用JDK提供的开发工具(比如javac.exe、java.exe等命令),而这些工具在JDK的安装目录的 bin目录下,如果不配置环境变量,那么这些命令只可以在该目录下执行。我们不可能把所有的java文件都放到JDK 的bin目录下&…

给Debian 11系统,添加右键时,使用其它程序打开】

VS Code 添加到文件管理器的右键菜单中 在 Debian 系统中,nautilus-actions 软件包已经被移除了。因此,如果你想将 VS Code 添加到文件管理器的右键菜单中,你需要使用 nautilus-admin 工具。下面是详细步骤: 打开终端应用程序。运…

前端三剑客CSS篇——CSS选择器

初识CSS选择器 文章目录 初识CSS选择器CSS三大特征👍CSS的三种使用方法👏CSS常见选择器👀标签选择器类选择器id选择器后代选择器属性选择器复合选择器 CSS代码风格📜 CSS是前端三剑客不可忽略的一部分,CSS对前端来说是…

项目成本管理

定义:项目各个成本的总和 作用:在预算范围内完成项目 考点: 直接成本是指一个由项目组承担的费用,例如员工的工资,电脑等硬件费用。 间接成本是指由多个项目组承担的费用,例如租金,水电费&am…

c++ 11标准模板(STL) std::vector<bool> (二)

定义于头文件 <vector> template<class Allocator> class vector<bool, Allocator>; std::vector<bool> 是 std::vector 对类型 bool 为空间提效的特化。 std::vector<bool> 中对空间提效的行为&#xff08;以及它是否有优化&#xff09;是实现…

19 树表的查找

文章目录 二叉排序树(BST)查找操作二叉排序树的存储结构查找实现查找算法分析二叉排序树的平均查找长度 插入操作删除操作代码实现 平衡二叉树&#xff08;AVL&#xff09;插入&旋转操作插入操作四种旋转情况代码实现 删除操作查找操作 介绍 树表查找是一种在树形数据结构中…