神经网络入门篇:直观理解反向传播(Backpropagation intuition)
详细推导反向传播
下图是逻辑回归的推导:
回想一下逻辑回归的公式(参考公式1.2、公式1.5、公式1.6、公式1.15)
公式1.38:
所以回想当时我们讨论逻辑回归的时候,我们有这个正向传播步骤,其中我们计算\(z\),然后\(a\),然后损失函数\(L\)。
公式1.39:
神经网络的计算中,与逻辑回归十分类似,但中间会有多层的计算。下图是一个双层神经网络,有一个输入层,一个隐藏层和一个输出层。
前向传播:
计算\(z^{[1]}\),\(a^{[1]}\),再计算\(z^{[2]}\),\(a^{[2]}\),最后得到loss function。
反向传播:
向后推算出\(da^{[2]}\),然后推算出\(dz^{[2]}\),接着推算出\(da^{[1]}\),然后推算出\(dz^{[1]}\)。我们不需要对\(x\)求导,因为\(x\)是固定的,我们也不是想优化\(x\)。向后推算出\(da^{[2]}\),然后推算出\(dz^{[2]}\)的步骤可以合为一步:
公式1.40:
\(dz^{[2]}=a^{[2]}-y\;,\;dW^{[2]}=dz^{[2]}{a^{[1]}}^{T}\)
(注意:逻辑回归中;为什么\(a^{[1]T}\)多了个转置:\(dw\)中的\(W\)(视频里是\(W^{[2]}_i\))是一个列向量,而\(W^{[2]}\)是个行向量,故需要加个转置);
公式1.41:
\(db^{[2]}=dz^{[2]}\)
公式1.42:
\(dz^{[1]} = W^{[2]T}dz^{[2]}* g[1]^{'}(z^{[1]})\)
注意:这里的矩阵:\(W^{[2]}\)的维度是:\((n^{[2]},n^{[1]})\)。
\(z^{[2]}\) , \(dz^{[2]}\)的维度都是:\((n^{[2]},1)\),如果是二分类,那维度就是\((1,1)\)。
\(z^{[1]}\),\(dz^{[1]}\)的维度都是:\((n^{[1]},1)\)。
证明过程:
见公式1.42,其中\(W^{[2]T}dz^{[2]}\)维度为:\((n^{[1]},n^{[2]})\)、\((n^{[2]},1)\)相乘得到\((n^{[1]},1)\),和\(z^{[1]}\)维度相同,
\(g[1]^{'}(z^{[1]})\)的维度为\((n^{[1]},1)\),这就变成了两个都是\((n^{[1]},1)\)向量逐元素乘积。
实现后向传播有个技巧,就是要保证矩阵的维度相互匹配。最后得到\(dW^{[1]}\)和\(db^{[1]}\),公式1.43:
\(dW^{[1]} =dz^{[1]}x^{T},db^{[1]} = dz^{[1]}\)
可以看出\(dW^{[1]}\) 和\(dW^{[2]}\) 非常相似,其中\(x\)扮演了\(a^{[0]}\)的角色,\(x^{T}\) 等同于\(a^{[0]T}\)。
由:
\(Z^{[1]} = W^{[1]}x + b^{[1]}\;,\;a^{[1]}=g^{[1]}(Z^{[1]})\)
得到:
\(Z^{[1]} = W^{[1]}x + b^{[1]}, A^{[1]} = g^{[1]}(Z^{[1]})\)
注意:大写的\(Z^{[1]}\)表示\(z^{[1](1)},z^{[1](2)},z^{[1](3)}...z^{[1](m)}\)的列向量堆叠成的矩阵,以下类同。
下图写了主要的推导过程:
公式1.44:
\(dZ^{[2]}=A^{[2]}-Y\;,\;dW^{[2]}={\frac{1}{m}}dZ^{[2]}{A^{[1]}}^{T}\)
公式1.45:
\(L = {\frac{1}{m}}\sum_i^n{L(\hat{y},y)}\)
公式1.46:
\(db^{[2]} = {\frac{1}{m}}np.sum(dZ^{[2]},axis=1,keepdims=True)\)
公式1.47:
\(\underbrace{dZ^{[1]}}_{(n^{[1]}, m)} = \underbrace{W^{[2]T}dZ^{[2]}}_{(n^{[1]}, m)}*\underbrace{g[1]^{'} (Z^{[1]})}_{(n^{[1]}, m)}\)
公式1.48:
\(dW^{[1]} = {\frac{1}{m}}dZ^{[1]}x^{T}\)
公式1.49:
$db^{[1]} = {\frac{1}{m}}np.sum(dZ^{[1]},axis=1,keepdims=True) $
反向传播的推导是机器学习领域最难的数学推导之一,矩阵的导数要用链式法则来求,如果这篇博客理解不了也没大的关系,只要有这种直觉就可以了。还有一点,就是初始化你的神经网络的权重,不要都是0,而是随机初始化。