1.4.llm_sft_and_usages

微调

  • 指令微调(instruct tuning):增强/解锁LLM的能力,

  • 对齐微调(alignment tuning):将LLM的行为与为类的价值观或偏好对齐。

  • 高效微调方法:用于模型快速适配

指令微调

  • 收集或构建指令格式(instruction-formatted)的实例

  • 使用这些示例进行有监督微调

详见综述Is prompt all you need? no. A comprehensive and broader view of instruction learning

数据集:https://huggingface.co/collections/davanstrien/top-10-instruction-tuning-datasets-650d91e11427d12e8542a21a

构建格式化实例

指令格式的实例包括一个任务描述(即指令)、一对输入输出和少量示例(可选)

格式化已有数据集

  • 收集来自不同领域(文本摘要、文本分类、翻译等)的实例来创建有监督的多任务训练数据集。用自然语言的任务描述来格式化这些数据集是很方便的。

  • 使用人类撰写的任务描述来增广带标的数据集,通过解释任务目标来指导LLM理解任务。

  • 众包平台(如PromptSource)有效地创建、共享和难不同数据集的任务描述

  • 通过指令微调特殊设计的任务描述,反转已有实例的输入-输出对,例如“请基于以下答案生成一个问题”,如

  • 利用启发式任务模板将大量无标注的文本转换为带标注的实例。如Learning instructions with unlabeled data for zero-shot cross-task generalization

格式化人类需求

来自公共NLP数据集的训练实例虽然进行了格式化,但任务描述缺乏多样性与人类真实需求不匹配,故InstructGPT采用真实用户提交给其API的查询作为任务描述。此外,为了丰富任务多样性,通常

  • 标注者为真实生活中的任务编写指令,如开放式生成、开放式问答、头脑风暴、聊天等

  • 另一组标注人员直接对这些指令进行回答

  • 将**指令(采集的用户查询)期望输出(人工编写的答案)**pair对作为一个训练实例

还有一些半自动化的方法将现有实例输入到LLM中生成多样的任务描述和实例来构建实例,如

构建实例的关键

指令微调策略

相比预训练而言,指令微调有多个不同:

指令微调效果

性能改进

任务泛化性

对齐微调

Training language models to follow instructions with human feedbackAlignment of language agents提出,LLM可能编造虚假信息、产生有害的、误导性的和有偏见的表达,因为LLM在预训练时没有考虑人类的价值观或偏好。

Improving alignment of dialogue agents via targeted human judgementsTraining language models to follow instructions with human feedback提出了人类对齐,使LLM的行为能够符合人类期望。

Training language models to follow instructions with human feedbackA general language assistant as a laboratory for alignmentTraining a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback发现,和适配微调(如指令微调)相比,对齐微调要考虑的标准并不同,这可能会在某种程度上损害LLM的通用能力,即对齐税

对齐的标准

  • 有用性:以简洁高效的方式帮助用户解决任务或回答问题。需要进一步阐明问题时,应该有通过提出恰当的问题获取额外信息的能力,并有合适的敏感度、洞察力和审慎度(from A general language assistant as a laboratory for alignment)。

  • 诚实性:又称为正确性,提供准确内容,传达适当的不确定性很重要,避免任何形式的欺骗或信息误传。LLM了解其能力和知识水平(知道自己不知道什么)。A general language assistant as a laboratory for alignment)认为,与有用性和无害性相比,诚实性是一个更客观的标准,故诚实性对齐依赖的人力可能更少

  • 无害性:生成的语言不得是冒犯性或者歧视性的,能检测隐蔽的出于恶意目的的请求。当被诱导去执行危险行为(如犯罪)时,应该礼貌拒绝Training a Helpful and Harmless Assistant with Reinforcement Learning from Human Feedback提出,某个行为是否有害有害程度个人社会而异。

对齐的标准很主观,难以直接作为LLM的优化目标。比较有前景的方法是Red teaming language models to reduce harms: Methods, scaling behaviors, and lessons learnedRed teaming language models with language models提出的红队攻防,用对抗的方式手动自动探测LLM,使其生成有害输出,再更新模型防止此类输出

收集人类反馈

选择标注人员

收集反馈

  • 基于排序的方法:

  • 基于问题的方法:回答研究人员设计的特定问题,这些问题覆盖不同的对齐标准以及其他对LLM的约束条件。例如WebGPT中,标注人员要回答关于检索到的文档对回答给定输入是否有帮助的选择题。

  • 基于规则的方法:

    • Sparrow不仅选择标注人员挑选的最佳回复,还设计一系列规则测试模型生成的回复是否符合有用正确无害的标准,让标注者对模型生成的回复违反规则的程度进行打分

    • GPT-4用一组基于GPT-4的zero-shot分类器作为基于规则的奖励模型自动确定模型生成的输出是否违反一组人类编写的规则

RLHF

详见RLHF章节

高效微调

全量参数都微调成本很大,有更高效的方法,称为参数高效微调parameter-efficient fine-tuning)。

适配器微调(adapter tuning)

Parameter-efficient transfer learning for NLP提出,在Transformer中引入一个小型神经网络模块适配器),LLM-Adapters: An Adapter Family for Parameter-Efficient Fine-Tuning of Large Language Models也提出了瓶颈架构:

  • 将原始特征压缩到较小维度(然后进行非线性变换)

  • 恢复到原始维度

一般是串行插入的方式,集成到每个Transformer层里,分别放到注意力层前馈层之后Towards a unified view of parameter- efficient transfer learning提出了并行适配器,即与注意力层和前馈层并行

微调时,原参数不变仅更新适配器模块参数

前缀微调(prefix tuning)

Prefix-tuning: Optimizing continuous prompts for generation

  • 在每个Transformer层前添加一系列前缀,即一组可训练的连续向量。前缀向量具有任务的特异性,可以看作虚拟的token emb

  • 重参数化技巧:

    • 学习一个将较小矩阵映射到前缀参数矩阵MLP函数,而不是直接优化前缀,有助于稳定训练

    • 优化后,舍弃映射函数,只保留派生的前缀向量以增强与特定任务相关的性能。

    • 由于只训练前缀参数,故能实现参数高效的模型优化

P-tuning v2: Prompt tuning can be comparable to fine- tuning universally across scales and tasks提出了p-tuning v2,为了自然语言理解在Transformer中引入逐层提示向量,还利用多任务学习联合优化共享的提示

提示微调(prompt tuning)

输入层加入可训练提示向量,基于离散提示方法(How can we know what language models know?Autoprompt: Eliciting knowledge from lan- guage models with automatically generated prompts),通过包含一组软提示token来扩充输入文本,再用扩充后的输入来解决特定的下游任务。将任务特定的提示emb输入文本的emb相结合,输入模型中。

  • GPT understands, too:提出了P-tuning,用自由形式来组合上下文提示目标token,用双向LSTM学习软提示token的表示,适用于自然语言理解和生成的架构。

  • The power of scale for parameter-efficient prompt tuning:提示微调,直接在输入前加入前缀提示。训练时只有提示emb会根据特定任务进行监督学习。这种方法在输入层只包含少量可训练参数,故其效果高度依赖底层语言模型的能力

低秩适配(LoRA)

LoRA的优点:

  • 大大节省内存和存储(如VRAM,Video Random Access Memory)

  • 可以只保留一个大型模型副本,同时保留多个用于适配不同下游任务特定低秩分解矩阵

用更有原则的方法设置秩:

小结

LoRA已经有广泛的应用,如LLaMA和BLOOM,

LLM-Adapters: An Adapter Family for Parameter-Efficient Fine-Tuning of Large Language Models比较了串行适配器微调、并行适配器微调和LoRA,在GPT-J(6B)、BLOOM(7.1B)和LLaMA(7B)上评估:这些方法在困难任务上效果不如GPT-3.5,但在简单任务上表现相当LoRA表现相对较好且使用的可训练参数明显较少。

huggingface开源了Peft: State-of-the-art parameter-efficient fine-tuning methods,包括LoRA/AdaLoRA、前缀微调、P-Tuning、提示微调,支持GPT-2和LLaMA,还支持视觉Transformer如ViT和Swin Transformer。

让大模型不再「巨无霸」,这是一份最新的大模型参数高效微调综述

Parameter-Efficient Fine-Tuning for Large Models: A Comprehensive Survey

lora变种

DoRA

DoRA: Weight-Decomposed Low-Rank Adaptation

https://github.com/catid/dora

LoRA可以认为是对Finetune微调的一种低秩近似,通过增加Rank,LoRA可以达到类似Finetune的微调效果。因此之前多数研究都把LoRA和Finetune在微调准确性上的差异归结为二者的优化参数量不同。

但经过分析发现,lora的学习模式和FT很不一样,更偏向于大开大合,即方向幅度呈很强的正相关,可能对更精细的学习有害

dora通过同时关注权重更新时的大小方向变化,实现了比LoRA更加接近finetune微调效果:

# This layer is dropped into your pre-trained PyTorch model where nn.Linear is used
class DoRALayer(nn.Module):
    def __init__(self, d_in, d_out, rank=4, weight=None, bias=None):
        super().__init__()

        if weight is not None:
            self.weight = nn.Parameter(weight, requires_grad=False)
        else:
            self.weight = nn.Parameter(torch.Tensor(d_out, d_in), requires_grad=False)

        if bias is not None:
            self.bias = nn.Parameter(bias, requires_grad=False)
        else:
            self.bias = nn.Parameter(torch.Tensor(d_out), requires_grad=False)

        # m = Magnitude column-wise across output dimension
        self.m = nn.Parameter(self.weight.norm(p=2, dim=0, keepdim=True))
        
        std_dev = 1 / torch.sqrt(torch.tensor(rank).float())
        self.lora_A = nn.Parameter(torch.randn(d_out, rank)*std_dev)
        self.lora_B = nn.Parameter(torch.zeros(rank, d_in))

    def forward(self, x):
        lora = torch.matmul(self.lora_A, self.lora_B)
        adapted = self.weight + lora
        column_norm = adapted.norm(p=2, dim=0, keepdim=True)
        norm_adapted = adapted / column_norm
        calc_weights = self.m * norm_adapted
        return F.linear(x, calc_weights, self.bias)

## 使用
def replace_linear_with_dora(model):
    for name, module in model.named_children():
        if isinstance(module, nn.Linear):
            # Get the input and output dimensions of the current nn.Linear layer
            d_in = module.in_features
            d_out = module.out_features

            # Create a new DoRALayer with the same dimensions
            setattr(model, name, DoRALayer(d_out=d_out, d_in=d_in, weight=module.weight.data.clone(), bias=module.bias.data.clone()))
        else:
            # Recursively apply this function to submodules
            replace_linear_with_dora(module)

fourierft

ICML 2024 | 脱离LoRA架构,训练参数大幅减少,新型傅立叶微调来了

https://github.com/Chaos96/fourierft

SFT技巧

全是细节|大模型SFT的100个关键点

LLM预训练与SFT数据配比调研

使用

上下文学习

GPT-3提出ICL,将任务描述和(或)示范(demonstration)以自然语言文本形式表达。

上下文学习形式

  • 任务描述作为开始,从任务数据集中选择一些样例作为示范

  • 以特别设计的模板形式将它们按照特定的顺序组合成自然语言提示

  • 测试样例添加到LLM的输入中以生成输出。

更多的可以参考综述A survey for in-context learning

指令微调可以提高LLM执行目标任务的ICL能力,尤其是零样本场景(仅使用任务描述)。

示范设计

示范选择

An explanation of in-context learning as implicit bayesian inference提到,ICL中选择的示范样例应该包含足够的有关待解决任务的信息,并与测试查询相关

示范格式

将选择的示范进行整合以及格式化

示范顺序

LLM有时会被顺序偏差影响,例如Calibrate before use: Improving few-shot performance of language models提出LLM会倾向于重复示范结尾附近的答案===>结尾很重要!!

底层机制

预训练如何影响ICL

LLM如何实现ICL

思维链提示(CoT)

CoT是一种改进的提示策略,旨在提高LLM在复杂推理任务中的性能,如算术推理(Training verifiers to solve math word problemsAre NLP models really able to solve simple math word problems?A diverse corpus for evaluating and developing english math word problem solvers)、常识推理(Commonsenseqa: A question answering challenge targeting commonsense knowledgeDid aristotle use a laptop? A question answering benchmark with implicit reasoning strategies)、符号推理(Chain of thought prompting elicits reasoning in large language models)。

ICL只使用输入输出对来构造提示,而CoT将最终输出的中间推理步骤加入提示。

使用CoT的ICL

一般在小样本和零样本这两种设置下和ICL一起用

小样本思维链

将每个示范<输入,输出>替换为<输入,CoT,输出>。小样本CoT可以看成ICL的一种特殊提示,但相比ICL的标准提示,示范的顺序对性能影响相对较小

零样本思维链

不在提示中加入人工标注的示范,而是直接生成推理步骤,再利用生成的CoT来得出答案。Large language models are zero-shot reasoners

  • 先通过“Let’s think step by step”来提示LLM生成步骤

  • 再通过“Therefore, the answer is”来提示得到最终答案

这种方法在模型规模超过一定大小时可以显著提高性能,但在小规模的模型效果不佳,即涌现能力。

Flan-T5和Flan-PaLM(Scaling instruction-finetuned language models)进一步地使用CoT进行指令调整,有效增强了在未见任务上的零样本性能。

进一步讨论CoT

  • 思维链何时适用于LLM:

  • LLM为何能进行思维链推理:

    • 思维链能力的来源:

    • 提示中组成部分的影响:

能力评测

史上最严“中文真实性评估”:OpenAI o1第1豆包第2,其它全部不及格

Chinese SimpleQA: A Chinese Factuality Evaluation for Large Language Models

最后更新于