以下是关于增量预训练的相关内容:
Atom 系列模型的预训练:
GPT 助手的预训练:
Atom系列模型包含Atom-7B和Atom-13B,基于Llama2做了中文能力的持续优化。Atom-7B和Atom-7B-Chat目前已完全开源,支持商用,可在Hugging Face仓库获取模型:https://huggingface.co/FlagAlpha[heading6]大规模的中文数据预训练[content]原子大模型Atom在Llama2的基础上,采用大规模的中文数据进行持续预训练,包含百科、书籍、博客、新闻、公告、小说、金融数据、法律数据、医疗数据、代码数据、专业论文数据、中文自然语言处理竞赛数据集等,详见?数据来源。同时对庞大的数据进行了过滤、打分、去重,筛选出超过1T token的高质量中文数据,持续不断加入训练迭代中。[heading6]更高效的中文词表[content]为了提高中文文本处理的效率,我们针对Llama2模型的词表进行了深度优化。首先,我们基于数百G的中文文本,在该模型词表的基础上扩展词库至65,000个单词。经过测试,我们的改进使得中文编码/解码速度提高了约350%。此外,我们还扩大了中文字符集的覆盖范围,包括所有emoji符号?。这使得生成带有表情符号的文章更加高效。[heading6]自适应上下文扩展[content]Atom大模型默认支持4K上下文,利用位置插值PI和Neural Tangent Kernel(NTK)方法,经过微调可以将上下文长度扩增到32K。
那么,当你训练其中一个模型时,我来更具体地展示一下这看起来是什么样的。这实际上来自《纽约时报》,他们在莎士比亚作品上训练了一个小型的GPT。所以,这里有一个莎士比亚的小片段,他们在这个上面训练了他们的GPT。现在,在开始的时候,GPT以完全随机的权重开始,所以你也只能得到完全随机的输出。但随着时间的推移,当你训练GPT越来越长的时间,你会得到越来越连贯和一致的模型样本。当然,从中抽样的方式,是预测接下来会发生什么。你从这个分布中抽样,并持续地反馈到这个过程中,你基本上可以对大量的序列进行抽样。所以到最后,你会看到transformer已经学会了关于单词的知识,以及在哪里放空格,哪里放逗号等等。所以我们随着时间的推移,我们的预测越来越一致。当你在做模型预训练时,你要看的就是这种图(见下图)。实际上,我们在观察你训练时的损失函数如何随时间变化。低损失意味着我们的transformer预测正确——为序列中正确的下一个整数给出了更高的概率。那么,当我们经过一个月的训练后,我们该如何使用这个模型呢?首先,我们注意到的是,我们在这个领域,这些模型在语言建模的过程中,学会了非常强大的通用表示,而且可以非常有效地对任何你可能感兴趣的任意下游任务进行微调。举个例子,如果你对情绪分类感兴趣,过去的方法是收集一堆正面和负面的情绪,然后为此训练一个NLP模型。但新的方法是忽略情绪分类,去做大规模的语言模型预训练,训练大的Transformer,然后你只需要有少量的例子,就可以非常有效地微调你的模型进行这个任务。这种方法在实践中效果很好。其原因是Transformer在语言建模任务中被迫处理大量的任务,因为仅仅在预测下一个token的过程中,它就必须理解很多关于文本结构和其中所有不同概念的信息。
所以我们将从预训练阶段开始。现在,这个阶段在图表中比较特殊,而且这个图表不是按比例绘制的,因为这个阶段是所有计算工作基本上都发生的地方。它占用了训练计算时间和浮点运算的99%。所以,这就是我们处理互联网规模数据集的地方,超级计算机中有成千上万的GPU,并且可能需要几个月的训练时间。其他三个阶段则是微调阶段,这些阶段更多的是使用一些GPU进行几个小时或几天的训练。那么,我们来看看如何通过预训练阶段得到一个基础模型。首先,我们要收集大量的数据。这里有一个我们称之为数据混合体的例子,它来自Meta公司发布的一篇论文,论文中发布了LLaMA的基础模型。现在,你可以大致看到这些集合中涉及的数据集种类。我们有Common Crawl,它只是一个网页爬虫,还有C4,也是一个Common Crawl,然后还有一些高质量的数据集,例如:GitHub、维基百科、图书、ArXiv、StackExchange等。这些都混在一起,然后按照一定的比例进行采样,这就形成了GPT神经网络的训练集。在我们实际对这些数据进行训练之前,我们需要进行一个预处理步骤,那就是Tokenization(分词/标记化)。这基本上就是将我们从互联网上抓取的原始文本翻译成整数序列,因为这是GPT操作的原生表示方式。现在,这是一种文本片段、token以及整数之间的无损转化,这个阶段有很多算法。通常,例如,你可以使用类似于字节对编码的东西,它迭代地合并小文本块,并将它们组成token。所以,我在这里展示一些这些token的示例块,然后这就是将实际输入transformer的原始整数序列。现在,我在这里展示了两个类似的例子,这些例子是关于控制这个阶段的超参数的。