长短期记忆网络LSTMCell单元详解及反向传播的梯度求导

摘要

本文给出长短期记忆网络LSTMCell单元的定义公式, 并求解其在反向传播中的梯度.

求导过程比较长, 涉及的变量很多, 但求导过程并不难, 只要细心即可.

给出的相关公式是完整的, 编程导向的, 可以直接用于代码实现, 已通过 Python 验证.

相关

配套代码, 请参考文章 :

纯 Python 和 PyTorch 对比实现循环神经网络 LSTM 及反向传播

Affine 变换的定义和梯度, 请参考文章 :

affine/linear(仿射/线性)变换函数详解及全连接层反向传播的梯度求导

文章索引 :
https://blog.csdn.net/oBrightLamp/article/details/85067981

正文

1. LSTMCell 定义

1.1 一次迭代

n考虑输入一个 3 阶张量 X l m n X_{lmn} Xlmn, 该张量可以表示为 l l l 个尺寸为 m × n m \times n m×n 的矩阵 X m n X_{mn} Xmn, 同时表明循环单元的输入尺寸为 n n n.

设第一个输入矩阵为 X m n ( 1 ) X_{mn}^{(1)} Xmn(1) , 对应的 4 个门的变换矩阵分别为 W i , W f , W o , W c W_i,W_f,W_o,W_c Wi,Wf,Wo,Wc, 偏置向量为 a i , a f , a o , a c a_i,a_f,a_o,a_c ai,af,ao,ac.

设初始隐含层矩阵为 H m r ( 0 ) H_{mr}^{(0)} Hmr(0), 对应的 4 个门的变换矩阵分别为 V i , V f , V o , V c V_i,V_f,V_o,V_c Vi,Vf,Vo,Vc, 偏置向量为 b i , b f , b o , b c b_i,b_f,b_o,b_c bi,bf,bo,bc.

设初始单元转态矩阵为 C m r ( 0 ) C _{mr}^{(0)} Cmr(0), 则一次 LSTMCell 循环变换为 :
A i = X ( 1 ) W i T + a i + H ( 0 ) V i T + b i A f = X ( 1 ) W f T + a f + H ( 0 ) V f T + b f A o = X ( 1 ) W o T + a o + H ( 0 ) V o T + b o A c = X ( 1 ) W c T + a c + H ( 0 ) V c T + b c g i = s i g m o i d ( A i ) g f = s i g m o i d ( A f ) g o = s i g m o i d ( A o ) g c = t a n h ( A c ) C ( 1 ) = g i ⊙ g c + g f ⊙ C ( 0 ) H ( 1 ) = g o ⊙ t a n h ( C ( 1 ) ) A_i = X^{(1)}{W_{i}}^T + a_{i} + H^{(0)}V_{i}^T + b_{i}\\ A_f = X^{(1)}{W_{f}}^T + a_{f} + H^{(0)}V_{f}^T + b_{f}\\ A_o = X^{(1)}{W_{o}}^T + a_{o} + H^{(0)}V_{o}^T + b_{o}\\ A_c = X^{(1)}{W_{c}}^T + a_{c} + H^{(0)}V_{c}^T + b_{c}\\ g_i = sigmoid(A_i)\\ g_f = sigmoid(A_f)\\ g_o = sigmoid(A_o)\\ g_c = tanh(A_c)\\ C^{(1)} =g_i\odot g_c + g_f\odot C^{(0)}\\ H^{(1)} =g_o\odot tanh(C^{(1)}) Ai=X(1)WiT+ai+H(0)ViT+biAf=X(1)WfT+af+H(0)VfT+bfAo=X(1)WoT+ao+H(0)VoT+boAc=X(1)WcT+ac+H(0)VcT+bcgi=sigmoid(Ai)gf=sigmoid(Af)go=sigmoid(Ao)gc=tanh(Ac)C(1)=gigc+gfC(0)H(1)=gotanh(C(1))
上式中的 ⊙ \odot 表示 element-wise 元素积, 将以上过程记为 :
H ( 1 ) , C ( 1 ) = L S T M C e l l ( X ( 1 ) , H ( 0 ) , C ( 0 ) ) H^{(1)},C^{(1)} = LSTMCell(X^{(1)},H^{(0)},C^{(0)}) H(1),C(1)=LSTMCell(X(1),H(0),C(0))
循环到下一次时, 将 H ( 1 ) , C ( 1 ) H^{(1)},C^{(1)} H(1),C(1) 代入 H ( 0 ) , C ( 0 ) H^{(0)},C^{(0)} H(0),C(0) 的位置, 与下一个 X ( 2 ) X^{(2)} X(2) 重新进行运算.

1.2 循环迭代

下面使用迭代记法表示 LSTMCell 运算.

使用 H ( 0 ) , C ( 0 ) H^{(0)},C^{(0)} H(0),C(0) 表示初始隐含层矩阵和初始状态矩阵, 对于 :
X l m n = X m n ( 1 ) , X m n ( 2 ) , X m n ( 3 ) , ⋯   , X m n ( l ) X_{lmn} = X_{mn}^{(1)},X_{mn}^{(2)},X_{mn}^{(3)},\cdots,X_{mn}^{(l)} Xlmn=Xmn(1),Xmn(2),Xmn(3),,Xmn(l)
则 :
H ( 1 ) , C ( 1 ) = L S T M C e l l ( X ( 1 ) , H ( 0 ) , C ( 0 ) )    H ( 2 ) , C ( 2 ) = L S T M C e l l ( X ( 2 ) , H ( 1 ) , C ( 1 ) )    H ( 3 ) , C ( 3 ) = L S T M C e l l ( X ( 3 ) , H ( 2 ) , C ( 2 ) ) ⋮ H ( l ) , C ( l ) = L S T M C e l l ( X ( l ) , H ( l − 1 ) , C ( l − 1 ) ) H^{(1)},C^{(1)} = LSTMCell(X^{(1)},H^{(0)},C^{(0)})\\ \;\\ H^{(2)},C^{(2)} = LSTMCell(X^{(2)},H^{(1)},C^{(1)})\\ \;\\ H^{(3)},C^{(3)} = LSTMCell(X^{(3)},H^{(2)},C^{(2)})\\ \vdots\\ H^{(l)},C^{(l)} = LSTMCell(X^{(l)},H^{(l-1)},C^{(l-1)})\\ H(1),C(1)=LSTMCell(X(1),H(0),C(0))H(2),C(2)=LSTMCell(X(2),H(1),C(1))H(3),C(3)=LSTMCell(X(3),H(2),C(2))H(l),C(l)=LSTMCell(X(l),H(l1),C(l1))

展开最后一层作为示例 :
g i = s i g m o i d ( X ( l ) W i T + a i + H ( l − 1 ) V i T + b i )    g f = s i g m o i d ( X ( l ) W f T + a f + H ( l − 1 ) V f T + b f )    g o = s i g m o i d ( X ( l ) W o T + a o + H ( l − 1 ) V o T + b o )    g c = t a n h ( X ( l ) W c T + a c + H ( l − 1 ) V c T + b c )    C ( l ) = g i ⊙ g c + g f ⊙ C ( l − 1 )    H ( l ) = g o ⊙ t a n h ( C ( l ) ) g_i = sigmoid(X^{(l)}{W_{i}}^T + a_{i} + H^{(l-1)}V_{i}^T + b_{i})\\ \;\\ g_f = sigmoid(X^{(l)}{W_{f}}^T + a_{f} + H^{(l-1)}V_{f}^T + b_{f})\\ \;\\ g_o = sigmoid(X^{(l)}{W_{o}}^T + a_{o} + H^{(l-1)}V_{o}^T + b_{o})\\ \;\\ g_c = tanh(X^{(l)}{W_{c}}^T + a_{c} + H^{(l-1)}V_{c}^T + b_{c})\\ \;\\ C^{(l)} =g_i\odot g_c + g_f\odot C^{(l-1)}\\ \;\\ H^{(l)} =g_o\odot tanh(C^{(l)}) gi=sigmoid(X(l)WiT+ai+H(l1)ViT+bi)gf=sigmoid(X(l)WfT+af+H(l1)VfT+bf)go=sigmoid(X(l)WoT+ao+H(l1)VoT+bo)gc=tanh(X(l)WcT+ac+H(l1)VcT+bc)C(l)=gigc+gfC(l1)H(l)=gotanh(C(l))
在迭代的过程中, W ,    V ,    a ,    b W, \; V , \; a, \; b W,V,a,b 都是共享的, 不变的.

1.3 张量公式

使用 3 阶张量表示 :
H l m r , C l m r = L S T M C e l l ( l ) ( X l m n , H m r ( 0 ) , C m r ( 0 ) ) H_{lmr},C_{lmr} = LSTMCell^{(l)}(X_{lmn},H_{mr}^{(0)},C_{mr}^{(0)}) Hlmr,Clmr=LSTMCell(l)(Xlmn,Hmr(0),Cmr(0))
LSTMCell 的上标 ( l ) (l) (l) 表示经过 l l l 次循环迭代运算, 输入尺寸为 l × m × n l \times m \times n l×m×n 的张量 X l m n X_{lmn} Xlmn 将输出尺寸为 l × m × r l \times m \times r l×m×r 的张量 H l m r , C l m r H_{lmr}, C_{lmr} Hlmr,Clmr. 其中, H l m r H_{lmr} Hlmr 将参与神经网络的损失值运算, C l m r C_{lmr} Clmr 仅为 LSTM 所用.

2. 反向传播

考虑输入一个 3 阶张量 X l m n X_{lmn} Xlmn, 经过 LSTMCell 运算后, 输出 3 阶张量 H l m r H_{lmr} Hlmr, 往前 forward 传播得到误差值 error ( 标量 e ), e 对 H l m r H_{lmr} Hlmr 的梯度 ∇ e ( H l m r ) \nabla e_{(H_{lmr})} e(Hlmr) 已由上游给出, 求 e 对 X l m n X_{lmn} Xlmn 的梯度.
H i j n , C i j n = R N N C e l l ( i ) ( X i j k , H j n ( 0 ) , C j n ( 0 ) )    e = f o r w a r d ( H i j n ) H_{ijn},C_{ijn} = RNNCell^{(i)}(X_{ijk},H_{jn}^{(0)},C_{jn}^{(0)})\\ \;\\ e = forward(H_{ijn}) Hijn,Cijn=RNNCell(i)(Xijk,Hjn(0),Cjn(0))e=forward(Hijn)

2.1 相关函数的梯度

从 LSTMCell 运算的定义可以看出, 每一次循环迭代都是由 Affine 运算和激活函数运算组合而成.

Affine 运算的定义及梯度求导公式已在上面的 <相关> 中给出.

关于 Affine 的梯度 :
A = X W T + b    d e d X = ∇ e ( A ) W    d e d W = ∇ e ( A ) T X    d e d b = s u m ( ∇ e ( A ) ,    a x i s = 0 ) A = XW^T + b\\ \;\\ \frac {d e}{d X} =\nabla e_{(A)}W\\ \;\\ \frac {d e}{d W} =\nabla e_{(A)}^TX\\ \;\\ \frac {de}{db}=sum(\nabla e_{(A)},\; axis=0) A=XWT+bdXde=e(A)WdWde=e(A)TXdbde=sum(e(A),axis=0)
关于 tanh 的梯度 :
y = t a n h ( x ) = e x − e − x e x + e − x    d y d x = 1 − y 2 y = tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} \\ \;\\ \frac{dy}{dx}= 1-y^2 y=tanh(x)=ex+exexexdxdy=1y2
关于 sigmoid 的梯度 :
y = s i g m o i d ( x ) = 1 1 + e − x    d y d x = y ( 1 − y ) y = sigmoid(x)=\frac{1}{1+e^{-x}} \\ \;\\ \frac{dy}{dx}= y(1-y) y=sigmoid(x)=1+ex1dxdy=y(1y)

2.2 关于 C 的梯度

LSTMCell 的运算是循环迭代的, 每一次梯度不仅受到上游 forward 运算的影响, 还受到自身上一步运算的影响.

为了避免符号混乱, 将上游 forward 运算传递到 H 的梯度 ∇ e ( H l m r ) \nabla e_{(H_{lmr})} e(Hlmr) 记为 ∇ e ( F l m r ) \nabla e_{(F_{lmr})} e(Flmr), ∇ e ( H l m r ) \nabla e_{(H_{lmr})} e(Hlmr) 用于迭代过程中的内部计算.

另外, LSTMCell 有两个输出值, 本题隐含了一个条件 ∇ e ( C l m r ) = 0 \nabla e_{(C_{lmr})} = 0 e(Clmr)=0, 表示上游 forward 运算对输出张量 C i j n C_{ijn} Cijn 的梯度为零. 同样的, 将外部梯度 ∇ e ( C l m r ) \nabla e_{(C_{lmr})} e(Clmr) 记为 ∇ e ( D l m r ) \nabla e_{(D_{lmr})} e(Dlmr), ∇ e ( C l m r ) \nabla e_{(C_{lmr})} e(Clmr) 用于内部运算. 为了格式整齐和逻辑完整, 需要加上这个条件.
d e d C ( l − 1 ) = d e d F ( l ) ⊙ d H ( l ) d C ( l − 1 ) + d e d D ( l ) ⊙ d C ( l ) d C ( l − 1 ) = d e d F ( l ) ⊙ g o ( l ) ⊙ ( 1 − t a n h 2 ( C ( l ) ) ) ⊙ g f ( l ) + d e d D ( l ) ⊙ g f ( l ) 令 : \frac{de}{dC^{(l-1)}}=\frac{de}{dF^{(l)}}\odot \frac{dH^{(l)}}{dC^{(l-1)}}+\frac{de}{dD^{(l)}}\odot \frac{dC^{(l)}}{dC^{(l-1)}}\\ =\frac{de}{dF^{(l)}}\odot g_o^{(l)}\odot(1-tanh^2(C^{(l)}))\odot g_f^{(l)}+\frac{de}{dD^{(l)}}\odot g_f^{(l)} 令 : dC(l1)de=dF(l)dedC(l1)dH(l)+dD(l)dedC(l1)dC(l)=dF(l)dego(l)(1tanh2(C(l)))gf(l)+dD(l)degf(l):

令 :
T ( l ) = g o ( l ) ⊙ ( 1 − t a n h 2 ( C ( l ) ) ) T^{(l)}= g_o^{(l)}\odot(1-tanh^2(C^{(l)})) T(l)=go(l)(1tanh2(C(l)))
从最后一次开始求解 :
d e d C ( l − 1 ) = d e d F ( l ) ⊙ T ( l ) ⊙ g f ( l ) + d e d D ( l ) ⊙ g f ( l ) \frac{de}{dC^{(l-1)}}=\frac{de}{dF^{(l)}}\odot T^{(l)}\odot g_f^{(l)}+\frac{de}{dD^{(l)}}\odot g_f^{(l)} dC(l1)de=dF(l)deT(l)gf(l)+dD(l)degf(l)
在这一步, 同样可以得到 d e / d H ( l − 1 ) de / dH^{(l-1)} de/dH(l1), 这个结果不依赖于 d e / d C ( l − 1 ) de / dC^{(l-1)} de/dC(l1). d e / d H ( l − 1 ) de / dH^{(l-1)} de/dH(l1) 的计算过程比较长, 放到下文, 这里先拿来使用.

综合上游和自身迭代的梯度, 迭代求解 :
d e d C ( l − 1 ) = d e d F ( l ) T ( l ) g f ( l ) + d e d D ( l ) g f ( l )    d e d C ( l − 2 ) = ( d e d F ( l − 1 ) + d e d H ( l − 1 ) ) T ( l − 1 ) g f ( l − 1 ) + ( d e d D ( l − 1 ) + d e d C ( l − 1 ) ) g f ( l − 1 )    d e d C ( l − 3 ) = ( d e d F ( l − 2 ) + d e d H ( l − 2 ) ) T ( l − 2 ) g f ( l − 2 ) + ( d e d D ( l − 2 ) + d e d C ( l − 2 ) ) g f ( l − 2 ) ⋮ d e d C ( 0 ) = ( d e d F ( 1 ) + d e d H ( 1 ) ) T ( 1 ) g f ( 1 ) + ( d e d D ( 1 ) + d e d C ( 1 ) ) g f ( 1 ) \frac{de}{dC^{(l-1)}} = \frac{de}{dF^{(l)}} T^{(l)} g_f^{(l)}+\frac{de}{dD^{(l)}} g_f^{(l)}\\ \;\\ \frac{de}{dC^{(l-2)}}=(\frac{de}{dF^{(l-1)}}+\frac{de}{dH^{(l-1)}}) T^{(l-1)} g_f^{(l-1)}+(\frac{de}{dD^{(l-1)}}+\frac{de}{dC^{(l-1)}}) g_f^{(l-1)}\\ \;\\ \frac{de}{dC^{(l-3)}}=(\frac{de}{dF^{(l-2)}}+\frac{de}{dH^{(l-2)}}) T^{(l-2)} g_f^{(l-2)}+(\frac{de}{dD^{(l-2)}}+\frac{de}{dC^{(l-2)}}) g_f^{(l-2)}\\ \vdots\\ \frac{de}{dC^{(0)}}=(\frac{de}{dF^{(1)}}+\frac{de}{dH^{(1)}}) T^{(1)} g_f^{(1)}+(\frac{de}{dD^{(1)}}+\frac{de}{dC^{(1)}}) g_f^{(1)} dC(l1)de=dF(l)deT(l)gf(l)+dD(l)degf(l)dC(l2)de=(dF(l1)de+dH(l1)de)T(l1)gf(l1)+(dD(l1)de+dC(l1)de)gf(l1)dC(l3)de=(dF(l2)de+dH(l2)de)T(l2)gf(l2)+(dD(l2)de+dC(l2)de)gf(l2)dC(0)de=(dF(1)de+dH(1)de)T(1)gf(1)+(dD(1)de+dC(1)de)gf(1)

注意, 上面的乘法都是元素积运算, 为了美观, 符号 ⊙ \odot 被省略了.

2.3 关于 4 个门 g i , g f , g o , g c g_i, g_f, g_o, g_c gi,gf,go,gc 的梯度

g i , g f , g c g_i, g_f, g_c gi,gf,gc计算过程和上例类似, 综合上游和自身迭代的梯度 :

d e d g ( l ) = d e d F ( l ) T ( l ) G ( l ) + d e d D ( l ) G ( l )    d e d g ( l − 1 ) = ( d e d F ( l − 1 ) + d e d H ( l − 1 ) ) T ( l − 1 ) G ( l − 1 ) + ( d e d D ( l − 1 ) + d e d C ( l − 1 ) ) G ( l − 1 )    d e d g ( l − 2 ) = ( d e d F ( l − 2 ) + d e d H ( l − 2 ) ) T ( l − 1 ) G ( l − 1 ) + ( d e d D ( l − 2 ) + d e d C ( l − 2 ) ) G ( l − 2 ) ⋮ d e d g ( 1 ) = ( d e d F ( 1 ) + d e d H ( 1 ) ) T ( 1 ) G ( 1 ) + ( d e d D ( 1 ) + d e d C ( 1 ) ) G ( 1 ) \frac{de}{dg^{(l)}} = \frac{de}{dF^{(l)}} T^{(l)} G^{(l)}+\frac{de}{dD^{(l)}} G^{(l)}\\ \;\\ \frac{de}{dg^{(l-1)}}=(\frac{de}{dF^{(l-1)}}+\frac{de}{dH^{(l-1)}}) T^{(l-1)} G^{(l-1)}+(\frac{de}{dD^{(l-1)}}+\frac{de}{dC^{(l-1)}}) G^{(l-1)}\\ \;\\ \frac{de}{dg^{(l-2)}}=(\frac{de}{dF^{(l-2)}}+\frac{de}{dH^{(l-2)}}) T^{(l-1)} G^{(l-1)}+(\frac{de}{dD^{(l-2)}}+\frac{de}{dC^{(l-2)}}) G^{(l-2)}\\ \vdots\\ \frac{de}{dg^{(1)}}=(\frac{de}{dF^{(1)}}+\frac{de}{dH^{(1)}}) T^{(1)} G^{(1)}+(\frac{de}{dD^{(1)}}+\frac{de}{dC^{(1)}}) G^{(1)} dg(l)de=dF(l)deT(l)G(l)+dD(l)deG(l)dg(l1)de=(dF(l1)de+dH(l1)de)T(l1)G(l1)+(dD(l1)de+dC(l1)de)G(l1)dg(l2)de=(dF(l2)de+dH(l2)de)T(l1)G(l1)+(dD(l2)de+dC(l2)de)G(l2)dg(1)de=(dF(1)de+dH(1)de)T(1)G(1)+(dD(1)de+dC(1)de)G(1)

按下面的表格替换上述公式中的 g , G g, G g,G.

序号 g G
1 g i g_i gi g c g_c gc
2 g f g_f gf C ( l − 1 ) C^{(l-1)} C(l1)
3 g c g_c gc g i g_i gi

g o g_o go计算过程不涉及 C 迭代 :

d e d g o ( l ) = d e d F ( l ) t a n h ( C ( l ) )    d e d g o ( l − 1 ) = ( d e d F ( l − 1 ) + d e d H ( l − 1 ) ) t a n h ( C ( l − 1 ) )    d e d g o ( l − 2 ) = ( d e d F ( l − 2 ) + d e d H ( l − 2 ) ) t a n h ( C ( l − 2 ) ) ⋮ d e d g o ( 1 ) = ( d e d F ( 1 ) + d e d H ( 1 ) ) t a n h ( C ( 1 ) ) \frac{de}{dg_o^{(l)}} = \frac{de}{dF^{(l)}} tanh(C^{(l)})\\ \;\\ \frac{de}{dg_o^{(l-1)}}=(\frac{de}{dF^{(l-1)}}+\frac{de}{dH^{(l-1)}}) tanh(C^{(l-1)})\\ \;\\ \frac{de}{dg_o^{(l-2)}}=(\frac{de}{dF^{(l-2)}}+\frac{de}{dH^{(l-2)}}) tanh(C^{(l-2)})\\ \vdots\\ \frac{de}{dg_o^{(1)}}=(\frac{de}{dF^{(1)}}+\frac{de}{dH^{(1)}}) tanh(C^{(1)}) dgo(l)de=dF(l)detanh(C(l))dgo(l1)de=(dF(l1)de+dH(l1)de)tanh(C(l1))dgo(l2)de=(dF(l2)de+dH(l2)de)tanh(C(l2))dgo(1)de=(dF(1)de+dH(1)de)tanh(C(1))

同样的, 上面的乘法都是元素积运算, 为了美观, 符号 ⊙ \odot 被省略了.

2.4 关于 Affine 层的梯度

d e d A i ( l ) = d e d g i ( l ) ⊙ g i ( l ) ⊙ ( 1 − g i ( l ) )    d e d A f ( l ) = d e d g f ( l ) ⊙ g f ( l ) ⊙ ( 1 − g f ( l ) )    d e d A o ( l ) = d e d g o ( l ) ⊙ g o ( l ) ⊙ ( 1 − g o ( l ) )    d e d A c ( l ) = d e d g c ( l ) ⊙ ( 1 − ( g c ( l ) ) 2 ) \frac{de}{dA_i^{(l)}}=\frac{de}{dg_i^{(l)}}\odot g_i^{(l)}\odot (1-g_i^{(l)})\\ \;\\ \frac{de}{dA_f^{(l)}}=\frac{de}{dg_f^{(l)}}\odot g_f^{(l)}\odot (1-g_f^{(l)})\\ \;\\ \frac{de}{dA_o^{(l)}}=\frac{de}{dg_o^{(l)}}\odot g_o^{(l)}\odot (1-g_o^{(l)})\\ \;\\ \frac{de}{dA_c^{(l)}}=\frac{de}{dg_c^{(l)}} \odot (1-(g_c^{(l)})^2)\\ dAi(l)de=dgi(l)degi(l)(1gi(l))dAf(l)de=dgf(l)degf(l)(1gf(l))dAo(l)de=dgo(l)dego(l)(1go(l))dAc(l)de=dgc(l)de(1(gc(l))2)

上述梯度公式的格式在每一步迭代都是一样的, 将 ( l ) (l) (l) 替换为相应的步数即可.

涉及循环迭代的部分, 已在 g i , g f , g o , g c g_i, g_f, g_o, g_c gi,gf,go,gc 的计算中考虑.

2.5 关于 X, H 的梯度

根据 Affine 的梯度公式, 易得 :
d e i d X ( l ) = d e d A i ( l ) W i    d e f d X ( l ) = d e d A f ( l ) W f    d e o d X ( l ) = d e d A o ( l ) W o    d e c d X ( l ) = d e d A c ( l ) W c \frac{de_i}{dX^{(l)}}=\frac{de}{dA_i^{(l)}}W_i\\ \;\\ \frac{de_f}{dX^{(l)}}=\frac{de}{dA_f^{(l)}}W_f\\ \;\\ \frac{de_o}{dX^{(l)}}=\frac{de}{dA_o^{(l)}}W_o\\ \;\\ \frac{de_c}{dX^{(l)}}=\frac{de}{dA_c^{(l)}}W_c\\ dX(l)dei=dAi(l)deWidX(l)def=dAf(l)deWfdX(l)deo=dAo(l)deWodX(l)dec=dAc(l)deWc
注意, 这里不是元素积, 是标准的矩阵乘法.

e i e_i ei 的下标 i i i 用于区分 e 通过 W i W_i Wi 路径反向传播的梯度, e f , e o , e c e_f, e_o, e_c ef,eo,ec 同理.

综合 4 个路径对 X 的影响, 得 :
d e d X ( l ) = d e i d X ( l ) + d e f d X ( l ) + d e o d X ( l ) + d e c d X ( l ) \frac{de}{dX^{(l)}} = \frac{de_i}{dX^{(l)}}+\frac{de_f}{dX^{(l)}}+\frac{de_o}{dX^{(l)}}+\frac{de_c}{dX^{(l)}} dX(l)de=dX(l)dei+dX(l)def+dX(l)deo+dX(l)dec
同理 :
d e i d H ( l − 1 ) = d e d A i ( l ) V i    d e f d H ( l − 1 ) = d e d A f ( l ) V f    d e o d H ( l − 1 ) = d e d A o ( l ) V o    d e c d H ( l − 1 ) = d e d A c ( l ) V c \frac{de_i}{dH^{(l-1)}}=\frac{de}{dA_i^{(l)}}V_i\\ \;\\ \frac{de_f}{dH^{(l-1)}}=\frac{de}{dA_f^{(l)}}V_f\\ \;\\ \frac{de_o}{dH^{(l-1)}}=\frac{de}{dA_o^{(l)}}V_o\\ \;\\ \frac{de_c}{dH^{(l-1)}}=\frac{de}{dA_c^{(l)}}V_c\\ dH(l1)dei=dAi(l)deVidH(l1)def=dAf(l)deVfdH(l1)deo=dAo(l)deVodH(l1)dec=dAc(l)deVc

d e d H ( l − 1 ) = d e i d H ( l − 1 ) + d e f d H ( l − 1 ) + d e o d H ( l − 1 ) + d e c d H ( l − 1 ) \frac{de}{dH^{(l-1)}} = \frac{de_i}{dH^{(l-1)}}+\frac{de_f}{dH^{(l-1)}}+\frac{de_o}{dH^{(l-1)}}+\frac{de_c}{dH^{(l-1)}} dH(l1)de=dH(l1)dei+dH(l1)def+dH(l1)deo+dH(l1)dec

2.3 关于 W, V 的梯度

根据 Affine 的梯度公式, 易得 :
d e d W i ( l ) = ( d e d A i ( l ) ) T X ( l )    d e d W f ( l ) = ( d e d A f ( l ) ) T X ( l )    d e d W o ( l ) = ( d e d A o ( l ) ) T X ( l )    d e d W c ( l ) = ( d e d A c ( l ) ) T X ( l ) \frac{de}{dW_i^{(l)}}=(\frac{de}{dA_i^{(l)}})^TX^{(l)}\\ \;\\ \frac{de}{dW_f^{(l)}}=(\frac{de}{dA_f^{(l)}})^TX^{(l)}\\ \;\\ \frac{de}{dW_o^{(l)}}=(\frac{de}{dA_o^{(l)}})^TX^{(l)}\\ \;\\ \frac{de}{dW_c^{(l)}}=(\frac{de}{dA_c^{(l)}})^TX^{(l)}\\ dWi(l)de=(dAi(l)de)TX(l)dWf(l)de=(dAf(l)de)TX(l)dWo(l)de=(dAo(l)de)TX(l)dWc(l)de=(dAc(l)de)TX(l)
注意, 这里不是元素积, 是标准的矩阵乘法.

同理:
d e d V i ( l ) = ( d e d A i ( l ) ) T H ( l − 1 )    d e d V f ( l ) = ( d e d A f ( l ) ) T H ( l − 1 )    d e d V o ( l ) = ( d e d A o ( l ) ) T H ( l − 1 )    d e d V c ( l ) = ( d e d A c ( l ) ) T H ( l − 1 ) \frac{de}{dV_i^{(l)}}=(\frac{de}{dA_i^{(l)}})^TH^{(l-1)}\\ \;\\ \frac{de}{dV_f^{(l)}}=(\frac{de}{dA_f^{(l)}})^TH^{(l-1)}\\ \;\\ \frac{de}{dV_o^{(l)}}=(\frac{de}{dA_o^{(l)}})^TH^{(l-1)}\\ \;\\ \frac{de}{dV_c^{(l)}}=(\frac{de}{dA_c^{(l)}})^TH^{(l-1)}\\ dVi(l)de=(dAi(l)de)TH(l1)dVf(l)de=(dAf(l)de)TH(l1)dVo(l)de=(dAo(l)de)TH(l1)dVc(l)de=(dAc(l)de)TH(l1)
最后, 将所有迭代步的梯度相加即可 :
d e d W = d e d W ( 1 ) + d e d W ( 2 ) + d e d W ( 3 ) + ⋯ + d e d W ( l )    d e d V = d e d V ( 1 ) + d e d V ( 2 ) + d e d V ( 3 ) + ⋯ + d e d V ( l ) \frac{de}{dW}=\frac{de}{dW^{(1)}}+\frac{de}{dW^{(2)}}+\frac{de}{dW^{(3)}}+\cdots+\frac{de}{dW^{(l)}}\\ \;\\ \frac{de}{dV}=\frac{de}{dV^{(1)}}+\frac{de}{dV^{(2)}}+\frac{de}{dV^{(3)}}+\cdots+\frac{de}{dV^{(l)}}\\ dWde=dW(1)de+dW(2)de+dW(3)de++dW(l)dedVde=dV(1)de+dV(2)de+dV(3)de++dV(l)de
为了简洁起见, 上式不区分 W i , W f , W o , W c W_i, W_f, W_o, W_c Wi,Wf,Wo,Wc V i , V f , V o , V c V_i, V_f, V_o, V_c Vi,Vf,Vo,Vc, 格式都是一样的.

2.8 关于 a, b 的梯度

根据 Affine 的梯度公式, 易得 :
d e d a i ( l ) = s u m ( d e d A i ( l ) ,    a x i s = 0 )    d e d a f ( l ) = s u m ( d e d A f ( l ) ,    a x i s = 0 )    d e d a o ( l ) = s u m ( d e d A o ( l ) ,    a x i s = 0 )    d e d a c ( l ) = s u m ( d e d A c ( l ) ,    a x i s = 0 ) \frac{de}{da_i^{(l)}}=sum(\frac{de}{dA_i^{(l)}},\; axis=0)\\ \;\\ \frac{de}{da_f^{(l)}}=sum(\frac{de}{dA_f^{(l)}},\; axis=0)\\ \;\\ \frac{de}{da_o^{(l)}}=sum(\frac{de}{dA_o^{(l)}},\; axis=0)\\ \;\\ \frac{de}{da_c^{(l)}}=sum(\frac{de}{dA_c^{(l)}},\; axis=0)\\ dai(l)de=sum(dAi(l)de,axis=0)daf(l)de=sum(dAf(l)de,axis=0)dao(l)de=sum(dAo(l)de,axis=0)dac(l)de=sum(dAc(l)de,axis=0)
最后, 将所有迭代步的梯度相加即可 :
d e d a = d e d a ( 1 ) + d e d a ( 2 ) + d e d a ( 3 ) + ⋯ + d e d a ( l ) \frac{de}{da}=\frac{de}{da^{(1)}}+\frac{de}{da^{(2)}}+\frac{de}{da^{(3)}}+\cdots+\frac{de}{da^{(l)}}\\ dade=da(1)de+da(2)de+da(3)de++da(l)de
上式不区分 a i , a f , a o , a c a_i, a_f, a_o, a_c ai,af,ao,ac, 格式都是一样的.

同样的有 :
d e d b = d e d a \frac{de}{db}=\frac{de}{da} dbde=dade

你可能感兴趣的:(深度学习基础)