反向传播算法求导公式的推导

这里是对吴恩达深度学习视频中后向传播求导公式的推导,需要对视频有一定了解。
吐槽:吴恩达的符号记法真的是比西瓜书上的记法好太多了,后者还没开始推导就看晕了。

符号说明

n [ l ] n^{[l]} n[l]:第 l l l层神经元的数目;

W [ l ] W^{[l]} W[l]:第 l l l层的权值;

b [ l ] b^{[l]} b[l]:第 l l l层的阈值;

z [ l ] z^{[l]} z[l]:第 l l l层的输入;

a [ l ] a^{[l]} a[l]:第 l l l层的输出;

g [ l ] g^{[l]} g[l]:第 l l l层的激活函数;

L ( y ^ , y ) \mathcal{L}(\hat y,y) L(y^,y):损失函数。

神经网络的前向传播公式是:
z [ l ] = W [ l ] a [ l − 1 ] + b [ l ] a [ l ] = g [ l ] ( z [ l ] ) \begin{aligned} z^{[l]}&=W^{[l]}a^{[l-1]}+b^{[l]}\\ a^{[l]}&=g^{[l]}(z^{[l]}) \end{aligned} z[l]a[l]=W[l]a[l1]+b[l]=g[l](z[l])
一个样本的情形

假设我们已经知道了损失函数 L ( y ^ , y ) \mathcal{L}(\hat y,y) L(y^,y)对第 l l l层输出值 a [ l ] a^{[l]} a[l]的梯度 d a [ l ] d a^{[l]} da[l],也即
d a [ l ] = ( ∂ L ∂ a 1 [ l ] , ∂ L ∂ a 2 [ l ] , . . . , ∂ L ∂ a n [ l ] [ l ] ) T d a^{[l]}=\begin{pmatrix}\frac{\partial\mathcal{L}}{\partial a^{[l]}_1},\frac{\partial\mathcal{L}}{\partial a^{[l]}_2},...,\frac{\partial\mathcal{L}}{\partial a^{[l]}_{n^{[l]}}}\end{pmatrix}^T da[l]=(a1[l]L,a2[l]L,...,an[l][l]L)T
根据链式法则,首先对 z [ l ] z^{[l]} z[l]求导,再对 W [ l ] W^{[l]} W[l] b [ l ] b^{[l]} b[l]求导。

由于 a [ l ] a^{[l]} a[l]中的值和 z [ l ] z^{[l]} z[l]中的值是一一对应的,因此求导时也应该是对应元素求导,也即 d z [ l ] dz^{[l]} dz[l]可以写成这种形式
d z [ l ] = ( ∂ L ∂ a 1 [ l ] ∂ a 1 [ l ] ∂ z 1 [ l ] , ∂ L ∂ a 2 [ l ] ∂ a 2 [ l ] ∂ z 2 [ l ] , . . . , ∂ L ∂ a n [ l ] [ l ] ∂ a n [ l ] [ l ] ∂ z n [ l ] [ l ] ) T dz^{[l]}=\begin{pmatrix}\frac{\partial\mathcal{L}}{\partial a^{[l]}_1}\frac{\partial a^{[l]}_1}{\partial z^{[l]}_1},\frac{\partial\mathcal{L}}{\partial a^{[l]}_2}\frac{\partial a^{[l]}_2}{\partial z^{[l]}_2},...,\frac{\partial\mathcal{L}}{\partial a^{[l]}_{n^{[l]}}}\frac{\partial a^{[l]}_{n^{[l]}}}{\partial z^{[l]}_{n^{[l]}}}\end{pmatrix}^T dz[l]=(a1[l]Lz1[l]a1[l],a2[l]Lz2[l]a2[l],...,an[l][l]Lzn[l][l]an[l][l])T
g [ l ] ′ ( z [ l ] ) g^{[l]}{'}(z^{[l]}) g[l](z[l])表示对 z [ l ] z^{[l]} z[l]逐元素求导,也即
g [ l ] ′ ( z [ l ] ) = ( ∂ a 1 [ l ] ∂ z 1 [ l ] , ∂ a 2 [ l ] ∂ z 2 [ l ] , . . . , ∂ a n [ l ] [ l ] ∂ z n [ l ] [ l ] ) T g^{[l]}{'}(z^{[l]})=\begin{pmatrix}\frac{\partial a^{[l]}_1}{\partial z^{[l]}_1},\frac{\partial a^{[l]}_2}{\partial z^{[l]}_2},...,\frac{\partial a^{[l]}_{n^{[l]}}}{\partial z^{[l]}_{n^{[l]}}}\end{pmatrix}^T g[l](z[l])=(z1[l]a1[l],z2[l]a2[l],...,zn[l][l]an[l][l])T
那么 d z [ l ] dz^{[l]} dz[l]可以写成
d z [ l ] = d a [ l ] ∗ g [ l ] ′ ( z [ l ] ) d z^{[l]}=d a^{[l]}*g^{[l]}{'}(z^{[l]}) dz[l]=da[l]g[l](z[l])
有了 d z [ l ] dz^{[l]} dz[l]可以对 W [ l ] W^{[l]} W[l] b [ l ] b^{[l]} b[l]求导。先考虑最简单的,对 b [ l ] b^{[l]} b[l]求导,由于 z [ l ] z^{[l]} z[l]中的值和 b [ l ] b^{[l]} b[l]中的值也是一一对应的,因此
d b [ l ] = ( ∂ L ∂ z 1 [ l ] ∂ z 1 [ l ] ∂ b 1 [ l ] , ∂ L ∂ z 2 [ l ] ∂ z 2 [ l ] ∂ b 2 [ l ] , . . . , ∂ L ∂ z n [ l ] [ l ] ∂ z n [ l ] [ l ] ∂ b n [ l ] [ l ] ) T db^{[l]}=\begin{pmatrix}\frac{\partial\mathcal{L}}{\partial z^{[l]}_1}\frac{\partial z^{[l]}_1}{\partial b^{[l]}_1},\frac{\partial\mathcal{L}}{\partial z^{[l]}_2}\frac{\partial z^{[l]}_2}{\partial b^{[l]}_2},...,\frac{\partial\mathcal{L}}{\partial z^{[l]}_{n^{[l]}}}\frac{\partial z^{[l]}_{n^{[l]}}}{\partial b^{[l]}_{n^{[l]}}}\end{pmatrix}^T db[l]=(z1[l]Lb1[l]z1[l],z2[l]Lb2[l]z2[l],...,zn[l][l]Lbn[l][l]zn[l][l])T
由于 b [ l ] b^{[l]} b[l]的系数为 1 1 1,因此
d b [ l ] = d z [ l ] db^{[l]}=dz^{[l]} db[l]=dz[l]
接下来对 W [ l ] W^{[l]} W[l]求导,根据矩阵乘法规则, z [ l ] z^{[l]} z[l]的一个元素对应于矩阵 W [ l ] W^{[l]} W[l]的一行,因此求导时应该是
d W [ l ] = ( ∂ L ∂ z 1 [ l ] ∂ z 1 [ l ] W 1 : [ l ] ∂ L ∂ z 2 [ l ] ∂ z 2 [ l ] W 2 : [ l ] ⋮ ∂ L ∂ z n [ l ] [ l ] ∂ z n [ l ] [ l ] W n [ l ] : [ l ] ) dW^{[l]}= \begin{pmatrix} \frac{\partial\mathcal{L}}{\partial z^{[l]}_1}\frac{\partial z^{[l]}_1}{W^{[l]}_{1:}}\\ \frac{\partial\mathcal{L}}{\partial z^{[l]}_2}\frac{\partial z^{[l]}_2}{W^{[l]}_{2:}}\\ \vdots\\ \frac{\partial\mathcal{L}}{\partial z^{[l]}_{n^{[l]}}}\frac{\partial z^{[l]}_{n^{[l]}}}{W^{[l]}_{n^{[l]}:}} \end{pmatrix} dW[l]=z1[l]LW1:[l]z1[l]z2[l]LW2:[l]z2[l]zn[l][l]LWn[l]:[l]zn[l][l]
这里 W i : [ l ] W^{[l]}_{i:} Wi:[l]代表 W [ l ] W^{[l]} W[l]的第 i i i行,是一个行向量,由于
z i [ l ] = W i : [ l ] a [ l ] z^{[l]}_i=W^{[l]}_{i:}a^{[l]} zi[l]=Wi:[l]a[l]
因此
∂ z i [ l ] ∂ W i : [ l ] = a [ l ] T \frac{\partial z^{[l]}_i}{\partial W^{[l]}_{i:}}=a^{[l]T} Wi:[l]zi[l]=a[l]T
最终的结果是
d W [ l ] = d z [ l ] a [ l ] T dW^{[l]}=dz^{[l]}a^{[l]^T} dW[l]=dz[l]a[l]T
最后为了实现反向传播,还需要计算损失函数对 a [ l − 1 ] a^{[l-1]} a[l1]的导数 d a [ l − 1 ] da^{[l-1]} da[l1]。跟之前不同的是, z [ l ] z^{[l]} z[l]的一个元素对应于 a [ l − 1 ] a^{[l-1]} a[l1]的每个元素,所以应该是 z [ l ] z^{[l]} z[l]的每个元素分别对 a [ l − 1 ] a^{[l-1]} a[l1]求导,然后求和,也即
d a [ l ] = ∑ i = 1 n [ l ] ∂ L ∂ z i [ l ] ∂ z i [ l ] ∂ a [ l − 1 ] da^{[l]}=\sum_{i=1}^{n^{[l]}}\frac{\partial\mathcal{L}}{\partial z^{[l]}_i}\frac{\partial z^{[l]}_i}{\partial a^{[l-1]}} da[l]=i=1n[l]zi[l]La[l1]zi[l]
由于有
∂ z i [ l ] ∂ a [ l − 1 ] = W i : [ l ] T \frac{\partial z^{[l]}_i}{\partial a^{[l-1]}}=W^{[l]^T}_{i:} a[l1]zi[l]=Wi:[l]T
因此
d a [ l ] = ∑ i = 1 n [ l ] ∂ L ∂ z i [ l ] ∂ z i [ l ] ∂ a [ l − 1 ] = ∑ i = 1 n [ l ] W i : [ l ] T d z i [ l ] = W [ l ] T d z [ l ] \begin{aligned} da^{[l]}&=\sum_{i=1}^{n^{[l]}}\frac{\partial\mathcal{L}}{\partial z^{[l]}_i}\frac{\partial z^{[l]}_i}{\partial a^{[l-1]}}\\ &=\sum_{i=1}^{n^{[l]}}W^{[l]^T}_{i:}dz^{[l]}_i\\ &=W^{[l]^T}dz^{[l]} \end{aligned} da[l]=i=1n[l]zi[l]La[l1]zi[l]=i=1n[l]Wi:[l]Tdzi[l]=W[l]Tdz[l]
至此推导出了单个样本情形的所有求导公式:
d z [ l ] = d a [ l ] ∗ g [ l ] ′ ( z [ l ] ) d b [ l ] = d z [ l ] d W [ l ] = d z [ l ] a [ l ] T d a [ l ] = W [ l ] T d z [ l ] \begin{aligned} dz^{[l]}&=d a^{[l]}*g^{[l]}{'}(z^{[l]})\\ db^{[l]}&=dz^{[l]}\\ dW^{[l]}&=dz^{[l]}a^{[l]^T}\\ da^{[l]}&=W^{[l]^T}dz^{[l]} \end{aligned} dz[l]db[l]dW[l]da[l]=da[l]g[l](z[l])=dz[l]=dz[l]a[l]T=W[l]Tdz[l]
批量的情形

只需要对单个样本情形进行简单的推广即可。这里先给出结果,再进行解释。

假设已经有了 d A [ l ] dA^{[l]} dA[l],那么
d Z [ l ] = d A [ l ] ∗ g [ l ] ′ ( Z [ l ] ) dZ^{[l]}=dA^{[l]}*g^{[l]}{'}(Z^{[l]}) dZ[l]=dA[l]g[l](Z[l])
这很容易理解,因为从 Z [ l ] Z^{[l]} Z[l] A [ l ] A^{[l]} A[l]仍然是经过一个逐元素函数。
d W [ l ] = d Z [ l ] A [ l − 1 ] T dW^{[l]}=dZ^{[l]}A^{[l-1]^T} dW[l]=dZ[l]A[l1]T
在一个样本时
d W [ l ] = d z [ l ] a [ l ] T dW^{[l]}=dz^{[l]}a^{[l]^T} dW[l]=dz[l]a[l]T
现在有多个样本,那么就需要求和,也就可以写成上面那种形式。
这里跟视频中的不一样,因为损失函数中的 1 m \frac{1}{m} m1已经包含在了上一层的求导中。
d b [ l ] = ∑ i = 1 M d Z : i [ l ] db^{[l]}=\sum_{i=1}^{M}dZ^{[l]}_{:i} db[l]=i=1MdZ:i[l]
其中 d Z : i [ l ] dZ^{[l]}_{:i} dZ:i[l]代表矩阵 d Z [ l ] dZ^{[l]} dZ[l]的第 i i i列,这里跟 d W [ l ] dW^{[l]} dW[l]是一样的情形。
d A [ l − 1 ] = W [ l ] T d Z [ l ] dA^{[l-1]}=W^{[l]^T}dZ^{[l]} dA[l1]=W[l]TdZ[l]
在一个样本时
d a [ l ] = W [ l ] T d z [ l ] da^{[l]}=W^{[l]^T}dz^{[l]} da[l]=W[l]Tdz[l]
现在有多个样本,那么
d A [ l ] = ( d a [ l ] ( 1 ) , d a [ l ] ( 2 ) , . . . , d a [ l ] ( m ) ) = ( W [ l ] T d z [ l ] ( 1 ) , W [ l ] T d z [ l ] ( 2 ) , . . . , W [ l ] T d z [ l ] ( m ) ) = W [ l ] T d Z [ l ] \begin{aligned} dA^{[l]}&=\begin{pmatrix}da^{[l](1)},da^{[l](2)},...,da^{[l](m)}\end{pmatrix}\\ &=\begin{pmatrix}W^{[l]^T}dz^{[l](1)},W^{[l]^T}dz^{[l](2)},...,W^{[l]^T}dz^{[l](m)}\end{pmatrix}\\ &=W^{[l]^T}dZ^{[l]} \end{aligned} dA[l]=(da[l](1),da[l](2),...,da[l](m))=(W[l]Tdz[l](1),W[l]Tdz[l](2),...,W[l]Tdz[l](m))=W[l]TdZ[l]
其中 a [ l ] ( i ) a^{[l](i)} a[l](i)代表第 i i i个样本在第 l l l层的输出, z [ l ] ( i ) z^{[l](i)} z[l](i)同理。
至此所有的公式是
d Z [ l ] = d A [ l ] ∗ g [ l ] ′ ( Z [ l ] ) d b [ l ] = ∑ i = 1 M d Z : i [ l ] d W [ l ] = d Z [ l ] A [ l − 1 ] T d A [ l − 1 ] = W [ l ] T d Z [ l ] \begin{aligned} dZ^{[l]}&=dA^{[l]}*g^{[l]}{'}(Z^{[l]})\\ db^{[l]}&=\sum_{i=1}^{M}dZ^{[l]}_{:i}\\ dW^{[l]}&=dZ^{[l]}A^{[l-1]^T}\\ dA^{[l-1]}&=W^{[l]^T}dZ^{[l]} \end{aligned} dZ[l]db[l]dW[l]dA[l1]=dA[l]g[l](Z[l])=i=1MdZ:i[l]=dZ[l]A[l1]T=W[l]TdZ[l]

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值