Code前端首页关于Code前端联系我们

GPT模型tokenization(词元化)的工作原理揭晓

terry 2年前 (2023-09-23) 阅读数 100 #AI人工智能

GPT模型tokenization(词元化)工作原理揭示

在GPT模型中,tokenization(词元化)指的是把用户输入的文本划分为token(单词的元素)的过程,以便GPT更好地理解输入。文本单词的含义、语法和语义,以及生成更连贯的输出内容。这是一个非常重要的预处理操作,对模型的最终效果有着显着的影响。分词器(引理生成器)是一种将文本拆分为标记的工具或组件。它将原始文本转换为模型可以处理的数字形式,并提供GPT标签生成和推理的基本能力。

本文详细介绍了GPT tokenizer的工作原理。作者·Simon·威利森是开源 Web 应用程序框架 Django 以及开源数据探索和发布工具 Datasette 的联合创始人。 (以下内容由OneFlow编译,转载授权请联系OneFlow。来源:https://simonwillison.net/2023/Jun/8/gpt-tokenizers/)

作者|Simon·威利森

OneFlow 编译

翻译 | 贾川

大型语言模型(例如 GPT-3/4、LLaMA 和 PaLM)使用 token 作为基本工作单元。它们将文本作为输入,将其转换为标记(整数),并预测接下来应该出现哪些标记。

通过操作这些标记,您可以更好地理解它们在语言模型中的工作方式。

OpenAI 提供了一个标记器来探索标记的工作原理。我自己创建的一个更有趣的工具是 Observable 笔记本 (https://observablehq.com/@simonw/gpt-tokenizer)。在此 Observable 笔记本中,您可以将文本转换为标记、将标记转换为文本以及搜索整个标记表。

这个观察笔记本看起来像这样:

GPT模型tokenization(词元化)工作原理揭示

我在这里剪切的文字是:

狗吃苹果

El perro 来例子 las manzanas❙❙‶‶Kat❙‶❙› ,生成一个总共 21 个整数标记。 5 对应于英语文本,8 对应于西班牙语文本,6(每个字符两个)对应于三个日语字符。两个换行符也表示为整数标记。

Notebook Observable 使用 GPT-2 分词器(基于 EJ Fox 和 Ian Johnson 创建的出色笔记本),主要用作教育工具,但 GPT -2 中存在 GPT-3 及更高版本的最新分词器分词器。一些差异。

1
探索一些有趣的标记

通过与标记器交互可以发现各种有趣的模式。最常见的英语单词被分配一个标记,如上所示:

  • “The”:464
  • “dog”:3290
  • “eats”:25365
  • “theapp”:25365❙“theapp”: 25365": 22514

注意:大小写很重要。以单词“the”为例,大写T的单词“The”对应的token为464,而大写T对应的token为以小写 t 开头且开头有空格的单词“the”为 262。

许多单词标记都包含前导空格,这消除了为每个空格字符使用附加标记的需要,从而可以更有效地编码

相比英语,其他语言的分词效率较低。西班牙语句子“El perro come las manzanas”编码如下:

  • “El”:9527
  • “per” :583
  • “罗”:305
  • “罗”:305
  • 8 305
  • “拉斯”:39990
  • “男人”:582
  • “赞”:15201
  • “as”: 292

这里显示了英语偏好,因为“man”是英语单词,所以它的 token ID 较低,582。“zan”在英语中不是一个独立的单词,但也是一个常见的序列字符,所以它仍然值得拥有自己的令牌,因此它的令牌 ID 是 15201。 令牌

“Glitch 令牌” 它们是令牌的一个令人着迷的子集。一个有趣的例子是代币 23282“davidjl”。

在笔记本的搜索框中搜索“david”即可找到令牌。 Scala AI 的快速工程师

GPT模型tokenization(词元化)工作原理揭示

Riley Goodside 指出了一些与代币相关的奇怪行为。

GPT模型tokenization(词元化)工作原理揭示

为什么会出现这种情况?这是一个有趣的谜题。

令牌 23282 可能与 Reddit 用户“davidjl123”相关。该用户是/r/counting子论坛的狂热用户,经常发帖,发帖次数超过163,000次。

推测 /r/counting 子论坛中的数据最终被用来训练 GPT-2 分词器。由于用户davidjl123在该子论坛上出现了数十万次,因此他最终被分配了自己的代币。

为什么这种情况会引起类似的问题呢?到目前为止,我看到的最好的解释来自黑客新闻上的 @londons_explore

所有这些有缺陷的令牌都位于令牌插入空间的中心附近。这意味着模型很难将这些标记与位于插入空间中心附近的其他标记区分开来,因此当要求模型“重复”这些标记时,它会选择错误的标记。

原因是这些token在互联网上出现了很多次(例如用户davidjl在Reddit上有163,000个帖子,我只是在统计不断增加的数字),但token本身并不难预测(因此,在训练中,梯度几乎为零,并且嵌入的向量减少到零,某些优化器在标准化权重时会这样做)。

在“SolidGoldMagikarp(加,提示生成)”帖子下,LessWrong详细解释了这个现象。

3
使用 tiktoken 计算代币

OpenAI 模型有代币限制。有时,在将文本传递给 API 之前,需要计算字符串中的标记数量,以避免超出限制。

一项需要计算 token 数量的技术是“检索增强生成”,它通过在文档语料库上运行搜索(或嵌入式搜索)来回答用户的问题,提取最可能的内容并将其包含在文档中提示作为上下文。

成功实现此模式的关键是在令牌限制中包含尽可能多的相关上下文,因此您需要能够计算令牌的数量。

OpenAI 提供了一个名为 tiktoken 的 Python 库(https://github.com/openai/tiktoken)来实现此功能。

如果您深入研究该库,您会发现它当前包含五种不同的分片方案:r50k_base、p50k_base、p50k_edit、cl100k_base 和 gpt2。

其中,cl100k_base 是最相关的,它是 GPT-4 和当前 ChatGPT 使用的 gpt-3.5-turbo 经济模型的标记器。

text-davinci-003 使用 p50k_base。模型和分词器的完整映射可以在 tiktoken/model.py 的 MODEL_TO_ENCODING 字典中找到。

以下是如何使用 tiktoken 的代码示例:

import tiktoken
encoding = tiktoken.encoding_for_model("gpt-4")# or "gpt-3.5-turbo" or "text-davinci-003"tokens = encoding.encode("Here is some text")token_count = len(tokens)

Token 现在将是一个包含四个整数令牌 ID 的数组 - 在本例中为 [8586, 374, 1063, 1495]。

使用.decode()方法将令牌ID字段转换回文本:

text = encoding.decode(tokens)# 'Here is some text'

第一次调用encoding_for_model()时,将通过HTTP从openaipublic.blob.core.windows下载编码数据。 net Azure Blob 存储桶(存储桶)(代码:https://github.com/openai/tiktoken/blob/0.4.0/tiktoken_ext/openai_public.py)。这些数据缓存在临时目录中,但如果计算机重新启动,该目录将被清除。您可以通过设置 TIKTOKEN_CACHE_DIR 环境变量来强制使用更持久的缓存目录。 ?主要功能:首先,它可以计算文本输入中的标记数量,其次,它可以将文本截断为指定的标记数量。

可以计算给定文本中的标记数量:

# Count tokensecho -n "Count these tokens" | ttok# Outputs: 3 (the newline is skipped thanks to echo -n)
# Truncationcurl 'https://simonwillison.net/' | strip-tags -m | ttok -t 6# Outputs: Simon Willison’s Weblog
# View integer token IDsecho "Show these tokens" | ttok --tokens# Outputs: 7968 1521 11460 198

使用 -m gpt2 或类似选项来选择使用适合不同模型的编码。

5
令牌生成过程

一旦您了解了令牌,GPT 生成文本的方式就会变得更加清晰。

观察到 GPT-4 将其输出流式传输到独立的代币(GPT-4 比 3.5 版本稍慢,这使得更容易观察其生成过程)是特别有趣的。

以下是使用我的 llm CLI 工具 (https://github.com/simonw/llm) 使用命令 llm -s 'Five name for a pet pelican' - 4:

GPT模型tokenization(词元化)工作原理揭示

如您所见,非字典名称(例如“Pelly”)占用更多令牌,而“Captain Gulliver”整体发出“Captain”令牌。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门