【LLM】预训练的具体流程

分词器训练

  1. 预训练模型:就像你已经学会了一些基础知识的“大脑”,我们可以在这个基础上继续学习新东西。比如,有些模型已经学会了英语,但中文学得不够好。

  2. 中文预训练:为了让这个“大脑”更好地理解中文,我们需要用大量的中文数据继续训练它。

  3. 分词器(Tokenizer):它的作用是把一句话拆分成一个个小单元(比如词语或字)。比如,“我喜欢学习”会被拆成“我/喜欢/学习”。这些拆分后的单元会被转换成数字,方便模型理解。

  4. BPE/WordPiece:这是两种常用的拆分方法,可以把不常见的词拆成更小的部分,比如“学习”可能被拆成“学/习”,这样模型能更好地处理新词。

总结:我们想用一个已经学会英语的模型,通过中文数据继续训练它,同时用分词器把中文句子拆成小单元,让模型更容易理解中文。

分词器训练 – 切词技巧

  1. 数字处理:需要设计合理的规则,避免模型对数字的理解出错(比如把“9.9 > 9.11”理解成错误的结果)。

  2. 词典大小控制

    • Token(分词单元)可以代表多个汉字,词典大小会影响模型性能。
    • 词典太大,解码效率低;词典太小,压缩率高,可能丢失信息。
    • 中文模型中,通常每个 token 对应 1.5 个以上的字符。
  3. 手动调整:可以根据任务需求,灵活调整 token 的设置,比如让模型更适合处理中文。

  4. 任务设计:在训练时,可以加入特定领域的词汇(比如医疗、法律等),让模型在特定领域表现更好。

  5. 语料质量:高质量的训练数据非常重要,尤其是在特定领域,需要关注业务需求。

  6. 词汇表和嵌入层的关系:Tokenizer 的词汇表大小要和模型的 embedding 层大小匹配,并预留一些空间,方便后续增加新词汇。

总结:分词器的设计需要平衡词典大小、压缩率和任务需求,同时关注数字处理、领域词汇和语料质量,确保模型在中文任务中表现更好。

词表扩展

  1. 问题:原来的词表(比如LLaMA的词表)可能缺少一些中文词汇,或者对中文的切分方式不够好。如果词表中没有某个词,模型就无法计算它的损失(loss),导致效果不好。
  2. 解决方法:比如【Chinese-LLaMA】在原来的LLaMA词表基础上,新增了17953个中文token,让模型能更好地处理中文。

步骤

  1. 步骤1:把新增的中文token和原来的词表合并,形成一个更大的词表。
  2. 步骤2:用大规模中文语料,对新增的token embedding(词嵌入)和其他模型参数一起进行预训练,让模型学会这些新词。

问题

  1. 提高编码解码效率?

    • 词表扩展后,模型能更准确地切分中文,减少不必要的切分错误,从而提高编码和解码的效率。
    • 但如果词表太大,可能会稍微降低效率,所以需要在词表大小和效率之间找到平衡。
  2. 提高上下文长度?

    • 词表扩展本身不会直接提高上下文长度,但更高效的切分方式可以减少token数量(比如一个词被切分成多个token的情况减少),从而间接让模型能处理更长的文本。
  3. 提高中文能力?

    • 词表扩展后,模型能更好地理解和生成中文,尤其是在处理中文特有的词汇、短语和表达时,效果会明显提升。

总结
通过扩展词表并加入中文 token,模型能更高效地处理中文,提升编码解码效率和中文理解能力,同时间接支持更长的上下文。

预训练数据获取方法

预训练数据获取方法

  1. 直接用开源语料:可以直接使用已有的公开数据集,比如下面列出的中文开源数据集。
      1. Skywork/SkyPile-150B:大规模中文数据集。
    1. wikipedia-cn-20230720-filtered:经过过滤的中文维基百科数据。
    2. C4:一个多语言数据集,包含中文部分。
    3. RedPajama:开源的多语言数据集,支持中文。
    4. EleutherAI/the_pile_deduplicated:去重后的多语言数据集,包含中文。
    5. WuDaoCorporaText:中文超大规模语料库。
    6. PRM800K:中文数学问题数据集。
    7. YeungNLP/firefly-pretrain-dataset:高质量中文预训练数据集。
  2. 爬虫:通过编写爬虫程序(比如使用 MediaCrawler)从网页上抓取数据。
  3. 文档转文本:将PDF、Word等格式的文档转换成纯文本(比如使用 MinerU),通常需要处理数百GB甚至TB级别的数据。

工具推荐

  1. 爬虫工具:MediaCrawler 是一个开源的爬虫工具,适合抓取网页数据。
  2. 文档转文本工具:MinerU 可以将PDF等文档转换为纯文本,方便后续处理。

总结
获取预训练数据的方法主要有三种:使用开源语料、爬虫抓取、文档转文本。中文开源数据集丰富多样,可以根据需求选择合适的资源。同时,爬虫和文档转换工具可以帮助你获取和处理更多定制化的数据。

预训练数据处理 – 数据清洗

数据清洗的核心目标
用初始的小规模高质量数据集作为“种子”,通过清洗和扩展,找到更多高质量的数据(“找朋友”)。


数据清洗的步骤

  1. 第一步:确定Unit(处理单元)

    • 根据数据来源和性质,确定基本处理单元。比如:
      • 网页数据:按行(Line-level)去重。
      • 书籍数据:按书(Book-level)去重(覆盖超过90%即去重)。
      • 代码数据:按文件(File-level)去重。
  2. 第二步:Unit内部去重

    • 检查每个Unit内部是否有大量重复内容(如重复行、段落、n-grams)。
    • 如果重复比例高,说明Unit质量低,直接丢弃整个Unit。
  3. 第三步:Unit之间去重

    • 对比不同Unit之间的相似度,使用完全匹配或模糊匹配。
    • 去除重复的Unit,保留唯一的Unit集合。
  4. 第四步:测试集和训练集去重

    • 去除训练集中与测试集相似的文档,避免数据泄露。

去重和召回

  • 数据集内部重复:去除同一个数据集中重复的内容。
  • 数据集之间重复:去除不同数据集之间的重复内容。
  • 测试集和验证集重复:确保训练数据和测试数据没有重叠。

数据过滤和排名

  1. URL过滤和正则过滤
    • 篇章级过滤:过滤掉低质量的整篇文章。
    • 句子级过滤:过滤掉低质量的句子。
  2. 排名:根据数据质量对文档进行排序,优先使用高质量数据

迭代数据收集(继续爬)

  • 在清洗过程中,如果发现数据不足,可以继续爬取新数据,并重复清洗步骤。

去噪去污染

  1. 句子主要由大写字符组成:丢弃。
  2. 句子由纯数字组成:丢弃。
  3. 命中特定关键词:如“关注”、“转发”、“点赞”等,丢弃。
  4. 句子长度小于10且命中特定模板
    • 以“登录”、“注册”开头。
    • 以“展开”、“更多”结尾。
    • 丢弃这些低质量句子。

总结
数据清洗的核心是通过去重、过滤和去噪,从海量数据中提取出高质量的部分。重点是:

  1. 确定处理单元(Unit)。
  2. 去除重复和低质量内容。
  3. 避免训练集和测试集的重叠。
  4. 通过迭代爬取和清洗,不断扩展高质量数据集。

这样可以让模型在训练时接触到更干净、更有价值的数据,从而提升性能。

好的!我来总结一下关于预训练数据配比和继续训练的核心内容:


预训练数据处理 – 数据配比

根据任务类型对数据进行分类和配比,以便更精确地训练模型,提升模型在特定任务上的表现。常见的分类包括:中文英文代码数学等。


数据配比的步骤

  1. 训练分类器

    • 将数据按文档(document)进行分类,比如划分为代码(code)、Markdown、数学(math)等。
    • 使用BERT等模型训练分类器,数据量级大约2万条即可。
  2. 类型判断

    • 根据任务需求,确定数据的类型比例。例如,LLaMA模型的数据结构是“知识 + 代码 + 数学”
    • 通常,中文、英文、代码的比例可以设置为 4:4:2

继续训练的要求

  1. 防止灾难性遗忘

    • 继续训练时,数据质量需要保持一定的混合度,避免模型忘记之前学到的知识。
  2. 数据量控制

    • 继续预训练的数据量应控制在 15%以内,避免过度干扰模型的泛化能力。
  3. 数据多样性

    • 数据需要保持多样性,避免过度集中。
    • 数据量可以有 10%-15%的波动,以确保模型能够适应不同的数据分布。

总结

  1. 数据配比:根据任务类型(中文、英文、代码、数学等)对数据进行分类和配比,常见比例为 中:英:代码 = 4:4:2
  2. 继续训练
    • 数据量控制在15%以内。
    • 保持数据多样性和一定的波动范围(10%-15%)。
    • 防止灾难性遗忘,确保模型在继续训练时不会丢失之前学到的知识。

通过合理的数据配比和继续训练策略,可以提升模型在特定任务上的表现,同时保持其泛化能力。

训练

工具:Megatron

  • Megatron 是一个用于大规模模型训练的高效框架,特别适合训练超大规模的预训练模型(如GPT、BERT等)。
  • 它支持分布式训练,能够充分利用多GPU或多节点的计算资源,加速训练过程。

后续内容:分布式并行

  • 分布式并行训练 的相关内容,包括:
    1. 数据并行:将数据拆分到多个设备上并行处理。
    2. 模型并行:将模型拆分到多个设备上并行计算。
    3. 混合并行:结合数据并行和模型并行的优势,进一步提升训练效率。

总结

  • 使用 Megatron 进行训练,可以高效地处理大规模模型的训练任务。
  • 后续会深入讲解 分布式并行训练 的技术细节,帮助你更好地理解如何利用多设备资源加速训练。
    好的!我来总结一下关于模型评估的内容:

评估

评估平台:OpenCompass
OpenCompass 是一个用于评估模型性能的平台,支持多种任务和指标。


评估任务和指标

  1. AIME 2024 (Pass@1)

    • 用途:评估模型在数学竞赛题上的表现。
    • 指标:Pass@1,表示模型在第一次尝试中答对题目的概率。
  2. Codeforces (Percentile)

    • 用途:评估模型在编程竞赛平台 Codeforces 上的解题能力,反映其代码生成和算法理解水平。
    • 指标:Percentile,表示模型在所有参赛者中的排名百分比。
  3. GPQA (Pass@1)

    • 用途:评估模型在编程竞赛平台 Codeforces 上的解题能力,反映其代码生成和算法理解水平。
    • 指标:Pass@1,表示模型在第一次尝试中答对题目的概率。
  4. MATH-500 (Pass@1)

    • 用途:测试模型在 500 道数学题目上的表现,考察数学推理能力。
    • 指标:Pass@1,表示模型在第一次尝试中答对题目的概率。
  5. MMLU (Pass@1)

    • 用途:Massive Multitask Language Understanding,测试模型在 57 个多领域任务(如科学、人文、数学等)中的综合语言理解能力
    • 指标:Pass@1,表示模型在第一次尝试中答对题目的概率。
  6. SWE-bench Verified (Resolved)

    • 用途:评估模型在软件工程问题(如代码修复、功能实现)上的解决能力。
    • 指标:Resolved,表示通过人工验证的有效解决案例数量。

总结
OpenCompass 提供了多种评估任务和指标,涵盖数学、编程、语言理解和软件工程等领域。通过这些评估,可以全面了解模型在不同任务上的表现:

  • 数学能力:AIME 2024、MATH-500。
  • 编程能力:Codeforces、GPQA。
  • 综合语言理解能力:MMLU。
  • 软件工程能力:SWE-bench Verified。

这些评估帮助开发者更好地理解模型的优势和不足,从而优化模型性能。

你可能感兴趣的:(LLM,python,人工智能,深度学习,大模型)