Python:反向传播 (六十八)

反向传播

现在,我们准备好训练神经网络了。为此,我们将使用一种方法,叫做反向传播。简而言之,反向传播将包括:

  • 进行前向反馈运算。
  • 将模型的输出与期望的输出进行比较。
  • 计算误差。
  • 向后运行前向反馈运算(反向传播),将误差分散到每个权重上。
  • 更新权重,并获得更好的模型。
  • 继续此流程,直到获得很好的模型。

听起来比较复杂,实际上要简单些。

file

我们看到,上边的蓝点被错误的分到红色区域,这时,我们问红色点,需要我们为你干什么,蓝色点会说希望直线离我更近些。

我们的做法就像从误差之巅下来,高度将是误差函数E(W),我们计算误差函数的梯度,就像在问点希望模型做什么,当我们朝着梯度的相反方向下山,我们就减少了误差,从山上下来,这样就得到了新的误差E(W'),以及一个误差更小的新模型W',意味着我们得到了离点更近的新直线。我们继续这一流程,以最小化该误差。这就是单个感知器的反向传播过程。

file

多层感知器更复杂,不过基本也是这个流程:
file

我们再看看多层级感知器中的前向反馈,传入点的坐标是(x1,x2)标签是 y=1,它对应的是隐藏层的线性模型,然后通过层级间的的结合,这个点的最终结果通过整个非线性模型的输出层得到,该点是蓝色的概率等于该点在最终模型中的位置。

file

反向传播

和之前一样,查看一下这个模型得到的误差,这个模型不太好,因为它预测这个点是红色,但实际这个点是蓝色,我们问该点:“为了分类正确,你希望该模型怎么做?”, 这个点说“我希望这个蓝色区域离我近点”,然蓝色区域靠近点是什么意思?我们看看隐藏层中的两个线性模型,哪个模型效果更好?

似乎上面这个模型的分类的结果更糟,而下面的模型分类正确,因此我们希望来自下面这个模型的影响增大,来自上边的模型影响缩小,我们要做的是减少上边模型的权重,并增大来自下面这个模型的权重,那么,我们得到的模型看起来,更像下面的模型,而不是上面的模型,我们可以更加深入地解释,我们可以从各个线性模型触发,问这个点,“为了更好地对你进行分类,这些模型该怎么做?”,该点说“上面这个模型对我的分类不正确,我想这条线离我近些,第二个模型对我分类正确,所以我想这条线离我远点”,模型据此更新权重,假设它将增加下面模型的权重而减少上面的模型权重,在更新了所有的权重后,隐藏层中所有模型的预测更加准确,输出层中的模型的预测也更为准确,注意这里我们省略了偏差,在现实中你更新权重也会更新偏差。

file

更新权重后:

file

反向传播数学

后面的几个视频将深入讲解数学知识。如果不想听也没有关系,现有的很多代码库和深度学习框架比如 Keras,能够很好并且很简单地完成这个任务。如果你想立即开始训练网络,请转到下个部分。但是如果你喜欢计算各种导数,那么我们深入了解下吧!

file

file

链式法则

我们需要复习下链式法则,以便计算导数。
file

计算 sigmoid 函数的导数

回想一下,sigmoid 函数有一个完美的导数,我们可以在下面的计算中看到。这将使我们的反向传播步骤更加简洁。

file

为者常成,行者常至