一、代价函数

神经网络用的代价函数是逻辑回归代价函数的一般形式。

image-20230223184355441

二、反向传播算法

为了计算代价函数的偏导数,我们采用反向传播算法。

先通过前向传播求出激活值

image-20230226162332716

计算出最后一层的误差

image-20230226162546112

使用反向传播求出其它层的误差,从而得到代价函数的偏导数

image-20230226162751210

l代表目前所计算的是第几层;

j代表目前计算层中第几个神经元;

i代表下一层中误差单元的下标。

以上是单个样本的情况,且我们没有考虑正则化。下面看完整的算法流程

image-20230226163851297

三、理解反向传播

所谓的梯度下降就是要找到特定的权重和偏置,从而使代价函数最小化。我们要求的就是代价函数的负梯度,它告诉你如何改变所有连线上的权重和偏置,才好让代价下降得更快。

梯度向量的每一项的大小大都是在告诉我们代价函数对于每个参数有多敏感。因为代价函数牵扯到对成千上万个训练样本的代价取平均值,所以我们调整每一步梯度下降用的权重和偏置也会基于所有的训练样本。

image-20230224184347340

假设这个模型还没有训练好,输出比较随机。我们不希望改动这些激活值,只能改变权重和偏置。我们希望图像最终的分类是“9”,也就是最后一个数字9神经元的激活值变大而其他的神经元激活值变小。而且变动的大小应该与现在值和目标值之间的差成正比。比如,增加“9”神经元的激活值比减少“8”神经元的激活值来的更重要。

image-20230226150700889

进一步关注“9”神经元

image-20230226151024358

想增加激活值,有三种思路:

1、增大偏置

2、增大权重

3、改变上一层的激活值

  • 先看如何调整权重,各个权重他们的影响力各不相同。例如连接上一层激活值最大的神经元的权重影响力最大。那么对于这一个训练样本而言,增加了这几个影响较大的权重值,对代价函数造成的影响,就比增大连接激活值较小的神经元的权重要大上很多。当我们说到梯度下降时,我们并不只看每个参数量是该增大还是减小,还应该看哪个参数的性价比更高。
  • 再看改变上一层的激活值,如果与所有正权重连接的神经元激活值更大,与所有负权重连接的激活值更小,那么数字“9”的神经元就会更强烈地激发。和改变权重值类似,我们想要造成更大的影响,就要依据对应权重的大小对激活值做出成比例的改变。当然我们并不能直接改变激活值,我们手里只有权重和偏置可以用。改变上一层的激活值,是数字“9”神经元的期待。对于全局而言,还期待其余数字神经元的激发变弱,但其余神经元对于如何改变也有自己不同的期待。所以,我们把神经元“9”的期待和别的神经元的期待全部加起来,作为如何改变倒数第二层神经元的指示。这些期待变化不仅仅是对应的权重的倍数,也是每个神经元激活值改变量的倍数。
  • 这其实就是在实现反向传播的理念了,把所有的期待的改变加起来,就得到了一串对倒数第二层改动的变化量。有了这些,可以重复这个过程,改变影响倒数第二层神经元激活值的相关参数,从后一层到前一层,把这个过程一直循环到第一层。
  • 刚刚我们谈到的只是单个样本对所有权重和偏置的影响,如果我们只关注那个“9”的要求,最后网络会把所有图像都分类成“9”。所以要对其他的所有训练样本,同样的过一遍反向传播,记录下每个样本想要怎样修改权重和偏置,最后取一个平均值。这里一系列的权重和偏置的平均微调大小,不严格的说就是上面提到的代价函数的负梯度,至少是其标量的倍数。
  • 在实际操作中,如果梯度下降的每一步都用上所有的训练样本来计算,那么花的时间太长了。一般先将训练样本打乱,然后分成多个组,比如每个组包含100个训练样本,再算出这个组下降的一步。这当然不是代价函数的真正梯度,真正的梯度得用上所有的样本,不过这也是一个近似值。每个组都会给出一个近似值,这虽然不是下降最快的一步,但是计算量会减轻很多,最终也会慢慢达到终点,这就是
    ”随机梯度下降“。

总结一下,反向传播算法算的是单个样本想怎样修改权重和偏置,使之能够最快地降低代价。对很多个样本这样操作,然后对这些变化值取平均值。

四、反向传播中的微积分

image-20230226164810734