赞
踩
why ?->当模型参数超过一定规模时,大模型不仅取得了显著性能提升,并表现出了一些小规模语言模型不具备的特殊能力(emergent abilities)
LLM->显著规模的PLM
LLM的四个阶段:预训练、调优、使用、评估
区别于小型PLMs,访问LLM的主要方式是通过prompting interface(e.g. API)
LLMs的发展限制:
(本文内容来源于论文A Survey of Large Language Models 部分内容阅读笔记,如有阅读不理解之处可参照原论文arxiv地址)
现有LLMs主要利用多种公众文本数据集混合作为预训练语料
现有预训练语料数据集大致可分为两种类型:通用数据与专业数据
数据预处理
一般包括去噪、降低冗余、去除不相关内容、删除潜在有害数据
预训练语料的质量与分布对LLM的性能影响
encoder-decoder
vanilla transformer:
decoder-only:一般包括causal decoder与prefix decoder,但是一般说起decoder-only模型时,一般指的是causal decoder
causal decoder
使用单向注意力掩码,输入的每个token只能关注过去的token和本身。输入和输出tokens通过decoder以相同的方式进行处理。
prefix decoder
对causal decoder的掩码机制进行修改,使其能对前置tokens使用双向注意力,并对生成的tokens使用单项注意力。在实际训练中可先训练causal decoder,再把它转换成prefix decoder来加速收敛。
Transformer的归一化、位置嵌入、激活函数、注意力偏置
下表展示了这几项配置的种类及其对应的计算方式
综合上表得到的结论是:在训练LLMs时建议选择Pre RMSNorm进行归一化、选择SwiGLU或GeGLU作为激活函数。此外,LN在嵌入层后可能不会立即使用,这很可能导致性能下降。对于位置嵌入,RoPE或ALiBi更好,因为它们在长序列上表现更佳。
预训练任务
一般有语言建模和去噪自编码两种任务
语言建模(Language Modeling):一般是only-decoder最常用的目标。对于一个给定的tokens序列x = {x_1,x_2,…,x_n},LM任务旨在根据之前的token(x_<i)自回归预测目标token x_i。一般训练目标是最大化以下似然概率:
L
L
M
(
x
)
=
∑
i
=
1
n
l
o
g
P
(
x
i
∣
x
<
i
)
L_{LM}(x) = \sum ^n _{i=1}logP(x_i|x_{<i})
LLM(x)=i=1∑nlogP(xi∣x<i)
去噪自编码(denoising autoencoding task, DAE):DAE任务的输入x \ ~x 是随机替换跨度的损坏文本。然后,训练语言模型来恢复替换的token ~x。DAE的训练目标表示如下
L
D
A
E
(
x
)
=
l
o
g
P
(
x
~
∣
x
x
~
)
L_{DAE}(x)=logP(\tilde{x}|x_{ \tilde{x}})
LDAE(x)=logP(x~∣xx~)
由于DAE在执行上比LM更为复杂,所以并没有被广泛应用于LLMs的训练
混合去噪器(Mixture-of-Denoisers, MoD):也被称为UL2 loss,它被引入作为预训练语言模型的统一目标。MoD把LM与DAE都视作不同类型的去噪任务,其中S-denoiser->LM, R-denoiser->DAE, short span and low corruption, X-denoiser->DAE,long span or high corruption
对于这三种去噪器,S-denoiser与LM目标类似,R-denoiser 和X-denoiser与DAE类似,只不过二者在文本的跨度长度和损坏文本的比例上有细微不同。对于使用不同的特殊token([R]、[S]、[X])开始的输入语句将使用相对应的去噪器对模型进行优化
架构选择:
使用LM目标进行预训练时,casual decoder架构可以实现出色的零样本和少样本泛化能力,并表现出优于其他架构的零样本性能。此外,指令调整和对齐调整已经被证明可以进一步增强大型casual decoder模型的能力。
根据scaling law,选择更大模型与更大的数据集能获得更好的表现能力
LLMs支持长文本上下文建模,主要原因可归结于以下两点
优化器设置:
训练技巧:
两个主要问题:提高训练吞吐量&将大模型加载到GPU内存中
3D Parallelism:三维并行主要由三种训练策略组成,分别是数据并行、pipeline并行、和张量并行
data parallelism: 数据并行是增加训练吞吐量的方法之一。数据并行是把model paramenters 和optimizer states跨多个GPU进行复制,然后再把整个训练语料分发到这些GPU中,每个GPU只处理分配给自己数据并获得梯度,然后再进一步聚合获得整个批次的梯度用于更新所有GPU中的模型
Pipeline parallelism: pipeline并行主要是把LLM的不同层分布到多个GPU中,对于transformer来说,pipeline并行是把连续的层加载到同一个GPU中来降低GPU之间传输计算隐藏状态或梯度的成本。由于每个GPU都需要等待上一个GPU来完成计算,pipeline并行化可能会导致GPU利用率降低,从而导致不必要的bubbles overhead。为了减少pipeline并行中的这些气泡,有方法提出了多批次数据填充和异步梯度更新技术来提高流水线效率
bubbles overhead:在计算机科学和工程领域,“bubbles overhead"指的是资源(GPU、CPU或内存)的浪费,因为系统中存在不必要的空闲,故降低了系统的效率。
tensor parallelism: 区别于pipeline并行,张量并行侧重于分解LLM中的张量(参数矩阵)。对于LLM中的矩阵乘法运算Y = XA,参数矩阵A可以按列拆分为A1和A2两个子矩阵,可以表示为Y = [ XA1、XA2]。通过将矩阵A1和A2放置在不同的GPU上,矩阵乘法运算将在两个GPU上并行调用,最后通过跨GPU通信将两个GPU的输出进行合并得到最终结果。
ZeRO:ZeRO主要是针对数据并行中的内存冗余问题。在模型训练过程中,并不是所有数据都需要保存在每个GPU上(比如某个时刻只需要调用某一小部分数据),故导致了内存冗余。ZeRO技术的目标是在每个GPU上只保留一小部分数据,而其余的数据可以在需要时从其他GPU中检索。
具体而言,ZeRO提供了3种解决方案,这取决于数据的3个部分是如何存储的,即优化器状态划分、梯度划分和参数划分。实验结果表明,前两种方案并没有增加通信开销,第三种方案增加了约50 %的通信开销,但节省了与GPU数量成正比的内存。PyTorch实现了与ZeRO类似的技术,称为FSDP
mixed precision trainning:在以往的PLMs中,FP32(32位浮点数)主要用于预训练。为了降低大模型训练的开销,会使用FP16来进行训练,且NVIDIA GPUs的FP16计算单元数量是FP32的两倍,故计算效率会进一步提高。但是单使用FP16会造成一定的精度损失从而影响模型性能,为了缓解这种情况,一种叫做brain floating point( BF16 )的替代品被用于训练,它比FP16分配更多的指数位和更少的有效位,在预训练阶段,BF16在表示精度上总体表现优于FP16。
在实际的应用中,通常联合使用上述训练技术来进行训练,例如,研究人员将8路数据并行、4路张量并行和12路流水线并行结合起来,实现了在384个A100 GPU上训练BLOOM。目前,Deep Speed、Colossal - AI、Alpa等开源库可以很好地支持这3种并行训练方法。此外也可以利用BF16混合精度训练来提高效率。
由于训练大型模型是一个时间密集型的过程,因此在早期阶段预测模型性能和发现异常问题是非常有用的。为此,GPT-4最近引入了一种建立在深度学习堆栈上的可预测缩放的新机制,实现了用更小的模型预测大模型的性能,这对于开发LLMs可能非常有用。在实践上,可以进一步利用主流深度学习框架的支撑训练技术。例如,PyTorch支持数据并行训练算法FSDP (fully sharded data parallel),该算法允许在需要时将训练计算部分卸载到CPU。
为了使得LLMs能针对具体目标获得更优的能力,一般有两种调优方式,分别是指令调优(instructoin tuning)和对齐调优(alignment tuning)
instruction tuning:增强LLMs的能力
从本质上说,指令微调是以自然语言的形式在格式化实例集合(collection of formatted instances)上对预训练的LLM进行微调的方法,与有监督的微调和多任务提示训练高度相关。
为了进行指令调优,我们首先需要收集或构造指令格式化的实例。然后,我们使用这些格式化的实例以监督学习的方式(例如,使用序列到序列的损失进行训练)对LLM进行微调。经过指导语调优后,LLMs即使在多语言环境下也能表现出泛化到看不见的任务的卓越能力。
格式化实例构建
构成:一个指令格式的实例由任务描述(称为指令)、可选输入、对应输出和少量演示(可选)组成
任务数据集的格式化:在提出指导语调优之前,一些早期的研究从不同范围的任务(如文本摘要、文本分类和翻译等)中收集实例,以创建有监督的多任务训练数据集。它们是指令调优实例的主要来源,用自然语言任务描述来格式化这些多任务训练数据集是很方便的
众包平台:PromptSource 用于有效地创建、共享和验证不同数据集的任务描述以更好地生成用于指令调优的标注实例
日常聊天数据格式化:增强模型的指令多样性&匹配真实人类多样性。InstructGPT把真实用户提交给OpenAI API的查询用做任务描述来激发LLM的指令跟随能力。具体来说,为了丰富任务的多样性,人类标注者被要求编写真实任务的指导语,包括开放式生成、开放式问答、头脑风暴和聊天等。然后,他们让另一组标注者直接回答这些指令作为输出。最后,将一条指令(即收集到的用户查询)和期望输出(即人类书写的答案)配对作为训练实例。另外,GPT-4也设计了潜在高风险指令,并通过针对安全问题的有监督微调来引导模型拒绝这些指令
合成数据格式化:该方法主要是为了减少人工标注或降低人工收集的负担而提出的半自动化构建方法。主要是将已有的实例输入LLMs来合成多样化的任务描述和实例。Self - Instruct方法只需要100个左右的实例作为初始任务池,然后再从池中随机选择几个实例作为示范,并提示LLM生成新的指令和相应的输入输出对。经过质量和多样性过滤后,新生成的实例将被添加到任务池中。因此,该合成方法是生成大规模LLM指令数据的一种有效且经济的方法
实例构建的关键要素:
指令微调策略:指令微调可以看作一个有监督的训练过程,相较预训练来说,指令微调的训练目标和优化配置都是不一样的。另外,在指令微调中需要特别关注以下两个问题:
平衡数据分布:由于指令微调涉及不同任务的混合,因此在微调过程中平衡不同任务的比例非常重要。
样例比例混合策略(examples-proportional mixing stratege):合并所有的数据集并从混合数据集中均匀地采样每个样例。
根据最近的研究结果,增加优质实例集合(例如FLAN 和P3 )的抽样比例通常可以带来性能的提高。此外,在指令调优过程中,通常会设置一个最大上限来控制数据集所能包含的最大样例数,以防止更大的数据集压倒整个分布。在实际应用中,通常根据不同的数据集,将最大上限设置为几千或几万
指令调优与预训练结合:
指令调优在不同规模的模型上都体现了普适性,基本都能带来性能提升。此外,指令调优大大增强了大模型的任务泛化能力,在跨语言任务中也表现良好。指令调优还能增强模型在某特定领域的专业能力(如金融、医学、法律等)。
下表展示了基于LLaMA ( 7B )模型在聊天和QA设置下的指令调整实验结果(均为单话轮会话)。在Self - Instruct - 52K数据集上采用了4种指令改进策略,即增强复杂度( w /复杂度)、增加多样性( w /多样性)、平衡难度( w /难度)和缩放指令数量( w /缩放)
LLaMA - 7B是一种流行的LLM主干,已被广泛用于指令调优
Chat:
AlpacaFarm: 一个评价集,用于对聊天设置进行评价
w->win rate: 来自两个比较模型的响应哪个更适合用户查询
QA: 基于MMLU和BBH3k两个基准通过启发式规则来解析来自LLM答案的准确性
MMLU:
BBH3k: Yu-Lan Chat 发布的BBH基准的一个子集
结论:
Task-formatted 指令相较Chat更适合QA
多种指令混合使用对于提高LLMs的综合能力很有帮助
增加指令的复杂性和多样性会造成模型性能提升
单纯增加指令数量或对指令难度进行均衡不一定能带来比较好的性能提升
作者关于指令调优的建议:
为了对LLMs进行指令调优,可以根据上表中关于所需GPU数量和调优时间的基本统计信息来准备计算资源。在搭建好开发环境后,我们推荐初学者遵循Alpaca Reposita的代码进行指令调优。随后,我们应该选择基本模型并构建本节中讨论的指令数据集。当用于训练的计算资源受到限制时,用户可以利用LoRA进行参数高效的调优。在推理方面,用户可以进一步使用量化方法在更少或更小的GPU上部署LLM
alignment tuning:将LLMs与人类价值观或偏好对齐
1、alignment training
对齐训练的核心思想是通过引入对齐信息来指导模型的学习过程,主要是在模型训练过程中对输入和输出之间的对应关系进行建模,以便能更好地捕捉输入与输出之间的关联
human alignment被引入使得LLMs的行为符合人类的预期(减少虚假有害信息、符合人类偏好)
alignment tax:alignment可能会在一定程度上损害LLMs的一般能力
三种代表性的人工对齐指标:
Human Feedback的选取:
目前还是主要依赖人工标注来生成反馈数据,所以如何选取human labelers至关重要。
现在一般来说为了获取高质量的feedback会要求人工标注者需要具备合适的教育水平与英语数量程度。同时需要尽量保证人工标注者和研究者之间意图的一致性。(目前一致性的保证主要是通过研究者先对少量数据进行标注,再衡量自己的标注与其他人工标注者之间的一致性来对人工标注者进行筛选。或者是研究者选择一批"super raters"(一批具有良好性能的人工标注者)来为其他人工标注人员提供说明与指导)
Human Feedback的收集:
RLHF(Reinforcement learning from human feedback, 基于人类反馈的强化学习)在LLMs中的应用
定义:RLHF使用强化学习(RL)算法通过学习一个奖励模型来使得LLMs适应人类的反馈
参数高效微调办法(Parameter-Efficient Fine-Tuning,PEFT):
有实证研究表明,LoRA在所有的调优方法中表现相对较好,使用的可训练参数明显较少
LoRA:对于一个优化参数矩阵W,它的更新过程可以表示为W<–W+ΔW,LoRA的基本思想是将原始矩阵W∈Rmxn冻结,同时用低秩分解矩阵近似参数更新ΔW,,即∆W = A · B⊤,其中A∈Rm × k和B∈Rn × k为任务自适应的可训练参数,k⋅min( m , n)为降秩。LoRA的主要优点是可以在很大程度上节省内存和存储使用量(VRAM)。此外,为了适应不同的下游任务,只能保持单个大的模型拷贝,同时保持多个特定任务的低秩分解矩阵。
在LLMs的训练中,应该对transformer中的哪些权重矩阵应用LoRA->适配更多的权重矩阵比适配具有较大秩的单一类型矩阵更可取(适配{Wq, Wv}比只适配Wq更有竞争力)
LoRA的最佳秩->LoRA在一个很小的r下已有很好表现了,增加秩并不一定能够覆盖一个更有意义的子空间,所以一个低秩的适配矩阵就足够
矩阵的秩&低秩近似
矩阵的秩:矩阵中线性无关的列(列秩)或行(行秩)的数量
低秩近似:用秩小于原始矩阵M的矩阵M *来表示M信息的过程。为了达到降低M *秩的效果,可以尝试将矩阵进行分解,即M = LRT ≈ LkRTk ≈M *。这样的变换能使得一个通常由m×n表示的矩阵可以由k(m+n)个值表示。当矩阵M中包含可以忽略的信息时,低秩近似通常有用。
构造低秩近似矩阵的方法最常用的为奇异值分解
将矩阵M进行奇异值分解,有M = USVT = (US)VT = LRT,其中L=(US), R=V
不局限于矩阵的精确分解,使用Uk、Sk、Vk分别替换上述方程中的U、S、V(只使用分解矩阵的前k列,k<r):M ≈ UkSkVkT ≈M *
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。