【LLM】预训练的具体流程
我们想用一个已经学会英语的模型,通过中文数据继续训练它,同时用分词器把中文句子拆成小单元,让模型更容易理解中文。
分词器训练
-
预训练模型:就像你已经学会了一些基础知识的“大脑”,我们可以在这个基础上继续学习新东西。比如,有些模型已经学会了英语,但中文学得不够好。
-
中文预训练:为了让这个“大脑”更好地理解中文,我们需要用大量的中文数据继续训练它。
-
分词器(Tokenizer):它的作用是把一句话拆分成一个个小单元(比如词语或字)。比如,“我喜欢学习”会被拆成“我/喜欢/学习”。这些拆分后的单元会被转换成数字,方便模型理解。
-
BPE/WordPiece:这是两种常用的拆分方法,可以把不常见的词拆成更小的部分,比如“学习”可能被拆成“学/习”,这样模型能更好地处理新词。
总结:我们想用一个已经学会英语的模型,通过中文数据继续训练它,同时用分词器把中文句子拆成小单元,让模型更容易理解中文。
分词器训练 – 切词技巧
-
数字处理:需要设计合理的规则,避免模型对数字的理解出错(比如把“9.9 > 9.11”理解成错误的结果)。
-
词典大小控制:
- Token(分词单元)可以代表多个汉字,词典大小会影响模型性能。
- 词典太大,解码效率低;词典太小,压缩率高,可能丢失信息。
- 中文模型中,通常每个 token 对应 1.5 个以上的字符。
-
手动调整:可以根据任务需求,灵活调整 token 的设置,比如让模型更适合处理中文。
-
任务设计:在训练时,可以加入特定领域的词汇(比如医疗、法律等),让模型在特定领域表现更好。
-
语料质量:高质量的训练数据非常重要,尤其是在特定领域,需要关注业务需求。
-
词汇表和嵌入层的关系:Tokenizer 的词汇表大小要和模型的 embedding 层大小匹配,并预留一些空间,方便后续增加新词汇。
总结:分词器的设计需要平衡词典大小、压缩率和任务需求,同时关注数字处理、领域词汇和语料质量,确保模型在中文任务中表现更好。
词表扩展
- 问题:原来的词表(比如LLaMA的词表)可能缺少一些中文词汇,或者对中文的切分方式不够好。如果词表中没有某个词,模型就无法计算它的损失(loss),导致效果不好。
- 解决方法:比如【Chinese-LLaMA】在原来的LLaMA词表基础上,新增了17953个中文token,让模型能更好地处理中文。
步骤
- 步骤1:把新增的中文token和原来的词表合并,形成一个更大的词表。
- 步骤2:用大规模中文语料,对新增的token embedding(词嵌入)和其他模型参数一起进行预训练,让模型学会这些新词。
问题
-
提高编码解码效率?
- 词表扩展后,模型能更准确地切分中文,减少不必要的切分错误,从而提高编码和解码的效率。
- 但如果词表太大,可能会稍微降低效率,所以需要在词表大小和效率之间找到平衡。
-
提高上下文长度?
- 词表扩展本身不会直接提高上下文长度,但更高效的切分方式可以减少token数量(比如一个词被切分成多个token的情况减少),从而间接让模型能处理更长的文本。
-
提高中文能力?
- 词表扩展后,模型能更好地理解和生成中文,尤其是在处理中文特有的词汇、短语和表达时,效果会明显提升。
总结
通过扩展词表并加入中文 token,模型能更高效地处理中文,提升编码解码效率和中文理解能力,同时间接支持更长的上下文。
预训练数据获取方法
预训练数据获取方法
- 直接用开源语料:可以直接使用已有的公开数据集,比如下面列出的中文开源数据集。
-
- Skywork/SkyPile-150B:大规模中文数据集。
- wikipedia-cn-20230720-filtered:经过过滤的中文维基百科数据。
- C4:一个多语言数据集,包含中文部分。
- RedPajama:开源的多语言数据集,支持中文。
- EleutherAI/the_pile_deduplicated:去重后的多语言数据集,包含中文。
- WuDaoCorporaText:中文超大规模语料库。
- PRM800K:中文数学问题数据集。
- YeungNLP/firefly-pretrain-dataset:高质量中文预训练数据集。
-
- 爬虫:通过编写爬虫程序(比如使用 MediaCrawler)从网页上抓取数据。
- 文档转文本:将PDF、Word等格式的文档转换成纯文本(比如使用 MinerU),通常需要处理数百GB甚至TB级别的数据。
工具推荐
- 爬虫工具:MediaCrawler 是一个开源的爬虫工具,适合抓取网页数据。
- 文档转文本工具:MinerU 可以将PDF等文档转换为纯文本,方便后续处理。
总结
获取预训练数据的方法主要有三种:使用开源语料、爬虫抓取、文档转文本。中文开源数据集丰富多样,可以根据需求选择合适的资源。同时,爬虫和文档转换工具可以帮助你获取和处理更多定制化的数据。
预训练数据处理 – 数据清洗
数据清洗的核心目标
用初始的小规模高质量数据集作为“种子”,通过清洗和扩展,找到更多高质量的数据(“找朋友”)。
数据清洗的步骤
-
第一步:确定Unit(处理单元)
- 根据数据来源和性质,确定基本处理单元。比如:
- 网页数据:按行(Line-level)去重。
- 书籍数据:按书(Book-level)去重(覆盖超过90%即去重)。
- 代码数据:按文件(File-level)去重。
- 根据数据来源和性质,确定基本处理单元。比如:
-
第二步:Unit内部去重
- 检查每个Unit内部是否有大量重复内容(如重复行、段落、n-grams)。
- 如果重复比例高,说明Unit质量低,直接丢弃整个Unit。
-
第三步:Unit之间去重
- 对比不同Unit之间的相似度,使用完全匹配或模糊匹配。
- 去除重复的Unit,保留唯一的Unit集合。
-
第四步:测试集和训练集去重
- 去除训练集中与测试集相似的文档,避免数据泄露。
去重和召回
- 数据集内部重复:去除同一个数据集中重复的内容。
- 数据集之间重复:去除不同数据集之间的重复内容。
- 测试集和验证集重复:确保训练数据和测试数据没有重叠。
数据过滤和排名
- URL过滤和正则过滤:
- 篇章级过滤:过滤掉低质量的整篇文章。
- 句子级过滤:过滤掉低质量的句子。
- 排名:根据数据质量对文档进行排序,优先使用高质量数据。
迭代数据收集(继续爬)
- 在清洗过程中,如果发现数据不足,可以继续爬取新数据,并重复清洗步骤。
去噪去污染
- 句子主要由大写字符组成:丢弃。
- 句子由纯数字组成:丢弃。
- 命中特定关键词:如“关注”、“转发”、“点赞”等,丢弃。
- 句子长度小于10且命中特定模板:
- 以“登录”、“注册”开头。
- 以“展开”、“更多”结尾。
- 丢弃这些低质量句子。
总结
数据清洗的核心是通过去重、过滤和去噪,从海量数据中提取出高质量的部分。重点是:
- 确定处理单元(Unit)。
- 去除重复和低质量内容。
- 避免训练集和测试集的重叠。
- 通过迭代爬取和清洗,不断扩展高质量数据集。
这样可以让模型在训练时接触到更干净、更有价值的数据,从而提升性能。
好的!我来总结一下关于预训练数据配比和继续训练的核心内容:
预训练数据处理 – 数据配比
根据任务类型对数据进行分类和配比,以便更精确地训练模型,提升模型在特定任务上的表现。常见的分类包括:中文、英文、代码、数学等。
数据配比的步骤
-
训练分类器:
- 将数据按文档(document)进行分类,比如划分为代码(code)、Markdown、数学(math)等。
- 使用BERT等模型训练分类器,数据量级大约2万条即可。
-
类型判断:
- 根据任务需求,确定数据的类型比例。例如,LLaMA模型的数据结构是“知识 + 代码 + 数学”。
- 通常,中文、英文、代码的比例可以设置为 4:4:2。
继续训练的要求
-
防止灾难性遗忘:
- 继续训练时,数据质量需要保持一定的混合度,避免模型忘记之前学到的知识。
-
数据量控制:
- 继续预训练的数据量应控制在 15%以内,避免过度干扰模型的泛化能力。
-
数据多样性:
- 数据需要保持多样性,避免过度集中。
- 数据量可以有 10%-15%的波动,以确保模型能够适应不同的数据分布。
总结
- 数据配比:根据任务类型(中文、英文、代码、数学等)对数据进行分类和配比,常见比例为 中:英:代码 = 4:4:2。
- 继续训练:
- 数据量控制在15%以内。
- 保持数据多样性和一定的波动范围(10%-15%)。
- 防止灾难性遗忘,确保模型在继续训练时不会丢失之前学到的知识。
通过合理的数据配比和继续训练策略,可以提升模型在特定任务上的表现,同时保持其泛化能力。
训练
工具:Megatron
- Megatron 是一个用于大规模模型训练的高效框架,特别适合训练超大规模的预训练模型(如GPT、BERT等)。
- 它支持分布式训练,能够充分利用多GPU或多节点的计算资源,加速训练过程。
后续内容:分布式并行
- 分布式并行训练 的相关内容,包括:
- 数据并行:将数据拆分到多个设备上并行处理。
- 模型并行:将模型拆分到多个设备上并行计算。
- 混合并行:结合数据并行和模型并行的优势,进一步提升训练效率。
总结
- 使用 Megatron 进行训练,可以高效地处理大规模模型的训练任务。
- 后续会深入讲解 分布式并行训练 的技术细节,帮助你更好地理解如何利用多设备资源加速训练。
好的!我来总结一下关于模型评估的内容:
评估
评估平台:OpenCompass
OpenCompass 是一个用于评估模型性能的平台,支持多种任务和指标。
评估任务和指标
-
AIME 2024 (Pass@1)
- 用途:评估模型在数学竞赛题上的表现。
- 指标:Pass@1,表示模型在第一次尝试中答对题目的概率。
-
Codeforces (Percentile)
- 用途:评估模型在编程竞赛平台 Codeforces 上的解题能力,反映其代码生成和算法理解水平。
- 指标:Percentile,表示模型在所有参赛者中的排名百分比。
-
GPQA (Pass@1)
- 用途:评估模型在编程竞赛平台 Codeforces 上的解题能力,反映其代码生成和算法理解水平。
- 指标:Pass@1,表示模型在第一次尝试中答对题目的概率。
-
MATH-500 (Pass@1)
- 用途:测试模型在 500 道数学题目上的表现,考察数学推理能力。
- 指标:Pass@1,表示模型在第一次尝试中答对题目的概率。
-
MMLU (Pass@1)
- 用途:Massive Multitask Language Understanding,测试模型在 57 个多领域任务(如科学、人文、数学等)中的综合语言理解能力。
- 指标:Pass@1,表示模型在第一次尝试中答对题目的概率。
-
SWE-bench Verified (Resolved)
- 用途:评估模型在软件工程问题(如代码修复、功能实现)上的解决能力。
- 指标:Resolved,表示通过人工验证的有效解决案例数量。
总结
OpenCompass 提供了多种评估任务和指标,涵盖数学、编程、语言理解和软件工程等领域。通过这些评估,可以全面了解模型在不同任务上的表现:
- 数学能力:AIME 2024、MATH-500。
- 编程能力:Codeforces、GPQA。
- 综合语言理解能力:MMLU。
- 软件工程能力:SWE-bench Verified。
这些评估帮助开发者更好地理解模型的优势和不足,从而优化模型性能。
更多推荐


所有评论(0)