type
Post
status
Published
date
Dec 4, 2023
slug
summary
到目前为止,我们一直在讨论“已经知道”如何执行特定任务的神经网络。但神经网络如此有用(大概也在大脑中)的原因在于,它们不仅原则上可以完成各种任务,而且可以逐步“根据示例进行训练”来完成这些任务。
tags
推荐
ChatGPT相关
AI教程
AI知识库
category
ChatGPT
icon
password
Files & media
机器学习和神经网络的训练
到目前为止,我们一直在讨论“已经知道”如何执行特定任务的神经网络。但神经网络如此有用(大概也在大脑中)的原因在于,它们不仅原则上可以完成各种任务,而且可以逐步“根据示例进行训练”来完成这些任务。
当我们创建一个神经网络来区分猫和狗时,我们实际上不必编写一个程序来明确地找到胡须;相反,我们只是展示大量什么是猫、什么是狗的例子,然后让网络从这些例子中“机器学习”如何区分它们。
重点是,经过训练的网络会根据其显示的特定示例进行“概括”。正如我们在上面所看到的,网络不仅仅是识别所显示的示例猫图像的特定像素模式;相反,神经网络以某种方式设法根据我们认为的某种“一般猫性”来区分图像。
那么神经网络训练实际上是如何进行的呢?本质上,我们一直在尝试做的是找到使神经网络成功重现我们给出的示例的权重。然后我们依靠神经网络以“合理”的方式在这些示例之间“插值”(或“概括”)。
让我们看一个比上面的最近点问题更简单的问题。让我们尝试让神经网络来学习该函数:

对于此任务,我们需要一个只有一个输入和一个输出的网络,例如:

但是我们应该使用什么重量等?对于每组可能的权重,神经网络都会计算一些函数。例如,以下是它对几组随机选择的权重所做的操作:

是的,我们可以清楚地看到,在这些情况下,它都无法接近再现我们想要的功能。那么我们如何找到能够重现该函数的权重呢?
基本思想是提供大量“输入→输出”示例来“学习”,然后尝试找到能够重现这些示例的权重。以下是通过越来越多的示例执行此操作的结果:

在这个“训练”的每个阶段,网络中的权重都会逐渐调整——我们看到最终我们得到了一个能够成功再现我们想要的功能的网络。那么我们该如何调整权重呢?基本思想是在每个阶段查看距离获得我们想要的函数“距离我们有多远”,然后以更接近的方式更新权重。
为了找出“我们离我们有多远”,我们计算通常所谓的“损失函数”(有时也称为“成本函数”)。在这里,我们使用一个简单的 (L2) 损失函数,它只是我们得到的值与真实值之间的差值的平方和。我们看到的是,随着训练过程的进行,损失函数逐渐减小(遵循针对不同任务不同的特定“学习曲线”),直到我们达到网络(至少达到良好近似)成功再现的点我们想要的功能:

好吧,最后一个要解释的重要部分是如何调整权重以减少损失函数。正如我们所说,损失函数为我们提供了我们得到的值与真实值之间的“距离”。但“我们得到的值”在每个阶段都是由当前版本的神经网络及其权重决定的。但现在想象权重是变量——比如w i。我们想要找出如何调整这些变量的值以最小化取决于它们的损失。
例如,想象一下(在实践中使用的典型神经网络的令人难以置信的简化中)我们只有两个权重w 1 和w 2。那么我们的损失可能是w 1和w 2的函数,如下所示:

数值分析提供了多种技术来找到此类情况下的最小值。但典型的方法是逐步遵循从我们之前的w 1 , w 2开始的最陡下降路径:

就像水从山上流下来一样,唯一可以保证的是这个过程最终会到达地表的某个局部最小值(“山湖”);它很可能达不到最终的全球最低值。
在“重量景观”上找到最陡下降路径的可行性并不明显。但微积分可以解决这个问题。正如我们上面提到的,人们总是可以将神经网络视为计算数学函数——这取决于它的输入和权重。但现在考虑对这些权重进行微分。事实证明,微积分的链式法则实际上可以让我们“解开”神经网络中连续层所完成的操作。结果是,我们可以(至少在某些局部近似中)“反转”神经网络的操作,并逐步找到最小化与输出相关的损失的权重。
上图显示了在只有 2 个权重的不切实际的简单情况下我们可能需要做的最小化。但事实证明,即使使用更多的权重(ChatGPT 使用 1750 亿),仍然可以进行最小化,至少达到某种程度的近似。事实上,2011 年左右发生的“深度学习”的重大突破与这样的发现有关:在某种意义上,涉及大量权重时比权重相当少时更容易(至少近似)最小化。
换句话说——有点违反直觉——用神经网络解决更复杂的问题比用更简单的问题更容易。其粗略原因似乎是,当一个人有很多“权重变量”时,就会有一个具有“许多不同方向”的高维空间,可以导致一个人达到最小值,而变量越少,就越容易结束陷入局部极小值(“山湖”),没有“出路”。
值得指出的是,在典型情况下,有许多不同的权重集合,它们都将为神经网络提供几乎相同的性能。通常在实际的神经网络训练中,会做出很多随机选择,从而产生“不同但等效的解决方案”,如下所示:

但每个这样的“不同解决方案”都会有至少略有不同的行为。如果我们要求在我们提供训练示例的区域之外进行“外推”,我们可能会得到截然不同的结果:

但其中哪一个是“正确的”呢?实在是没办法说。它们都“与观察到的数据一致”。但它们都对应于不同的“固有”方式来“思考”“跳出框框”做什么。对于我们人类来说,有些可能比其他的“更合理”。
神经网络训练的实践和知识
特别是在过去的十年里,神经网络的训练技术取得了许多进步。是的,它基本上是一门艺术。有时——尤其是在回顾时——人们至少可以看到正在做的事情的一丝“科学解释”。但大多数事情都是通过反复试验发现的,添加了一些想法和技巧,这些想法和技巧逐渐建立了关于如何使用神经网络的重要知识。
有几个关键部分。首先,存在一个问题,即对于特定任务应该使用哪种神经网络架构。接下来的关键问题是如何获取用于训练神经网络的数据。而且越来越多的人不再从头开始训练网络:相反,一个新的网络可以直接合并另一个已经训练过的网络,或者至少可以使用该网络为自己生成更多的训练示例。
人们可能会认为,对于每一种特定类型的任务,都需要不同的神经网络架构。但我们发现,即使对于明显不同的任务,相同的架构通常也能工作。在某种程度上,这让人想起了通用计算的想法(以及我的计算等效原理),但是,正如我稍后将讨论的,我认为这更多地反映了这样一个事实:我们通常试图获得神经网络的任务神经网络要做的事情是“类人”的,而神经网络可以捕获相当普遍的“类人过程”。
在神经网络的早期,人们倾向于“让神经网络尽可能少地做事”。例如,在将语音转换为文本时,人们认为应该首先分析语音的音频,将其分解为音素等。但我们发现,至少对于“类人任务”来说,通常最好只是尝试在“端到端问题”上训练神经网络,让它自己“发现”必要的中间特征、编码等。
还有一种想法是,应该将复杂的单个组件引入神经网络,使其实际上“明确地实现特定的算法思想”。但再一次,事实证明这基本上是不值得的。相反,最好只处理非常简单的组件并让它们“自我组织”(尽管通常以我们无法理解的方式)以实现(大概)这些算法思想的等价物。
这并不
是说不存在与神经网络相关的“结构思想”。因此,例如,具有局部连接的二维神经元阵列似乎至少在处理图像的早期阶段非常有用。在处理诸如 ChatGPT 等人类语言之类的事物时,专注于“按顺序回顾”的连接模式似乎很有用(我们稍后会看到)。
但神经网络的一个重要特征是,就像一般的计算机一样,它们最终只是处理数据。当前的神经网络(采用当前的神经网络训练方法)专门处理数字数组。但在处理过程中,这些阵列可以完全重新排列和重塑。举个例子,我们上面用于识别数字的网络从一个 2D“类似图像”的数组开始,快速“增厚”到许多通道,然后“集中”到一个 1D 数组中,该数组最终将包含代表不同通道的元素。可能的输出数字:

但是,好吧,我们如何知道完成一项特定任务需要多大的神经网络呢?这是一门艺术。在某种程度上,关键是要知道“任务有多艰巨”。但对于类似人类的任务,这通常很难估计。是的,可能有一种系统的方法可以通过计算机非常“机械”地完成任务。但很难知道是否存在人们认为的技巧或捷径,可以让人们至少在“类人水平”上更轻松地完成任务。可能需要枚举一个巨大的游戏树才能“机械地”玩某个游戏;但可能有一种更简单(“启发式”)的方法来实现“人类水平的游戏”。
当一个人处理微小的神经网络和简单的任务时,有时会明确地看到“无法从这里到达那里”。例如,以下是使用一些小型神经网络似乎能够完成上一节任务的最佳方案:

我们看到的是,如果网络太小,它就无法重现我们想要的功能。但在一定规模以上,它没有问题——至少如果人们训练它足够长的时间并有足够的例子的话。顺便说一句,这些图片说明了一个神经网络知识:如果中间存在“挤压”,迫使所有东西都经过较小的中间数量的神经元,那么人们通常可以使用较小的网络。(还值得一提的是,“无中间层”——或者所谓的“感知器”——网络只能学习本质上的线性函数——但只要有一个中间层,原则上就总是可以任意好地逼近任何函数,至少如果有足够的神经元,尽管为了使其可训练,通常会进行某种正则化或归一化。)
好吧,假设一个人已经确定了某种神经网络架构。现在的问题是获取数据来训练网络。围绕神经网络和一般机器学习的许多实际挑战都集中在获取或准备必要的训练数据。在许多情况下(“监督学习”),人们希望获得输入和期望的输出的明确示例。因此,例如,人们可能希望根据图像中的内容或某些其他属性来标记图像。也许人们必须明确地进行检查(通常需要付出很大的努力)并进行标记。但事实证明,很多时候我们可以利用已经完成的事情,或者将其用作某种代理。例如,人们可能会使用为网络上的图像提供的 alt 标签。或者,在不同的域中,人们可能会使用为视频创建的隐藏式字幕。或者,对于语言翻译培训,人们可以使用不同语言中存在的网页或其他文档的并行版本。
您需要多少数据来显示神经网络来训练它执行特定任务?同样,很难根据第一原理进行估计。当然,通过使用“迁移学习”来“迁移”一些东西,例如已经在另一个网络中学到的重要特征列表,可以大大降低要求。但一般来说,神经网络需要“看到很多例子”才能很好地训练。至少对于某些任务来说,神经网络知识的一个重要部分是,这些例子可能会令人难以置信地重复。事实上,一遍又一遍地向神经网络展示所有的例子是一种标准策略。在每一轮“训练轮”(或“时期”)中,神经网络至少会处于稍微不同的状态,并且以某种方式“提醒它”特定示例对于让它“记住该示例”很有用。(是的,也许这类似于人类记忆中重复的用处。)
但通常只是一遍又一遍地重复同一个例子是不够的。还需要展示该示例的神经网络变化。神经网络知识的一个特点是,这些“数据增强”变体不必非常复杂就能发挥作用。只需使用基本图像处理稍微修改图像就可以使它们对于神经网络训练来说基本上“像新的一样”。同样,当人们用完用于训练自动驾驶汽车的实际视频等时,人们可以继续在类似视频游戏的模型环境中运行模拟来获取数据,而无需了解实际现实世界场景的所有细节。
像 ChatGPT 这样的东西怎么样?嗯,它有一个很好的功能,就是可以进行“无监督学习”,从而更容易获得训练示例。回想一下,ChatGPT 的基本任务是弄清楚如何继续给出的一段文本。因此,要获得“训练示例”,人们所要做的就是获取一段文本,并掩盖其结尾,然后将其用作“训练的输入”,“输出”是完整的,未屏蔽的文本片段。我们稍后将对此进行更多讨论,但要点是,与学习图像中的内容不同,不需要“显式标记”;ChatGPT 实际上可以直接从给定的任何文本示例中学习。
好的,那么神经网络中的实际学习过程又如何呢?最后,一切都是为了确定什么权重最能捕获所给出的训练示例。还有各种详细的选择和“超参数设置”(之所以这样称呼,是因为权重可以被认为是“参数”),可以用来调整如何完成此操作。损失函数有不同的选择(平方和、绝对值和等)。有不同的方法可以实现损失最小化(每一步在权重空间中移动多远等)。然后还有一些问题,例如需要展示多大“一批”示例才能获得对试图最小化的损失的每个连续估计。是的,人们可以应用机器学习(例如我们在 Wolfram 语言中所做的那样)来自动化机器学习,并自动设置超参数等内容。
但最终,整个训练过程可以通过观察损失如何逐渐减少来表征(如在这个Wolfram 语言的小型训练进度监视器中):

人们通常会看到损失会暂时减少,但最终会趋于某个恒定值。如果该值足够小,则可以认为训练成功;否则,这可能是一个应该尝试改变网络架构的信号。
有人能说出“学习曲线”需要多长时间才能趋于平缓吗?与许多其他事物一样,似乎存在近似幂律缩放关系,该关系取决于神经网络的大小和所使用的数据量。但总体结论是训练神经网络很困难,并且需要大量的计算工作。实际上,绝大多数工作都花在了对数字数组进行运算,而这正是 GPU 所擅长的,这就是为什么神经网络训练通常受到 GPU 可用性的限制。
未来,是否会有更好的方法来训练神经网络——或者通常做神经网络所做的事情?我想几乎可以肯定。神经网络的基本思想是用大量简单(本质上相同)的组件创建一种灵活的“计算结构”,并使这种“结构”可以逐步修改以从示例中学习。在当前的神经网络中,人们本质上是使用微积分的思想(应用于实数)来进行增量修改。但越来越明显的是,拥有高精度数字并不重要;重要的是。即使使用当前的方法,8 位或更少也可能足够了。
对于像元胞自动机这样的计算系统,基本上在许多单独的位上并行运行,我们从来不清楚如何进行这种增量修改,但没有理由认为这是不可能的。事实上,就像“ 2012 年深度学习突破”一样,这种增量修改在更复杂的情况下可能比在简单的情况下更容易。
神经网络——可能有点像大脑——被设置为具有本质上固定的神经元网络,改变的是神经元之间连接的强度(“权重”)。(也许至少在年轻的大脑中,大量全新的连接也可以生长。)但是,虽然这对于生物学来说可能是一种方便的设置,但目前还不清楚它是否接近实现我们所需功能的最佳方式。涉及渐进式网络重写的东西(也许让人想起我们的物理项目)最终可能会更好。
但即使在现有神经网络的框架内,目前也存在一个关键的限制:现在进行的神经网络训练基本上是顺序的,每批示例的效果都会被传播回去以更新权重。事实上,对于当前的计算机硬件(即使考虑到 GPU),大多数神经网络在训练期间的大部分时间都是“空闲”的,一次只更新一个部分。从某种意义上说,这是因为我们当前的计算机往往拥有与其 CPU(或 GPU)分开的内存。但在大脑中,情况可能有所不同——每个“记忆元素”(即神经元)也是一个潜在的活跃计算元素。如果我们能够以这种方式设置未来的计算机硬件,那么就可以更有效地进行培训。
- 作者:AIBLOG
- 链接:https://blog.1370.cn//article/0f7000dc-4ace-426f-8a85-2711c2acdfe3
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。










