文件名 pretrain基础-来源公众号.md

pretrain基础-来源公众号

正文

开源数据集:FineWeb、pile、Skypile、RedPajama,但开源的肯定多少有不干净的数据。

prompt不算loss,可以随便写,但answer算loss,每一个标点符号都不能错。

数据爬取

找数据商家买,自己爬容易出事。

高质量的数据往往是论文、书籍等pdf格式,需要借助pdf2text工具。不能用python库,表格、公式识别效果不好。尽可能花钱买pdf2text服务,或者自己训ocr模型。gpt4的价格 可能大于 买pdf2text服务。

知识密度概念

数据的知识密度是有差异的。“唐诗三百首”的知识量要远远大于“中国新闻网的三百篇新闻”。高密度知识比较贵

可以使用“手动合成高知识密度数据”技术,把几千字的新闻概括成几百字喂给模型,四舍五入也等于训练速度提高了十倍。

数据清洗打分器清洗

利用gpt4模型对数据质量进行打分是数据清洗的标配。但是,任何打分模型对code、markdown、latex都会打很低的分数,必须提取摘出来,不然这类数据全没了。

同等 size 下,BERT 结构的模型的表征能力是强于 transformer-decoder 模型,因此打分模型最好还是从 BERT 家族中选一个来训,效果好、速度还快。

启发式规则清洗

规则示例:数据长度是否少于某个值,数据中某个 token 的比例超过某个阈值,数据的 zh 占比、en 占比、数字占比,数据是否有“http”字段,数据是否包含了“新冠”、“疫情”等低质量关键词,数据是否包含某些反动词汇,数据是否包含某些黄色字眼。

数据脱敏

尽可能的把训练数据中涉及到的人名、电话号码、邮箱等剔除出去,一旦被模型说出来,就构成了隐私侵犯。还有”转载自,删掉,黄色信息,反动信息,references”。

数据去重

一般都是对T级别的数据去重。

去重的数据特征可能是:网页A引用网页B,网页B引用网页C,因此A、B、C只保留一个就行。同时还有,同一篇文章在知乎、CSDN、博客等发布。

能对sentence去重就不要对document去重,但工作量剧增。

去重一定有大数据处理集群,Hadoop、spark等。

去重算法:minhash,gpt就能写。

需要 10T 训练数据,去重相似度设为80%,5T的话 ,去重相似度设为90%

如果去重不彻底,一篇文章重复出现,可以间隔多个token降低影响。

不同类别数据阈值不同,“新闻”类可能 70% 的重复度就不要,“知识”类则可以 85% 的相似度才丢弃,在丢去重复文档的时候,优先保留数据打分器比较高的数据。

数据配比

假设数据集已经用分类器(gpt4、bert、人工)划分为不同类别,如新闻、百科、代码、markdown、等。

数据配比,基本上都是“知识 + 代码 + 逻辑”三个大类目。其中知识数据分文中文知识和英文知识,逻辑数据则可以认为是 math 数据和 cot 数据的混合体。

整体上,大部分中文模型的配比都在这个区间 -> [中:英:code] = [4:4:2](逻辑数据的比例我没有写进去,加入多少取决于你能收集多少,其他三类数据应该是要多少有多少的存在)。

可以根据实际情况调整,但英文数据不能太低,且一般中文数据质量远低于英文数据。原因可能为:

1.中文确实比英文难学,语言空间的复杂度更高;

2.中文语料无论是干净程度还是数量级,都无法与英文语料相比较。

数据多样性prompt 表达方式多样性,不要千篇一律的“把中文句子 A 翻译成英文”,也要适当有一些“我在英国旅游,我现在需要向路人问路,我想表达 A 的意思,该怎么说”,“我是一个英文老师,我需要向我的学生讲解句子 A 用英文怎么写,请你用最正宗的表达方式帮我完成。”这么做的目的是防止模型只认识 prompt 中的几个关键 token,进而导致训练过拟合或者泛化性变差;

对于每种 task_type 的数据量,别搞平均主义:难 task_type 就数据多点,简单 task_type 就数据少点。

prompt 长度均衡,既要有短数据,也要有长数据,避免模型的 attention 退化到无法聚焦长 prompt。长数据还不只是字面意思的长,要有那种关键信息藏在 【开头 / 中间 / 结尾】 的各种数据场景,避免模型在训练时偷懒,只对 prompt 的起始 token 或结束 token 有 attention;

answer 长度均衡。不能让模型没出输几个 token 就停止,适当的有一些语料让它学会输出尽量长的 answer,否则模型会很难 follow “不少于2000字” 这种指令;

多轮聊天的切换 主题 能力。有的数据当前 query 是和 session 有关系的,有的数据则是当前 query 和 session 毫无关系,要让模型自己学会判断 query 是否和 session 有关。类似的数据还要有 system 是否生效,有些数据 system 是个摆设,有些数据的 answer 则和 system 直接相关;

answer 分布的多样性这最重要,千万别总共一万条训练数据,一千条数据的 answer 都说同一句话,answer 可是算 loss 的,太单一的话会严重让模型过拟合;

数据中要有一些鲁棒性数据。 answer 很正常,但 prompt 表达很差劲的训练语料 。prompt 差指的是,它或者是有错别字,或者是话没说完整,亦或者是中文英文拼音夹杂着表达。不用担心会破坏模型效果,毕竟 prompt 根本不算 loss,这么做的目的是适应线上用户的糟糕表达,没有一个用户会希望听到“不是我们的模型不行,而是你 prompt 写的不行”这种观点(糟糕 prompt 的理解能力,感觉国内模型和 GPT4 的差距挺大的)。

复杂数据——不少于多少字。先射箭,再画靶。你搞了一个很复杂的 prompt ,但模型的回答没有遵循复杂指令。直接去修改 prompt,原本的 prompt 要求模型输出不少于 200 字,实际上只输出了 189 个字,那就把 prompt 改成不少于 180 字。