当前位置: 首页 > 科技观察

神经网络如何学习?

时间:2023-03-19 13:19:14 科技观察

像下山一样,找到损失函数的最低点。毫无疑问,神经网络是当今最流行的机器学习技术。所以我认为了解神经网络如何学习是非常有趣的。要理解神经网络是如何学习的,我们先来看下图:如果我们将每一层的输入输出值表示为向量,将权重表示为矩阵,将误差表示为向量,那么我们有得到上面的从神经网络的角度来看,它只是一系列向量函数的应用。也就是说,函数将向量作为输入,对其进行一些转换,然后输出转换后的向量。上图中,每一行代表一个函数,可以是矩阵乘法加误差向量,也可以是激活函数。圆圈代表这些函数作用的向量。例如,我们从一个输入向量开始,然后将其输入到第一个函数中,该函数计算其分量的线性组合,然后将结果向量作为输出。然后将该向量用作激活函数的输入,依此类推,直到我们到达序列中的最后一个函数。最后一个函数的输出是神经网络的预测值。到目前为止我们已经讨论了神经网络如何得到它的输出,这是我们感兴趣的。我们知道神经网络只是通过一系列函数传递它的输入向量。但是这些函数依赖于一些参数:权重和误差。神经网络如何学习这些参数来做出好的预测?让我们回忆一下神经网络到底是什么:它实际上只是一个函数,一个由小函数按顺序排列组成的大函数。这个函数有一组参数,一开始我们不知道这些参数应该是什么,我们只是随机初始化它们。所以一开始神经网络会给我们一些随机值。那么我们如何改进它们呢?在尝试改进它们之前,我们首先需要一种方法来评估神经网络的性能。如果我们没有办法衡量模型的好坏,我们应该如何提高模型的性能呢?为此,我们需要设计一个函数,将神经网络的预测值和数据集中的真实标签作为输入,转换一个具有代表性的神经网络性能数字作为输出。然后我们可以将学习问题转化为寻找函数的最小值或最大值的优化问题。在机器学习领域,这个函数经常被用来衡量我们的预测有多糟糕,因此得名损失函数。然后我们的问题就变成了找到最小化这个损失函数的神经网络参数。随机梯度下降算法你可能擅长从微积分中找到函数的最小值。对于这类问题,通常取函数的梯度,使其等于0,求出所有的解(也叫临界点),然后选择使函数值最小的解。这是全局最小值。我们可以做同样的事情来最小化我们的损失函数吗?其实也行不通,主要问题是神经网络的损失函数并不像微积分课本上经常看到的那样简单明了。它是一个极其复杂的函数,有数千、数十万甚至数百万个参数。有时甚至无法找到问题的收敛解。这个问题通常通过迭代方法来解决,它不试图找到一个直接的解决方案,而是从一个随机的解决方案开始,并尝试在每次迭代中稍微改进它。最终,经过多次迭代,我们会有一个很好的解决方案。一种这样的迭代方法是梯度下降。你可能知道,一个函数的梯度给了我们最陡的上升方向,如果我们取梯度为负,它就会给我们最陡的下降方向,也就是最快到达最小值的方向。因此,在每次迭代(我们也可以称之为训练时期)中,我们计算损失函数的梯度并将其从旧参数中减去(乘以一个称为学习率的因子)以获得神经网络的新参数。其中θ(theta)表示包含神经网络所有参数的向量。在标准梯度下降中,梯度是在考虑整个数据集的情况下计算的。通常这是不可取的,因为这种计算可能很昂贵。在实践中,数据集被随机分成称为批次的块。每个批次都会进行更新。这种方法称为随机梯度下降。上面的更新规则只考虑每一步在当前位置计算的梯度。这样,在损失函数面上移动的点的轨迹对任何变化都很敏感。有时我们可能想让这个轨迹更稳健。为此,我们使用了一个受物理学启发的概念:动量。这个想法是,当我们进行更新时,我们还会考虑以前的更新,这些更新会累积到一个变量Δθ中。如果在同一个方向上进行更多更新,那么我们将在那个方向上“更快”地移动,并且不会因为任何小的扰动而改变我们的轨迹。把它想象成速度。其中α是一个非负因子,它可以决定旧梯度可以贡献多少值。当它为0时,我们不使用动量。反向传播算法我们如何计算梯度?回想一下,神经网络和损失函数只是函数的组合。那么如何计算复合函数的偏导数呢?我们可以使用链式法则。我们看下图:如果我们要计算损失函数对第一层的权重参数的偏导数:我们先对第一个线性表达式对权重参数求偏导,然后乘以这个下一个函数(也就是激活函数)对前面函数输出的偏导数的结果,一直执行这个操作,直到我们乘以损失函数对上一个激活函数的偏导数功能。如果我们想计算关于第二层权重参数的导数怎么办?我们要做同样的过程,但是这次我们从第二个线性组合函数对权重参数的导数开始,然后,我们乘以另一项,在计算第一层权重的导数时也会出现。因此,我们不会一遍又一遍地计算这些项,而是要前后计算它们,因此得名反向传播算法。我们将首先计算损失函数相对于神经网络输出层的偏导数,然后通过保持导数的运行乘积将这些导数反向传播到第一层。请注意,我们有两种导数:一种是函数对其输入的导数。我们将它们乘以导数的乘积,目的是跟踪神经网络从输出层到当前层神经元节点的误差。第二类导数是关于参数的,这种导数就是我们用来优化参数的。我们不将它与其他导数的乘积相乘,而是将它们存储为梯度的一部分,稍后我们将使用它来更新参数。所以,在反向传播中,当我们遇到没有可学习参数的函数(比如激活函数)时,我们只取第一类导数,只是为了反向传播误差。然而,当我们遇到一个带有可学习参数的函数(比如一个线性组合,带有权重和偏差),那么我们取这两个导数:第一个是带有误差传播的输入,第二个是权重和偏差,并存储它们作为渐变的一部分。自始至终,我们从损失函数开始,直到到达第一层,在第一层我们没有任何要添加到梯度中的可学习参数。这就是反向传播算法。在Softmax激活和交叉熵损失函数分类任务中,最后一层常用的激活函数是softmax函数。softmax函数将其输入向量转换为概率分布。从上图可以看出,softmax输出的向量元素都是正的,它们的和为1。当我们使用softmax激活时,我们在神经网络的最后一层创建等于类数的节点在数据集中,softmax激活函数将给出可能类别的概率分布。因此,神经网络的输出会输出给我们输入向量属于每一个可能类别的概率,我们选择概率最高的类别作为神经网络的预测。当使用softmax函数作为输出层的激活函数时,通常使用交叉熵损失作为损失函数。交叉熵损失衡量两个概率分布的相似程度。我们可以将输入值x的真实标签表示为概率分布,真实类标签的概率为1,其他类标签的概率为0。这种标签表示也称为单热编码。然后我们使用交叉熵来衡量网络预测的概率分布与真实概率分布的接近程度。其中y是真实标签的单热编码,yhat是预测的概率分布,yi,yihat是这些向量的元素。如果预测的概率分布接近真实标签的one-hot编码,那么损失函数的值将接近于0。否则,如果它们相差很大,损失函数的值可能会无限大。均方误差损失函数softmax激活和交叉熵损失主要用于分类任务,而神经网络只需在最后一层使用适当的损失函数和激活函数即可轻松适应回归任务。例如,如果我们没有类标签作为基础并且我们有一个我们想要近似的数字列表,我们可以使用均方误差(简称MSE)损失函数。通常,当我们使用MSE损失函数时,我们在最后一层使用身份激活(即f(x)=x)。综上所述,神经网络的学习过程无非就是一个优化问题:我们要找到使损失函数最小的参数。但这不是一件容易的事,有很多关于优化技术的书。而且,除了优化之外,还出现了为给定任务选择哪种神经网络架构的问题。希望这篇文章对您有所帮助,非常感谢您的阅读。