让我们来设计一个简单的大语言模型——大语言模型的基本程序架构

142次阅读
没有评论

定义词表

我们将设计以下的 token id

token_id 字符表示
01
02
03
04
05
06
07 AI
08 人类

为什么“你”和“我”有两个 id 对应呢?其实我们可以规定 01 和 02 号 token 是特殊 token,用来控制上下文角色。

前处理

我们先进行一段对话(虽然大多数传输协议使用 json,但是这里为了便于人类理解,我使用更易读的 yaml):

- 你 
  - 你好我是人类 

我们可以看到,yaml 包含了两层结构,第一层是发言的角色(role),第二层是发言的内容(content)
那么现在,使用简单地 yaml 解析器,我们就可以获取到这段对话的发言人是“你”,发言内容是“你好我是人类”;接下来我们要将这段文本序列转换为模型可以处理的 id 序列,这就需要用到分词器(tokenizer)
填回上文挖的坑。tokenizer 在划分序列和映射 id 时,并不会使用到特殊 token_id。也就是说,content 中的内容只能映射到普通 token_id。
因此,正文部分的分词结果就是

[ 你 好 我 是 人类]
[03 04 05 06 08]

接下来,我们要插入角色控制的特殊 token。这部分就不需要使用基于 ML 或者神经网络的分词器了,直接根据结构,用传统算法编排 role 和 content 的结构就行,比如在这段对话中,我们将代表“你”的 01 插入开头,变成 [01 03 04 05 06 08]。
哦,别忘了在末尾加上 02 号 id,提示模型接下来自己扮演“我”来输出。
我们最后得到这样一个序列:[01 03 04 05 06 08 02]。我们会将其输入 transformer。

输入模型

我们的 transformer 有一层 embedding 层,它在训练时就学习了一些参数,能够将 token_id 转换为一个向量(vector)。高维向量是 transformer 或其他神经网络处理问题的终极形态。

自回归 & 后处理

经过一系列复杂的处理,transformer 层计算出了一个结果向量,接下来通过一个线性层,它被转换为了长度为 8——是的,和 token 总数一致——的输出矩阵,我们发现 03 号位置权重最高,查表发现 03 号 token 的文本表示是“你”,这就说明模型输出的第一个字是“你”。

接下来更新序列,将模型的输出追加到末尾:[01 03 04 05 06 08 02 03]。完事之后,如法炮制地,我们再将这个序列提供到 transformer 网络……

当模型在一次一次循环中,依次给出了 03 04 05 06 07,查表就能知道,模型输出了“你好我是 AI”。
在下一次的循环中,我们惊讶地发现模型竟然输出了 01,难道模型想说“你好我是 AI 你”吗?其实不是的。01 号 token 是特殊 token,不应该被转换为字符串。模型输出 01,说明它认为它的角色,即“我(02)”已经回答完了,接下来交给“你(01)”角色发言。因此,我们监控到模型输出这个特殊 token,接下来就不需要再把序列继续输入回去——模型担当的角色发言已经完成,接下来轮到用户。

附注

  • 通常的 token 词表中,特殊 token 会使用诸如这样的特殊、不重复的字符串表示。然而事实上在整个运行过程中,特殊 token 的 token string 基本上可以认为毫无意义。这里特意设计了“你”“我”两个看起来重复的 token string,旨在说明“所见并不一定是所得”,在正文中使用“<System>”这样所谓的“特殊 token 的 token string”,大概率不会起到真正的角色控制作用。
  • 诚然,目前主流的 LLM 会用一个独立的特殊标记代表结束;然而在三四年前,我刚刚研究 LLM,那时候几乎所有人对 LLM 的认识和研究都没有那么深刻,计算资源有限、开发能力有限,我们更喜欢直接“以角色转换代表发言结束”这种直观且取巧的方式;考虑到其确实可行且具有相当的简易型和直观性,我决定采用此架构进行说明。
  • 训练时可以在对话方面进行定向地优化,以期让模型学习到“角色 token 之后是角色转换,应当以新身份回答问题”和“回答结束要输出一个角色转换 token(仅针对此架构)”的标准化输入输出能力。如果没有这方面的大量数据或者高权重训练,那么得到的模型有时候会因为学习过自然语言对话的语料,出现使用自然语言进行多角色对话,却不使用特殊 token 控制角色的情况。
  • 现代分词器的规模常常高达数万甚至数十万。
  • 最终输出 token 的选择有多种方式,“选择最大权重”只是其中最简单直观的一种。
正文完
 1
评论(没有评论)