深度学习中的梯度计算与反向传播推导(二)DNN中多样本反向传播的全矩阵方法推导

前言

在DNN的反向传播算法中,几乎所有教材都只使用单个样本(一个特征向量)进行相关公式的推导,而多个样本(也就是mini-batch,即多个特征向量组成的矩阵)反向传播的全矩阵方法对于理解“多样本”这一概念是非常重要的。所以花了一点时间推导了一下并记录在此,便于记忆,同时希望能对别人有所帮助。

0 几点说明

  1. 该文章是我上一篇博客Back Propagation and Gradient Calculation in Deep Learning(单样本反向传播)的后续版本,写作风格、符号表示与上篇类似,请按顺序阅读
  2. 请时刻记住,不论是标量,还是向量、矩阵,其梯度的维度一定与其本身的维度相同,这可以作为很多梯度推导的检验方法
  3. 多样本在DNN的前向传播和反向传播中,样本(列)与样本(列)之间是毫无影响的。这一点符合直觉,也属于矩阵的特性,具体会在之后的推导过程中详细解释

1 变量定义

符号含义
N l N_l Nl l l l层神经元数量
X \bm{X} X M M M个输入样本,维度为( N 0 × M N_0\times M N0×M)
Y \bm{Y} Y M M M个输入样本的标签,维度为( N L × M N_L\times M NL×M)
W j k l W_{jk}^l Wjkl l − 1 l-1 l1层第 k \bm{k} k个神经元到第 l l l层第 j \bm{j} j个神经元的连接权重
b j l b_j^l bjl l l l层第 j j j个神经元的偏置
Z j , m l Z_{j,m}^l Zj,ml l l l层第 j j j个神经元对 m m m个样本的带权输入
σ l \sigma^l σl l l l层的激活函数
A j , m l A_{j,m}^l Aj,ml l l l层第 j j j个神经元对 m m m个样本的输出

2 单样本到多样本的变化

变量定义已经给出,先说明一下多样本相对于单样本发生的变化

2.1 什么变了

  1. 输入和标签变了,均由一个列向量变成一个矩阵( M M M个列向量): x ∈ R N 0 → X ∈ R N 0 × M , y ∈ R N L → Y ∈ R N L × M \bm{x}\in \bm{\mathrm{R^{N_0}}}\rightarrow\bm{X}\in \bm{\mathrm{R^{N_0\times M}}},\bm{y}\in \bm{\mathrm{R^{N_L}}}\rightarrow\bm{Y}\in \bm{\mathrm{R^{N_L\times M}}} xRN0XRN0×MyRNLYRNL×M
  2. 每一层的带权输入和输出变了,均由一个列向量变为一个矩阵( M M M个列向量): z l ∈ R N l → Z l ∈ R N l × M , a l ∈ R N l → A l ∈ R N l × M \bm{z^l}\in \bm{\mathrm{R^{N_l}}}\rightarrow\bm{Z^l}\in \bm{\mathrm{R^{N_l\times M}}},\bm{a^l}\in \bm{\mathrm{R^{N_l}}}\rightarrow\bm{A^l}\in \bm{\mathrm{R^{N_l\times M}}} zlRNlZlRNl×MalRNlAlRNl×M
  3. 损失函数 L o s s Loss Loss变了,需要对所有样本的误差取平均了

2.2 什么没变

  1. 不变的永远都是模型参数 W , b \bm{W,b} W,b,与之前一样,每一层 l = 1 , 2 , . . . , L l=1,2,...,L l=1,2,...,L都分别只有一个对应的 W l \bm{W^l} Wl b l \bm{b^l} bl
  2. 我们的目标依然不变,最终目的仍然是求得 W l \bm{W^l} Wl b l \bm{b^l} bl的梯度

3 前向传播

Z l = W l A l − 1 + b ^ l A l = σ l ( Z l ) \begin{aligned} &\bm{Z^l}=\bm{W^lA^{l-1}+\hat{b}^l}\\ &\bm{A^l}=\sigma^l(\bm{Z^l}) \end{aligned} Zl=WlAl1+b^lAl=σl(Zl)

其中, A 0 = X \bm{A^0}=\bm{X} A0=X W l \bm{W^l} Wl的维度为 ( N l × N l − 1 ) (N_{l}\times N_{l-1}) (Nl×Nl1) A l − 1 \bm{A^{l-1}} Al1的维度为 ( N l − 1 × M ) (N_{l-1}\times M) (Nl1×M)

尤其注意 b ^ l \bm{\hat{b}^l} b^l b l \bm{b^l} bl多了个帽子,表示 b l \bm{b^l} bl广播(即直接将 b l \bm{b^l} bl复制 M M M个组成矩阵,维度与 Z l , A l \bm{Z^l,A^l} Zl,Al相同,均为 ( N l × M ) (N_l\times M) (Nl×M)。这种广播是在两个维度不同的张量之间加减运算时产生的,在Numpy或PyTorch中是自动发生的)

A L \bm{A^L} AL是DNN的输出,维度为 ( N L × M ) (N_L\times M) (NL×M)

4 计算损失并求输出层误差

同样以平方损失为例:

C = L o s s ( A L , Y ) = 1 m ⋅ 1 2 ∥ Y − A L ∥ 2 = 1 m ∑ m 1 2 ∑ j ( Y j , m − A j , m L ) 2 C=Loss(\bm{A^L,Y})=\frac{1}{m}\cdot\frac{1}{2}\Vert\bm{Y-A^L}\Vert^2=\frac{1}{m}\sum_m\frac{1}{2}\sum_j(Y_{j,m}-A_{j,m}^L)^2 C=Loss(AL,Y)=m121YAL2=m1m21j(Yj,mAj,mL)2

第一步,需要求 ∂ C ∂ A L \frac{\partial C}{\partial \bm{A^L}} ALC,我们同样先求矩阵的一个元素的梯度 ∂ C ∂ A j , m L \frac{\partial C}{\partial A_{j,m}^L} Aj,mLC

显而易见, ∂ C ∂ A j , m L = 1 2 m × 2 ( Y j , m − A j , m L ) × − 1 = 1 m ⋅ ( A j , m L − Y j , m ) \frac{\partial C}{\partial A_{j,m}^L}=\frac{1}{2m}\times2(Y_{j,m}-A_{j,m}^L)\times-1=\frac{1}{m}\cdot(A_{j,m}^L-Y_{j,m}) Aj,mLC=2m1×2(Yj,mAj,mL)×1=m1(Aj,mLYj,m)
因为在 C C C的展开式中,仅此一项的导数不为0(可以回顾前一篇文章的这个部分)。

拓展到矩阵表示,即:

∂ C ∂ A L = 1 m ⋅ ( A L − Y ) \frac{\partial C}{\partial \bm{A^L}}=\frac{1}{m}\cdot(\bm{A^L}-\bm{Y}) ALC=m1(ALY)

第二步,需要求输出层误差 ∂ C ∂ Z L \frac{\partial C}{\partial \bm{Z^L}} ZLC。由链式法则, ∂ C ∂ Z L = ∂ C ∂ A L ⋅ ∂ A L ∂ Z L \frac{\partial C}{\partial \bm{Z^L}}=\frac{\partial C}{\partial \bm{A^L}}\cdot\frac{\partial \bm{A^L}}{\partial \bm{Z^L}} ZLC=ALCZLAL.其中 ∂ A L ∂ Z L \frac{\partial \bm{A^L}}{\partial \bm{Z^L}} ZLAL这一项等于 σ ′ L ( Z L ) \sigma'^L(\bm{Z^L}) σL(ZL)。因为 A L = σ L ( Z L ) \bm{A^L}=\sigma^L(\bm{Z^L}) AL=σL(ZL)

所以,拓展到任意损失函数,输出层误差为:

∂ C ∂ Z L = ∂ C ∂ A L ⊙ σ ′ L ( Z L ) \frac{\partial C}{\partial \bm{Z^L}}=\frac{\partial C}{\partial \bm{A^L}}\odot\sigma'^L(\bm{Z^L}) ZLC=ALCσL(ZL)

5 反向传播误差

与上一篇文章相同,误差的反向传播,即已知 ∂ C ∂ Z l + 1 \frac{\partial C}{\partial \bm{Z^{l+1}}} Zl+1C,希望求得 ∂ C ∂ Z l \frac{\partial C}{\partial \bm{Z^l}} ZlC。我们还是先求矩阵中的一个元素的梯度 ∂ C ∂ Z j , m L \frac{\partial C}{\partial Z_{j,m}^L} Zj,mLC

在这之前,希望大家想起文章开头说过,样本(列)与样本(列)之间是互不影响的,怎么理解呢?也就是每个样本(列)在每一层流动的过程中,永远都只在属于自己的那一列。这也是为什么多样本反向传播误差时的公式可以和单样本的基本相似,只是多了一个下标 m m m

∂ C ∂ Z j , m l = ∑ k ∂ C ∂ Z k , m l + 1 ∂ Z k , m l + 1 ∂ Z j , m l 其 中 , Z k , m l + 1 = ∑ i = 1 N l σ l ( Z i , m l ) × W k i l + 1 + b k l + 1 所 以 , ∂ Z k , m l + 1 ∂ Z j , m l = σ ′ l ( Z j , m l ) × W k j l + 1 将 其 带 回 原 式 , ∂ C ∂ Z j , m l = ∑ k ∂ C ∂ Z k , m l + 1 × W k j l + 1 × σ ′ l ( Z j , m l ) = [ ( W l + 1 ) T ( ∂ C ∂ Z l + 1 ) ] j , m × σ ′ l ( Z j , m l ) \begin{aligned} &\frac{\partial C}{\partial Z_{j,m}^l}=\sum_k\frac{\partial C}{\partial Z_{k,m}^{l+1}}\frac{\partial Z_{k,m}^{l+1}}{\partial Z_{j,m}^l}\\ 其中,&Z_{k,m}^{l+1}=\sum_{i=1}^{N_l}\sigma^l(Z_{i,m}^l)\times W_{ki}^{l+1}+b_k^{l+1}\\ 所以,&\frac{\partial Z_{k,m}^{l+1}}{\partial Z_{j,m}^l}=\sigma'^l(Z_{j,m}^l)\times W_{kj}^{l+1}\\ 将其带回原式,\frac{\partial C}{\partial Z_{j,m}^l}&=\sum_k\frac{\partial C}{\partial Z_{k,m}^{l+1}}\times W_{kj}^{l+1}\times\sigma'^l(Z_{j,m}^l)\\ &=[\bm{(W^{l+1})}^\mathrm{T}(\frac{\partial C}{\partial \bm{Z^{l+1}}})]_{j,m}\times \sigma'^l(Z_{j,m}^l) \end{aligned} Zj,mlCZj,mlC=kZk,ml+1CZj,mlZk,ml+1Zk,ml+1=i=1Nlσl(Zi,ml)×Wkil+1+bkl+1Zj,mlZk,ml+1=σl(Zj,ml)×Wkjl+1=kZk,ml+1C×Wkjl+1×σl(Zj,ml)=[(Wl+1)T(Zl+1C)]j,m×σl(Zj,ml)

拓展到矩阵表示,即:

∂ C ∂ Z l = ( W l + 1 ) T ( ∂ C ∂ Z l + 1 ) ⊙ σ ′ l ( Z l ) \frac{\partial C}{\bm{\partial \bm{Z^l}}}=\bm{(W^{l+1})}^\mathrm{T}(\frac{\partial C}{\partial \bm{Z^{l+1}}})\odot\sigma'^l(\bm{Z^l}) ZlC=(Wl+1)T(Zl+1C)σl(Zl)

读过上一篇文章的朋友可能会发现,这个公式其实就是把上篇文章中的 z \bm{z} z换成了 Z \bm{Z} Z。没错,正因为样本(列)与样本(列)之间互不影响,误差的反向传播成为这篇文章中较为简单的一部分。

6 求 W l , b l \bm{W^l,b^l} Wl,bl的梯度

在考虑 W l , b l \bm{W^l,b^l} Wl,bl的时候总觉得有些奇怪,因为他们总是作用到所有样本上。不过不慌,我们还是先使用我们的法宝:只考虑矩阵或向量中一个元素的梯度 ∂ C ∂ W j k l \frac{\partial C}{\partial W_{jk}^l} WjklC ∂ C ∂ b j l \frac{\partial C}{\partial b_j^l} bjlC

6.1 求 ∂ C ∂ W j k l \frac{\partial C}{\partial W_{jk}^l} WjklC

先来与上一篇文章做一下对比:

  • 单样本前向传播中, W j k l W_{jk}^l Wjkl只会与第 l − 1 l-1 l1层第 k \bm{k} k个节点的输出 a k l − 1 a_k^{l-1} akl1相乘,然后作为一部分汇聚到下一层,也就是第 l l l层的第 j \bm{j} j个节点上,这可以看作一对一连接。公式为: z j l = ∑ i = 1 N l − 1 a i l − 1 W j i l + b j l z_j^l=\sum_{i=1}^{N_{l-1}}a_i^{l-1}W_{ji}^l+b_j^l zjl=i=1Nl1ail1Wjil+bjl
  • 而在多样本前向传播中, W j k l W_{jk}^l Wjkl分别与第 l − 1 l-1 l1层第 k \bm{k} k个节点的 M M M个输出 A k , m l − 1 A_{k,m}^{l-1} Ak,ml1相乘,然后分别作为一部分汇聚到下一层,也就是第 l l l层的第 j \bm{j} j个节点上(共有 M M M个),这可以看作是M个一对一连接。公式为: Z j , m l = ∑ i = 1 N l − 1 A i , m l − 1 W j i l + b j l Z_{j,m}^l=\sum_{i=1}^{N_{l-1}}A_{i,m}^{l-1}W_{ji}^l+b_j^l Zj,ml=i=1Nl1Ai,ml1Wjil+bjl

如下图所示(还没画):

所以,根据链式法则,我们要在 m m m维度上累加: ∂ C ∂ W j k l = ∑ m ∂ C ∂ Z j , m l ∂ Z j , m l ∂ W j k l \frac{\partial C}{\partial W_{jk}^l}=\sum_m\frac{\partial C}{\partial Z_{j,m}^l}\frac{\partial Z_{j,m}^l}{\partial W_{jk}^l} WjklC=mZj,mlCWjklZj,ml

其中, ∂ Z j , m l ∂ W j k l = A k , m l − 1 \frac{\partial Z_{j,m}^l}{\partial W_{jk}^l}=A_{k,m}^{l-1} WjklZj,ml=Ak,ml1。代入原式得到 ∂ C ∂ W j k l = ∑ m ∂ C ∂ Z j , m l A k , m l − 1 \frac{\partial C}{\partial W_{jk}^l}=\sum_m\frac{\partial C}{\partial Z_{j,m}^l}A_{k,m}^{l-1} WjklC=mZj,mlCAk,ml1

拓展到矩阵表示,即:

∂ C ∂ W l = ∂ C ∂ Z l ⋅ ( A l − 1 ) T \frac{\partial C}{\partial \bm{W^l}}=\frac{\partial C}{\partial \bm{Z^l}}\cdot (\bm{A^{l-1})^\mathrm{T}} WlC=ZlC(Al1)T

使用维度计算验证一下: ( N l × M ) ⋅ ( M × N l − 1 ) = ( N l × N l − 1 ) (N_l\times M)\cdot(M \times N_{l-1})=(N_l\times N_{l-1}) (Nl×M)(M×Nl1)=(Nl×Nl1)

6.2 求 ∂ C ∂ b j l \frac{\partial C}{\partial b_j^l} bjlC

由于 b l \bm{b^l} bl在前向传播时,广播到了 M M M个,所以与 W \bm{W} W同理,在使用链式法则是同样要在 m m m维度上累加: ∂ C ∂ b j l = ∑ m ∂ C ∂ Z j , m l ∂ Z j , m l ∂ b j l \frac{\partial C}{\partial b_j^l}=\sum_m\frac{\partial C}{\partial Z_{j,m}^l}\frac{\partial Z_{j,m}^l}{\partial b_j^l} bjlC=mZj,mlCbjlZj,ml

其中, ∂ Z j , m l ∂ b j l = 1 \frac{\partial Z_{j,m}^l}{\partial b_j^l}=1 bjlZj,ml=1。带入原式得到 ∂ C ∂ b j l = ∑ m ∂ C ∂ Z j , m l \frac{\partial C}{\partial b_j^l}=\sum_m\frac{\partial C}{\partial Z_{j,m}^l} bjlC=mZj,mlC

在扩展到矩阵表示时,我们需要引入一个全1的 M M M维列向量:

∂ C ∂ b l = ∂ C ∂ Z l ⋅ o n e s ( M , 1 ) \frac{\partial C}{\partial \bm{b^l}}=\frac{\partial C}{\partial \bm{Z^l}}\cdot \mathrm{ones(M,1)} blC=ZlCones(M,1)

使用维度计算验证一下: ( N l × M ) ⋅ ( M , 1 ) = ( N l × 1 ) (N_l\times M)\cdot(M,1)=(N_l\times 1) (Nl×M)(M,1)=(Nl×1)

7 多样本反向传播全矩阵方法的最后公式

赏心悦目的公式们:

∂ C ∂ Z L = ∂ C ∂ A L ⊙ σ ′ L ( Z L ) ∂ C ∂ Z l = ( W l + 1 ) T ( ∂ C ∂ Z l + 1 ) ⊙ σ ′ l ( Z l ) ∂ C ∂ W l = ∂ C ∂ Z l ⋅ ( A l − 1 ) T ∂ C ∂ b l = ∂ C ∂ Z l ⋅ o n e s ( M , 1 ) \begin{aligned} \frac{\partial C}{\partial \bm{Z^L}}&=\frac{\partial C}{\partial \bm{A^L}}\odot\sigma'^L(\bm{Z^L})\\ \frac{\partial C}{\bm{\partial \bm{Z^l}}}&=\bm{(W^{l+1})}^\mathrm{T}(\frac{\partial C}{\partial \bm{Z^{l+1}}})\odot\sigma'^l(\bm{Z^l})\\ \frac{\partial C}{\partial \bm{W^l}}&=\frac{\partial C}{\partial \bm{Z^l}}\cdot (\bm{A^{l-1})^\mathrm{T}}\\ \frac{\partial C}{\partial \bm{b^l}}&=\frac{\partial C}{\partial \bm{Z^l}}\cdot \mathrm{ones(M,1)} \end{aligned} ZLCZlCWlCblC=ALCσL(ZL)=(Wl+1)T(Zl+1C)σl(Zl)=ZlC(Al1)T=ZlCones(M,1)

8 与基于单样本累加的mini-batch更新方法的比较

Michael Nielsen在书中给出了计算mini-batch梯度的一种方法。

这个方法是在单样本基础上实现的,总体的思路是先依次进行mini-batch个样本的前向传播和误差计算,再依次传播误差到每一层中,最后进一步计算 W l , b l \bm{W^l,b^l} Wl,bl的梯度。而全矩阵方法是并行化的,也就是一次前向传播就可以同时完成mini-batch个样本的相应计算,反向传播误差时亦如此。并行化也在当今的算法中大受推崇,比如序列建模中,Transformer相对于(RNN家族)的一个巨大优势,就是可以并行计算。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值