现在大模型训练数据的主力都是LLM自己贡献的了。但是也不是说你让它输出什么,然后它就一劳永逸地不停地输出你想要的东西。受限于LLM本身的能力、上下文规定的长度、训练方式导致的有限变化,你需要不断变更你的prompt,以让输出更多样。
接下来介绍SmolLM的数据生成方法
SomlLM
这是一个小模型,应该是一个base模型。是huggingface团队推出的。
他们主要的工作是数据增强,基于Cosmopedia V1数据集生成V2数据集,前者是基于网页爬取的种子数据+主题识别后,同时提供种子数据+主题,进行扩写得到的数据集。
他们一开始想一劳永逸,写一个prompt,应用到多个LLM上,根据LLM的多样性来吐出多样性的数据。然而效果不好。
所以第二个方法,使用更好的prompt策略。
首先是对Cosmopedia V1的清洗。他们抛弃了原本的主题分类,因为他们认为这些主题不能很好地反应真实世界的分类。他们选择BISAC书籍分类,这是一个包含51个大类、5000多个标签的分类。借此,他们用LLM扩写出了5000个分类下面的二级分类,从图表中粗略估算,有三万多类,与他们提供的3.4w个分类相符,也就是说他们从5000扩展到了3.4w。
生成新数据的思路很简单。按照上面图片给的例子,一个种子数据,一个主题词,一堆输出限制,然后按照种子数据和主题词进行扩写。问题是,3.4w个主题,几十万的种子数据,你好歹先确定种子属于哪个一级标签吧?不然一个体育数据+医学主题词,生成的东西四不像了。
为了找到与每个主题最相近的文档聚类,他们放弃了聚类算法,转而使用网页搜索的方法,即,把大类标题、一级标题、二级标题串起来作为搜索query,把数据库作为一个个“网页”。具体怎么搜索的不知道,但是代码里面出现了一个词:IDF。那看来就是IDF了,用基于单字的逆文档频率排序网页,然后选择其中1000个最相近的。代码里还有一个boosted_subtopic,里面把每个字符^2了,这是针对TF-IDF类搜索的,把得分平方的意思,可能与具体的搜索引擎处理方式有关,但是肯定是加权用的。搜索引擎那边会对搜索结果截断,不相关的就不返回了,所以boosted方法返回不够了,再用不加权的搜索一次,然后合并。
至此有了基于主题获得种子数据的方法。
另一个问题是,什么样的种子数据是好的?
确定这个的思路很简单。假如有A、B两组数据,风格不同,你把它们都扔进LLM里训练,看评测结果就得了。另外,如果你以后生成了数据,拿生成数据去训一版LLM,对比种子数据训出来的效果,就能知道生成的数据有没有用、够不够优秀了。
基于上述方法,作者们从Cosmopedia V1中的几个数据包里测试了:
两个 web 样本集:web_samples_v1和web_samples_v2、stories子集,stanford和openstax两个子集
这么些个数据集拿来,都训了20亿个token,epoch=4,也就是每个数据集80亿token,以测评结果作为指标,选择合适的种子数据集。
上面只是个例子,涉及到的数据集只是一个部分,实际上他们还要做关于教育和代码的数据集生成。对于教育部分,他们有课文的数据集,但是选择生成的口吻是一个问题:你是生成说话像小学生的数据,还是中学生,还是大学生?核心问题是,你生成的数据,** 受众是谁?**
也不好说哪个好,只能都生成,然后看一下效果。结果是中学生、大学生各有千秋。实际上他们也不会把所有受众都罗列出来测一遍,那怕是要写几十个了。最终决定的受众比例是:40中学生,30大学生,剩下的受众瓜分剩下的30,还有Cosmopedia v1 中 stories、stanford 等数据集的课文风格。
总结一下。上面3.4万个主题,结合种子数据,每个主题生成1000条数据,这是3400w条文章数据。还有500w条涉及代码、故事、课本。总token数到达28B,就是280亿token,平均一条数据小1000个token呗。
以上就是SmolLM数据生成的大概内容。还有后续关于教育性的代码、网页内容的筛选机制报告,大概就是通过llama70b-instruct对数据的教育性按1~5分评分,拿着这个数据去训练一个reward model,再去过滤脏数据。细节看这里