语言模型是怎么回事
语言模型( language model,LM )简单来说,就是利用自然语言构建的模型。
自然语言就是我们日常生活、学习和工作中常用的文字。语言模型就是利用自然 语言文本构建的,根据给定文本,输出对应文本的模型。
语言模型具体是如何根据给定文本输出对应文本呢?方法有很多种,比如我 们写好一个模板:“XX 喜欢 YY ”。如果 XX 是我,YY 是你,那就是“我喜欢 你”,反过来就是“你喜欢我”。我们这里重点要说的是概率语言模型,它的核 心是概率,准确来说是下一个 Token 的概率。这种语言模型的过程就是通过已有 的 Token 预测接下来的Token。举个简单的例子,比如你只告诉模型“我喜欢你” 这句话,当你输入“我”的时候,它就已经知道你接下来要输入“喜欢”了。为 什么?因为它的“脑子”里就只有这 4 个字。
好,接下来,我们要升级了。假设我们给了模型很多资料,多到现在网上所 能找到的资料都给了它。这时候你再输入“我”,此时它大概不会说“喜欢”了。 为什么呢?因为见到了更多不同的文本,它的“脑子”里已经不只有“我喜欢你” 这 4 个字了。不过,如果我们考虑的是最大概率,也就是说,每次都只选择下一 个最大概率的 Token,那么对于同样的给定输入,我们依然会得到相同的对应输 出(可能还是“喜欢你”,也可能不是,具体要看给的语料)。对于这样的结果, 语言模型看起来比较“呆”。我们把这种方法叫作贪心搜索( greedy search), 因为它只往后看一个词,只考虑下一步最大概率的词!为了让生成的结果更加 多样和丰富,语言模型都会在这个地方执行一些策略。比如让模型每一步多看 几个可能的词, 而不是就看概率最大的那个词。这样到下一步时,上一步最大 概率的 Token,加上这一步的 Token,路径概率(两步概率的乘积)可能就不是 最大的了。
举个例子,如图 1-3 所示,先看第一步,如果只选概率最大的那个词,那就 变成“我想”了。但是别急,我们给“喜欢”一点机会,同时考虑它们两个。再 往下看一步,“喜欢”和“想”后面最大概率的都是“你”,最后就有了下面几句 (我们附上了它们的概率)。
· “我喜欢你”,概率为 0.3 ×0.8=0.24。 · “我喜欢吃”,概率为 0.3 ×0.1=0.03。 · “我想你”,概率为 0.4 ×0.5=0.2。
· “我想去”,概率为 0.4 ×0.3=0.12。
多看一步大不一样!看看概率最大的成谁了,变成了“我喜欢你”。上面这 种方法叫作集束搜索(beam search),简单来说,就是一步多看几个词,看最 终句子(比如生成到句号、感叹号或其他停止符号)的概率。在上面的例子中, num_beams=2(只看了两个词),看得越多,越不容易生成固定的文本。
好了,其实在最开始的语言模型中,基本就到这里,上面介绍的两种不同 搜索方法(贪心搜索和集束搜索)也叫解码策略。当时更多被研究的还是模型 本身,我们经历了从简单模型到复杂模型,再到巨大复杂模型的变迁过程。简 单模型就是把一句话拆成一个个 Token,然后统计概率,这类模型有个典型代 表——N-Gram模型,它也是最简单的语言模型。这里的 N 表示每次用到的上 下文 Token 的个数。举个例子,看下面这句话:“人工智能让世界变得更美好”。 N-Gram 模 型 中 的 N 通 常 等 于 2 或 3, 等 于 2 的 叫 Bi-Gram, 等 于 3 的 叫 Tri- Gram。
· Bi-Gram:人工智能/让 让/世界 世界/变得 变得/更 更/美好
· Tri-Gram:人工智能/让/世界 让/世界/变得 世界/变得/更 变得/更/美好
Bi-Gram 和 Tri-Gram 的区别是,前者的下一个 Token 是根据上一个 Token 来的,而后者的下一个 Token 是根据前两个 Token 来的。在 N-Gram 模型中,Token 的表示是离散的,实际上就是词表中的一个个单词。这种表示方式比较简 单,再加上 N 不能太大,导致难以学到丰富的上下文知识。事实上,它并没有 用到深度学习和神经网络,只是一些统计出来的概率值。以 Bi-Gram 为例,在给 定很多语料的情况下,统计的是从“人工智能”开始,下个词出现的频率。假设 “人工智能 / 让”出现了 5 次,“人工智能 / 是”出现了 3 次,将它们出现的频率 除以所有的 Gram 数就是概率。
训练 N-Gram 模型的过程其实是统计频率的过程。如果给定“人工智能”, N-Gram 模型就会找基于“人工智能”下个最大概率的词,然后输出“人工智能 让”。接下来就是给定“让”,继续往下走了。当然,我们也可以用上面提到的不 同解码策略往下走。
接下来,让每个 Token 成为一个 Embedding 向量。我们简单解释一下在这种 情况下怎么预测下一个 Token。其实还是计算概率,但这次和刚才的稍微有点不 一样。在刚才离散的情况下,用统计出来的对应 Gram 数除以 Gram 总数就是出 现概率。但是稠密向量要稍微换个方式,也就是说,给你一个 d 维的向量(某个 给定的 Token),你最后要输出一个长度为 N 的向量,N 是词表大小,其中的每 一个值都是一个概率值,表示下一个 Token 出现的概率,概率值加起来为 1。按 照贪心搜索解码策略,下一个 Token 就是概率最大的那个,写成简单的计算表达 式如下。
上面的 W 就是模型参数,其实 X 也可以被看作模型参数(自动学习到的)。 因为我们知道了输入和输出的大小,所以中间其实可以经过任意的计算,也就是 说,W 可以包含很多运算。总之各种张量(三维以上数组)运算,只要保证最后 的输出形式不变就行。各种不同的计算方式就意味着各种不同的模型。
在深度学习早期,最著名的语言模型是使用循环神经网络( recurrent neuraletwork,RNN)训练的,RNN 是一种比N-Gram 模型复杂得多的模型。RNN 与 其他神经网络的不同之处在于,RNN的节点之间存在循环连接,这使得它能够记住之前的信息,并将它们应用于当前的输入。这种记忆能力使得RNN在处理 时间序列数据时特别有用,例如预测未来的时间序列数据、进行自然语言的处理等。通俗地说,RNN就像具有记忆能力的人,它可以根据之前的经验和知识对当前的情况做出反应,并预测未来的发展趋势,如图 1-4 所示。
在图 1-4 中,右边是左边的展开,A 就是参数,x 是输入,h 就是输出。自 然语言是一个 Token 接着一个 Token(Token by Token)的,从而形成一个序列。 参数怎么学习呢?这就要稍微解释一下学习(训练)过程。
如图 1-5 所示,第 一 行就是输入 X,第二行就是输出 Y,SOS( start of sentence )表示句子开始,EOS( end of sentence )表示句子结束。注意,图 1-4 中的 h 并不是那个输出的概率,而是隐向量。如果需要概率,可以再对 h 执行张 量运算,归一化到整个词表即可。
上面的 nn.RNN就是 RNN 模型。输入是一个 4 ×32 的向量,换句话说,输入 是 4 个 Token,维度 d=32。h0就是随机初始化的输出,也就是 4 个 Token 中第 1 个 Token 的输出,这里 output 的 4 个 64 维的向量分别表示 4 个输出。hn 就是最后 一个 Token 的输出(它和output 的最后一个 64 维向量是一样的),也可以看成整 个句子的表示。注意,这里的 output 和图 1-5 中的输出 Y 还没有关系。别急,继 续往下看。如果要输出词的概率,就需要先扩充到词表大小,再进行归一化。
这里的 probs 的每一行就是词表大小的概率分布,概率和为 1 ,意思是根 据当前 Token 生成下一个 Token 的概率,下一个 Token 有可能是词表中的任意一 个 Token,但它们的概率和一定为 1 。因为我们知道接下来每个位置的 Token 是 什么(也就是图 1-5 中的输出 Y)。这里得到最大概率的那个 Token,如果正好是 这个 Token,则说明预测对了,参数就不用怎么调整;反之,模型就会调整前面 的参数( RNN、h0、input 和 wo)。你可能会疑惑为什么 input 也是参数,其 实前面我们偷懒了,本来的参数是一个 1000 ×32 的大矩阵,但我们使用了 4 个 Token 对应位置的向量。这个 1000 ×32 的大矩阵其实就是词向量(每个词一行), 开始时全部随机初始化,然后通过训练调整参数。
训练完成后,这些参数就不变了,然后就可以用前面同样的步骤来预测了, 也就是给定一个 Token,预测下一个 Token。如果使用贪心搜索,则每次给定同样的 Token 时,生成的结果就一样。其余的就和前面讲的接上了。随着深度学习 的不断发展,出现了更多比 RNN 还复杂的网络结构,而且模型变得更大,参数 更多,但逻辑和方法是一样的。
好了,语言模型就介绍到这里。上面的代码看不懂没关系,你只需要大致了解每个 Token 是怎么表示、怎么训练和预测出来的就行。简单直观地说,构建 (训练)语言模型的过程就是学习词、句内在的“语言关系”;而推理(预测)就 是在给定上下文后,让构建好的模型根据不同的解码策略输出对应的文本。无论 是训练还是预测,都以 Token 为粒度进行。
准备一本《ChatGPT原理与应用开发》,你就可以用大语言模型轻松做出自己的AI产品。
1. Di一本基于大语言模型进行商业应用开发的书;
2. 以任务(相似匹配、句词分类、文本生成、复杂推理)为中心,内容不仅可用于ChatGPT,也适用于其他大语言模型;
3. 侧重于任务的讲解与设计,思路可用于任何项目;
4. 有详细的示例代码,大部分的代码稍作修改后可用于生产环境,还有Datawhale的HuggingLLM开源教程、全方位助力学习与实践。
全书共8 章内容,第1 章介绍与ChatGPT 相关的基础知识,第2~5 章分别介绍相似匹配、句词分类、文本生成和复杂推理方面的任务,第6~8 章分别介绍ChatGPT 的工程实践、局限与不足,以及商业应用,以帮助读者更好地构建自己的应用。
本书以实践为主,尤其注重任务的讲解和设计,但同时也对自然语言处理相关算法的基本原理和基础知识进行科普性介绍,适合所有对大语言模型感兴趣的开发者阅读。