上篇博文在两层神经网络的基础上进行了正向传播和反向传播的推导,由于网络层数较少,且只考虑了一个样本的情况,使得推导不具有普适性,本章将进行深层神经网络场景下的正向反向传播推导。
正向传播
假设第$l$层网络有$n$个神经元,第$l-1$层网络有$m$个神经元,$w^{(l)}_{ij}$表示第$l$层第$i$个神经元与第$l-1$层第$j$个神经元的连接权重,$b^{(l)}_{i}$表示第$l$层第i个单元的偏置项,$z^{(l)}_{i}$表示第$l$层第$i$个神经元的输入, $a^{(l)}_{i}$表示第$l$层第$i$个神经元的输入,$f(x)$为激活函数,则有
$$z^{(l)}_{i} = \sum^{m}_{j=1}w^{(l)}_{ij}a^{(l-1)}_{j}+b^{(l)}_{i}$$
$$a^{(l)}_{i}=f[z^{(l)}_{i}]$$
前向传播比较简单,公式推导比较简单,接下来将其向量化。
$$W^{(l)}=\begin{pmatrix}
w^{(l)}_{11} & w^{(l)}_{12} &\cdots & w^{(l)}_{1m}\\\
w^{(l)}_{21} & w^{(l)}_{22} &\cdots & w^{(l)}_{2m}\\
\vdots & \vdots & \ddots &\vdots \\
w^{(l)}_{n1} & w^{(l)}_{n2} &\cdots & w^{(l)}_{nm}\
\end{pmatrix}$$
$$A^{(l-1)}=\begin{bmatrix}
a^{(l-1)}_{1}\
a^{(l-1)}_{2}\
\vdots\
a^{(l-1)}_{m}
\end{bmatrix}$$
$$B^{(l)}=\begin{bmatrix}
b^{(l)}_{1}\
b^{(l)}_{2}\
\vdots\
b^{(l)}_{m}
\end{bmatrix}$$
$$Z^{(l)}=\begin{bmatrix}
z^{(l)}_{1}\
z^{(l)}_{2}\
\vdots\
z^{(l)}_{m}
\end{bmatrix}$$
所以有
$$Z^{(l)}=W^{(l)}A^{(l-1)}+B^{(l)}$$
$$A^{(l)}=f[Z^{(l)}]$$
反向传播
上篇博文中反向传播使用的均方误差作为损失函数,实际上还可以使用交叉熵等其他公式,所以此处使用$J(W,b)$来代表损失函数,根据链式求导法则有:
$$\bigtriangledown_{W^{(l)}} J(W,b)=\frac{\partial{J(W,b)}}{\partial{z^{(l)}}}\frac{\partial{z^{(l)}}}{\partial{W^{(l)}}}=\delta^{(l)}[A^{(l-1)}]^{T}$$
$$\bigtriangledown_{b^{(l)}} J(W,b)=\frac{\partial{J(W,b)}}{\partial{z^{(l)}}}\frac{\partial{z^{(l)}}}{\partial{b^{(l)}}}=\delta^{(l)}$$
其中$\frac{\partial{J(W,b)}}{\partial{z^{(l)}}}=\delta^{(l)}$,接下来继续求$\delta^{(l-1)}=\frac{\partial{J(W,b)}}{\partial{z^{(l-1)}}}$
$$\delta^{(l-1)}=\frac{\partial{J(W,b)}}{\partial{z^{(l-1)}}}=\frac{\partial{J(W,b)}}{\partial{z^{(l)}}}
\frac{\partial{z^{(l)}}}{\partial{a^{(l-1)}}}
\frac{\partial{a^{(l-1)}}}{\partial{z^{(l-1)}}}
=[W^{(l)}]^{T}\delta^{(l)}f’(z^{(l-1)})$$
其中$\frac{\partial{J(W,b)}}{\partial{z^{(l)}}}=\delta^{(l)}$,$\frac{\partial{z^{(l)}}}{\partial{a^{(l-1)}}} = W^{(l)}$,$\frac{\partial{a^{(l-1)}}}{\partial{z^{(l-1)}}}=f’(z^{(l-1)})$。所以可以从输出层向输入层逐步计算每一层的$\delta^{(l)}$。
神经网络工作流程
整个神经网络的计算过程如下:
- 前向传播,利用前向传播公式计算每一层的输出值$a^{(l)}$
$$Z^{(l)}=W^{(l)}A^{(l-1)}+B^{(l)}$$
$$A^{(l)}=f[Z^{(l)}]$$ - 对输出层计算残差
$$\delta^{(l)}=\frac{\partial{J(W,b)}}{\partial{z^{(l)}}}$$ - 对其他隐含层计算每一层的残差
$$\delta^{(l-1)}=\frac{\partial{J(W,b)}}{\partial{z^{(l-1)}}}=\frac{\partial{J(W,b)}}{\partial{z^{(l)}}}
\frac{\partial{z^{(l)}}}{\partial{a^{(l-1)}}}
\frac{\partial{a^{(l-1)}}}{\partial{z^{(l)}}}
=[W^{(l)}]^{T}\delta^{(l)}f’(z^{(l-1)})$$ - 计算各层的偏导数$W^{(l)}$、$b^{(l)}$
$$\bigtriangledown_{W^{(l)}} J(W,b)=\frac{\partial{J(W,b)}}{\partial{z^{(l)}}}\frac{\partial{z^{(l)}}}{\partial{W^{(l)}}}=\delta^{(l)}[A^{(l-1)}]^{T}$$
$$\bigtriangledown_{b^{(l)}} J(W,b)=\frac{\partial{J(W,b)}}{\partial{z^{(l)}}}\frac{\partial{z^{(l)}}}{\partial{b^{(l)}}}=\delta^{(l+1)}$$ - 利用梯度下降算法更新每一层的梯度
$$W^{(l)}:=W^{(l)}-\eta\bigtriangledown_{W^{(l)}}J(W,b)$$
$$b^{(l)}:=b^{(l)}-\eta\bigtriangledown_{b^{(l)}} J(W,b)$$
这次还是以推导为主,比较抽象,下次将结合实例进行分析,有助于理解神经网络的工作过程。