解读大模型(LLM)中的 Token 机制
当人们谈论大型语言模型的大小时,参数会让我们了解神经网络的结构有多复杂,而 token 的大小会让我们知道有多少数据用于训练参数。
正如陆奇博士所说的那样,大型语言模型为从文本生成到问题回答的各种任务提供了令人印象深刻的能力,不仅彻底改变了自然语言处理 (NLP) 领域,而且作为基础模型会改变整个软件生态。这些模型的一个经常被忽视的关键点是'token'的作用,即模型处理的各个信息单元。大型语言模型 (LLM) 不能真正理解原始文本,相反,文本被转换为称为 token 的数字表示形式,然后将这些 token 提供给模型进行处理。
1. 什么是 token?
在 LLM 中,token 代表模型可以理解和生成的最小意义单位,是模型的基础单元。根据所使用的特定标记化方案,token 可以表示单词、单词的一部分,甚至只表示字符。token 被赋予数值或标识符,并按序列或向量排列,并被输入或从模型中输出,是模型的语言构件。
一般地,token 可以被看作是单词的片段,不会精确地从单词的开始或结束处分割,可以包括尾随空格以及子单词,甚至更大的语言单位。token 作为原始文本数据和 LLM 可以使用的数字表示之间的桥梁。LLM 使用 token 来确保文本的连贯性和一致性,有效地处理各种任务,如写作、翻译和回答查询。
下面是一些有用的经验法则,可以帮助理解 token 的长度:
- 1 token ~= 4 chars in English
- 1 token ~= ¾ words
- 100 tokens ~= 75 words 或者 1-2 句子 ~= 30 tokens
- 1 段落 ~= 100 tokens
- 1,500 单词 ~= 2048 tokens
在 OpenAI 的 API 参数中,max_tokens 参数指定模型应该生成一个最大长度为 60 个令牌的响应。可以通过官方提供的 tokenizer 工具来观察 token 的相关信息。
2. token 的特点
我们可以先用 Playground 来看一个例子:"Dec 31,1993. Things are getting crazy."
2.1 token 到数值表示的映射
词汇表将 token 映射到唯一的数值表示。LLM 使用数字输入,因此词汇表中的每个标记都被赋予一个唯一标识符或索引。这种映射允许 LLM 将文本数据作为数字序列进行处理和操作,从而实现高效的计算和建模。
为了捕获 token 之间的意义和语义关系,LLM 采用 token 编码技术。这些技术将 token 转换成称为嵌入的密集数字表示。嵌入式编码语义和上下文信息,使 LLM 能够理解和生成连贯的和上下文相关的文本。像 Transformer 这样的体系结构使用 self-attention 机制来学习 token 之间的依赖关系并生成高质量的嵌入。
2.2 token 级操作:精确地操作文本
token 级别的操作是对文本数据启用细粒度操作。LLM 可以生成 token、替换 token 或掩码 token,以有意义的方式修改文本。这些 token 级操作在各种自然语言处理任务中都有应用,例如机器翻译、情感分析和文本摘要等。
2.3 token 设计的局限性
在将文本发送到 LLM 进行生成之前,会对其进行 tokenization。token 是模型查看输入的方式——单个字符、单词、单词的一部分或文本或代码的其他部分。每个模型都以不同的方式执行这一步骤,例如,GPT 模型使用字节对编码 (BPE)。
token 会在 tokenizer 发生器的词汇表中分配一个 id,这是一个将数字与相应的字符串绑定在一起的数字标识符。例如,'Matt'在 GPT 中被编码为 token 编号 [13448],而'Rickard'被编码为两个标记,'Rick','ard'带有 id [8759,446],GPT-3 拥有 1400 万字符串组成的词汇表。
token 的设计大概存在着以下的局限性:
- 大小写区分:不同大小写的单词被视为不同的标记。'hello'是 token [31373],'Hello'是 [15496],而'HELLO'有三个 token [13909,3069,46]。
- 数字分块不一致:数值'380'在 GPT 中标记为单个'380'token。但是'381'表示为两个 token ['38','1']。'382'同样是两个 token,但'383'是单个 token ['383']。一些四位数字的 token 有:['3000'],['3','100'],['35','00'],['4','500']。这或许就是为什么基于 GPT 的模型并不总是擅长数学计算的原因。
- 尾随的空格:有些 token 有空格,这将导致提示词和单词补全的有趣行为。例如,带有尾部空格的'once upon a '被编码为 ['once'、'upon'、'a'、' ']。然而,'once on a time'被编码为 ['once','upon','a','time']。因为'time'是带有空格的单个 token,所以将空格添加到提示词将影响'time'成为下一个 token 的概率。


