从零到有 | 理解人工智能的简单方法
人工智能的世界充满了看似神奇的过程,却从未解释清楚,重要的步骤只是简单的黑匣子。今天,我们将打开这些盒子,看看人类概念如何从你可以用口袋计算器和铅笔完成的工作中产生,比如学习和意义。我将准确地描述人工智能工具是如何构建以及它们如何产生结果的,而不需要涉及复杂的数学或无法解释的术语。让我们开始吧!
这篇文章是我人工智能图书馆的一部分。这些文章按复杂程度排序列出。它们并不是前提条件,而是这些主题的另一种进入点。
- 幕后花絮|了解ChatGPT的魔力-无需数学或编程
- 昨晚一款AI拯救了我的生命 | 用ChatGPT进行调试- 编程
- 从零到英雄 | 手工定制GPT-编程
- 从无到有 | 理解人工智能-数学和编程的无痛方法
关于词语
在人工智能的世界里,正如在许多学术努力中一样,我们不断为已经存在并且可以用其他方式解释的概念找到无穷无尽的新词。不幸的是,您需要这些新词才能理解其他人在这个主题上写的任何东西。
我会试图温和地介绍这些术语。当它们首次出现时,我会将它们加粗,这样你就知道它们是关于人工智能的其他文章中出现的确切术语。我还会标记每个新术语所介绍的每个部分。
行业工具
在本篇文章中虽然没有作业,但如果你对编程感兴趣,你会发现足够的内容来开始探索建立自己人工智能应用的方法和工具。
如果你不是程序员,你可以理解甚至重建我要展示的一切,只需使用口袋计算器、铅笔和纸,你可以考虑在小范围内这样做,以巩固你的理解 — 尤其是如果数学对你来说像对我一样具有挑战性的话!
我不是AI方面的专家。我的专长在我们更熟悉的另一种软件领域。在为这篇文章做研究时,我花了几天的时间用ChatGPT的帮助写作并完善我的笔记。它没有写下你在这里看到的任何文字,但在我提出的150个要点中修复了一些误解,非常有帮助。
如果这是您第一次深入了解这个话题,请尝试通过向ChatGPT陈述来检验您的收获,然后询问您的理解是否正确。好问题应该以“是不是真的…”开头,并以一个单一结论,就像律师所说的那样。通过这种方式,LLM本身可以帮助提升您的调查水平。
今天的特色菜单
LLM
重要的第一个词是我们正在构建的东西 - 一个LLM或大型语言模型。就像模型火车一样,它并不同于真实的事物。LLM不包含任何语言或任何知识,但它能很好地对这些事物进行建模。
在名称中,“大”一词指的是需要建模以使其有用的文本量。LLM无法建模任何未在其所见文本中的知识。它不能产生任何新知识。
“语言”一词是因为模型试图代表语言作为一个整体,而不是像我们从传统数据库中获得的特定数据。如果我们只是尝试返回我们存储的确切单词,那么已经有更简单的数据库可以做到这一点。事实上,LLM不会返回给定的确切文本,并且不是可靠的数据库。
与常规数据(如银行余额)完全相反,甚至信息存储的方式也是不可预测的。没有人能告诉您某个特定LLM是如何对任何文本“相信”起来的。想象一下,如果您的银行无法告诉您您的余额是如何形成的。
相反,LLMs 模拟人类语言,以便可以使用语言语句驱动传统软件中的其他过程。我们可以将其视为一种新型的编程,即提示驱动的编程。
在最常见的例子中,LLM被用来生成新的文本(回答问题),就像ChatGPT一样。这些答案不是提前以任何方式存储的。它们是通过传统的计算机代码生成的,该代码根据模型预测出正确的下一个单词。
在银行应用程序中,我们可能希望使用自然语言来检索我们的余额,但数据检索部分仍然使用传统软件进行。为了完成循环,我们可以要求LLM使用传统代码中的数据生成纯英语的新文本,例如编写一个包含我们余额的礼貌句子。
一个不可靠的证人
训练变压器GPT生成预训练出现关注
在人工智能的讨论中,支持者和批评者都发表了大胆的言论。人工智能的支持者指出,像OpenAI的o1模型这样的工具产出令人难以置信,证明至少某种程度上人类智慧被体现出来了。与此同时,人工智能的批评者指出,在一个从他人写作中挣扎出文字的系统中不可能有任何智能。这两个群体都是正确的。
这是如何可能的?解释在于将字词的随机信息通过一系列简单的数学运算转化成代表高级人类概念的数字,比如语法、上下文和整个文本的含义。
我们都听过无线电的静电声,这是一种随机信息形式。对我们来说,它听起来像噪音,因为它包含的是非组织的音调(声音频率),而不是我们的大脑听到的音乐中的有序音调。现在想象一下,一个机器人可以随着时间的推移过滤无线电静电声中的随机性,并精炼信息,使我们只保留听起来像音乐的东西。
用于过滤和提炼文本的操作被称为transformer。每次提炼被称为一个训练步骤。通常我们希望使用这些LLMs来生成新文本,而专门用于这项工作的LLM被称为GPT或生成预训练transformer。名字中的“预训练”指的是所需的大量训练步骤(以及计算时间和成本)来生成一个有用的模型。
重要的是要注意,我们赋予文本的背景和含义仅来自这个过程。在人工智能术语中,我们说上下文是新兴的。它不是由人直接分配的。换句话说,没有人告诉模型狗是一种动物,是一种宠物,有一些方面类似于猫,但在其他方面不同等。通过这种方式,变压器方法与自60年代以来计算机科学家所遵循的人工智能方法完全相悖。
一篇2017年由两名谷歌研究人员撰写的关键论文《注意力就是一切》展示了我们将要研究的变压器过程,特别是被称为注意力的概念,确实是从简单的数学中产生大量人类背景和意义所需的全部内容。
开始使用AI国际象棋选手,我们发现这种注意机制不仅可以像人类编码的信息一样工作- 在有限的领域内,它实际上可以工作得更好。 这一事实,称为2019年同名论文中的“苦涩教训”,意味着我们将通过不尝试向信息中添加任何人类智能来获得更好的“人工智能”。 相反,我们应该将更多的计算能力应用于简单的关系计算和预测。 那么让我们看看这些计算是什么样子的...
令人困扰的向量
矢量数组的维度
我永远不会忘记在西班牙马拉加上高中数学课的第一天,老师开头说道:“今天我们将学习向量,你应该还记得去年学过的。” 刚刚结束美国高中十年级的我从未听说过这个课题!
原来,我们自学下象棋时就已经了解过矢量。矢量不过是空间中两个物体之间的方向和距离,就像在棋盘上的两个棋子一样。
如果我们用数字为每一行和列贴标签,然后为每个棋子写下那些数字,我们就有了一个列表(或数组),它代表着该棋子在二维棋盘上的位置。
因为棋盘有两个维度,所以每个棋子的数组也需要两个维度来存储其位置的两个部分。在数学中(以及许多编程语言中),这些用方括号表示,每个项目之间用逗号分隔。
检查器数组
黑色顶部黑色: [1,1]中间黑色: [2,2]
红底角:[3,1] 顶部红:[1,3]
国王我!
有了这些信息,我们就可以计算出棋盘上任意两个棋子之间的距离,并用向量来描述它。
为了消除任何混淆,向量和任何其他数组之间没有区别。我们使用这个术语来暗示我们将使用标准数学运算来将数组的值视为多维空间中的位置,而不是其他可能包含账户ID或其他数据列表的数组。
为了将皇位加冕,我们需要知道每个棋子必须移动的距离以及移动的方向,以便最终与其颜色相同的棋子在同一位置。如果我们逐字逐句地记录这些移动,最终可能会得到如下描述:
检查器向量
中间黑色 ➔ 顶部黑色黑色: [-1,-1]
顶部红色 ➔ 底部红色红: [2,2]
在跳棋中,“你离赢有多远”包含着宝贵的信息——即即将获胜的人。通过找到每个棋子和它的对手之间的距离,我们可以弄清楚最有可能喊出“我成为国王!”的人是谁。
在这个例子中,就像在现实跪式棋盘上一样,国王的位置位于棋盘的对立面。中间的黑色棋子需要向上移动一个空间,然后向后移动一个空间才能到达那里——而红色的棋子则需要向下移动两个空间,然后向左或向右移动两个空间。
原来,在计算距离时方向并不重要,就像两座城市之间的距离是相同的,无论你从哪一座城市开始。一个简单而巧妙的数学方法,叫做点积(表示为“·”),解决了这个问题。
点乘是通过将一个向量中的每个值与另一个向量中相应的值相乘,然后将所有这些值相加而创建的。
当我们这样做时,我们发现黑色更接近获胜。
距离检查器(点乘)
黑[1,1] · [2,2] ➔ 1*2 + 1*22 + 2 = 4
红[1,3] · [3,1] ➔ 1*3 + 3*13 + 3 = 6
黑色的两个向量之间的距离是4,而红色的则相隔6个单位。在这里使用跳棋作为视觉示例时,请记住我们并不试图找到跳棋之间的移动次数或实际棋盘方块的数量。
我们在这里追求的是向量本身,它是显示两点之间移动的一条线。每条线都有方向和长度,我们可以比较它们来找出在二维空间中相似的向量。
至宇宙,超越之外!
量词、标记、上下文、语料库
不理会跳棋规则,我们可以计算棋盘上任意两个棋子之间的向量。我们也可以比较它们的长度,即向量的大小。
使用向量来存储比棋盘位置更复杂的东西,我们需要更多的维度。 从二维棋盘到我们在视频游戏中看到的三维世界并不是一件困难的心理飞跃。 但是超过三个维度,我们的大脑很难创建出一个视觉图像。
好消息是,我们不需要视觉图片,因为这些不是代表空间中任何东西的物理矢量。它们只是值的容器,我们将逐个操作这些值,使用非常"现实"的数学。
在LLM中,棋盘上的检查器代表什么?一个词或令牌是一个好的起点。我们想要计算文本中两个令牌之间的关系。额外的维度将包含LLM已经检查过的整个文本集体内的该单词的上下文,被称为语料库。
我们需要多少个维度?300是一个简单模型的良好起点。理论上,更多的维度意味着我们可以捕获更多种类的上下文。但在实践中,每个维度都会带来真正的成本,需要计算和存储。花费很多钱。
究竟存储了什么上下文信息,每个维度代表什么?我们不知道。建立上下文是LLM的新兴行为的一部分。
原来,人类的书写(以及音乐和绘画)充满了模式。当这些模式在我们的头脑中再次出现时,会触发所有我们自己学习经验所暗示的整个背景。
与音乐一样,文本中的周围信息提供了上下文。在短语“早睡早起”中,起床一词的意思与“让面团发酵在烘烤之前”中的意思不同。经过足够多的文本检查,人们可以找到一个单词的不同上下文,而不需要了解烘烤或烘烤。正是这种信息,我们将为每个标记提取和存储。
是什么使音乐成为音乐,而不是电台的杂音是使用连贯的音调和模式以及它们之间的关系。 我们的大脑之所以将这些视为音乐,是因为其中蕴含的模式,而不是个别音响。《生日快乐》无论用什么调式演奏,都是同一首歌,你无法仅仅通过改变歌词将葬礼进行曲变成那首歌。音乐本身具有上下文信息。
同样道理适用于词语。我们将看到LLM如何找到这些模式并记录在多维向量空间中,即使它本身没有概念。当模型选择的词语被人类阅读时,赋予意义的工作发生在我们的大脑中。即使没有LLM,相同的词语也可能有不同的含义,而不同的词语也可用于传达相同的含义。
为了跟进狗与猫的例子,一个 LLM 怎样能发现狗和猫在某些方面相同而在另一些方面不同? 许多关于狗的文本会涉及与关于猫的文本相同的概念,比如待在室内和外出、喂养和兽医访问。 其他概念可能只属于其中一种物种,比如在散步时拉臭尿或者被抓眼睛。 一个 LLM 永远不可能知道或找到这些差异,但可以在被问及时预测正确答案。
吃豆人的代币
上下文向量字节对标记化输入序列词汇令牌ID
现在我们知道什么是向量以及我们打算用它们做什么,让我们为转换器准备一些简单的输入文本。我们将为文本中的每个标记生成一个上下文向量。它将包含我们从训练中学到的有价值的信息,我们稍后将用它来得到答案。
这是我们的初始文本,只有两个句子:
每天一个苹果,远离医生。医生正在度假。
旧的人工智能方法可能会尝试列出医生、假期和苹果之间的各种联系,但在这里我们只需要两句话中所有标记的列表。虽然我在这里随意地使用“标记”一词来表示文本中的一个单词,但实际上这些通常是字节对,一种表示单词甚至更小部分和标点符号组合的方式。从语料库中提取标记的过程称为标记化。
以下是我们单词标记的数组,忽略大小写和标点符号。现在,我们将称之为输入序列,稍后稍微更新该定义。
["an", "apple", "a", "day", "keeps", "the", "doctor", "away", "the", "doctor", "is", "away", "on", "vacation"]
如果我们移除所有重复项并按字母顺序排序,我们会得到:
["a", "an", "apple", "away", "day", "doctor", "is", "keeps", "on", "the", "vacation"]
这是词汇表。词汇表并不总是按字母顺序排序的。通常一个LLM会按照语料库中词汇的频率对标记进行排序。但是它必须根据某些东西排序,因为我们需要在列表中跟踪它的位置,称为标记ID。如果我们在整个过程中保留这个词汇表数组,我们随时可以将这些ID数字转回成英文单词。
我的床,你的床,嵌入
嵌入维度矩阵随机值种子注意机制
一旦词汇表建立好了,我们就可以为其中的每个令牌创建多维向量。这些向量被称为嵌入,因为它们会将语料库中的上下文信息嵌入到词汇表中的每个单词中,这是一个相当了不起的成就!
每个令牌的维度数量称为嵌入维度。 要处理我们每个拥有300维度的11个令牌的词汇表,我们将需要一个尺寸为11x300的矩阵。 这是很多存储盒子,而我们只写了两句话。
您可以看到,当处理大量文本时,这些“简单”类型的数值(以及我们将对它们进行的数学运算)很快就会失控。然而,如今,三百个维度对于今天的孩子们来说已经是小菜一碟了,而您将使用的所有模型都有远远超过这个数量的维度。
无论我们选择什么嵌入维度,都需要在过程中扩展到四倍的数量,然后稍后再收缩回来。很明显,训练具有显着文本和上下文分辨率的LLM是一项昂贵的任务,通常由拥有庞大云计算农场的数十亿美元的公司完成。
但是在这些维度里面是什么?令人惊讶的是,我们从随机值开始。是的,你没看错。全知全能的LLM实际上是从随机性开始的,因此本文的标题。
这些最初的随机值是从一个种子生成的,这个种子是启动随机数生成的起点,它可以被保存和重复使用来再次生成相同的“随机”数字。
这些数值不会长时间随机。通过重要的注意机制,我们将收集关于每个令牌如何与输入序列中的其他令牌相关的信息。然后,我们将调整数值以嵌入这些上下文关系。
全面发力,数学类
矩阵乘法,矩阵向量乘法,线性变换,非线性激活函数,焦点
变压器之所以被称为变压器,是因为发明者喜欢这个名字,并且这是一个很好的原因。虽然听起来很大很强大(实际上也确实如此),但在内部,变压器只是在两个矩阵之间进行简单的数学运算,比如矩阵乘法,或者在一个矩阵和一个向量之间进行运算,如矩阵向量乘法。
如果您对这些数学术语感兴趣,请查找它们或向ChatGPT要一个演示。它们只不过是乘法和加法。这些变压器的酷之处在于它们可以扩展我们的向量,为我们提供更多的收集上下文的位置。它们还可以将向量之间的关系折叠成仍然包含原始信息的简单表示。这是一个了不起的魔术,您应该调查一下,即使只是为了给自己留下深刻印象。
数学讨厌者,不要害怕。在每种情况下,我都会给出我们做数学的原因和我们期望得到的结果,因为这些是最重要的事情。
变压器有两种类型。线性转换是一种输出与输入成正比的转换。如果一个线性转换将一个数字乘以2,输出将始终与输入成正比 - 是输入的两倍。到目前为止我提到的转换都属于这种线性类型。
我们的训练过程将把令牌向量提交给一系列较大的转换过程,每个转换都会对值进行微小调整。这是计算一系列迭代中复杂事物的一个很棒的方法,但正如我们从杂货店收银员那里所知道的,分别扫描三种不同的1美元商品,三次扫描相同的1美元商品,或者在注册时按3次QTY再扫描其中之一,最终都将得到相同的总数。所有这些算术操作都会“合并”为一个最终结果,当给定相同的数字输入时,结果都是相同的。
为了捕捉更详细的信息,我们添加一个非线性激活函数。非线性函数返回的结果不与输入成比例。一种流行的函数只是将线性转换的所有负结果重置为零。结果是非比例的,因为-2和-4都会返回零。它被称为激活函数,因为它在两个令牌之间“激活”注意力,我们稍后会看到。
回到棋盘的例子,我们可以说,如果在一个维度上两个棋子之间的向量指向相同的方向,那么如果那个维度上的值都是正数或者都是负数的话。如果一个值是负数,一个是正数,它们根本不指向相同的方向。
由于两个负数相乘的结果是正数,两个指向负方向的向量指向相同方向。因为两个负数相乘的结果与这两个正数相乘的结果相同,所以无论方向如何,我们都得到相同距离的度量。
如果我们放弃负面结果(一个向量中的负值与另一个向量中的正值),我们实际上忘记了多维空间中指向彼此的向量之间的关系。这将导致该模型仅关注变压器产生积极结果的值,从而使其能够捕捉嵌入中的向量相似性。
请记住,在所有关于向量和空间的讨论中,这些只是一种视觉思考(以及数学方法)单词如何相互关联概念的方式。事实证明,使用向量和矩阵来存储和操作关于文本的上下文信息是很方便的,但与棋盘上的“空间关系”不同。相反,嵌入正在捕捉上下文信息,如单词含义、语法甚至风格。
侯丁尼先生,我想
下一个标记预测自动完成微调
哈利·胡迪尼以魔术闻名,但在1920年代,他转而开始揭穿精神骗子。他特别喜欢伪装出现在附带警探和记者的附灵会上,只是为了揭露通灵者的欺诈和他们制造的“预言”事件。这与我们如何从LLM中获得有用信息并不相似。
我将在讨论LLM培训的过程中暂停一下,解释为什么它能起作用。这并不明显,就像在侯迪尼时代甚至连科学家都没有意识到的 — 直到他揭开桌子上的掩饰。相信魔术很好,但更好的是了解秘密。
许多GPT的最佳特性是下一个标记预测的应用。这是如何工作的是我们将密切关注的事情。但为什么它有效同样重要。
当我们向ChatGPT提出问题时,它看起来像是在一些文本中“找到”答案然后写出来—可能会重新表达或从不同的文本中拼凑在一起。实际上,这完全不是它的工作方式。
实际上发生的是,GPT只是在预测下一个最有可能的单词,然后将其写出来。接下来是什么,你会问?在语料库的上下文中是你的提示之后。
这并不等同于在语料库中查找您的提示并在那里找到答案,然后将其死记硬背。您的提示是原创的,回应也是如此。它们以前从未见过面。每个回应的单词都是通过下一个标记预测逐个生成的,您可以将此延迟视为 GPT “打字”生成其回应。
这不重要,如果你的提示是一个问题或陈述。如果你写一个问题,下一个最可能的词将是答案的第一个词。得到输出后,下一个最可能的词将是答案的第二个词,以此类推。
但对于LLM来说,把这些称为“答案”并没有什么意义。陈述同样有效。如果你说今天过得不好而没有问问题,下一个最有可能出现的词(根据学习的上下文)会是“我”,然后是“抱歉”。
对于代码和自动补全来说,它的工作方式是相同的。根据一些程序行的开头,LLM可以预测下一个最有可能的标记,无论是语句、表达式、函数还是变量。
如果让你用海盗的声音写莎士比亚,没有必要查找莎士比亚或海盗的声音,事实上并没有这样的数据存在。相反,模型会逐个token预测这样一首诗可能会包含什么。
在输入和LLM的输出中,每个令牌都必须经过令牌化和训练步骤 - 这项工作也是每次一个令牌进行的。 LLM是经过预先训练的一个成本,但与您进行的每个令牌事务都会产生另一种计算成本,包括物理内存和处理器时间。这解释了为什么费用是基于计数和限制令牌的,以及为什么更复杂的模型每个令牌的成本更高。
正如在预先训练LLM时使用种子提供随机性一样,当在您的输入上进行训练时,使用另一个种子,称为微调。这就是使用相同提示运行LLM会产生大多数(或全部)有效响应不同结果的原因。通过重复使用相同种子调用LLM,可以在需要时保持一组更可预测的输出。
在实践中,这些随机的起点可以导致新的和令人惊讶的词语预测,使它们更具人性。一个特定的回应可能包含其他回应中缺少的有趣或有用的信息。这是新兴行为的另一个例子。
向前,哈奇!
前向传播层反向传播
前向传播是应用于词汇表中特定标记的嵌入的转换。它是向前的,因为随着向量的输入,它们的值会随着函数发生变化,然后前进到下一层。前向传播不会改变之前的任何内容。
它还是“向前”的,因为它将成为一个前瞻性预测的一部分,用于找到下一个最可能的令牌。
霍迪尼时代的心灵学家(甚至是今天)可能会随口猜测:“我听到一个以‘M’开头的名字。玛丽?玛莎?”,确保使用符合听众和他们年龄(背景)的名字。当表演者听到“我母亲的名字是莫林”时,他会打圆场说:“啊,是莫林在与我们交流。她现在在这里。”
在类似的过程中,在训练期间,LLM 最初(并重复地)废弃错误的预测。但是,LLM 不是通过改变其上一个答案来退一步,而是通过调整嵌入来改善下一次尝试的机会,这个过程称为反向传播。
我会为你等待
权重 权重 权重矩阵
在工作于令牌嵌入的变换器需要一些东西来配合工作,这个东西叫做权重。权重告诉每个令牌嵌入中的数值需要调整多少,而嵌入本身保留了调整的结果。
在我们的超市里可以看到关于重量的暗示。 如果称重出1磅糖果,促销活动说您可以获得50%免费,那么您原来的袋子将增加150%的重量。 这是您最初糖果重量的100%加上免费的50%,或者1 x 1.5。 调整后秤上的总重量将是1.5磅糖果。 好耶!
回想一下,词汇表中的每个标记都被分配了一个嵌入维度的向量,如300。无论我们要加权什么,都需要一个至少为300x300的权重矩阵,以便对一个标记的每个维度进行加权,针对另一个标记的每个维度。
如果看起来像是为了比较每个维度与其他维度而添加权重会给我们更多捕捉上下文的位置,那么你就对了。事实上,为了不同步骤的过程创建了几套这样的权重矩阵。首先,我们需要为每个词汇标记创建一个权重矩阵。
线开始于这里
数组索引输入序列
一旦词汇设置了每个令牌的初始嵌入和权重,我们就可以开始查看上下文中的训练文本。换句话说,要审查我们收到的语料库,而不仅仅是作为一组独特词汇单词。
这里是我们的两个训练句子。
“每天一个苹果,医生远离你。”“医生度假中。”
使用我之前提到的令牌ID(在排序后的词汇表中每个令牌的位置),我可以将语料库重新写成令牌编号的列表。
[1,2,0,4,7,9,5,3,9,5,6,3,8,10]
你可能会注意到两件事。首先,“医生”一词的两个出现次数都被指定为词汇表中的同一个数字,即5。同样,“离开”这两个出现也都被记录为数字3。这确保了词汇表中的同一个词汇在语料库中的不同上下文中每次出现时都会被调整。
其次,“a”这个词(列表中排第三)被分配给位置0。许多编程语言(但不是所有)使用0作为数组索引的起始位置。
这个精简列表将被用来处理输入文本,实际上这是真正的输入序列,而不是我之前展示的英文序列。
注意听课
机器学习注意力自注意力
与人类学习一样,机器学习也涉及注意力。特别是,我们希望机器关注那些强相关的标记,即它们的向量在许多维度上是相似的。
注意力机制是用于确定这些关系的方法。术语中的“self”指的是我们使用文本本身而不是其他任何内容来衡量令牌向量的注意力或相似性。
得了多少分?
关注度查询密钥注意权重查询权重
在一天结束时,我们希望为每个代币都有一个简单的数字,告诉我们它与语料库中的每个其他代币有多相关。当训练完成时,我们将在下一个代币预测中使用这个数字。
在实践中,这意味着我们需要在输入序列中的所有标记之间建立注意分数,并且根据另一个标记在序列中的比较,称为键,我们将通过输入序列中的每个标记,称为查询,来执行该操作。
您会惊讶地发现,计算每个查询和关键字之间的关注度分数只是一系列对令牌嵌入进行变换并为此目的创建的一些新权重,即关注权重吗?
对于输入序列中的每个标记,我们将从一个新的查询权重矩阵开始。就像训练中的所有值一样,这些初始值是随机的,但在每次通过中会被调整。然后,我们在词汇表中查找标记的嵌入向量,并将其乘以查询权重矩阵。
请注意,权重矩阵是针对输入序列中的每个标记计算的,但来自词汇表的嵌入保持不变。 在我们的示例语料库中,这意味着单词“doctor”的两次出现在计算注意力得分时将使用相同的doctor标记嵌入,但每次出现将有自己的权重矩阵。 结果是,可以在单词本身中捕获输入文本中相同单词或标记的不同上下文。
谁掌控?K上面有什么。
Q K 标量注意矩阵键权重
这种矩阵-向量乘法的结果(嵌入 x 权重)是一个新向量,称为 Q。由于这个操作是对输入序列中的每个词元执行的,Q 的大小等于输入序列长度。它现在包含了每个我们正在比较的词元的加权嵌入。
我们将比较查询的令牌和我之前提到的关键字。如果我们通过每个关键字的关键权重矩阵来乘以这些令牌嵌入,我们将得到一个新的K向量,代表所有关键字令牌的加权嵌入。
我们要关注的注意力分数只是一个令牌的Q向量(嵌入维度)和一个令牌的K向量(同样是嵌入维度)的点积。这将在所有维度上的向量之间的比较压缩成单一的数值相似度度量。
这两个令牌之间的注意力分数结合了词汇中的令牌嵌入和语料库上下文中的权重,因为这些都是计算Q和K的一部分。在这一步中失去的信息是有关个别嵌入维度的任何信息。我们只计算了一个向量与另一个向量相似程度的单一测量。
计算了每个Q和K的注意力分数之后,我们得到了一个大小为Q x K的注意力矩阵——或者输入序列长度x输入序列长度。通过根据反馈步骤调整词汇中的令牌嵌入和输入序列中的权重,最终的注意力分数更好地反映了文本中令牌之间的上下文关系。
那不正常
softmax概率分布标准化的标准化注意力矩阵
敏锐的读者会记得所有这些权重(甚至包括嵌入)最初是随机的。我们仔细计算的注意力分数并没有什么意义。我们还没有解决有意义的、非随机分数是怎么出现的问题。
我之前谈到过通灵者寻找答案的方式,他们随意提出一些东西,看看它是否成立,然后在了解事实时调整答案。这正是LLM学习的方式。这一切都与正确答案的概率有关。正确的答案是什么?接下来应该是下一个令牌的预测。
利用我们所拥有的注意力矩阵,我们可以计算输入序列中任何标记对另一个标记具有高度注意力的概率。执行该计算的函数被称为softmax。
现在在这里说“概率”可能看起来有点傻,因为这两个向量要么相似,要么不相似。那就是这些向量中数字的现实。这里的概率是指概率分布。我们正在将发生的实际数字转化为每种结果发生的频率百分比,就像我们通过观察实际旋转来审计一台轮盘一样。
Softmax的结果被归一化,使得每个标记与序列中另一个标记相关联的概率总和为1。我们用任何一种不确定性的游戏来进行这个操作。如果一个轮盘上有38个空格,你有38分之1的机会落在任何一个特定的空格上。因为球必须落在某个地方,所有概率的总和都会等于1或100%。
这个计算结果被称为规格化的注意力矩阵。任何一个分数越接近1,表示在整个序列中那些标记之间的注意力越高。
价值观的问题
权重值之和
值权重 值向量 上下文矩阵
我提到了关注分数“抛弃”嵌入维度本身,将它们合并为一个相似度度量,并且标准化这些值并不能使我们重新得到嵌入。
为了确定每个嵌入维度对两个令牌之间关系的影响,我们将使用加权值的总和。这些值来自一个新的向量V。它类似于Q和K,以相同的方式创建,通过将来自词汇的令牌向量与价值权重矩阵相乘。
与 Q 和 K 一样,V 向量是输入序列的大小。要计算输入序列中单个令牌的加权和,我们将规范化注意力矩阵中的每个向量与 V 向量中的相应值相乘,然后将这些乘积相加在一起。结果是一个大小为嵌入维度的向量。
这样做将会减少输入序列中所有标记的注意力得分,使每个嵌入维度产生一个加权总和,展示该维度对标记向量相似性和单词背景的贡献。所有值向量(每个输入序列中的一个标记)的矩阵被称为上下文矩阵。
从神经元到网络
神经元 神经网络 前馈 FFNN 隐藏维度 瓶颈效应 ReLU
我们正在使用的技术来转换令牌向量中的值,例如通过乘法应用权重并对结果求和,旨在模拟大脑中的神经元如何将信息传递给彼此。
在嵌入维度中的每个位置可以被看作是传递信息类似于单个神经元。有更多维度,我们可以捕捉更多的信息,但会增加计算复杂性和时间成本。当我们执行模拟大脑中神经元的矩阵操作时,我们将数据处理为神经网络。
每个处理步骤称为一层。一个特定的层,即前馈神经网络或FFNN,通过引入每个令牌的额外权重的隐藏维度,扩展了模型捕获语境的能力。这个隐藏维度通常是嵌入维度的4倍,是复杂性和性能之间的折中。对于我们原始的嵌入维度300的情况,我们将有一个隐藏维度为1200。
一旦捕捉到隐藏维度中的关系,前馈神经网络(FFNN)会将模型缩减回其原始大小,并保留新信息。这被称为瓶颈效应。漏斗顶部宽阔,收集隐藏维度中的注意力信息,而狭窄的颈部将其缩减为嵌入维度中那些关系的数值摘要。
在这两个阶段之间,使用非线性激活函数来聚焦模型,以便只有期望的关系能够通过漏斗。在某种非线性函数(称为ReLU)的情况下,只保留正向关系值(同方向的向量)。
这些神经网络操作被称为前馈,因为信息只从第一步流向最后一步。这部分不会修改或重新访问任何自身的输入。这会在后面完成。
FFNN 第一次转换
在FFNN的第一部分中,我们建立了一个新的权重矩阵,大小为嵌入维度 x 隐藏维度。之前的权重矩阵是嵌入维度 x 嵌入维度大小,现在在这里使用新的隐藏维度可以更加精细地对每个令牌在其所有原始维度上与其他令牌进行加权。
我们之前建立的上下文矩阵然后与这个新的权重矩阵相乘,得到一个大小为输入序列长度 x 隐藏维度的矩阵。
FFNN 非线性激活
激活级别 激活函数
在FFNN的下一步中,对转换的上下文矩阵执行非线性激活函数。在ReLU的情况下,这会“丢弃”所有负乘积结果,仅关注模型中的正注意力分数。
最开始,分数会是正数和负数,这是由于所有数据的随机来源。但是经过非线性激活后,保存的数值将使模型只专注于正分数,忽略任何带有负值的结果。
这种省略一些值并不将它们传递到下一层的方式是模仿大脑中神经元需要一定的激活水平才能发射,将其消息发送到另一个神经元的方式。这一步的非线性结果充当激活功能,只有当其水平高于零时才激活注意力。
FFNN第二次转型
在FFNN的最后一步中,为输入序列中的每个标记创建第二个权重矩阵,大小为嵌入维度 x 隐藏维度。
将应用非线性激活的扩展上下文矩阵与此第二权重矩阵相乘,有效地将它缩小回其原始输入序列长度 x 嵌入维度的大小,同时捕捉(并以数值方式总结)所有来自更高隐藏维度的关注信息。
进行预测
最终的线性层
预测步骤被称为最后的线性层,就像一位舞台魔术师,我们已经把所有东西“藏在袖子里”,以便能够执行它。预测是从哪里来的?
我们已经看到,在每对标记中,注意关系或向量相似性是通过使用概率分布捕获其在输入序列中的位置和上下文(以及实际标记本身)。这些信息存在于我们一直在完善的上下文矩阵中。
如果我们取序列中的最后一个令牌(上下文矩阵中的最后一个向量)并将其与词汇表中的每个令牌计算相似度,然后将其转换为概率,得分最高的令牌最有可能是下一个令牌!如果对我们刚生成的令牌执行相同的操作,则可以预测那之后的下一个令牌。
要在整个词汇表的背景下查看最后一个标记,我们首先将其嵌入向量乘以一个新的权重矩阵,大小为词汇表大小 x 嵌入维度。这会产生一个词汇大小的向量,其中每个元素将标记的嵌入和其权重合并为单个标量值。
确定几率
对数变量 对数几率 对数函数
这个新向量中的所有值都称为对数比(logits),这是对事件发生几率的对数的引用。在这种情况下,我们要预测的事件是每个词汇中的令牌成为序列中下一个词的可能性,包括我们学到的所有上下文。
逻辑回归(Logits)是原始概率分数,表示词汇表中每个令牌成为下一个令牌的可能性。这些分数通过softmax函数进行归一化,使它们在整个词汇表中总和为1。归一化得分最高为1的词汇令牌最有可能成为下一个令牌,因为它具有最类似于上下文中最后一个令牌的加权嵌入,这个上下文是输入序列中它之前的所有令牌所形成的。通过查找保存的英语词汇表中的该令牌ID,我们可以返回LLM响应的下一个词。
我不知如何表达
损失函数 信息论 熵 交叉熵损失 优化
为了计算预测的错误程度,我们使用损失函数。如果我们不是在输入序列中的最后一个令牌上运行我们的预测层(最后的线性层),而是在之前的一个上运行它呢?那么我们可以查看分配给序列中实际最后一个令牌的概率,以查看是否获得了最高分。Et voilá,我们有了一个损失函数。
我们知道,在开始时我们没有机会得到任何正确的东西,因为所有数字最初都是随机的。这就像试图预测下一段无线电静音。在信息论中,熵这个术语指的是某些信息中存在多少不确定性或随机性。
为了找出关于上下文信息在随机性中仍然丢失了多少,我们取所分配给正确标记的概率值的负对数,这个度量称为交叉熵损失。
较低的交叉熵损失意味着模型做出了更准确的预测,或者“命中”,而较高的损失意味着预测不够准确,或者“失误”。在接下来的优化步骤中,我们将看到模型如何在每次传递中调整嵌入和权重,以实现更低的损失和更准确的预测。
回到我们的输入文本:
“每天一个苹果,远离医生。” “医生正在度假。”
如果我们提交了“每天一个苹果远离医生”的问题,并要求预测,我们很可能会在第一次尝试中得到“是” — 或者甚至得到更远的答案。请记住,这些输入开始时没有任何关系信息。
因为实际输入在该上下文或文本部分中的“医生”之后紧跟着“离开”代币,模型将调整“离开”代币的嵌入,使其更有可能在下次被预测。
在实践中,这些步骤对输入序列中的每个令牌都运行。因此,我们要求对“An”进行预测。然后我们要求对“An apple”进行预测,依此类推,在每一点进行调整。
把那个东西往后移
参数梯度学习率反向传播
为了调整模型并改善预测,首先我们要考察每个数值在令牌嵌入和权重矩阵中对于“错误”或损失的贡献。这显示了每个维度的数值或权重相对于其他维度应该调整的程度,这种度量被称为参数梯度。
每次调整旨在将参数的值朝着减少损失的方向移动。为了确定要移动多少,我们从与梯度成比例的数量开始,然后乘以一个称为学习率的因子进行缩放。这会影响步长的大小或对调整的影响。这个缩放的调整计算被称为梯度下降。
每个轻推都是朝着最小化损失的方向进行的。通过反复迭代,模型的准确性随着时间的推移而提高,这个过程被称为反向传播。
这都是幻觉。
幻觉
在这一点上,可能会想到,根据你的观点,要么所有LLMs的输出都不是幻觉,要么它们全部都是。
在数学意义上,所有的输出都是100%正确的。从词汇表中选取的标记基于其嵌入中的值,可以证明为正确的“下一个”标记。然而,这并不意味着该标记代表的单词具有正确的人类含义,或者将这些标记串在一起的整体输出代表着正确的含义。
任何一个输出token在人类意义上可能是正确的事实纯粹是偶然的。它们都是幻觉,通常这些幻觉与现实相吻合。更好的模型和更好的提示可以改善现实世界和概率世界之间的对齐,但我们永远不能像在数据库中或阅读文件内容中那样确信无疑。
回想起来,很遗憾我们把这个词应用于这种现象,因为这会导致错误的观念,即所有幻觉都可被消除。要做到这一点,我们就必须彻底放弃使用LLMs。
微调
时代训练模型微调主函数
通常,LLM培训涉及反复迭代从前馈层到反向传播的步骤,当达到一定数量的时代或另一个设置限制比如计算成本时停止。
生成的产品,称为训练好的模型,然后就可以部署了。这是生产一个依赖于下一个标记预测的聊天机器人或其他基于文本的应用程序所需的全部内容。
额外的训练是指您在将模型带回家后所进行的训练,称为微调。它包括向语料库中添加新文本,通常采用较低的学习率,以避免破坏原始训练。在使用托管的LLM时,自定义GPT或聊天会话上的“设置”,例如主提示,就是微调。
AI 应用
功能调用消息人工智能应用程序
就这样,我们从随机数字发展到了人工智能。嗯,几乎是这样。还有一步要连接LLM的自然语言能力(以及它们的不可预测性)与需要可靠价值的传统应用程序,例如银行余额或天气。
当训练使用函数调用时,一种高级微调技术,模型可以连接到用传统语言编写的编程语言程序中。这些函数可以访问服务器,在数据库中查找内容,并执行数学和逻辑操作- 这些在训练模型中都不存在。
在一个神奇的镜子技巧中,LLM 甚至可以被提示提前编写这些传统功能 - 当然要有人类监督。在对代码进行训练时,这是下一个令牌预测的绝佳用途。
很重要的一点是模型本身并不执行任何计算任务,只是生成消息,对提示的个人回应只是标记的令牌列表。为了真正启动一个函数调用,一个控制应用程序使用传统语言编写,会查看每条消息,检查是否有一个标志表明“需要函数调用”。这些消息包含要调用的函数名以及从用户提示中提取的参数。
在我们的天气示例中,如果用户询问丹佛的温度,LLM只是随机选择一个较低的数字,因为丹佛一直很冷。不,开玩笑的。回复消息将包含一个指示器,其参数为“丹佛”的温度功能。
看到这条消息时,控制应用程序而不是LLM调用该函数,并传递消息中的参数。为了将函数结果包含在生成的回复中,必须将返回值传递回LLM自己的消息中,带有上下文 —— 实际上是包含该函数值的提示。
通过先使用具有大量词汇和上下文的预训练模型,然后用您自己行业或公司特定的数据和函数调用进行微调,创建一个定制用户界面的组合,最终形成了一个AI应用程序。
虽然transformers中的基本方法很简单,但您可以看到更复杂的人工智能应用程序需要大量人力和人工编写的软件才能发挥作用—至少在今天是这样。例如,医生使用的人工智能应用程序需要非常小心地选择何时在记录和数据库中查阅真实数据,以及何时使用下一个标记预测。我们不希望预测某人被开给了什么药物或者用多少药可能会致命。投入到这类应用程序中的努力创造了显著的竞争优势—这是其他公司将难以超越的障碍,即使每个人都从相同的语言模型开始。
接下来是什么?
这个解释对于你来说有助于澄清LLMs和AI应用吗?写下来确实帮助我理解!
在我的下一篇文章中,我将介绍如何构建一种精确类型的AI应用程序,该应用程序使用一个经过训练的模型,并在Typescript(或JavaScript)应用程序中添加自定义微调文档和函数调用。
请随时在这里添加您的评论或直接写信给我。期待收到您的反馈。我的联系方式可以在我的作品集网站davidbethune.com上找到。
像往常一样,谢谢阅读!
```html