1.4.llm_sft_and_usages
最后更新于
这有帮助吗?
最后更新于
这有帮助吗?
指令微调(instruct tuning):增强/解锁LLM的能力,
对齐微调(alignment tuning):将LLM的行为与为类的价值观或偏好对齐。
高效微调方法:用于模型快速适配
收集或构建指令格式(instruction-formatted)的实例
使用这些示例进行有监督微调
详见综述
数据集:
指令格式的实例包括一个任务描述(即指令)、一对输入输出和少量示例(可选)
格式化已有数据集
收集来自不同领域(文本摘要、文本分类、翻译等)的实例来创建有监督的多任务训练数据集。用自然语言的任务描述来格式化这些数据集是很方便的。
使用人类撰写的任务描述来增广带标的数据集,通过解释任务目标来指导LLM理解任务。
众包平台(如PromptSource)有效地创建、共享和难不同数据集的任务描述
通过指令微调特殊设计的任务描述,反转已有实例的输入-输出对,例如“请基于以下答案生成一个问题”,如
利用启发式任务模板将大量无标注的文本转换为带标注的实例。如
格式化人类需求
来自公共NLP数据集的训练实例虽然进行了格式化,但任务描述缺乏多样性或与人类真实需求不匹配,故InstructGPT采用真实用户提交给其API的查询作为任务描述。此外,为了丰富任务多样性,通常
标注者为真实生活中的任务编写指令,如开放式生成、开放式问答、头脑风暴、聊天等
另一组标注人员直接对这些指令进行回答
将**指令(采集的用户查询)和期望输出(人工编写的答案)**pair对作为一个训练实例
还有一些半自动化的方法将现有实例输入到LLM中生成多样的任务描述和实例来构建实例,如
构建实例的关键
增加指令:
设计格式:
任务描述:LLM理解任务的最关键部分
相比预训练而言,指令微调有多个不同:
训练目标函数:如seq2seq的loss
优化参数设置:更小的batchsize和学习率
平衡数据分布:平衡不同任务间的比例:
结合指令微调和预训练:
在指令微调时加入预训练数据:,如OPT-IML, 可以看成是对模型的正则化。
性能改进
LLM所需的指令数据数量明显少于预训练数据,故指令微调的成本较低。
任务泛化性
选择标注人员
意图一致性筛选:InstructGPT通过标注人员和研究人员意图一致性来选择标人员。研究者先自己标少量数据,然后衡量自己和标注人员间标的一致性,选择一致性最高的标注人员来进行后续标注。
收集反馈
基于排序的方法:
基于问题的方法:回答研究人员设计的特定问题,这些问题覆盖不同的对齐标准以及其他对LLM的约束条件。例如WebGPT中,标注人员要回答关于检索到的文档对回答给定输入是否有帮助的选择题。
基于规则的方法:
Sparrow不仅选择标注人员挑选的最佳回复,还设计一系列规则来测试模型生成的回复是否符合有用、正确、无害的标准,让标注者对模型生成的回复违反规则的程度进行打分。
GPT-4用一组基于GPT-4的zero-shot分类器作为基于规则的奖励模型,自动确定模型生成的输出是否违反一组人类编写的规则。
详见RLHF章节
全量参数都微调成本很大,有更高效的方法,称为参数高效微调(parameter-efficient fine-tuning)。
将原始特征压缩到较小维度(然后进行非线性变换)
恢复到原始维度
微调时,原参数不变,仅更新适配器模块参数。
在每个Transformer层前添加一系列前缀,即一组可训练的连续向量。前缀向量具有任务的特异性,可以看作虚拟的token emb。
重参数化技巧:
学习一个将较小矩阵映射到前缀参数矩阵的MLP函数,而不是直接优化前缀,有助于稳定训练。
优化后,舍弃映射函数,只保留派生的前缀向量以增强与特定任务相关的性能。
由于只训练前缀参数,故能实现参数高效的模型优化
冻结,通过低秩分解矩阵来近似更新
其中和是用于任务适配的可训练参数,是降低后的秩。
LoRA的优点:
大大节省内存和存储(如VRAM,Video Random Access Memory)
可以只保留一个大型模型副本,同时保留多个用于适配不同下游任务的特定低秩分解矩阵。
用更有原则的方法设置秩:
LoRA已经有广泛的应用,如LLaMA和BLOOM,
LoRA可以认为是对Finetune微调的一种低秩近似,通过增加Rank,LoRA可以达到类似Finetune的微调效果。因此之前多数研究都把LoRA和Finetune在微调准确性上的差异归结为二者的优化参数量不同。
但经过分析发现,lora的学习模式和FT很不一样,更偏向于大开大合,即方向和幅度呈很强的正相关,可能对更精细的学习有害
dora通过同时关注权重更新时的大小和方向变化,实现了比LoRA更加接近finetune微调效果:
w拆成magnitude()乘以direction()
magnitude不变,direction里的用lora更新
注意,这里的norm是column-wise的norm,即输入的矩阵,每一列的元素算一个norm(平方和开根号)得到一个数,最终就是的矩阵
GPT-3提出ICL,将任务描述和(或)示范(demonstration)以自然语言文本形式表达。
以任务描述作为开始,从任务数据集中选择一些样例作为示范。
以特别设计的模板形式将它们按照特定的顺序组合成自然语言提示。
将测试样例添加到LLM的输入中以生成输出。
形式化地看,表示由个样例组成的一组示范,表示把第个任务样例转换为自然语言提示的函数。给定任务描述、示范和新的输入查询,LLM生成的输出如下:
真实答案留白,由LLM预测。
指令微调可以提高LLM执行目标任务的ICL能力,尤其是零样本场景(仅使用任务描述)。
示范选择
启发式方法:
基于LLM的方法:
示范格式
将选择的示范进行整合以及格式化:
增强LLM的推理能力
自动生成高质量的示范格式:
示范顺序
基于信息论的方法:
预训练如何影响ICL
ICL与预训练语料:
LLM如何实现ICL
ICL可以看成是通过前向计算,LLM生成关于示范的元梯度,并通过注意力机制隐式地梯度下降。
LLM的某些注意力头能执行与ICL能力密切相关的任务无关的原子操作(如复制、前缀匹配等)
预训练阶段:LLM本质上通过其参数对隐式模型进行编码
前向计算阶段:通过ICL中提供的示例,LLM可以实现如sgd的学习算法,或者直接计算出闭式解以更新这些模型
ICL只使用输入输出对来构造提示,而CoT将最终输出的中间推理步骤加入提示。
一般在小样本和零样本这两种设置下和ICL一起用
小样本思维链
将每个示范<输入,输出>
替换为<输入,CoT,输出>
。小样本CoT可以看成ICL的一种特殊提示,但相比ICL的标准提示,示范的顺序对性能影响相对较小。
思维链提示设计:
通过特别提示LLM来生成CoT推理路径(例如“Let’s think step by step”)
将训练集里的问题分成不同簇,选择最接近每个簇质心的问题,就可以代表整个训练集里的问题。
增强的思维链策略:如何生成多个推理路径,并在得到的答案中寻找一致性
零样本思维链
先通过“Let’s think step by step”来提示LLM生成步骤
再通过“Therefore, the answer is”来提示得到最终答案
这种方法在模型规模超过一定大小时可以显著提高性能,但在小规模的模型中效果不佳,即涌现能力。
思维链何时适用于LLM:
LLM为何能进行思维链推理:
思维链能力的来源:
提示中组成部分的影响:
,引用数好几百
,meta的论文
扩大任务数量:可以极大提高LLM的泛化能力。但随着任务增加,模型性能最初是连续增长,但任务数量达到一定水平时,性能基本不提升了。猜测,一定数量的代表性性任务就能够提供足够充足的知识了。
增强任务描述的多样性:从如长度、结构、创造力等方面入手,如
每个任务的实例数量:通常少量实例就可以让模型有不错的泛化能力,当某些任务的实例数量进一步增加(至数百个)时可能会过拟合。如
适当数量的示例:能产生实质性的改进,也减轻对指令工程的敏感性。如
指令中的其他部分:如避免事项、原因、建议,影响很小,甚至有负面影响,如
包含推理数据集的CoT实例:和提到同时用包含和不包含CoT的样本微调,能在各种下游任务取得好的效果,包括需要多级推理能力的任务(常识问答、算术推理)和不需要多级推理的任务(如情感分析和抽取式问答)。
实例比例混合策略(),把所有数据集合并,然后从混合数据集中按比例采样每种实例。
提高高质量数据集的采样比例能提升效果,如的FLAN和的P3。
设置最大容量:限制数据集中能包含的最大实例数,防止较大数据集挤占整个采样集合,通常设置为几千或几万,如和。
混合预训练数据(纯文本)和指令微调(指令格式)数据,用多任务方式从头训练:和。将指令格式数据集作为预训练语料库的一小部分来预训练,同时获得预训练和指令微调的优势,如GLM-130B和Galactica。
不同规模的模型都能从指令微调中受益,随着参数规模增加,性能也有提升。发现,指令微调后的小模型甚至能比未经微调的大模型效果更好
指令微调在不同模型架构、预训练目标和模型适配方法上都有稳定改进效果,由发现
指令微调是提升现有LM(包括小型PLM)能力的一个通用方法,同样由发现
赋予LLM遵循人类指令执行特定任务的能力(通常被视为一种涌现能力):发现,指令微调鼓励LLM理解用于完成任务的自然语言指令,,即在未见过的任务上也能执行。
使LLM具有更强的解决现实世界任务的能力:指令微调能帮助LLM缓解一些弱点(如生成重复内容或补全输入但完不成成相应任务),由和发现。
指令微调后的LLM能泛化到其他语言的相关任务上:提出的BLOOMZ-P3基于BLOOM在纯英文的P3任务集合上进行微调,在多语言的句子实例任务中,相比BLOOM有超过50%的性能提升,同时仅用英文指令就能产生不错效果,减少针对特定语言的指令工程的工作量。
和提出,LLM可能编造虚假信息、产生有害的、误导性的和有偏见的表达,因为LLM在预训练时没有考虑人类的价值观或偏好。
和提出了人类对齐,使LLM的行为能够符合人类期望。
、和发现,和适配微调(如指令微调)相比,对齐微调要考虑的标准并不同,这可能会在某种程度上损害LLM的通用能力,即对齐税。
有用性:以简洁且高效的方式帮助用户解决任务或回答问题。需要进一步阐明问题时,应该有通过提出恰当的问题来获取额外信息的能力,并有合适的敏感度、洞察力和审慎度(from )。
诚实性:又称为正确性,提供准确内容,传达适当的不确定性很重要,避免任何形式的欺骗或信息误传。LLM了解其能力和知识水平(知道自己不知道什么)。)认为,与有用性和无害性相比,诚实性是一个更客观的标准,故诚实性对齐依赖的人力可能更少。
无害性:生成的语言不得是冒犯性或者歧视性的,能检测到隐蔽的出于恶意目的的请求。当被诱导去执行危险行为(如犯罪)时,应该礼貌拒绝。提出,某个行为是否有害及有害程度因个人和社会而异。
对齐的标准很主观,难以直接作为LLM的优化目标。比较有前景的方法是和提出的红队攻防,用对抗的方式手动或自动地探测LLM,使其生成有害输出,再更新模型防止此类输出。
教育水平要求高:Sparrow要求本科学历的英国人,中的高优任务有一半是美国硕士
选择优秀标注者:中,研究人员评估标注人员的表现,选出如高一致性之类的一组优秀标注人员继续合作,发现,在标注时提供详细的标注指令和实时的指导是有帮助的。
只选最佳候选:和在这种早期工作中,标注人员用比较粗略的方式评估模型生成的结果,如只选择最佳候选。一方面不同人意见不同,另一方面这种方法忽略了没被选中的样本。
elo评分系统:和提出了elo评分系统,两两比较所有候选输出结果,生成一个偏好排序。
提出,在Transformer中引入一个小型神经网络模块(适配器),也提出了瓶颈架构:
一般是串行插入的方式,集成到每个Transformer层里,分别放到注意力层和前馈层之后。提出了并行适配器,即与注意力层和前馈层并行。
。
提出了p-tuning v2,为了自然语言理解在Transformer中引入逐层提示向量,还利用多任务学习来联合优化共享的提示。
在输入层加入可训练的提示向量,基于离散提示方法(和),通过包含一组软提示token来扩充输入文本,再用扩充后的输入来解决特定的下游任务。将任务特定的提示emb与输入文本的emb相结合,输入模型中。
:提出了P-tuning,用自由形式来组合上下文、提示和目标token,用双向LSTM学习软提示token的表示,适用于自然语言理解和生成的架构。
:提示微调,直接在输入前加入前缀提示。训练时只有提示emb会根据特定任务进行监督学习。这种方法在输入层只包含少量可训练参数,故其效果高度依赖底层语言模型的能力。
通过增加低秩约束来近似每层的更新矩阵,假设参数矩阵,一般是
基于重要性分数的分配:提出的AdaLoRA
无需搜索的最优秩选择:
Alpaca-LoRA:,通过LoRA训练的Alpaca的轻量级微调版本。
LLaMA-Adapter:将可学习的提示向量插入每个Transformer层中,提出零初始化的注意力,通过减轻欠拟合提示向量的影响以改善训练,还能扩展到多模态设置,如视觉问答。
比较了串行适配器微调、并行适配器微调和LoRA,在GPT-J(6B)、BLOOM(7.1B)和LLaMA(7B)上评估:这些方法在困难任务上效果不如GPT-3.5,但在简单任务上表现相当,LoRA表现相对较好且使用的可训练参数明显较少。
huggingface开源了,包括LoRA/AdaLoRA、前缀微调、P-Tuning、提示微调,支持GPT-2和LLaMA,还支持视觉Transformer如ViT和Swin Transformer。
更多的可以参考综述
基于knn的检索器来选择与查询语义相关的样例:如和。但只是针对每个样例单独选择,而不是对整个样例集合进行评估。
基于多样性的选择策略:和
同时考虑相关性和多样性的选择策略:
直接用LLM来选择::LLM可以直接根据添加样例后的性能提升评估每个样例的信息量,以进行选择。
两阶段检索::提出EPR,先用无监督方法召回相似样例,再用密集检索器(用LLM标记的正负样例训练)进行排序。
RL方法:,将示范选择任务建模为RL问题,LLM是奖励函数,为训练策略模型提供反馈。
用LLM来生成示范:发现LLM在文本标方面表现很好,故可以直接将LLM作为无人工干预的示范生成器,如和
提到,ICL中选择的示范样例应该包含足够的有关待解决任务的信息,并与测试查询相关。
用相应的输入输出对来实例化预定义的模板:
添加任务描述:
通过CoT提示:
收集包含人工编写的任务描述的大规模数据集:,能够提升已见任务的性能,也能在一定程度泛化到未见任务。
半自动化方法:使用由人工编写的任务描述组成的种子集合来指导LLM为新任务生成任务描述。
Auto-CoT:使用零样本提示(let's think step by step)以生成中间推理步骤
least-to-most提示:先询问LLM来执行问题分解,再利用LLM根据已解决的中间答案依次解决子问题。
LLM有时会被顺序偏差影响,例如提出LLM会倾向于重复示范结尾附近的答案===>结尾很重要!!
启发式方法:根据在emb空间中示范与查询的相似度来排列,相似度越高,距离结尾越近。
使用最小化压缩和传输任务标签所需的码长来整合更多任务信息,需要额外的标记数据作为用来评估特定示范顺序性能的验证集。
使用全局和局部熵度量来为不同的示范顺序打分,且为了消除对额外标注数据的需要,这篇文章从LLM本身采样来获取验证集。
ICL与预训练任务设计:GPT-3发现ICL能力随模型增大而增强,但发现小规模的PLM也能通过特别设计的训练任务从而表现出强大的ICL能力(例如输入是任务实例+查询,预测标签),甚至能超越规模更大的模型。
发现ICL的性能主要取决于预训练语料的来源而非规模
分析训练数据分布的影响,发现当训练数据可以被聚类成多个不常见的类,而不是均匀分布时,模型会有ICL能力
从理论上解释,认为ICL是在具备长程连贯性的文档上进行预训练的产物。
将ICL视为隐式微调:和
将ICL视为算法学习过程:、,基于这个解释框架,LLM能通过ICL有效地学习简单的线性函数,甚至是如决策树的复杂函数
CoT是一种改进的提示策略,旨在提高LLM在复杂推理任务中的性能,如算术推理(、和)、常识推理(和)、符号推理()。
使用多样的CoT推理路径:,对每个问题给出多个推理路径。
使用具有复杂推理路径的提示:
Auto-CoT:上述方法都需要标注CoT,利用提出的zero-shot-CoT
self-consistency:,在生成CoT和最终答案时新的解码策略。先用LLM生成多个推理路径,再对所有答案进行集成(例如投票)。
更通用的集成框架:发现多样化的推理路径是COT推理性能提高的关键,因此将self-consistency延伸至提示的集成。
通过训练打分模型来衡量生成的推理路径的可靠性,如
持续地利用LLM自己生成的推理路径进行训练,如和
不在提示中加入人工标注的示范,而是直接生成推理步骤,再利用生成的CoT来得出答案。。
Flan-T5和Flan-PaLM()进一步地使用CoT进行指令调整,有效增强了在未见任务上的零样本性能。