本系列的上一节介绍了梯度下降算法,本节将介绍反向传播算法。利用矩阵在神经网络中,可以大大简化公式的复杂性,同时矩阵运算在反向传播中使用起来极为方便。
上图给出了神经网络中对权重的标注方式, w j k l w_{jk}^l wjkl表示从 ( l − i ) t h {(l-i)}^{th} (l−i)th 层的第 k t h k^{th} kth 个神经元到 l t h {l}^{th} lth 层的第 j t h j^{th} jth 个神经元的连接上的权重。
上图给出了神经网络中对偏置和激活值的标注方式, b j l b_j^l bjl 表示在 l t h l^{th} lth层第 j t h j^{th} jth个神经元的偏置; a j l a_j^l ajl 表示在 l t h l^{th} lth层第 j t h j^{th} jth个神经元的激活。
那么, l t h l^{th} lth层的第 j t h j^{th} jth个神经元的激活值 a j l a_j^l ajl 可以和 ( l − 1 ) t h (l-1)^{th} (l−1)th层的激活值通过S型函数联系起来:
其中求和是在 ( l − 1 ) t h (l-1)^{th} (l−1)th层的所有k个神经元上进行。
定义权重矩阵 w l w^l wl, w l w^l wl的元素为连接到 l t h l^{th} lth层神经元的所有权重;
定义偏置向量 b l b^l bl, b l b^l bl的元素为 l t h l^{th} lth层神经元的所有偏置;
以上方程就可以写成矩阵的形式:
上式括号中的 w l a l − 1 + b l = z l w^la^{l-1}+b^l=z^l wlal−1+bl=zl称为带权输入。第 l l l层的第 j j j个神经元的激活函数的带权输入为, z j l = ∑ k w j k l a k l − 1 + b j l z_j^{l}=\sum_{k}w_{jk}^{l}a_k^{l-1}+b_j^{l} zjl=∑kwjklakl−1+bjl
反向传播的目的就是计算梯度下降中的偏导数 ∂ C / ∂ w j k l \partial C/\partial w_{jk}^l ∂C/∂wjkl和 ∂ C / ∂ b j l \partial C/\partial b_{j}^l ∂C/∂bjl,其中需要用到一个中间量 δ j l \delta_j^l δjl,
定义 δ j l \delta_j^l δjl为在 l t h l^{th} lth层第 j t h j^{th} jth个神经元上的误差。
误差的概念该如何理解? 首先明确: w j k l w_{jk}^l wjkl 和 b j l b_j^l bjl的微小变化会引起带权输入 z j l z_j^l zjl 的变化,当带权输入 z j l z_j^l zjl发生一个微小变化 Δ z j l \Delta z_j^l Δzjl, 在整个代价函数 C C C上引起的变化为 ∂ C ∂ z j l Δ z j l \frac{\partial C}{\partial z_{j}^l}\Delta z_j^l ∂zjl∂CΔzjl。
假设我们尝试优化代价函数,试着找到一个让代价函数 C C C更小的微小变化 Δ z j l \Delta z_j^l Δzjl(该变化当然也是由 w j k l w_{jk}^l wjkl 和 b j l b_j^l bjl引起的),如果 ∂ C ∂ z j l \frac{\partial C}{\partial z_{j}^l} ∂zjl∂C有一个很大的值(或正或负),我们可以通过选择与 ∂ C ∂ z j l \frac{\partial C}{\partial z_{j}^l} ∂zjl∂C符号相反的 Δ z j l \Delta z_j^l Δzjl来使代价函数减小;如果 ∂ C ∂ z j l \frac{\partial C}{\partial z_{j}^l} ∂zjl∂C接近0, ∂ C ∂ z j l Δ z j l \frac{\partial C}{\partial z_{j}^l}\Delta z_j^l ∂zjl∂CΔzjl也接近0,则 Δ z j l \Delta z_j^l Δzjl就没有必要变化,即使变化在代价函数上引起的影响也微乎其微。
所以说, ∂ C ∂ z j l \frac{\partial C}{\partial z_{j}^l} ∂zjl∂C会影响到 Δ z j l \Delta z_j^l Δzjl(即 w j k l w_{jk}^l wjkl 和 b j l b_j^l bjl)的变化, 所以有一种启发式的认识: δ j l = ∂ C ∂ z j l = ∂ C ∂ a j l σ ′ ( z j l ) \delta_{j}^l=\frac{\partial C}{\partial z_{j}^l}=\frac{\partial C}{\partial a_{j}^l}\sigma'(z_{j}^l) δjl=∂zjl∂C=∂ajl∂Cσ′(zjl)是神经元上微小变化的度量,称为是神经元上误差的度量。
方程1推导:
首先根据误差的定义有:
δ j L = ∂ C ∂ z j L \delta_j^L=\frac{\partial C}{\partial z_{j}^L} δjL=∂zjL∂C,
应用链式法则:
δ j L = ∂ C ∂ a j L ∂ a j L ∂ z j L \delta_j^L=\frac{\partial C}{\partial a_{j}^L}\frac{\partial a_{j}^L}{\partial z_{j}^L} δjL=∂ajL∂C∂zjL∂ajL
因为 a j L = σ ( z j L ) a_j^L=\sigma(z_j^L) ajL=σ(zjL),所以上述方程变成:
δ j L = ∂ C ∂ a j L σ ′ ( z j L ) \delta_j^L=\frac{\partial C}{\partial a_{j}^L}\sigma^{\prime}(z_j^L) δjL=∂ajL∂Cσ′(zjL) ,方程1得证。
方程2推导:
根据误差的定义有:
δ j l = ∂ C ∂ z j l \delta_j^l=\frac{\partial C}{\partial z_{j}^l} δjl=∂zjl∂C
引用链式法则:
δ j l = ∂ C ∂ z j l = ∑ k ∂ C ∂ z k l + 1 ∂ z k l + 1 ∂ z j l = ∑ k ∂ z k l + 1 ∂ z j l δ k l + 1 \delta_j^l=\frac{\partial C}{\partial z_{j}^l}=\sum_{k}\frac{\partial C}{\partial z_{k}^{l+1}}\frac{\partial z_{k}^{l+1}}{\partial z_{j}^l}=\sum_{k}\frac{\partial z_{k}^{l+1}}{\partial z_{j}^l}\delta_k^{l+1} δjl=∂zjl∂C=∑k∂zkl+1∂C∂zjl∂zkl+1=∑k∂zjl∂zkl+1δkl+1
已知: z j l + 1 = ∑ k w j k l + 1 a k l + b j l + 1 = ∑ k w j k l + 1 σ ( z k l ) + b j l + 1 z_j^{l+1}=\sum_{k}w_{jk}^{l+1}a_k^l+b_j^{l+1}=\sum_{k}w_{jk}^{l+1}\sigma(z_k^l)+b_j^{l+1} zjl+1=∑kwjkl+1akl+bjl+1=∑kwjkl+1σ(zkl)+bjl+1。作微分,得到:
∂ z k l + 1 ∂ z j l = w k j l + 1 σ ′ ( z j l ) \frac{\partial z_{k}^{l+1}}{\partial z_{j}^l}=w_{kj}^{l+1}\sigma^{\prime}(z_j^l) ∂zjl∂zkl+1=wkjl+1σ′(zjl)
带入得到:
δ j l = ∑ k w k j l + 1 δ k l + 1 σ ′ ( z j l ) \delta_j^l=\sum_{k}w_{kj}^{l+1}\delta_k^{l+1}\sigma^{\prime}(z_j^l) δjl=∑kwkjl+1δkl+1σ′(zjl) ,方程2得证。
方程3推导:
引用链式法则:
∂ C ∂ b j l = ∂ C ∂ a j l ∂ a j l ∂ b j l \frac{\partial C}{\partial b_{j}^l}=\frac{\partial C}{\partial a_{j}^l}\frac{\partial a_{j}^l}{\partial b_{j}^l} ∂bjl∂C=∂ajl∂C∂bjl∂ajl
根据方程1已知: δ j l = ∂ C ∂ a j l σ ′ ( z j l ) \delta_j^l=\frac{\partial C}{\partial a_{j}^l}\sigma^{\prime}(z_j^l) δjl=∂ajl∂Cσ′(zjl)
若能证明: σ ′ ( z j l ) = ∂ a j l ∂ b j l \sigma^{\prime}(z_j^l)=\frac{\partial a_{j}^l}{\partial b_{j}^l} σ′(zjl)=∂bjl∂ajl,则方程3得证;
已知 a j l = σ ( z j l ) a_j^l=\sigma(z_j^l) ajl=σ(zjl) 和 z j l = ∑ k w j k l a k l + b j l z_j^{l}=\sum_{k}w_{jk}^{l}a_k^l+b_j^{l} zjl=∑kwjklakl+bjl
则有 ∂ a j l ∂ b j l = ∂ σ ( z j l ) ∂ b j l = σ ′ ( z j l ) \frac{\partial a_{j}^l}{\partial b_{j}^l}=\frac{\partial \sigma(z_j^l)}{\partial b_{j}^l}=\sigma^{\prime}(z_j^l) ∂bjl∂ajl=∂bjl∂σ(zjl)=σ′(zjl) ,方程3得证;
方程4推导:
引用链式法则:
∂ C ∂ w j k l = ∂ C ∂ z j l ∂ z j l ∂ w j k l = δ j l ∂ z j l ∂ w j k l \frac{\partial C}{\partial w_{jk}^l}=\frac{\partial C}{\partial z_{j}^l}\frac{\partial z_{j}^l}{\partial w_{jk}^l}=\delta_j^l\frac{\partial z_{j}^l}{\partial w_{jk}^l} ∂wjkl∂C=∂zjl∂C∂wjkl∂zjl=δjl∂wjkl∂zjl
若能求得: ∂ z j l ∂ w j k l = a k l − 1 \frac{\partial z_{j}^l}{\partial w_{jk}^l}=a_k^{l-1} ∂wjkl∂zjl=akl−1,即得证;
其中 z j l = ∑ k w j k l a k l − 1 + b j l z_j^{l}=\sum_{k}w_{jk}^{l}a_k^{l-1}+b_j^{l} zjl=∑kwjklakl−1+bjl,代入上式左侧得到: ∂ z j l ∂ w j k l = a k l − 1 \frac{\partial z_j^l}{\partial w_{jk}^l}=a_k^{l-1} ∂wjkl∂zjl=akl−1,方程4得证;
前边说过,反向传播的目的就是计算梯度下降算法中的偏导数 ∂ C / ∂ w j k l \partial C/\partial w_{jk}^l ∂C/∂wjkl和 ∂ C / ∂ b j l \partial C/\partial b_{j}^l ∂C/∂bjl,那么显式的用算法步骤描述出来如下:
检视这个算法流程,我们可以看出它为何被称为反向传播算法,误差向量 δ l \delta^l δl的计算是从最后一层开始,逐步向前传递。
在实践中,通常将反向传播算法和随机梯度下降算法进行结合使用,对于一个给定的大小为 m m m的小批量数据,反向传播算法在随机梯度下降算法的应用步骤为:
本系列的下一节将通过代码的实现来理解上述算法的实际应用过程;