赞
踩
LLM训练是利用大规模数据对深度学习模型进行预训练的过程,旨在培养能够理解和生成自然语言文本的模型。这个过程通过处理海量文本数据,让模型学习语言的统计规律、语义信息和上下文关系。LLM训练包括预训练、微调等环节,其中预训练阶段通过处理大规模语料库数据,让模型学习语言的统计规律、语义信息和上下文关系,微调阶段则是在预训练的基础上,使用特定任务的数据对模型进行进一步的调整。Transformer结构模型是LLM训练中常用的模型结构之一,帮助模型捕捉序列数据中的长程依赖关系。LLM训练通常需要大量的计算资源和时间,面临数据选择、预处理等方面的挑战。经过训练的LLM可以应用于各种自然语言处理任务,如机器翻译、文本摘要、问题回答、情感分析等,帮助人们更高效地处理和理解大量的自然语言数据。
后续我们会通过五个不同的章节详细解释每个章节的主要方法及思想
LLM Pre-Training(大型语言模型预训练)是指在特定任务上进行微调之前,对大型语言模型进行的初始训练阶段。这个阶段的目标是通过处理大规模的语料库数据,让模型学习到语言的统计规律、语义信息和上下文关系,从而为后续的微调任务提供强大的语言理解和生成能力。
LLM Pre-Training 的过程可以被视为一次模型的深度学习之旅。在这个阶段,我们从一个未经训练的模型开始,即模型的权重是随机初始化的。然后,模型被训练来根据前面的令牌序列预测即将出现的令牌。
具体而言,LLM Pre-Training 通常采用自监督学习的方式。自监督学习是一种无需人工标注数据的训练方法,它利用大量的未标记数据来生成训练样本。在 LLM Pre-Training 中,模型根据输入的上下文信息,预测被遮盖或掩盖的部分文本,以此来学习词汇之间的关联和句子的结构。这种预测任务可以是掩盖词语恢复、下一个句子预测等。
为了进行 LLM Pre-Training,研究人员收集和整理来自不同来源的大量文本数据,如维基百科、互联网新闻、书籍等。这些数据被组织成语料库,然后被分成适当的片段输入到模型中进行训练。通常情况下,LLM Pre-Training 需要大量的计算资源和时间,以确保模型能够充分学习到语言的各个方面。
当前,不少工作选择在一个较强的基座模型上进行微调,且通常效果不错(如:[alpaca]、[vicuna] 等)。
这种成功的前提在于:预训练模型和下游任务的差距不大,预训练模型中通常已经包含微调任务中所需要的知识。但在实际情况中,我们通常会遇到一些问题,使得我们无法直接使用一些开源 backbone:
语言不匹配:大多数开源基座对中文的支持都不太友好,例如:[Llama]、[mpt]、[falcon] 等,这些模型在英文上效果都很优秀,但在中文上却差强人意。
专业知识不足:当我们需要一个专业领域的 LLM 时,预训练模型中的知识就尤为重要。由于大多数预训练模型都是在通用训练语料上进行学习,对于一些特殊领域(金融、法律等)中的概念和名词无法具备很好的理解。我们通常需要在训练语料中加入一些领域数据(如:[xuanyuan 2.0]),以帮助模型在指定领域内获得更好的效果。
LLM Pre-training具体流程可以参考下图:
在开始预训练之前,需要先选择一个预训练的模型基座。但存在一个较为普遍的问题是:大部分优秀的语言模型都没有进行充分的中文预训练,因此,许多工作都尝试将在英语上表现比较优秀的模型用中文语料进行二次预训练,期望其能够将英语上的优秀能力迁移到中文任务中来。有一些比较优秀的工作如:chinese-llama-alpaca
但在进行正式的训练之前,我们还有一步很重要的事情去做:词表扩充。tokenizer 的目的就是将一句话进行切词,并将切好词的列表喂给模型进行训练。例如:
输入句子 >>> 你好世界
切词结果 >>> ['你', '好', '世', '界']
目前主流的tokenizer方法有 2 种形式:WordPiece 和 BPE。
WordPiece的工作原理相对简单,但非常有效。它将文本分割成子词,每个子词通常由一个或多个字符组成。这些子词可以是词根、前缀、后缀或其他语言学单位。
构建词汇表:首先,WordPiece算法会构建一个初始词汇表,其中包含语料库中的所有字符作为单独的子词。
拆分:然后,它开始迭代地将频率最高的相邻字符组合成更长的子词。这个过程会一直持续,直到达到预定的词汇表大小或者不再能合并字符为止。
停止符号:WordPiece还会引入特殊的停止符号,以确保每个单词或子词都以其最小形式存在。
标记化:最终,文本会被分割成这些子词,然后用特殊的标记符号来表示每个子词的开头。这些标记化的文本可以用于各种NLP任务,例如文本分类、命名实体识别和机器翻译。
字节对编码(BPE, Byte Pair Encoder),又称 digram coding 双字母组合编码,是一种数据压缩 算法,用来在固定大小的词表中实现可变⻓度的子词。该算法简单有效,因而目前它是最流行的方法。
BPE 首先将词分成单个字符,然后依次用另一个字符替换频率最高的一对字符 ,直到循环次数结束。
接下来详细介绍 BPE 在分词中的算法过程:
算法过程
注:新字符依然可以参与后续的 merge,有点类似哈夫曼树,BPE 实际上就是一种贪心算法 。
重复遍历 2 和 3 操作,直到词表中单词数达到设定量 或下一个最高频数为 1 ,如果已经打到设定量,其余的词汇直接丢弃
具体详解见:BPE详解
在扩充完 tokenizer 后,我们就可以开始正式进行模型的预训练步骤了。
Pretraining 的思路很简单,就是输入一堆文本,让模型做 Next Token Prediction 的任务,这个很好理解。
我们主要来讨论几种预训练过程中所用到的方法:数据源采样、数据预处理、模型结构。
数据源采样
在 [gpt3] 的训练过程中,存在多个训练数据源,论文中提到:对不同的数据源会选择不同采样比例
通过「数据源」采样的方式,能够缓解模型在训练的时候受到「数据集规模大小」的影响。相对较大的数据集(Common Crawl)会使用相对较大的采样比例(60%),这个比例远远小于该数据集在整体数据集中所占的规模(410 / 499 = 82.1%),因此,CC 数据集最终实际上只被训练了 0.44(0.6 / 0.82 * (300 / 499))个 epoch。而对于规模比较小的数据集(Wikipedia),则将多被训练几次(3.4 个 epoch)。这样一来就能使得模型不会太偏向于规模较大的数据集,从而失去对规模小但作用大的数据集上的学习信息。
数据预处理
数据预处理主要指如何将「文档」进行向量化。通常来讲,在 Finetune 任务中,我们通常会直接使用 truncation 将超过阈值(2048)的文本给截断,但在 Pretrain 任务中,这种方式显得有些浪费。
以书籍数据为例,一本书的内容肯定远远多余 2048 个 token,但如果采用头部截断的方式,则每本书永远只能够学习到开头的 2048 tokens 的内容(连序章都不一定能看完)。因此,最好的方式是将长文章按照 seq_len(2048)作分割,将切割后的向量喂给模型做训练。
模型结构
为了加快模型的训练速度,通常会在 decoder 模型中加入一些 tricks 来缩短模型训练周期。目前大部分加速 tricks 都集中在 Attention 计算上(如:MQA 和 Flash Attention [falcon] 等);此外,为了让模型能够在不同长度的样本上都具备较好的推理能力,通常也会在 Position Embedding 上进行些处理,选用 ALiBi([Bloom])或 RoPE([GLM-130B])等
关于 Language Modeling 的量化指标,较为普遍的有 [PPL],[BPC] 等,
可以简单理解为在生成结果和目标文本之间的 Cross Entropy Loss 上做了一些处理。
这种方式可以用来评估模型对「语言模板」的拟合程度,
即给定一段话,预测后面可能出现哪些合法的、通顺的字词。
但仅仅是「生成通顺句子」的能力现在已经很难满足现在人们的需求,
大部分 LLM 都具备生成流畅和通顺语句能力,很难比较哪个好,哪个更好。
LLM在预训练阶段经过大量的数据训练后,已经具备了充足的知识储备,但任然有多种局限性:
针对LLM知识缺乏的问题,可以通过微调来提升LLM在特定领域的知识和表现。通过使用特定领域的数据对LLM进行微调训练,可以使其更好地理解和处理该领域的语言和知识,从而提高在该领域任务上的性能和准确性。
工作流程如下:
奖励模型是一种对LLM进行sft后的模型生成的答案与问题匹配度进行打分的一种评价模型。奖励模型来自于强化学习中的奖励函数,即对当前的时刻状态画一个分数,来说明这个状态产生的价值有多少。在大语言模型微调中的奖励模型是对输入的问题和答案计算出一个分数。输入的答案与问题匹配度越高,则奖励模型输出的分数也越高。
奖励模型(RM 模型)将 SFT 模型最后一层的 softmax 去掉,即最后一层不用 softmax,改成一个线性层。RM 模型的输入是问题和答案,输出是一个标量即分数。
由于模型太大不够稳定,损失值很难收敛且小模型成本较低,因此,RM 模型采用参数量为 6B 的模型,而不使用 175B 的模型。
奖励模型的训练数据是人工对问题的每个答案进行排名,如下图所示:
对于每个问题,给出若干答案,然后工人进行排序,而奖励模型就是利用排序的结果来进行反向传播训练。奖励模型的损失函数采用 Pairwise Ranking Loss。
大语言模型完成奖励模型的训练后,下一个阶段是训练强化学习模型(RL 模型),也是最后一个阶段。大语言模型微调中训练 RL 模型采用的优化算法是 PPO(Proximal Policy Optimization,近端策略优化)算法,即对设定的目标函数通过随机梯度下降进行优化。近端策略优化是一种深度强化学习算法,用于训练智能体在复杂环境中学习和执行任务。通过智能体的训练,使得其在与环境的交互中能够最大化累积回报,从而达成指定任务目标。这里的智能体在大语言模型中指的就是 RL 模型。
RL 模型的初始模型采用 SFT 微调之后的大语言预训练模型。训练 RL 模型的数据集只需要收集问题集(Prompt 集),不需要对问题进行标注。问题集通过 RL 模型生成答案文本,然后将问题和答案输入上一步训练的 RW 模型进行打分,来评价生成的文本质量,而训练 RL 模型的目标是使得生成的文本要在 RW 模型上获得尽可能高的得分。
将初始语言模型的微调任务建模为强化学习(RL)问题,需要定义策略(policy)、动作空间(action space)和奖励函数(reward function)等基本要素。
策略就是基于该语言模型,接收 prompt 作为输入,然后输出一系列文本(或文本的概率分布);而动作空间就是词表所有 token 在所有输出位置的排列组合;观察空间则是可能的输入 token 序列(即 prompt),为词表所有 token 在所有输入位置的排列组合;而奖励函数则是上一阶段训好的 RM 模型,配合一些策略层面的约束进行的奖励计算。该阶段流程如下图所示:
通过强化学习的训练方法,迭代式的更新奖励模型(RW 模型)以及策略模型(RL 模型),让奖励模型对模型输出质量的刻画愈加精确,策略模型的输出则愈能与初始模型拉开差距,使得输出文本变得越来越符合人的认知。这种训练方法也叫做 RLHF。
目前,RLHF 技术对训练大语言模型具有极大的影响力,训练出来的效果好于之前的方法。但是,RLHF 训练出来的大语言模型仍然可能输出有害或事实上不准确的文本,需要不断不断改进。此外,在基于 RLHF 范式训练模型时,人工标注的成本还是非常高昂的,RLHF 性能最终仅能达到标注人员的知识水平。这里的人工标注主要是为 RM 模型标注输出文本的排序结果,而若想要用人工去撰写答案的方式来训练模型,那成本更是不可想象。
参考文献:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。