神经网络与深度学习系列 -反向传播算法

矩阵的在神经网络中的应用

本系列的上一节介绍了梯度下降算法,本节将介绍反向传播算法。利用矩阵在神经网络中,可以大大简化公式的复杂性,同时矩阵运算在反向传播中使用起来极为方便。
在这里插入图片描述
上图给出了神经网络中对权重的标注方式, w j k l w_{jk}^l wjkl表示从 ( l − i ) t h {(l-i)}^{th} (li)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} l1th层的激活值通过S型函数联系起来:
在这里插入图片描述
其中求和是在 ( l − 1 ) t h (l-1)^{th} (l1)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 wlal1+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=kwjklakl1+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 zjlCΔ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} zjlC有一个很大的值(或正或负),我们可以通过选择与 ∂ C ∂ z j l \frac{\partial C}{\partial z_{j}^l} zjlC符号相反的 Δ z j l \Delta z_j^l Δzjl来使代价函数减小;如果 ∂ C ∂ z j l \frac{\partial C}{\partial z_{j}^l} zjlC接近0, ∂ C ∂ z j l Δ z j l \frac{\partial C}{\partial z_{j}^l}\Delta z_j^l zjlCΔzjl也接近0,则 Δ z j l \Delta z_j^l Δzjl就没有必要变化,即使变化在代价函数上引起的影响也微乎其微。

所以说, ∂ C ∂ z j l \frac{\partial C}{\partial z_{j}^l} zjlC会影响到 Δ 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=zjlC=ajlCσ(zjl)是神经元上微小变化的度量,称为是神经元上误差的度量。

四个方程

  1. 输出层误差方程:
    在这里插入图片描述
  2. 用下一层的误差 δ l + 1 \delta^{l+1} δl+1来计算当前层的误差 δ l \delta^{l} δl
    在这里插入图片描述
  3. 代价函数关于网络中任意偏置的改变率:
    在这里插入图片描述
  4. 代价函数关于任何一个权重的改变率:
    在这里插入图片描述
    根据方程1,当 σ ( z j L ) \sigma(z_j^L) σ(zjL)近似为0或者1的时候, σ ′ ( z j L ) \sigma^{\prime}(z_j^L) σ(zjL) ≈ \approx 0,那么最终层的权重学习缓慢,这种情况称为神经元饱和。

四个方程的推导

方程1推导:
首先根据误差的定义有:

δ j L = ∂ C ∂ z j L \delta_j^L=\frac{\partial C}{\partial z_{j}^L} δjL=zjLC

应用链式法则:

δ 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=ajLCzjLajL

因为 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=ajLCσ(zjL) ,方程1得证。

方程2推导:
根据误差的定义有:

δ j l = ∂ C ∂ z j l \delta_j^l=\frac{\partial C}{\partial z_{j}^l} δjl=zjlC

引用链式法则:

δ 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=zjlC=kzkl+1Czjlzkl+1=kzjlzkl+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) zjlzkl+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} bjlC=ajlCbjlajl

根据方程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=ajlCσ(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)=bjlajl,则方程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) bjlajl=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} wjklC=zjlCwjklzjl=δjlwjklzjl

若能求得: ∂ z j l ∂ w j k l = a k l − 1 \frac{\partial z_{j}^l}{\partial w_{jk}^l}=a_k^{l-1} wjklzjl=akl1,即得证;

其中 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=kwjklakl1+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} wjklzjl=akl1,方程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,那么显式的用算法步骤描述出来如下:

  1. 输入 x x x:为输入层设置对应的激活值 a 1 a^1 a1
  2. 前向传播:对每个 l = 2 , 3 , . . . L l=2,3,...L l=2,3,...L 计算相应的 z l = w l a l − 1 + b l z^l=w^la^{l-1}+b^l zl=wlal1+bl a l = σ ( z l ) a^l=\sigma(z^l) al=σ(zl)
  3. 输出层误差: δ L \delta^L δL: 计算向量 δ L = ∇ a C ⨀ σ ′ ( z L ) \delta^L=\nabla_aC\bigodot\sigma^{\prime}(z^L) δL=aCσ(zL)
  4. 反向传播误差:对每个 l = L − 1 , L − 2 , . . . , 2 l=L-1,L-2,...,2 l=L1,L2,...,2,计算 δ l = ( ( w l + 1 ) T δ l + 1 ) ⨀ σ ′ ( z l ) \delta^l=((w^{l+1})^T\delta^{l+1})\bigodot\sigma^{\prime}(z^l) δl=((wl+1)Tδl+1)σ(zl)
  5. 输出:代价函数的梯度由 ∂ C ∂ w j k l = a k l − 1 δ j l \frac{\partial C}{\partial w_{jk}^l}=a_k^{l-1}\delta_j^l wjklC=akl1δjl ∂ C ∂ b j l = δ j l \frac{\partial C}{\partial b_{j}^l}=\delta_j^l bjlC=δjl得出。

检视这个算法流程,我们可以看出它为何被称为反向传播算法,误差向量 δ l \delta^l δl的计算是从最后一层开始,逐步向前传递。

反向传播算法在随机梯度下降算法的应用:

在实践中,通常将反向传播算法和随机梯度下降算法进行结合使用,对于一个给定的大小为 m m m的小批量数据,反向传播算法在随机梯度下降算法的应用步骤为:

  1. 输入训练样样本的集合;
  2. 对每个训练样本 x x x: 设置对应的输入激活 a x , 1 a^{x,1} ax,1,并执行下面的步骤:
    a. 前向传播:对每个 l = 2 , 3 , . . . L l=2,3,...L l=2,3,...L,计算相应的 z x , l = w l a x , l − 1 + b l z^{x,l}=w^la^{x,l-1}+b^l zx,l=wlax,l1+bl a x , l = σ ( z x , l ) a^{x,l}=\sigma(z^{x,l}) ax,l=σ(zx,l)
    b. 输出误差: δ x , L \delta^{x,L} δx,L: 计算向量 δ x , L = ∇ a C x ⨀ σ ′ ( z x , L ) \delta^{x,L}=\nabla_aC_x\bigodot\sigma^{\prime}(z^{x,L}) δx,L=aCxσ(zx,L)
    c. 反向传播误差:对每个 l = L − 1 , L − 2 , . . . , 2 l=L-1,L-2,...,2 l=L1,L2,...,2,计算 δ x , l = ( ( w l + 1 ) T δ x , l + 1 ) ⨀ σ ′ ( z x , l ) \delta^{x,l}=((w^{l+1})^T\delta^{x,l+1})\bigodot\sigma^{\prime}(z^{x,l}) δx,l=((wl+1)Tδx,l+1)σ(zx,l)
  3. 梯度下降:对每个 l = L − 1 , L − 2 , . . . , 2 l=L-1,L-2,...,2 l=L1,L2,...,2,根据 w l = w l − η m ∑ x δ x , l ( a x , l − 1 ) T w^l=w^l-\frac{\eta}{m}\sum_x\delta^{x,l}(a^{x,l-1})^T wl=wlmηxδx,l(ax,l1)T b l = b l − η m ∑ x δ x , l b^l=b^l-\frac{\eta}{m}\sum_x\delta^{x,l} bl=blmηxδx,l

本系列的下一节将通过代码的实现来理解上述算法的实际应用过程;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值