ChatGPT 的工作原理:嵌入
神经网络的概念(至少在当前设置中)基本上基于数字。因此,如果我们要将它们用于文本之类的内容,我们需要一种方法来用数字表示文本。
当然,我们可以通过为字典中的每个单词分配一个数字来开始(基本上像 ChatGPT 一样)。然而,有一个重要的想法(例如,ChatGPT 的核心)超出了这一点。这就是“嵌入”的概念。 我们可以将嵌入视为尝试用数字数组表示事物“本质”的一种方式 - 其特性是“附近的事物”由相邻的数字表示。
因此,例如,我们可以将词嵌入视为尝试将单词排列在一种“含义空间”中,其中以某种方式合并“含义接近”的单词。世界嵌入(例如在 ChatGPT 中)往往涉及大量数字列表。但是,如果我们将其投影到 2D 空间中,我们可以展示嵌入单词如何排列的示例:
而且,是的,我们所看到的在捕捉典型的日常印象方面做得非常好。但是我们如何构建这样的嵌入呢?总体思路是查看大量文本(在本例中为来自互联网的 50 亿个单词),看看不同单词出现的“环境”有多相似。因此,例如,“alligator”和“crocodile”经常在其他类似句子中互换出现,这意味着它们被放置在嵌入中。但“萝卜”和“鹰”没有出现在其他类似句子中,因此它们在嵌入中被放置得很远。
但是如何使用神经网络实际实现这样的事情呢?让我们首先讨论不是针对单词的嵌入,而是针对图像的嵌入。我们希望找到一种通过数字列表来描述图像的方法,以便为“我们认为相似的图像”分配相似的数字列表。
我们如何判断是否应该“认为图像相似”?好吧,例如,如果我们的图像是手写数字,如果它们是相同的数字,我们可以“认为两个图像相似”。早些时候,我们讨论了一个经过训练来识别手写数字的神经网络。我们可以将这个神经网络视为将图像放入最终输出中的 10 个不同的容器中,每个数字一个容器。
但是,如果我们在做出“这是一个‘4’”的最终决定之前“捕捉”到神经网络中发生的情况呢?我们可以想象,在神经网络中,有一些数字将图像描述为“大部分是 4,但有一点 2”或类似的东西。这个想法是挑选出这些数字作为嵌入元素。
所以这是一个概念。我们不是直接尝试描述“哪些图像与哪些其他图像接近”,而是考虑一个明确定义的任务(在本例中为数字识别),我们可以访问明确的训练数据,然后利用以下事实: ,神经网络隐式地做出相当于“邻近决策”的事情。所以我们不需要明确地谈论“图像邻近性”,而只需具体问题哪个数字代表图像,然后“让它交给神经网络”来隐式地决定这意味着什么“图像邻近性”
那么,更详细地讲,数字识别网络是如何工作的呢?我们可以认为该网络由 11 个连续层组成,我们可以用一个图标对其进行总结(激活函数显示为单独的层):
一开始,我们将当前图像输入到第一层,用像素值的二维数组表示。在最后一层,我们得到一个包含 10 个值的数组,可想而知网络有多么“确定”就是图像是任意数字对应从0到9。
输入图像(手写4),最后一层神经元的值为:
也就是说,神经网络现在“非常确定”这个图像是4,为了实际上得到输出“4”,我们只需要选择具有最大值的神经元的位置。
但是如果我们更进一步呢?网络中的最后一个操作是所谓的 softmax,它试图“强制决定论”。但在此之前,神经元的值是:
表示“4”的神经元仍然具有最高值。但其他神经元的值中也有信息。我们可以期望这个数字列表在某种意义上被用来描述图像的“本质”,从而提供我们可以用作嵌入的东西。因此,例如,这里的所有 4 个都有一个稍微不同的“签名”(或“特征嵌入”)——都与 8 个非常不同:
这里我们基本上用 10 位数字来描述我们的图像特征。但通常最好使用比该数字更高的数字。例如,在我们的数字识别网络中,我们可以通过分解前一层来获得 500 个数字的数组。这可能是用作“图像源”的合理数组。
如果我们想要对手写数字的“图像空间”进行显式可视化,我们需要“降维”,有效地将得到的 500 维向量投影到例如三维空间中:
我们的想法是“为图像创建特征(并因此嵌入)实际上是基于识别图像的相似性,确定(基于我们的训练集)它们是否对应于相同的手写数字。”如果我们有一个训练集,可以确定每个图像属于 5000 种常见的对象类型(猫、狗、椅子...),那么我们可以对更一般的图像执行相同的操作。
通过这种方式,我们可以通过我们对常见物体的识别来“锚定”图像构造,然后根据神经网络的行为进行“概括”。 重点是,只要这种行为与我们看待和解释人类图像的方式一致,这最终将成为一种“对我们来说感觉正确”并且在实践中“像人类判断一样”的嵌入,对于执行任务很有用。
好吧,那么我们如何遵循相同的方法来查找单词的嵌入呢?关键是从我们可以随时练习的单词任务开始。默认任务是“单词预测”。假设我们得到了“猫”。基于大量文本(例如互联网上的文本内容),不同单词可以“填补空白”的概率是多少?换句话说,给定“__black_”,不同“侧翼词”的概率是多少?
我们如何为神经网络提出这个问题? 归根结底,我们必须将所有事情都用数字表示。 实现此目的的一种方法是为英语中大约 50,000 个常见单词中的每一个分配一个唯一的编号。因此,例如,“the”可能是 914,“cat”(前面有一个空格)可能是 3542。 (这些是 GPT-2 使用的实际数字。)因此,对于“_ cat”问题,我们的输入可以是 {914, 3542}。输出应该是什么样的?好吧,应该有一个包含 50,000 个左右数字的列表,有效地给出每个可能的“填充”单词的概率。
同样,为了找到嵌入,我们需要在神经网络“得出结论”之前“捕获”神经网络的“内部” - 然后选取出现在那里的数字列表,我们可以将其视为为“一个词的所有特征”。
好吧,那么这些表示是什么样的呢?在过去 10 年中,开发了一系列不同的系统(word2vec、GloVe、BERT、GPT 等),所有这些系统都基于不同的神经网络方法。但最终,所有这些系统都是通过数百到数千个数字的列表来描述单词的特征。
在其原始形式中,这些“嵌入向量”的信息量相当小。例如,以下是 GPT-2 为三个特定单词生成的原始嵌入向量:
如果我们执行诸如测量这些向量之间的距离之类的操作,那么我们可以发现诸如单词的“接近度”之类的东西。稍后我们将更详细地讨论这种嵌入性的“认知”含义。但重点是,现在我们有一种方法可以有效地将单词转化为“神经网络友好”的数字集合。
但实际上我们可以更进一步,不仅仅将单词描述为数字的集合;我们还可以描述单词序列或整个文本块。在 ChatGPT 中,事情就是这样完成的。
它获取到目前为止收到的文本并生成一个嵌入向量来表示它。然后它计算找到接下来可能出现的不同单词的概率。它将答案表示为一个数字列表,基本上给出了 50,000 个左右可能单词的概率。
(严格来说,ChatGPT 处理的不是单词,而是“标记”——实用的语言单位,可以是整个单词,也可以只是“pre”或“ing”或“ized”片段。符号的使用使其更容易让 ChatGPT 能够处理罕见的、复合的和非英语单词,有时,无论好坏,都可以发明新单词。)
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。