在使用大模型的时候,大家都知道的是,消耗的token越多,就越贵。

但是如果问到到底什么是token,可能很多人会答不上来。当然还有经常和token一起出现的词:Token(词元)、Tokenizer(分词器)、Embedding(嵌入),Tokenizer到底是怎么回事?Embedding在大模型中具体都起什么作用?为什么要用到这些?

对于这三个概念大家可能都有个直观的感觉,但具体的细节可能不是特别了解。虽然搞不清楚它们也不影响使用大模型,但是理解了这三个概念之后我们能更好地理解大模型。

它们其实是大模型读懂我们的需求必须经过的三个步骤。简单来说就是:Tokenizer 把文字拆成 Token,然后把Token 转换成数字ID,Embedding 把数字ID 转换成模型能够理解的向量。

下面分别解释每个词的含义。

1. Token是什么

在很多人的概念里,可能认为:Token = 一个单词。其实这样理解是不对的。准确地说,Token 是大模型处理文本的最小单位。

Token 可以是一个汉字、一个英文单词、一个英文单词的一部分,或者是一个标点符号,也可能是几个字符拼在一起。

以中文举例,“人工智能”这几个字不一定被拆成“人、工、智、能”四个字,也可能被拆成“人工”“智能” 两个词。具体会拆成什么,要看模型使用的规则,不同的模型,拆法是不同的。

以英文举例效果更明显:“ChatGPT is amazing” 可能被拆成:“ChatGPT、is、amazing”,也可能被拆成"Chat、G、PT、is、amazing"。所以,token不是固定长度,一个单词不一定就是一个token。

那么为什么不按照单个字或者单个单词拆分token? Tokenizer通常会学习常见的词,如果单个字或者每个单词为一个token的话,效率太低了,将常见的词拆分为token,效率会快很多。

2. Tokenizer是怎么回事

Tokenizer 是分词器,它主要负责把我们人类阅读的文本,转变成计算机能够理解和计算的数字(向量/ID)。因为大模型本质上是用来处理数字的,它看不懂汉字或英文,只能处理数字。

Tokenizer 的工作一般分为两步:

  • 第一步是分词。将一段文本拆分成token,例如:“我喜欢机器学习” 可能会被拆分为:[“我”,“喜欢”,“机器”,“学习”]
  • 第二步是 映射数字 (Mapping to IDs)。Tokenizer 内部维护着一本巨大的“词典”(Vocabulary)。分词完成后,它会查阅这本词典,把每个 Token 映射为对应的数字索引(Input IDs)。 例如词表中的对应关系:我 -> 531,喜欢 -> 8219, 机器 -> 1002, 学习 -> 325。那么最终输出的是:[531,8219,1002,325]
    最终,模型看到不是文字,而是数字。所以,Tokenizer本质就是文字和Token ID 之间的转换器。

当模型有了输出结果之后,Tokenizer 还要再执行反向操作(Detokenization),把数字再变回人类能看懂的文字。

3. Embedding是怎么回事

到这里,可能很多人会好奇:Token 已经变成数字了,为什么还要 Embedding?

经过 Tokenizer 之后,文本已经变成了数字 ID。但对于计算机来说,这些数字没有任何语义联系,如果把这些孤立的 数字ID 喂给模型,模型无法理解“猫”和“狗”都是宠物,也无法理解 “飞机”和“火箭”都是交通工具。Embedding 的出现,就是为了解决这个“语义鸿沟”。

Embedding 就是把 Token ID 映射成一个高维向量。模型中有一张巨大的“Embedding 矩阵表格”。当输入 不同的Token ID 时,它会去表里查找到对应的高维向量。

那么,为什么需要Embedding呢? 因为Transformer不会处理文字和整数,只能处理向量。输入高维矩阵时,Transformer 才能进行矩阵乘法。

而且,Embedding 也是模型参数,在训练的过程中,Embedding 也在不断更新。所以,模型能够越来越理解词语之间的关系。

写在最后

他们三者之间的关系见下图:
在这里插入图片描述

理解了上述这些概念以及他们之间的关系,我们就能够好的理解和使用大模型。

还有就是,由于词表设计的不同,1个汉字通常会占用 1~2 个甚至更多 Token,而英文中大约 3~4 个字母(或者 0.75 个单词)才占用 1 个 Token。这也是为什么用中文跟模型聊天往往比英文“更贵”、更消耗上下文空间的原因。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐