美文网首页DeepAI
【吴恩达深度学习】—深度神经网络的反向传播推导

【吴恩达深度学习】—深度神经网络的反向传播推导

作者: Sunflow007 | 来源:发表于2020-03-08 23:10 被阅读0次
32.jpg

神经网络的正向传播和反向传播梯度下降的推导过程其实在吴恩达机器学习公开课第五周:https://zhuanlan.zhihu.com/p/74167352 已经推导过了,不过之前的例子不够通用,重点在于解释反向传播的过程。这次我们进行更通用点的推导。
首先,我们总结一下单个神经网络和简单神经网络的向量化表示,然后对一个2层神经网络进行前向传播 + 反向传播的公式推导;最后总结出一个更一般的神经网络反向传播推导公式。

1. 神经网络的向量化表示

1.1 单个神经元:

image.png

我们用L 表示层数,上图:L = 2表示神经网络层数为2,输入层n^{[0]}= n_x = 3有三个变量,同时a^{[0]} = x = \left[ \begin{matrix} x_1 \\ x_2 \\ x_3 \end{matrix} \right]中间的隐藏层有4个神经元n^{[1]} = 4,隐藏层激活后的结果矩阵a^{[1]} = \left[ \begin{matrix} a^{[1]}_1 \\ a^{[1]}_2 \\ a^{[1]}_3 \\ a^{[1]}_4 \end{matrix} \right];输出层有1个神经元n^{[2]} = 1

1.2.1单样本向量化表示

用方程式表示隐藏层的z和激活结果a,如上图右边的方程式,看起来很直观,不过实际计算时,不可能一个个地根据上述方程来计算,而是用向量化地方式表示。
z^{[1]} = W^{[1]}x + b^{[1]}a^{[1]} = \sigma( z^{[1]})z^{[2]} = W^{[2]}x + b^{[2]}a^{[2]} = \sigma( z^{[2]})

1.2.2 多样本向量化表示

1.2.1中的公式适用于单个样本,当我们有多个样本(mini-batch)时,假设有m批样本,则我们就需要从i = 1~m,重复计算这四个过程。实际情况没那么复杂,我们可以直接用多样本向量化的公式表示如下:

x = \left[ \begin{matrix} \vdots &\vdots& \vdots & \vdots\\ x^{(1)} & x^{(2)} & ... & x^{(m)} \\ \vdots &\vdots& \vdots & \vdots\\ \end{matrix} \right] Z^{[1]} = \left[ \begin{matrix} \vdots &\vdots& \vdots & \vdots\\ z^{[1](1)} & z^{[1](2)} & ... & z^{[1](m)} \\ \vdots &\vdots& \vdots & \vdots\\ \end{matrix} \right]

3.png

注:此处a^{[1](i)}中[1]表示神经网络第一层,(i)表示第i批样本

2.简单神经网络的推导

损失函数Cost function公式: J(W^{[1]},b^{[1]},W^{[2]},b^{[2]}) = \frac{1}{m} \Sigma^m_{i=1}L(\widehat{y},y)
dW^{[1]} = \frac{\vartheta J}{\vartheta W^{[1]}}, db^{[1]} = \frac{\vartheta J}{\vartheta b^{[1]}}

W^{[1]} := W^{[1]} -\alpha dW^{[1]} , b^{[1]} := b^{[1]} -\alpha db^{[1]}

dW^{[2]} = \frac{\vartheta J}{\vartheta W^{[2]}}, db^{[2]} = \frac{\vartheta J}{\vartheta b^{[2]}}

正向传播forward propagation:
Z^{[1]} = W^{[1]}x + b^{[1]}
A^{[1]} = \sigma( z^{[1]})
Z^{[2]} = W^{[2]}A^{[1]} + b^{[2]}
A^{[2]} = \sigma( z^{[2]})

反向传播back propagation:dZ^{[2]} = A^{[2]}-Y,Y=[y^{[1]} y^{[2]}...y^{[m]}],>> Y表示了m个样本,y^{(i)}表示第i个样本的预测值矩阵
dW^{[2]} = \frac{1}{m} dZ^{[2]} A^{[1]T}
db^{[2]} = \frac{1}{m}np.sum(dZ^{[2]}, axis=1, keepdims = True)

dZ^{[1]} = W^{[2]T}dZ^{[2]} * g'^{[1]}(Z^{[1]})
dW^{[1]} = \frac{1}{m} dZ^{[1]} X^{T}
db^{[1]} = \frac{1}{m}np.sum(dZ^{[1]}, axis=1, keepdims = True)


dW的公式推导:
dW^{[2]} = \frac{\vartheta J}{\vartheta W^{[2]}} = \frac{\vartheta J}{\vartheta Z^{[2]}} * \frac{\vartheta Z^{[2]}}{\vartheta W^{[2]}} = dZ^{[2]}*\frac{\vartheta (W^{[2]}A^{[1]}+b)}{\vartheta W^{[2]}} = dZ^{[2]}A^{[1]} = \frac{1}{m}dZ^{[2]}A^{[1]T}
\frac{1}{m}和A^{[1]T}

1.这里需要注意的是,我们会repeaat i次(i从1~m),每次都会计算dW,推导公式中的\vartheta J 表示第i次过程汇总的损失。故\frac{\vartheta J}{\vartheta Z^{[2]}} = \frac{1}{m}dZ^{[2]}
2.dW^{[2]}是pxq矩阵,其中p表示第二层神经元数量、q表示第一层神经元数量;dZ^{[2]}是px1矩阵;A^{[1]}是qx1矩阵,为了保持队形,故将其转置。

3.神经网络反向传播推导

3.1前向传播

z^{[l]} = W^{[l]}.a^{[l-1]} + b^{[l]},b为偏差,第l层的结果矩阵:a^{[l]} = g^{[l]}(z^{[l]}) ,g(z)为激活函数
向量化地表示:
Z^{[l]} = W^{[l]}.A^{[l-1]} + b^{[l]}
A^{[l]} = g^{[l]}(Z^{[l]})

我们从l = 0 开始,即A^{[0]} = X 来表示输入层矩阵,开始计算z^{[1]} = W^{[1]}.A^{[0]} + b^{[1]},重复此过程直到最后的输出层:z^{[L]} = W^{[L]}.A^{[L-1]} + b^{[L]},A^{[L]} = g^{[L]}(Z^{[L]}),便完成了整个前向传播的推导

3.2反向传播

完成前向传播的推导后,我们知道了神经网络每一层的激活值,于是可以根据激活值从后往前逐层推导每一层的偏导。
向量化表示的步骤如下:
(6) dZ^{[l]} = dA^{[l]}*[g^{[l]}(Z^{[l]})]'
(7) dW^{[l]} = \frac{1}{m}dZ^{[l]}.A^{[l-1]T}
(8) db^{[l]} = \frac{1}{m}np.sum(dZ^{[l]}, axis = 1 ,keepdims = True)
(9) dA^{[l-1]} = W^{[l]T}.dZ^{[l]}

相关文章

网友评论

    本文标题:【吴恩达深度学习】—深度神经网络的反向传播推导

    本文链接:https://www.haomeiwen.com/subject/ffjsdhtx.html