Back propagation

本文详细介绍了反向传播算法的核心概念,包括链式法则、神经网络参数规范化、反向传播所需的两个假设以及四个关键方程的证明。通过实例解释了误差的定义及其与权重和偏置项的关系,为理解深度学习中的权重更新提供了清晰的数学基础。
摘要由CSDN通过智能技术生成

链式法则

微积分中的求导法则,用于求一个复合函数的导数

数学公式

y=f(g(x))

\frac{\mathrm{d y} }{\mathrm{d} x}=\frac{\mathrm{d y} }{\mathrm{d} g}\cdot \frac{\mathrm{d g} }{\mathrm{d} x}

示例

f(x)=\sin(x^{2}+2)的导数

  根据链式法则分解成两个函数嵌套:
f(x)=sin(g(x))

g(x)=x^{2}+2

根据链式法则进行求解:

\frac{\mathrm{d} f}{\mathrm{d} x} = \frac{\mathrm{d} f}{\mathrm{d} g}\cdot \frac{\mathrm{d} g}{\mathrm{d} x}

\frac{\mathrm{d} f}{\mathrm{d} g} = \cos(g(x))= \cos(x^{2}+2)

\frac{\mathrm{d} g}{\mathrm{d} x}=2x

\frac{\mathrm{d} f}{\mathrm{d} x}=2x\cdot \cos(x^{2}+2)

 

规范神经网络中的参数

权重

我们用 w_{jk}^{l} 表示连接 l-1 层第 k 个神经元至 l 层第 j 个神经元的权重,以下这个例子展示了第二层到第三层连接的权重

 

开始时这种表示方法很麻烦。但是只要您仔细想一下,就会发现这个符号的定义是非常简单而自然的。w_{jk}^{l}一个奇怪的地方就是 jk 的索引顺序。您可能会认为,使用 j 来指代输入神经元,使用 k 来指代输出神经元,更加符合习惯,实际上是这样。我会在下面解释这种奇怪的原因

 

偏置项

对于网络中的偏置项,我们使用类似的表示法。明确地说,我们将 b_{j}^{l} 表示第 l 层中第 j 个神经元的偏置项。我们将 a_{j}^{l} 表示第 l 层中第 j 个神经元的偏置项。下图显示了使用中的这些符号的示例

其他

\sigma 表示激活函数,如sigmod

z_{j}^{l} 表示z_{j}^{l}=\sum (w_{jk}^{l}\cdot a_{jk}^{l-1}+b_{j}^{l}),表示权重的总和加偏置项,未经过激活函数的中间值

a_{j}^{l} 表示\sigma (z_{j}^{l}) 这个神经元的激活值或输入值

总结

利用这些符号,通过等式,第 l 层中的第 j 个神经元的激活值  a_{j}^{l} 与第 (l-1) 层中的激活有关

a_{j}^{l}=\sigma(\sum (w_{jk}^{l}\cdot a_{jk}^{l-1}+b_{j}^{l}))

反向传播需要的两个假设

反向传播的目的是求出损失函数各权重和偏置项的偏导\frac{\partial C}{\partial w}\frac{\partial C}{\partial b},损失函数我们使用二次损失函数:

C=\frac{1}{2}\cdot\sum_{x}^{ } \left \| y(x)-a^{L}(x)\right \|^{2}

其中:n是训练样本的总数,x; y = y(x)是相应的实际输出; L表示网络中的层数;当输入x时,a^{L} = a^{L}(x)是从网络输出的激活值

那么为了可以应用反向传播,我们需要对成本函数C做哪些假设?

  1. 第一个假设是,对于单个训练示例 x,损失函数可以写成平均值的形式C=\frac{1}{n}\sum _{x}C_{x}C_{x}就是单个训练样本的损失函数,由此得知二次损失函数单个样本的损失函数为C=\frac{1}{2}\cdot \left \| y-a^{L}\right \|^{2} ,我们之所以需要这个假设,是因为反向传播实际上让我们做的是为单个训练示例计算偏导数 \frac{\partial C_{x}}{\partial w}\frac{\partial C_{x}}{\partial b}。然后,我们通过对样本进行均匀的训练来获得全局的 \frac{\partial C}{\partial w}\frac{\partial C}{\partial b}
  2. 第二个假设是,它可以通过神经网络的输出写成一个函数,例如二次损失函数写成C=\frac{1}{2}\left \| y-a^{L} \right \|=\frac{1}{2}\sum_{x}^{ }(y_{j}-a_{j}^{L})^{2}                                                                              

反向传播的四个方程及证明

反向传播是用于了解网络中权重和偏置项的变化如何改变损失函数输出的值。最终,这意味着需要计算偏导数 \frac{\partial C}{\partial w}\frac{\partial C}{\partial b}

但是为了计算这些误差,我们首先引入一个中间量\delta _{j}^{l}δ_{j}^{l},我们称其为第 l 层第 j 个神经元的误差。

反向传播将为我们提供计算误差 \delta _{j}^{l}δ_{j}^{l} 的过程,然后将 \delta _{j}^{l}δ_{j}^{l}  与 \frac{\partial C}{\partial w_{jk}^{l}}\frac{\partial C}{\partial b_{j}^{l}}关联起来

 

要了解误差的定义方式,请考虑以下的这个故事

      有一个神经网络,每次输入0就能输出1,输入1就能输出0,突然这个神经网络来了个恶魔,他占据了第 l 层的第 j 个神经元,这个恶魔非常调皮,恶魔在这个神经元的加权值输出z_{j}^{l}增加了一点变化\Delta z_{j}^{l},因此神经元原本激活输出\sigma ( z_{j}^{l}))变为\sigma (z_{j}^{l}+\Delta z_{j}^{l})。因为这个神经元值的变化,后面连接的神经元也产生了变化,原本输入0会输出1,现在输出0.8,原本输入1会输出0,现在输出0.4

      突然一天这个恶魔变好了,并且正试图帮助您减小误差,但他忘记神经元的增加值\Delta z_{j}^{l},因此无法直接调整这个神经元的输出使神经网络的输出变为输入0就能输出1,但他很聪明,他找的了一个方法来使神经网络输出正确,他找到了微分公式,通过微分公式他得知最终的误差变化为\frac{\partial C}{\partial z_{j}^{l}}\Delta z_{j}^{l},通过间接改变\frac{\partial C}{\partial z_{j}^{l}}来使输出正确,原本\frac{\partial C}{\partial z_{j}^{l}}因为\Delta z_{j}^{l}的变化变得非常大,因此,恶魔可以通过选择\Delta z_{j}^{l}具有与\frac{\partial C}{\partial z_{j}^{l}}相反的符号来最终误差。相对的,如果\frac{\partial C}{\partial z_{j}^{l}}接近零,那么该恶魔就无法改变\Delta z_{j}^{l}来减小误差了。

 

通过这个故事我们可以感受到  \delta _{j}^{l}\frac{\partial C}{\partial z_{j}^{l}}的关系,我们可以定义 l 层中 j 神经元的误差  \delta _{j}^{l}

\delta _{j}^{l}=\frac{\partial C}{\partial z_{j}^{l}}

 

输出层的误差方程

\delta _{j}^{l}=\frac{\partial C}{\partial a_{j}^{l}}\cdot {\sigma }'(z_{j}^{l})

证明:

通过链式法则得出

\frac{\partial C}{\partial z_{j}^{l}}=\frac{\partial C}{\partial a_{j}^{l}}\cdot \frac{\partial a_{j}^{l}}{\partial z_{j}^{l}}=\frac{\partial C}{\partial a_{j}^{l}}\cdot {\sigma }'(z_{j}^{l})

矩阵表达式:

\delta ^{L}=\bigtriangledown_{a}\odot {\sigma }'(z^{L})

二次损失函数:

C=\frac{1}{2}\sum_{x}^{ }(y_{j}-a_{j}^{L})^{2}

\frac{\partial C}{\partial z_{j}^{l}}=\frac{\partial C}{\partial a_{j}^{l}}\cdot \frac{\partial a_{j}^{l}}{\partial z_{j}^{l}}=(a_{j}^{L}-y_{j})\cdot \frac{\partial a_{j}^{l}}{\partial z_{j}^{l}}

根据误差\delta ^{l+1}计算上一层的误差\delta ^{l}

\delta ^{l}=((w^{l+1})^{T}\delta ^{l+1})\odot {\sigma }'(z^l)

这是 l 层所有误差的矩阵表达式,证明只需证单个神经元

证明:

通过链式法则得出

\frac{\partial z_{k}^{l+1} }{\partial z_{j}^{l}}=\frac{\partial z_{k}^{l+1}}{\partial a_{j}^{l}}\cdot \frac{\partial a_{j}^{l}}{\partial z_{j}^{l}}=w_{kj}^{l+1}{\sigma }'(z^l)

\delta_{j}^{l}=\frac{\partial C}{\partial z_{j}^{l}}=\sum_{k}^{ }\frac{\partial C}{\partial z_{k}^{l+1}}_{k}^{ }\frac{\partial z_{k}^{l+1}}{\partial z_{k}^{l}}=\sum_{k}^{ }\frac{\partial z_{k}^{l+1}}{\partial z_{k}^{l}}\delta _{k}^{l+1}

\delta_{j}^{l}=\sum_{k}^{ }w_{kj}^{l+1}\delta _{k}^{l+1}{\sigma }'(z_{j}^{l})

网络中任何偏置项的变化率

\frac{\partial C}{\partial w_{j}^{l}}=\delta _{j}^{l}

证明:

通过链式法则得出

\frac{\partial C}{\partial b_{j}^{l}}=\frac{\partial C}{\partial z_{j}^{l}}\cdot \frac{\partial z_{j}^{l}}{\partial b_{j}^{l}}=\delta _{j}^{l}\cdot 1=\delta _{j}^{l}

网络中任何权重的变化率

\frac{\partial C}{\partial w_{j}^{l}}=a_{k}^{l-1} \delta _{j}^{l}

证明:

通过链式法则得出

\frac{\partial C}{\partial w_{j}^{l}}=\frac{\partial C}{\partial z_{j}^{l}}\cdot \frac{\partial z_{j}^{l}}{\partial w_{j}^{l}}=a_{k}^{l-1}\cdot\delta _{j}^{l}

 

 

这四个公式组成了反向传播

 

参考链接:

http://neuralnetworksanddeeplearning.com/chap2.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值