增量预训练典型问题
- 训练过程中loss偶尔出现突刺。
可以同时监控模型训练过程中的grad norm数值,如果grad norm也同步发生跳变,那么说明模型在此阶段的学习不平稳,可能是因为训练数据的质量较差,模型难以学习,建议对训练数据进行再次更为精细的加工。
- 训练loss逐步降到0。
可能是模型训练轮数过多,产生过拟合现象,应减少训练轮次。通常来说预训练的训练轮次在1-2之间即可,不需要训练太多轮次。
- 模型loss迟迟不下降,或隐约有上升的趋势。
可能是学习率设置的过大,导致模型在训练初期就已经偏离最优路线,难以学到最优点。建议减小学习率重新训练。
- 训练初期loss波动较大,grad norm的值也较大。
可能是模型warmup的步数太少。由于训练初期Adam优化器的动量参数需要重新设定,所以初期的loss波动较大,因此需要warmup来进行缓解,随着数据量的增加,模型的warmup步数也应该随之增加。
- 训练过程中loss波动较大。
如果loss的上下波动较大,可以检查训练过程中的Batch Size设置是否合理,可以适当增加Batch Size的大小来让模型的训练过程更加平稳。
无监督的领域知识数据,量级无法支持增量预训练,如何让模型学习
一般来说,建议采用增量预训练的方式让模型学习领域知识,但预训练对数据量的要求较大,如果您的无监督文档量级过小,达不到预训练要求,您可以通过一些手段将其转换为有监督数据,再将转换后的领域知识与目标任务数据混合,使用微调的方式让模型学习。
这里提供了一些将无监督数据转换为有监督数据的方案,供您参考:
- 基于规则构建:您可以通过采用一些简单的规则来构建有监督数据。比如:
表1 采用规则将无监督数据构建为有监督数据的常用方法 规则场景
说明
文本生成:根据标题、关键词、简介生成段落
若您的无监督文档中含义标题、关键词、简介等结构化信息,可以将有监督的问题设置为“请根据标题xxx/关键性xxx/简介xxx,生成一段不少于xx个字的文本。”,将回答设置为符合要求的段落。
续写:根据段落的首句、首段续写成完整的段落
若您的无监督文档没有任何结构化信息,可以将有监督的问题设置为“以下是一篇文章的第一个句子:xxx/第一段落:xxx。请根据以上的句子/段落,续写为一段不少于xx个字的文本。”,再将回答设置为符合要求的段落。
扩写:根据段落的其中一句或者一段续写成完整的段落
若您的无监督文档没有任何结构化信息,可以将有监督的问题设置为“以下是一篇文章的某个句子:xxx/某个段落:xxx。请根据以上的句子/段落,扩写成一段不少于xx个字的文本。”,再将回答设置为符合要求的段落。
填空:从段落随机掩盖一个或多个词语、句子、段落,再将段落完形填空
若您的无监督文档没有任何结构化信息,可以将有监督的问题设置为“以下的文章中有一些词语/句子/段落缺失,文章如下:xxx。请结合文章内容,将缺失的信息补充完整。”,再将回答设置为符合要求的信息。
使用规则构建的优点是快速且成本低,缺点是数据多样性较低。
- 基于大模型的数据泛化:您可以通过调用大模型(比如盘古提供的任意一个规格的基础功能模型)来获取有监督场景。一个比较常见的方法是,将无监督的文本按照章节、段落、字符数进行切片,让模型基于这个片段生成问答对,再将段落、问题和答案三者组装为有监督数据。使用模型构建的优点是数据丰富度更高,缺点是成本较高。

当您将无监督数据构建为有监督数据时,请尽可能保证数据的多样性。比如:不要将所有文本都构建为单一的续写场景,一个比较好的经验是,将不同文本构建为不同的场景,甚至将同一段文本构建为多个不同的场景。
不同规格的模型支持的长度不同,当您将无监督数据构建为有监督数据时,请确保数据长度符合模型长度限制。