ChatGPT 的工作原理:机器学习和神经网络训练
到目前为止,我们一直在讨论“已经知道”如何执行特定任务的神经网络。但神经网络(可能在大脑中也可能)如此有用的原因在于,它们不仅原则上可以执行各种任务,而且还可以逐步“通过示例进行训练”来执行这些任务。
当我们创建一个区分猫和狗的神经网络时,我们实际上不需要编写程序来(比如说)显式地找到胡须;相反,我们只需要显示大量关于什么是猫、什么是狗的信息,然后让网络“机器学习”如何从这些示例中区分它们。
重点是,经过训练的网络从它所显示的具体示例中进行了“概括”。 正如我们在上面看到的,网络并不是简单地识别它所看到的猫图像的特定像素模式;而是简单地识别它所看到的猫图像的特定像素模式。神经网络以某种方式设法识别出我们认为的某种“通用猫”,并根据性别区分图像。
那么神经网络训练是如何进行的呢?基本上,我们正在尝试找到使神经网络能够成功重现我们给出的示例的权重。然后,我们依靠神经网络以“合理”的方式在这些示例之间进行“插值”(或“概括”)。
让我们看一个比上面最近点问题更简单的问题。让我们尝试让神经网络学习该函数:
对于这项任务,我们需要一个具有一个输入和一个输出的网络,例如:
但是什么权重等等。我们应该使用对于每个可能的权重集,神经网络计算一些函数。例如,它对一些随机选择的权重集执行以下操作:
是的,我们可以清楚地看到,在这些情况下,它甚至无法再现我们想要的函数。那么我们如何找到重现该函数的权重呢?
基本思想是提供大量“输入→输出”示例用于“学习”——然后尝试找到重现这些示例的权重。以下是逐步使用更多示例的结果:
在“训练”的每个阶段,网络中的权重都会逐渐调整 - 我们看到最终得到的模型能够成功重现我们想要的结果。具有所需功能的网络。那么我们该如何调整权重呢? 基本思想是,在每个阶段,我们都会看到距离所需功能“有多远”,然后更新权重以使其更接近。
为了找出“我们有多远”,我们计算通常所说的“损失函数”(有时也称为“成本函数”)。这里我们使用一个简单的(L2)损失函数,它只是我们得到的值与真实值之间的差值的平方和。
我们看到,随着我们训练过程的进展,损失函数逐渐减小(遵循针对不同任务不同的特定“学习曲线”)——直到我们达到网络(至少有一个良好的近似)成功的点重现我们想要的函数:
好吧,最后要解释的重要部分是如何调整权重以最小化损失函数。正如我们所说,损失函数给出了我们得到的值与真实值之间的“距离”。 但是每个阶段“我们得到的值”是由神经网络的当前版本及其权重决定的。 现在想象这些权重是变量 - 假设为 wi。我们想要弄清楚如何调整这些变量的值,以使取决于这些变量的损失最小。
例如,想象一下(实践中使用的典型神经网络的令人难以置信的简化)我们只有两个权重 w1 和 w2。然后我们可以将损失作为 w1 和 w2 的函数,如下所示:
数值分析提供了各种技术来查找这种情况下的最小值。但典型的方法是从前面的w1和w2开始,逐渐沿着最陡的向下路径:
就像水从山上流下来一样,我们可以保证这个过程最终会到达地球表面的某个部分。 。最小值(“山湖”);它很可能不会达到最终的全球最低值。
寻找重量最陡的下降路线并不明显,不可行。但是,帐户可以帮助我们。 如上所述,神经网络始终可以被视为计算数学函数 - 取决于其输入和权重。
现在考虑这些重量之间的差异。事实证明,微积分的链式定律实际上使我们能够“破译”神经网络连续层执行的操作。因此,我们可以——至少在某些局部近似中——“反转”神经网络的操作,并逐渐找到最小化与输出相关的损失的权重。
上图显示了在只有 2 个权重的不切实际的简单情况下我们可能需要做的最小化。但事实证明,即使权重更大(ChatGPT 使用 1750 亿),它仍然可以减少,至少在某种程度上是这样。事实上,2011 年左右发生的“深度学习”的重大突破与这样的发现有关:从某种意义上说,当涉及很多权重时,执行(至少近似)最小化比涉及相当多的权重时更容易。 。
换句话说(有点违反直觉),神经网络比简单的问题更容易用来解决更复杂的问题。 一般原因似乎是,当一个人有很多“权重变量”时,一个人就有一个具有“许多不同方向”的高维空间,可以取最小值 - 而如果变量较少,这它更容易陷入局部最小值(“山湖”),而没有“退出方向”。
值得指出的是,在典型情况下,有许多不同的权重集,所有这些权重集都赋予神经网络几乎相同的性能。在实际的神经网络训练中,通常有许多随机选择会导致“不同但等效的解决方案”,如下所示:
但每个这样的“不同解决方案”都会有至少略有不同的行为。如果我们要求在我们提供训练示例的区域之外“推断”,我们可能会得到截然不同的结果:
但哪一个是“正确的”呢?实在是无话可说。所有这些都“与观察到的数据一致”。但它们都对应于关于“跳出框框”做什么的不同“固有”方式。对于我们人类来说,有些可能看起来比其他“更合理”。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。