English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

访客
1 / ?
返回课程列表

分词器吃什么就知道什么

分词器饮食:定义

Harris 分词器在语料库样本上训练。它对该样本进行分布分析,选择最强烈重复出现的 N 个片段,并将它们写入词汇表。训练后,这些 N 个片段成为语言模型用于一切的固定字母表:训练、推理、每个输入、每个输出。


分词器饮食 = 分词器训练的文本样本。


训练饮食 = 语言模型训练的语料库。


当两种饮食不同时,分词器会学习针对模型将永不见到的文本的片段。嵌入容量(词汇表每个条目一个槽位)被花费在训练期间无法获得奖励的片段上。


分词器饮食与饱和度


ANDREA-12M的错误

ANDREA-12M 使用原始的 megachat-v8.txt 文件训练其 Harris 分词器。该文件包含代码样本和工具调用数据。然而,训练课程排除了代码和工具调用;ANDREA-12M 只看到了对话文本。


结果:分词器从 Python 关键字、JSON 大括号、shell 标志中学习了片段。一个在词典条目和对话上训练的模型。仅有 36.4% 的片段与课程加权样本重叠。 剩余 63.6% 的词汇槽位被分配给了模型在训练时永远不会遇到的片段。


为什么重要

每个词汇条目消耗嵌入参数:嵌入矩阵的一行,形状为 V × d_model(在活动 4 中介绍)。在 V = 4353 和 d_model = 384 时,每个词汇槽位成本 384 个浮点数。浪费 63.6% 意味着将嵌入矩阵的 63.6% 浪费在模型从未见过的数据上。

陈述饮食规则

用一句话解释分词器饮食规则。然后描述一个最坏情况:一位研究人员使用 Wikipedia(正式散文、引用)训练 Harris 分词器,但使用 Twitter(俚语、表情符号、标签)训练模型。会出什么问题?

N 应该多大

词汇科学扫描

ANDREA-120M 进行了一个词汇科学实验:在相同的 1.25B 字符火hose 语料库上,以不同 N 值(请求的片段数)训练 Harris 分词器。测量分词器实际找到的片段数。绘制结果。


请求的 N实际找到的片段数状态
2,0482,048未饱和(有增长空间)
4,0964,096未饱和
8,1928,192饱和点
16,38413,106语料库耗尽

饱和的含义

在小的 N 值时,语料库中有大量重复模式;分词器可以填满它请求的每个槽位。在大的 N 值时,分词器用尽了统计上有意义的边界。一个 1.25B 字符的语料库在大约频率阈值以上包含粗略 13,106 个不同的语素形状片段。请求 16,384 个只会得到 13,106 个;剩余的 3,278 个槽位会被填充或留空。


饱和点:请求的 N = 发现的 N 的点。 超过饱和点,分词器无法发现更多片段,而不稀释质量(降低频率阈值并接受噪声)。


8192 的甜蜜点

ANDREA-120M 选择了 N = 8192。理由如下:


- 低于 8192(例如 4096):词汇表未充分捕捉常见语素;序列碎片化为更多令牌;吞吐量下降。

- 在 8192 时:每个段槽映射到语料库中的一个真实、循环模式。

- 超过 8192:收益递减;13,106 < 16,384 意味着槽位被浪费。


最终 ANDREA-120M 词汇表:256 + 8192 + 1 = 8449 个 token。平均压缩率:每个 token 5.91 个 UTF-8 字节,意味着每个 token 替换约 5.9 字节的原始文本。该比率决定了模型的有效上下文:在 1024 个 token × 5.91 字节/token 下,ANDREA-120M 每次前向传播读取大约 6,050 个字符的上下文。

饱和点以上或以下

假设一位研究人员为未来的 ANDREA 模型考虑两个 N 值:N = 6144(低于饱和)与 N = 12288(高于饱和,其中实际发现的段数 = 13106 仍然适用,因为语料库固定)。对于每个值:(a) 计算最终词汇表大小 (256 + N + 1),& (b) 用一句话说明每个设置是否浪费词汇容量、捕获所有可用信号,或欠捕获。展示你的计算过程。

63.6% 的来源

统计浪费的槽位

ANDREA-12M 的分词器在原始 megachat-v8.txt 上训练(请求 4096 个片段,已找到)。团队抽样了一个课程加权的子集:根据每个来源被 bandit 拉取的频率加权的语料库。他们在该加权样本上重新运行了 Harris 分析,并询问:原始 4096 个片段中有多少仍然出现?


结果:36.4% 重叠。4,096 个片段中有 1,491 个匹配课程加权。剩余 2,605 个片段来自模型排除的来源。


模型从未见过字节占用了 63.6% 的词汇槽位。


嵌入成本

每个词汇表条目占用嵌入矩阵一行,形状为 (V, d_model)。对于 ANDREA-12M:


- V = 4353 (256 + 4096 + 1)

- d_model = 384

- 嵌入参数 = V × d_model = 4353 × 384 = 1,671,552 个参数


这些参数中有 63.6% 未用于对话训练。1,063,107 个参数分配,0 奖励信号。ANDREA-12M 存活下来是因为 256 个基础字节总是能覆盖任何字符;但每个参数的容量急剧下降。


ANDREA-120M 如何修复它

ANDREA-120M 的分词器在饱和 N = 8192 的完整火hose(1.25B 字符,21 个来源)上训练。训练语料库 = 相同的火hose。饮食对齐:100%。在聊天加权样本上的重叠结果:36.5%。(注意:36.5% 是重叠,不是覆盖率;聊天仅是完整火hose 的子集,因此这个数字与 12M 的 36.4% 表现不同。)


有效压缩:每个 token 5.91 个 UTF-8 字节。ANDREA-120M 的嵌入矩阵:8449 × 768 = 6,488,832 个参数。每个参数都获得了奖励信号,因为每个片段都映射到模型实际训练的文本。

覆盖率 与 重叠

ANDREA-120M 的分词器语料库与其训练语料库匹配。然而,“聊天加权样本上的片段覆盖率”仍为 36.5%,类似于 12M 的 36.4%。为什么 120M 的 36.5% 不是问题,而 12M 的 36.4% 是问题?使用一个关于哪个子集是哪个的短语。

为什么每令牌 5.91 字节很重要

压缩比率

平均 UTF-8 每令牌字节数衡量每个词汇条目压缩了多少原始文本。ANDREA-120M 平均为 5.91。具有较短片段(3 字节/令牌)的模型在前向传播中读取较少的上下文;具有较长片段(8 字节/令牌)的模型读取更多但训练更慢(每个片段需要更多样本来学习好)。


有效上下文


数量
Token 上下文窗口1,024 个 token
平均每个 token 的字节5.91
有效字符上下文1024 × 5.91 ≈ 6,050

大约 6,000 个 UTF-8 字符适合一个 ANDREA-120M 前向传播。一页密集的英语散文大约有 ~3,000-4,000 个字符;ANDREA 每次传播读取大约一页半。


饮食收紧压缩

良好对齐的分词器压缩得更好。当分词器学习到训练语料库中反复出现的片段时,每个标记能容纳更多文本。ANDREA-12M 的对齐不良分词器在聊天文本上压缩更差(因为聊天片段在词汇表中更稀疏,因此在字节回退片段上花费更多字节)。ANDREA-120M 的饮食对齐分词器将聊天形状的片段保持在快速路径上,并将稀有脚本置于字节回退。


活动 4 继续

活动 4 (grow_a_language_model_embeddings) 涵盖了那些 8449 个词汇表条目会发生什么:它们成为形状为 V × d_model 的嵌入矩阵的行,然后在流入第一个 transformer 块之前添加学习的位置嵌入。

选择一个 N

反思一个权衡:未来的 ANDREA 模型应该使用 N = 4096(训练更快,每令牌更多字节 = 有效上下文更长)还是 N = 16384(更长但更罕见的片段,每段文本更少令牌,但饱和后浪费槽位)?选择一个并给出 一个句子理由。没有错误答案。