神经网络与数字一起工作。他们无法像您那样读“你好”这个词。在任何语言模型可以处理文本之前,必须将其分解为称为“令牌”的小数字片段。这个看似简单的步骤对人工智能如何理解和误解语言产生了深远的影响。
最简单的方法:将每个字符视为一个标记。 “Hello”变成 ['H', 'e', 'l', 'l', 'o'] - 五个标记。
问题?单词变成了荒谬的长序列。一篇 500 字的文章可能会变成 2,500 多个字符。由于 Transformer 模型随序列长度呈二次方缩放,因此这在计算上是残酷的。更糟糕的是,单个字符几乎没有任何意义 - 模型必须知道“c”、“a”、“t”一起表示毛茸茸的动物。
相反的极端:每个单词都是一个标记。 “The cat sat”变成了['The', 'cat', 'sat']——紧凑而有意义。
但这产生了一个不同的问题:词汇量爆炸。仅英语就有数十万个单词。添加拼写错误、技术术语和代码,词汇量就会变得难以管理。词汇表中没有的任何单词都会成为未知的 [UNK] 标记 - 理解的死胡同。
如果使用单词级标记的模型第一次遇到“ChatGPT”并且它不在词汇表中,则它变为[UNK]。这可能会如何影响模型讨论新技术的能力?
现代语言模型使用子词标记化,它位于字符和单词之间。常见的单词保持完整(“the”、“and”),而罕见的单词则被分成有意义的部分(“un”+“belief”+“able”)。
这为我们提供了可管理的词汇量(通常为 32,000-100,000 个标记),同时处理任何文本 - 甚至是模型以前从未见过的单词。
BPE 是 GPT 模型背后的算法。以下是它构建词汇表的方式:
{'h', 'e', 'l', 'o', 'w', 'r', 'd', ' '}。工作示例,文本为“低下最低”:
|步骤|最常见的配对 |新代币 |词汇量增长 | |------|--------------------|------------|------------------| | 1 |左+右|瞧| ...瞧... | | 2 |洛 + w |低| ...低... | | 3 | e + r |呃| ...呃... | | 4 |低 + e |洛| ...洛威...|
经过足够的合并后,常见单词和单词片段会自然地从数据中出现。
BPE 最初于 1994 年作为一种数据压缩算法发明。 Sennrich 等人于 2015 年将其重新用于 NLP。 - 跨学科思想的一个美丽例子。
由 BERT 和相关模型使用。与 BPE 类似,但它不是合并最频繁的对,而是合并最大化训练数据的似然的对。子词片段以 ## 为前缀(例如,“演奏”→ )。
登录 参与讨论
['play', '##ing']将输入视为原始字节流 - 没有空格的预标记。这对于日语和中文等不使用单词之间空格的语言至关重要。 GPT-4 和 LLaMA 使用 SentencePiece 风格的方法。
GPT-4 使用名为 cl100k_base 的 BPE 变体,其词汇表中包含大约 100,000 个标记。一些令人惊讶的行为:
Hello、 world - 请注意附有空格)。ind、iv、isibility - 分割稀有单词)。def hello(): → 每个关键字和符号通常都是其自己的标记。为什么语言模型使用子词标记而不是整个单词?
|词汇量|优点 |缺点 | |----------------|------|------| |小 (8k) |更小的模型,更少的嵌入 |序列越长,处理速度越慢 | |大(100k+)|更短的序列,更丰富的标记 |更大的嵌入表,更多的内存 |
找到正确的平衡是一项影响模型速度、内存和功能的工程决策。
主要针对英文文本训练的分词器是有偏见的。印地语或阿拉伯语中的同一个句子可能比英语中的对应句子需要多 3-5 倍的标记,因为这些脚本在训练数据中的代表性不足。这意味着:
为什么同一个句子在印地语中比在英语中花费更多的 API 令牌?
对 GPT-4、Claude 或 Gemini 的每次 API 调用均按令牌计费。了解标记化可以帮助您:
英语的粗略经验法则:1 个标记 ≈ 一个单词的 3/4,或大约 4 个字符。
一篇1000字的英语作文大约需要多少个token?
OpenAI 的开源 tiktoken 库可让您使用与 GPT-4 使用的完全相同的算法在本地对文本进行标记。尝试自己写作,看看您的消息真正花费了多少代币。
如果您正在为威尔士语等低资源语言构建语言模型,您将如何进行标记化以确保公平且高效的编码?