推理大模型的后训练增强技术-预训练篇

大模型训练技术概述

LLM训练的三个阶段

训练大型语言模型不是一个单一的过程,相反,它是一个多层的训练过程组合,每个过程都有其独特的作用,并对模型的性能做出贡献。

  • 阶段1:自我监督学习(Self-Supervised Learning):自我监督学习是一种特殊形式的无监督学习,主要通过数据本身的内在结构来生成标签,而不需要人工标注的标签。比如LLM中的预训练。
  • 阶段2:监督学习(Supervised Learning):监督学习是机器学习中最常见的一种方法,其中模型通过带有标签的训练数据进行学习,目的是从输入数据和其对应的标签中找到映射关系。比如LLM中的指令微调。
  • 阶段3:强化学习(Reinforcement Learning):强化学习是一种基于奖励信号的学习方式,模型通过与环境的互动来学习。它不像监督学习那样依赖大量标注数据,而是通过探索(尝试不同的动作)和利用(根据经验选择动作)来不断改进自己的决策策略。比如LLM中的PPO。

第一阶段:理解语言的自监督学习

当我们谈论语言建模时,我们传统上会想到自我监督学习,也称之为预训练,即训练的第一阶段。

它涉及向模型提供大量未注释或原始数据,并让其预测其中"缺失"的部分。该模型会学习一些有关语言和数据领域的知识,以生成合理的答案。

例如,如果我们将天气网站上的文本输入到模型中并要求它预测下一个单词,那么它必须了解一些有关语言和天气领域的知识。在演示中,我给出了例句"洪水预警将在 _____ 生效。"

在中间状态下,模型会对一系列预测进行排序,从最有可能的答案("day"、"night"、"hour")到最不可能的答案("month"),甚至是毫无意义的答案("giraffe")(这些答案的概率应该非常低)。这个过程被称为自我监督(与无监督学习相反),因为有一个特定的正确答案------我们收集的文本中实际出现的单词------在我的例子中是"夜晚"。

自我监督与无监督学习类似,因为它可以使用丰富的未注释数据。

第二阶段:遵循指令的监督学习

监督学习,也称为指令微调,是大型语言模型 (LLM) 训练过程的第二阶段。这是一个关键阶段,它建立在自监督学习阶段获得的基础知识之上。

在此阶段,模型经过监督训练以遵循指令,这超出了对单词和句子的基本预测,这是自监督学习阶段的主要重点。该模型在该阶段学会响应特定请求,使其更具交互性和实用性。

各种研究都证明了指令微调在增强 LLM 能力方面的有效性,一个值得注意的结果是,该模型在推广到新的、未见过的任务时表现出更好的性能。这是一个重要性能,因为机器学习模型的主要目标之一是在未见过的数据上表现良好。

第三阶段:对齐偏好的强化学习

大模型训练的最后一个阶段是强化学习。这会鼓励期望的行为并阻止不想要的输出。此阶段的独特之处在于它不会为模型提供要生成的精确输出,而是对生成的输出进行评分。

  • 该过程从一个基础模型开始,该模型已经具备遵循指令和预测语言模式的能力。接下来,数据专家使用人工标注的方式来区分更好和更差的输出。这些数据标注(或注释)可作为模型的指导方针,帮助模型了解哪些响应是首选,哪些不是,然后,这些注释的反馈用于训练奖励模型。

  • 奖励模型是此过程的关键组成部分,它提供大规模奖励,有效地引导模型产生更理想的响应并阻止不太理想的响应。这种方法在促进简洁等模糊概念和阻止有害语言方面特别有效,从而提高了语言模型输出的整体质量。

这种强化学习方法通​​常被称为带人工反馈(human feedback)的强化学习,强调了人类参与训练过程的重要性,确保模型的学习符合用户的期望。

大模型预训练技术

大模型预训练简介

预训练是指在模型的初始阶段,使用大量数据对模型进行训练,以便让模型学习到通用的特征和知识。这些特征和知识可以是语言模型中的词嵌入,或者是图像识别模型中的视觉模式。

  • 通常发生在模型开发的早期阶段;
  • 目的是在大规模数据集上学习通用特征,为后续任务奠定基础;
  • 不针对特定任务,而是追求广泛的适用性;

下面是关于大语言模型(LLMs)预训练的一些描述:

  • 通过在大规模语料上进行预训练,大语言模型可以获得通用的语言理解与生成能力,并且学习到较为广泛的世界知识。

  • 大模型预训练需要从海量的文本数据中学习到充分的知识存储在其模型参数中。

  • 在大模型生成文本之前,它必须先学习语言的工作原理,这是通过预训练实现的,是一项计算密集型任务。

大模型预训练技术-数据准备

现有的大语言模型主要将各种公开的文本数据进行混合作为预训练语料,如图所示。预训练数据可以分为通用文本数据和专用文本数据

  • 通用文本数据规模较大,涵盖了网页、书籍和对话等内容,用以增强模型的语言建模能力;
  • 专用文本数据则是为了进一步提升大语言模型在特定任务上的表现,如多语数据、科学数据和代码数据等;

常用的专用文本数据分为三种:

  • 多语文本:多语文本数据可以帮助模型更好地建立多语言间的语义关联,增强模型的多语理解与生成能力,为跨语言理解与对话任务提供支持。此外,多语言数据还能有效增加数据的多样性,从而有助于提升模型的综合性能。
  • 科学文本:科学文本数据可以增强大语言模型对科学知识的理解,从而提高科学问答与推理等任务的性能。常用方法是收集 arXiv 论文、科学教材、数学网页等。但是由于科学文本数据中包含数学公式、蛋白质序列等特殊符号,通常需要采用特定的分词和预处理技术将数据转化为大语言模型能够处理的统一格式。
  • 代码:代码语料可以提高其模型生成的程序质量,其来源主要是 Stack Exchange 等编程问答社区的数据以及 GitHub 等开源项目仓库。由于代码主要以结构化的编程语言形式呈现,在代码数据上训练能够提升模型的结构化语义理解与逻辑推理能力。同时,代码中的函数调用关系还有助于增强模型的工具使用与学习能力。将推理任务格式化为代码通常可以得到更准确的结果。

代表性大语言模型的预训练数据分布

训练 LLM 的第一步是收集尽可能多的高质量文本,目标是创建一个包含广泛人类知识的庞大而多样化的数据集。

其中一个来源是Common Crawl,这是一个免费、开放的网络爬虫数据存储库,其中包含 18 年来 2500 亿个网页。但是,原始网络数据很嘈杂 --- 包含垃圾邮件、重复内容和低质量内容 , 因此预处理至关重要。

在收集了丰富的文本数据之后,就需要对数据进行预处理,消除低质量、冗余、无关甚可能有害的数据。一般来说,需要构建并使用系统化的数据处理框架,例如开源库 Data-Juicer。典型的数据预处理流程如图所示,包括质量过滤、敏感内容过滤、数据去重等步骤。

Data-Juicer功能:

  • 系统化地为用户提供 100 多个核心 算子 和 50 多个可重用的数据菜谱和 专用工具套件,旨在解耦于特定的多模态 LLM 数据集和处理管道运行。支持预训练、后训练、英语、中文等场景中的数据分析、清洗和合成。
  • 支持数据模型协同开发,通过沙盒实验室实现快速迭代,提供反馈循环、可视化等功能,让您更好地理解和改进数据和模型。已经有许多基于 DJ 衍生的数据菜谱和模型经过了效用验证,譬如在预训练、文生视频、图文生成等场景。

大模型预训练技术-数据预处理

步骤一:质量过滤 在质量过滤方面,目前主要使用以下两种数据清洗方法:

  • 基于启发式规则的方法:通过精心设计的规则有针对性地识别和剔除低质量数据。

    • 为了训练特定目标语言的模型可以过滤掉其他语言的文本。
    • 使用单词比率等统计特征来衡量文本质量。还可以利用困惑度(Perplexity)等文本生成评估指标来检测和删除表达不自然的句子,以及训练 FastText 分类器来检测有毒或仇恨言论。
    • 制定精准的清洗规则,结合关键词集合进行过滤。
  • 基于分类器的方法:训练判别数据质量的文本分类器进行数据清洗。

    • 具体来说,可以选取部分代表性的数据进行质量标注以训练分类器,例如将维基百科等高质量数据作为正样本、将筛选出含有不良内容或低质量数据的样本作为负样本。文本过滤的粒度可以是文档级别也可以是句子级别。为了减少误筛,可以使用多个分类器进行联合过滤或召回,还可以针对不同的评估维度训练不同的分类器。
    • 目前常用方法包括轻量级模型(如 FastText)、可微调的预训练模型(如 BERT)以及闭源大语言模型 API(如 GPT-4)。轻量级模型效率较高,但是分类的准确率和精度受限于模型能力;预训练模型可以针对性微调, 但是通用性和泛化性具有限制;闭源大语言模型的能力较强, 但是无法灵活针对任务进行适配而且成本较高。

步骤二:敏感内容过滤

  • 在敏感内容过滤方面,目前主要关注对有毒内容和隐私信息的过滤方法。为了精确过滤含有有毒内容的文本,通常采用基于分类器的过滤方法,例如基于 Jigsaw 评论数据集训练分类器。

有毒内容识别

  • 过滤隐私内容则主要使用启发式方法(如关键字识别),例如 Dolma 采用规则方法来过滤邮箱地址、IP 地址以及电话号码,如果文档中的隐私信息少于五条则使用使用特定的词元进行替换(如"[EMAIL_ADDRESS]"),如果隐私信息达到六条则直接删除整个文档。

个人隐私识别

步骤三:数据去重 数据去重同样是一个重要步骤。由于大语言模型具有较强的数据拟合与记忆能力,很容易习得训练数据中的重复模式,可能导致对这些模式的过度学习。研究发现,预训练语料中出现的重复低质量数据可能诱导模型在生成时频繁输出类似数据。此外,这些数据也可能导致训练过程不稳定(训练损失震荡)甚至导致训练崩溃。 目前数据去重主要关注计算粒度以及匹配方法两个方面:

  • 计算粒度:去重可以在句子、文档等多种粒度上进行。在句子级别上,可以删除包含重复单词和短语的句子;在文档级别上,可以依靠单词或 n 元词组的重叠等表层特征来衡量文档的重叠比率;数据集级别往往采用多阶段、多粒度的方式来进行。一般首先在数据集和文档级别进行去重(去除高度相似甚至完全一致文档),然后在句子级别实现更为精细的去重,例如当两个句子公共子串的长度过长时直接删除某一个句子。
  • 匹配方法:在去重过程中,可以使用精确匹配算法(即每个字符完全相同)或近似匹配算法(基于相似度)。对于精确匹配,通常使用后缀数组来匹配最小长度的完全相同子串;对于近似匹配,可以采用局部敏感哈希(Locality-Sensitive Hashing, LSH)算法,如最小哈希(MinHash) 来实现。为了平衡去重效率和效果,实际操作通常会结合多种匹配方法,例如在文档层面采用近似匹配而在句子层面采用精确匹配。

现有的研究证明,预训练数据的数量和质量都对训练效果具有重大影响。

  • 早期的研究工作认为增加模型参数更为重要,而最近的研究表明扩展训练数据量对于提升大语言模型的性能同样非常关键,整体上语言模型的性能会随着训练数据量的增加而提升。

  • 在获取充足的预训练数据后,数据质量直接决定了模型的实际性能。通过提升数据质量,语言模型就能展现出与更大规模模型相匹敌甚至更为优异的性能。相反,使用大量低质量数据会导致模型训练过程不稳定,容易造成模型训练不收敛等问题。而且如果模型在包含事实性错误的、过时的数据上进行训练,那么它在处理相关主题时就可能会产生不准确或虚假的信息,这种现象被称为"幻觉"(Hallucination)。

  • 已有研究普遍认为重复数据对于模型训练及最终性能会带来不良影响,例如导致模型训练损失出现"双下降"现象(先下降然后升高再下降)。而且重复数据可能会降低模型利用上下文信息的能力,从而削弱模型在上下文学习中的泛化能力。因此通常的建议是对于预训练数据进行精细的去重操作。

  • 数据中包含有偏、有毒、隐私的内容将会对于模型造成严重的不良影响。例如如果训练数据中包含有毒内容,模型就可能会产生侮辱性、攻击性或其他有害的输出;而在含有隐私内容的数据上训练可能会导致模型在输出中泄露或利用个人数据。

步骤四:分词 分词(Tokenization)步骤负责将原始文本分割成模型可识别和建模的词元序列,作为大语言模型的输入数据。如分词策略中介绍的那样,当前基于 Transformer 的语言模型大多采用子词分词器(Subword Tokenizer)进行分词,常见方法有 BPE 分词、WordPiece 分词和 Unigram 分词三种。

虽然直接使用已有的分词器较为方便(例如 GPT-3 模型使用了 GPT-2 的分词器),但是使用为语料专门设计的分词器会更加有效,尤其对于混合了多领域、多语言和多种格式的语料。最近的工作通常使用 SentencePiece 代码库定制化分词器。

在 GPT4 中,有 100,277 个可能的标记。流行的分词器Tiktokenizer允许尝试Token化并查看文本如何分解为标记,我们尝试输入一个句子,会看到每个单词或子单词都被分配了一系列数字 ID。

大模型预训练技术-数据调度

完成数据预处理之后,需要设计合适的调度策略来安排这些多来源的数据。数据调度(Data Scheduling)主要关注两个方面:各个数据源的混合比例以及各数据源用于训练的顺序(称为数据课程,Data Curriculum),具体的数据调度流程如图所示。

预训练大语言模型时的数据调度示意图

数据混合:

  • 由于数据源与大语言模型某些特定能力的学习具有紧密的联系,因此设置合适的数据混合比例非常重要。
  • 数据混合通常设置的是预训练数据的整体分布,在预训练期间,将根据混合比例从不同数据源中采样数据,也可以在不同训练阶段采用 不同的混合比例。
  • 代表性大语言模型 LLaMA 的预训练数据主要包括超过 80% 的网页数据、来自 GitHub 和 StackExchange 的 6.5% 代码密集型数据、4.5% 的书籍数据,以及来自 arXiv 的 2.5% 科学数据,这个数据配比可以作为训练大语言模型的一个重要参考。

在实践中,数据混合通常是根据经验确定的,下面汇总了几种常见的数据混合策略:

  • 增加数据源的多样性: 多样化的数据(如网页、书籍、代码等)能够改进大语言模型在下游任务中的综合表现。
  • 优化数据混合 :除了手动设置数据混合配比外,还可以使用可学习的方法来优化数据组成。实践中通常采用不同的数据混合从头开始训练几个小型语言模型(例如 1.3B 规模),然后选择获得最理想性能的数据混合配比。但是这个方法假设以类似方式训练出的小模型与大模型会表现出相似的模型能力或行为,在实际中并不总是成立。
  • 优化特定能力 :可以通过增加特定数据源的比例来增强某些对应的模型能力,例如使用更多的数学和代码数据可以增强大语言模型的数学推理和编程能力。常见做法是采用多阶段训练方法,例如在连续的两个阶段分别安排通用数据和任务特定数据,这种在多个阶段使用不同数据源混合配比进行训练的方法被称为"数据课程"。

数据课程:

  • 除了设置数据混合配比,在训练过程中对数据顺序进行合适的安排也很重要。一种实用方法是基于专门构建的评测基准监控大语言模型关键能力的学习过程,然后在预训练期间动态调整数据的混合配比。
  • 由于预训练阶段需要耗费大量的计算资源,目前针对数据课程的研究工作主要集中在继续预训练(Continual Pre-training)。研究表明,为了学习某些特定的技能,按照技能依赖顺序编排对应数据集的学习方法(例如从基本技能到目标技能)比直接在相关语料上学习效果更好。

下面将以三种常见能力为例,介绍具体的数据课程在继续预训练中的应用:

  • 代码能力: 为了提高模型的代码生成能力,研究人员基于 LLaMA-2 开发了 CodeLLaMA,采用的数据课程为:2T 通用词元 → 500B 代码密集型词元。CodeLLaMA 还提供了一个面向 Python 语言的特定代码大模型 CodeLLaMA-Python,采用的数据课程为:2T 通用词元 → 500B 代码相关词元 → 100B Python 代码相关词元。
  • 数学能力: Llemma 选择 CodeLLaMA 作为基座,进一步在包含论文、数学和代码的混合数据集合上进行继续预训练,采用的数据课程为:2T 通用词元 → 500B 代码相关词元 → 50∼200B 数学相关词元。特别地,Llemma 在继续预训练数据中还包含 5%的通用领域数据,这可以看做一种模型能力的"正则化"技术,加强对于基座模型通用能力的保持。
  • 长文本能力: 很多工作通过继续预训练有效扩展了大语言模型的上下文窗口,主要是针对 RoPE 中的位置嵌入编码进行修改。例如 CodeLLaMA 将 LLaMA-2 的上下文窗口从 4K 扩展到了 100K,采用的数据课程为:4K 上下文窗口的 2.5T 词元 → 16K 上下文窗口的 20B 词元。

数据课程的持续性学习:

  • 垂直持续学习:(i)持续预训练(CPT),(ii)领域适应性预训练(DAP),以及(iii)持续微调(CFT)。主要关注点是保持LLM的通用知识(防止垂直遗忘)

  • 水平持续学习:在LLM部署之后,当新的数据集可用时,模型会不断更新。主要目标是防止在长时间序列任务中发生水平遗忘

大模型预训练技术-模型架构

预训练的架构:大语言模型LLM预训练采用了 Transformer 模型的解码器部分,由于没有编码器部分,大语言模型去掉了中间的与编码器交互的多头交叉注意力层。

如图所示,左边是 Transformer 模型的解码器,右边是大语言模型的预训练架构。

语言模型大致可以分为三种架构:

  • 以 BERT 为代表的编码器(Encoder-only)架构
  • 以 GPT 为代表的解码器(Decoder-only)架构
  • 以 T5 为代表的编码器-解码器(Encoder-decoder)架构

近年来,随着 GPT 系列模型取得重大成功,解码器架构已经成为了大语言模型的主流架构。特别地,解码器架构还可以细分为因果解码器(Causal Decoder)和前缀解码器(Prefix Decoder),默认情况下指的就是因果解码器架构。

  • 编码器-解码器架构是一种经典的模型结构。该架构在编码器端采用了双向自注意力机制对输入信息进行编码,而在解码器端则使用了交叉注意力与掩码自注意力机制,进而通过自回归的方式对输出进行生成。目前只有如 Flan-T5 等少数大语言模型是基于编码器-解码器架构构建的。
  • 因果解码器架构没有显式地区分输入和输出部分。该架构采用单向掩码注意力机制,使得每个输入的词元只关注序列中位于它前面的词元和它本身,进而自回归地预测输出的词元。目前绝大部分大语言模型都采用因果解码器架构,最具有代表性的模型就是 OpenAI 推出的 GPT 系列模型。
  • 前缀解码器架构参考了编码器-解码器的设计。该架构对于输入(前缀)部分使用双向注意力进行编码,对于输出部分利用单向的掩码注意力利用该词元本身和前面的词元进行自回归地预测。当前基于前缀解码器架构的代表性大语言模型包括 GLM-130B 和 U-PaLM。

这几种架构的对比如图所示,其中蓝色、绿色、黄色和灰色矩形分别表示前缀词元之间的注意力、前缀词元和目标词元之间的注意力、目标词元之间的注意力以及掩码注意力。

大模型预训练技术-预训练任务

目前,大语言模型常用的预训练任务可以分为三类:语言建模(Language Modeling, LM)、去噪自编码(Denoising Autoencoding, DAE)以及混合去噪器(Mixture-of-Denoisers, MoD)

语言建模任务是最广泛采用的预训练任务,其核心在于"预测下一个词元",经常被用于训练基于解码器的大语言模型, 例如 GPT-3、PaLM 等。形式化来说,给定一个词元序列 <math xmlns="http://www.w3.org/1998/Math/MathML"> u = u 1 , . . . , u T u={u_1,...,u_T} </math>u=u1,...,uT ,语言建模任务旨在基于序列当前位置之前的词元序列 <math xmlns="http://www.w3.org/1998/Math/MathML"> u < t u_<t </math>u<t采用自回归的方式对目标词元 <math xmlns="http://www.w3.org/1998/Math/MathML"> u i u_i </math>ui进行预测,在训练过程中,模型根据式所示的似然函数进行优化:

小结

这次主要讲解大模型训练的三个阶段以及预训练技术里面的相关概念,但是如果需要搞清原理大家可以深入分析这些概念背后的数学逻辑,以及模型架构和实现。

参考资料

  • 第十五章:预训练大语言模型
  • Continual Learning of Large Language Models: A Comprehensive Survey
  • MULTITASK PROMPTED TRAINING ENABLES ZERO-SHOT TASK GENERALIZATIO
  • Training language models to follow instructions with human feedback
相关推荐
Flynt2 分钟前
在K8s上部署vLLM的完整踩坑记录
llm
Java后端的Ai之路4 分钟前
什么是“多模态微调”?
人工智能·lora·微调
沫儿笙4 分钟前
机器人焊接混合气智能节气装置
人工智能·机器人
imbackneverdie9 分钟前
AI生成论文插图速度快不用手搓,但是怎么变成矢量图?
图像处理·人工智能·ai作画·aigc·科研绘图·ai工具·ai生图
甲维斯10 分钟前
GLM5.1 降智了?国模思考强度研究!
人工智能·ai编程
中微子12 分钟前
突然爆火的Warp 终端,开源1天破 4w Stars
linux·人工智能·开源
Restart-AHTCM15 分钟前
AI 时代的大前端崛起,TypeScript 重塑前端开发
前端·人工智能·typescript·ai编程·a
无心水21 分钟前
【Hermes:多平台接入】15、Telegram Bot 接入:手机随时叫 AI 助手(最推荐) —— 把 Honcho 智能体装进口袋
人工智能·openclaw·养龙虾·hermes agent·hermes·养马
乐迪信息27 分钟前
乐迪信息:实时预警,秒级响应:船舶AI异常行为检测算法
大数据·人工智能·算法·安全·目标跟踪
用AI赚一点27 分钟前
AI落地不是造大模型:从概念到落地的核心差异
人工智能·深度学习·机器学习