【一文读懂】什么是神经网络?(三)梯度下降

177 阅读5分钟

前言

本文介绍了神经网络中的核心思想之一:“梯度下降”。它是神经网络学习的基础。

本片文章参考3blue1brown教程:Gradient descent, how neural networks learn

损失函数

权重偏差是神经网络的关键组成部分,它们直接影响着网络的最终输出。因此,调整权重和偏差是神经网络训练中至关重要的一步。

在神经网络的初始阶段,通常会为所有权重和偏差分配随机值。这样的做法使得网络的输出结果是随机的,因为网络还没有经过训练,权重和偏差的设置是随机的。

在这里插入图片描述

所以你应该如何告诉计算机,这样的结果是错误的呢?

我们可以通过定义一个数学函数来实现这一点。该函数接受正确答案和神经网络计算出的结果作为输入,然后输出一个值,该值表示神经网络计算结果与正确答案之间的相似程度。

在这里插入图片描述

举例来说,我们可以通过计算每个神经元的激活值与预期值之间的差异,然后取平方并将其累加,得到一个代表整体误差的值。在这个例子中,只有当预期的结果为【0,0,0,1,0,0,0,0,0,0】时,通过这个函数计算出来的值才是0。与数字“3”相关的神经元的激活值偏离1越远,将导致函数结果越大;而其他神经元的激活值偏离0越远,也会使函数结果增大。

因此,我们可以利用这个函数来评估神经网络得到的结果是否与预期相符。值越接近0,说明网络越接近正确答案。我们的目标是通过调整权重和偏差,使得这个函数的值尽可能接近0。这个函数就是我们所说的“损失函数”。

损失函数有很多种,每种的使用场景也可能不同,这里只是举了一个例子

如何最小化损失函数

有了损失函数的帮助,接下来就可以探讨如何利用它来调整神经网络中的权重和偏差,以最小化损失函数的值。

这听起来像是高中数学题,找到某个函数的最小值。

在损失函数中,输入包含了所有的权重和偏差,因此函数的自变量有成千上万个。与我们在数学课上学习的一般形式y=f(x)不同,这个函数更加复杂。

为了更好地理解在这种复杂函数上如何找到最小值之前,让我们先简化讨论,只考虑一般函数形式y = f(x)的情况,然后再推广到权重和偏差的情况。

在这里插入图片描述

对于一元一次方程,可以通过求解斜率为0的情况直接找到函数的最小值或最大值。然而,对于损失函数这样具有无数个输入的情况,直接求解是不现实的。

因此,我们需要运用微积分的知识。通过在随机选取的点上计算导数,我们可以得知函数的变化趋势。如果导数为正,表示函数图像是从左到右递增的;而如果导数为负,函数图像则是从左到右递减的。 假设函数为y = f(x),若在某一点求得导数为正,为了寻找函数图像附近的最小值,应该减小x值,向负方向移动。

在这里插入图片描述

然后,通过不断重复【计算导数 -> 调整输入】这个过程,就能在随机点附近找到最小值。这个过程就像是一个球沿着山坡滚动一样。

在这里插入图片描述

在这里插入图片描述

考虑更复杂的情况,假设函数具有两个输入:z = f(x, y),其图像形成一个曲面。在选取了一个随机点后,我们如何判断应该如何移动这个点,以接近曲面附近的最低点呢?

在这里插入图片描述

在这种情况下,我们不仅需要了解随机点在x轴上应该如何移动,还需要知道在y轴上应该如何移动。

因此,我们需要对函数进行偏导数运算,以便在每个方向上确定如何调整以最快地接近附近的最小值。

梯度

在更多输入的情况下,函数图像已经无法简单地在平面上表示,而是处于一个多维空间。在这种情况下,我们需要一个向量来指示如何调整输入值,以使函数增长或下降更快。这个向量被称为“梯度”。

为了最小化某个函数,我们通过不断地求梯度并调整输入值的过程,这就是“梯度下降”

步长(steps):这是梯度下降的速率,当他越大时,每次对输入的调整更大,反之亦然

总结

到这里,我们已经了解了神经网络中的重要概念:梯度下降。然而,如何高效地计算每一层的梯度,则涉及到另一个重要的算法:反向传播。关于反向传播的详细解释,我们将在下一节进行讲解。