在最近的一项实验中,研究者对 16 个语言模型使用不同的语料进行了预训练和微调。这次实验使用了 NanoGPT, 一种小规模的架构(基于 GPT-2 SMALL),训练了 12 个模型,NanoGPT 网络架构的配置为:12 个注意力头、12 层 transformer, 词嵌入维度为 768,进行大约 400,000 次迭代(大约 10 个 epoch)。然后在 GPT-2 MEDIUM 上训练了 4 个模型,GPT-2 MEDIUM 架构的设置为 16 个注意力头、24 层 transformer, 词嵌入维度为 1024,并进行 600,000 次迭代。所有模型均使用 NanoGPT 和 OpenWebText 数据集进行预训练。微调方面,研究者使用了 baize-chatbot 提供 的指令数据集,分别在两类模型里补充了额外的 20,000 和 500,000 个「字典」条目。
未来,研究者计划发布代码、预训练模型、指令调整模型和微调数据集。
不过,这 16 个模型仅在预训练阶段就要在 8 个 GPU 上累计运行 147 天(单个 GPU 要使用 1,176 天),成本为 8,000 美元。因为没有 GPU 赞助商(这是一个免费的开源项目),出于成本考虑,虽然还存在进一步对研究内容完善的空间,但是研究者目前没有继续进行下去。
研究结果可总结为:
- 编码方式上,TokenMonster(550256-strict-nocapcode)词表在所有指标上都比 GPT-2 Tokenizer 和 tiktoken p50k_base 表现更好。
- 最佳词表规模为 32000。
- 词表越简单,模型收敛得越快,但收敛后不一定会产生更好的结果。
- 字词比(每个 token 对应的平均字符数)增加,不会单独对模型质量产生负面影响。
- 单个 token 对应多个单词的词表对 SMLQA(真值)基准有 5% 的负面影响,但对字词比要高 13%。
- 带有 Capcode 的词表的话,模型需要更长的时间来学习,但一旦模型收敛,似乎不会在任何方向上会对 SMLQA(真值)或 SQuAD(Data Extraction)基准产生影响。
- 在比较不同的分词器时,验证损失和 F1 都是无意义的指标。
- 分词器的缺陷和复杂性对模型学习事实能力的影响大于对模型学习语言能力的影响。
根据实验结果,englishcode-32000-consistent 的结果是最好的。然而,如上所述,当使用在单个 token 对应多个单词的 TokenMonster 时,SMLQA( Ground Truth)的准确性和字词比之间会存在一种权衡,这增加了学习曲线的斜率。研究者坚信,通过强制 80% 的 token 对应一个单词,20% 的 token 对应多个单词,可以最大限度地减少这种权衡,实现 “两全其美” 的词表。研究者认为这种方法在性能上与 one-word 词表相同,同时字词比还能提高约 50%。
再详细地解释一下 “分词器中的缺陷和复杂性对模型学习事实的能力的影响大于对其语言能力的影响” 这句话的含义:
这种现象是训练过程中发现的一个有趣的特征,从模型训练的工作方式去思考,也能说得通。研究者没有证据证明其推理是合理的。但从本质上讲,因为在反向传播过程中,语言的流畅性比语言的事实性(它们是极其微妙和依赖上下文的)更容易纠正,这意味着分词器效率若有任何提高,与事实性无关,都会产生直接转化为信息保真度提高的连锁反应,如在 SMLQA(Ground Truth)基准中所见。简单地说:一个更好的分词器就是一个更真实的模型,但不一定是一个更流畅的模型。反过来说:一个拥有低效分词器的模型仍然能学会流利地写作,但流利性的额外成本会降低模型的可信度。
词表规模的影响
在进行这些测试之前,本文研究者认为 32000 是最佳词表规模,实验结果也证实了这一点。50256-balanced 的性能仅比 SMLQA(Ground Truth)基准上的 32000-balanced 好 1%,但是模型的尺寸却大了 13%。理想情况下,本文在基于 MEDIUM 的多个模型中,通过分别在规模为 24000、32000、50256 和 100256 的词表中进行如上所述的二八开划分方法,来明确证明这一观点。
优化模式的影响
研究者对 TokenMonster 下特定的三种优化模式 balanced, consistent 和 strict 进行了测试。不同的优化模式会影响标点符号以及 capcode 与单词 token 的组合方式。研究者最初预测 consistent 模式会表现得更好(因为不那么复杂),虽然字词比(即 character 与 token 的比值)会略低。
实验结果似乎证实了上述猜想,但是研究者也观察到了一些现象。首先,在 SMLQA(Ground Truth)基准上,consistent 模式似乎比 balanced 模式的效果好约 5%。然而,consistent 模式在 SQuAD(Data Extraction)基准上的表现明显较差(28%)。但是,SQuAD 基准表现出很大的不确定性(重复运行的结果不同),也不具有说服力。研究者并没有对 balanced 与 consistent 测试至收敛,所以这可能只代表 consistent 模式更容易学习。事实上,consistent 可能在 SQuAD(数据提取)上做得更好,因为 SQuAD 更难学习,也不太可能产生幻觉。
这本身就是一个有趣的发现,因为它意味着将标点符号和单词合并到一个 token 中并不存在明显的问题。迄今为止,所有其他分词器都认为标点符号应与字母分开,但从这里的结果可以看出,单词和标点符号可以合并到一个 token 中,不会有明显的性能损失。50256-consistent-oneword 也证实了这一点,这个组合与 50256-strict-oneword-nocapcode 的性能相当,而且优于 p50k_base。50256-consistent-oneword 将简单的标点符号与单词 token 合并在一起(而其他两个组合则不是这样)。
在此之后,启用 capcode 的 strict 模式会带来显著的不利影响。50256-strict-oneword-nocapcode 在 SMLQA 上得分 21.2,在 SQuAD 上得分 23.8,而 50256-strict-oneword 的得分分别为 16.8 和 20.0。原因很明显:strict 优化模式阻止 capcode 与单词 token 的合并,导致需要更多的 token 来表示相同的文本,直接结果就是字词比降低了 8%。事实上,比起 strict,strict-nocapcode 更类似于 consistent。50256-consistent-oneword 和 50256-strict-oneword-nocapcode 在各个维度的指标中都几乎相等。
最终的结论是,在大多数情况下,模型在学习包含标点符号和单词的 token 的含义方面没有任何困难。也就是说,与 balanced 模型相比,consistent 的语法准确性更高(语法错误更少)。综合考虑,研究者建议大家使用 consistent 模式。strict 只能在禁用 capcode 的情况下使用。
对语法准确性的影响
如上所述,与 balanced 模式相比,consistent 模式的语法准确性更高(语法错误更少)。这反映在字词比和语法之间存在非常轻微的负相关,如下图所示。除此之外,最值得注意的一点是,同样与 TokenMonster 的 50256-strict-oneword-nocapcode (98.6% 和 98.4%)相比,GPT-2 分词器和 tiktoken p50k_base 的语法结果都很糟糕(分别为 98.1% 和 97.5%)。研究者最初认为这只是巧合,但多次采样都会得到相同范围的结果。至于原因是什么尚不清楚。
对 MTLD 的影响
MTLD 用于表示生成样本文本的语言多样性。它似乎与 n_embed 参数高度相关,而与词汇量大小、优化模式或每个 token 的最大字数等特征无关。这一点在 6000-balanced 模型(n_embd 为 864)和 8000-consistent 模型(n_embd 为 900)中表现得尤为明显。
在中型模型中, p50k_base 的 MTLD 最高,为 43.85,但语法得分也最低。造成这种情况的原因尚不清楚,但研究者猜测可能是训练数据的选择有些奇特。
对 SQuAD 的讨论
SQuAD 基准测试的是模型从一段文字中提取数据的能力,具体做法是提供一段文字,然后提出一个问题,答案需包含在该段文字中。测试结果没有太大意义,没有明显的模式或相关性,包括模型总的参数。事实上,拥有 9100 万参数的 8000-balanced 模型在 SQuAD 中的得分要高于拥有 35400 万参数的 50256-consistent-oneword。造成这种情况的原因也许这种风格的例子不够多,也许在指导微调数据集中有太多的 QA 对。或者,这只是一个不太好的基准。
对 SMLQA 的讨论
SMLQA 基准通过提出具有客观答案的常识性问题来测试 "真值",例如 "哪个国家的首都是雅加达?" 和 "《哈利 - 波特》系列丛书是谁写的?"。
值得注意的是,参考用的分词器 —— GPT-2 Tokenizer 和 p50k_base 在该基准测试中表现相当出色。研究者最初以为浪费了几个月的时间和几千美元,却证明了 tiktoken 比 TokenMonster 有更高质量的性能。但事实证明,问题与每个 token 对应的字数有关。这一点在 "中等"(MEDIUM)模型中体现得最为明显,如下面的图表所示。
单字词表的性能略好于 TokenMonster 默认的每个 token 对应多个字的词表。
另一个重要的观察结果是,当词汇量低于 32,000 个时,即使调整模型的 n_embd 参数以弥补模型规模的缩小,词汇量也会直接影响真值。这是有悖直觉的,因为研究者本以为 n_embd 为 864 的 16000-balanced(参数为 1.2134 亿)和 n_embd 为 900 的 8000-consistent(参数为 1.2386 亿)会比 n_embd 为 768 的 50256-consistent(参数为 1.2359 亿)做得更好,但事实并非如此 — 两者的表现都差得多(13.7 和 15.1 对比 50256-consistent 的 16.4)。不过,这两个 “调整后” 的模型都接受了相同的时间来训练,这恰好导致预训练的次数显着减少(尽管时间相同)。
具有 12 层注意力头、12 层 transformer 层的小模型
研究者在默认的 NanoGPT 架构上训练了 12 个模型,该架构基于 12 个注意力头和 12 层的 GPT-2 架构,嵌入参数大小为 768。这些模型都没有训练到收敛,通俗地说,就是没有训练到最大的学习能力。模型的训练经历了 400,000 次迭代,而要想具有最大学习能力似乎需要 600,000 次迭代。造成这种情况的原因很简单,一是预算问题,二是收敛点的不确定性。
小模型的结果:
小模型的皮尔逊相关性:
小模型的结论:
1. 32,000 是最佳词汇量。从词汇量 8,000 到 32,000 的阶段中:增加词汇量可以提高模型的真值准确度。将词汇量从 32,000 增加到 50,257 时,模型的总参数也相应增加,但对真值准确度的提高只有 1%。超过 32,000 后,收益迅速减少。
2. 糟糕的分词器设计会影响模型的正确性,但不会影响语法正确性或语言多样性。在 90M - 125M 的参数范围内,语法规则更复杂的分词器(如 token 对应对应多词、词和标点符号的组合 token、capcode 编码 token 和减少总词汇量)在真值基准上的表现比简单的分词器要差。不过,分词器设计的这种复杂性并没有对生成文本的语言多样性或语法正确性产生显著的统计学影响。即使是一个紧凑的模型,如参数为 9000 万的模型,也能有效地利用更复杂的 token。更复杂的词汇需要更长的学习时间,从而减少了获取与基本事实相关信息的时间。由于这些模型都没有经过完整的训练,因此进一步训练以缩小性能差距的潜力还有待观察。
3. 验证损失不是比较使用不同分词器的模型的有效指标。验证损失与给定分词器的字词比(每个 token 对应的平均字符数)具有非常强的相关性(0.97 皮尔逊相关性)。要想比较分词器之间的损失值,测量相对于字符而非 token 的损失可能更有效,因为损失值与每个 token 对应的平均字符数成正比。
4. F1 分数不是评估语言模型的合适指标,这些语言模型被训练成生成可变长度的响应(用文本结束 token 来表示完成)。这是由于文本序列越长,F1 公式的惩罚越严重。F1 评分倾向于产生较短响应的模型。
5. 所有模型(从 90M 参数开始),再加上所有测试的分词器(大小从 8000 到 50257 不等),都证明了对其进行微调以产生语法连贯的答案的能力。虽然这些反应往往是不正确的或幻觉的,但都较为连贯,并表现出对上下文背景的理解能力。
6. 当 embedding 大小增加时,生成文本的词汇多样性和语法准确性显著增加,并且与字词比呈微微的负相关。这意味着,具有较大字词比的词汇会使学习语法和词汇多样性稍微困难一些。
7. 在调整模型参数大小时,字词比与 SMLQA(Ground Truth)或 SQuAD(Information Extraction)基准之间没有统计学上显著相关性。这意味着具有更高字词比的分词器不会对模型的性能产生负面影响。
8. 与 “balanced” 相比,“consistent” 类的词表在 SMLQA(Ground Truth)基准上的表现似乎稍好,但在 SQuAD(Information Extraction)基准上则差得多。尽管还需要更多的数据来证实这一点。
具有 16 层注意力头、24 层 transformer 层的中模型
在对小型模型进行训练和基准测试后,研究者明显发现,衡量的结果反映的是模型的学习速度,而不是模型的学习能力。此外,研究者没有优化 GPU 的计算潜力,因为使用的是默认的 NanoGPT 的参数。为了解决这个问题,研究者选择使用有着 50257 个 token 的分词器及中等语言模型,对四种变体进行了研究。研究者将 batch 的大小从 12 调整到 36,并将 block 的大小从 1024 缩减到 256,确保充分利用了 24GB GPU 的 VRAM 功能。然后进行了 600000 次迭代,而不是小模型中的 400000 次。每种模型的预训练平均需要 18 天多一点的时间,是小模型需要的 6 天的三倍。
对模型进行收敛训练确实显著降低了更简单词汇表和更复杂词汇表之间的性能差异。SMLQA(Ground Truth)和 SQuAD(Data Extration)的基准结果非常接近。主要区别在于 50256-consistent 有着比 p50k_base 高 23.5% 的字词比的优势。不过,对于每个 token 对应多个单词的词表来说,真值的性能代价较小,不过这可以用我在页首讨论的方法来解决。
中模型的结果:
在 560000 次迭代之后,所有模型都开始收敛,如下图所示:
后续展望
下一阶段将使用 englishcode-32000-consistent 来训练和基准测试 MEDIUM 的模型,该词汇表具有 80% 的单词 tokentoken 和 20% 的多词 token。