当前位置: 首页 > news >正文

3.1监督微调

SFT(Supervised Fine-Tuning,监督微调) 是一种在预训练模型基础上,利用标注好的数据进行进一步训练的方法。其核心目标是通过监督学习,使模型在特定任务或领域上表现得更好。(通过人类标注的数据,训练模型生成符合人类期望的回答。)

  • 预训练阶段:模型首先在大规模无监督数据集上进行预训练,学习语言的基本结构和模式。
  • 微调阶段:利用特定任务的标注数据(如输入-输出对),对模型进行微调,使其适应目标任务。

一、基础微调技术(全参数微调)

掌握全参数微调原理,了解学习率设置策略,早停策略等。

1. 全参数微调

定义:对预训练模型的所有参数进行再次训练,使其适应下游任务。

优点

  1. 不依赖附加结构,简单直接。
  2. 表现最好,效果最强(尤其在数据量足够时)。

缺点

  1. 需要大量计算资源,训练成本高。
  2. 在参数量非常大的模型(例如 BLOOM、LLaMA)中,不够“高效”。

2. 学习率设置策略

分层学习率(Layer-wise LR Decay):越靠近输出的层,学习率越大。Transformer 微调常用

固定学习率

学习率衰减

  • 阶梯衰减
  • 指数衰减
  • 余弦退火

WarmUp

自适应学习率

见 2.2
ReduceLROnPlateau

3. 早停策略

概念:早停策略是为了防止模型过拟合,在训练过程中监控模型在验证集上的性能,当性能不再提升或出现下降趋势时,提前停止训练。

核心逻辑

  1. 每训练一轮后,在验证集上评估指标(如准确率)。
  2. 若连续 N 轮指标不提升,则停止训练。

以下是一些常见的早停判断方法

  • 基于验证集损失:在每个训练周期结束后,计算模型在验证集上的损失。如果验证集损失在连续多个周期内没有下降,或者超过一定的阈值后开始上升,就可以考虑停止训练。例如,当验证集损失连续 5 个周期没有下降时,停止训练。
  • 基于验证集指标:除了损失函数,还可以根据具体任务的评估指标,如准确率、召回率、F1 值等在验证集上的表现来决定是否早停。当这些指标在连续多个周期内不再提升时,停止训练。例如,在分类任务中,当验证集的准确率连续 3 个周期没有提高时,停止训练。
  • 结合耐心值和容忍度:设置一个耐心值,表示允许模型在验证集上性能没有提升的最大周期数。同时,设置一个容忍度,用于判断性能是否有显著提升。如果在耐心值范围内,验证集上的性能提升小于容忍度,就认为模型已经收敛,停止训练。例如,耐心值设为 10,容忍度设为 0.01,即当连续 10 个周期内验证集性能提升小于 0.01 时,停止训练。

参数设置

参数说明推荐值
patience容忍轮数2 ~ 5
monitor观察指标val_loss, accuracy, f1
min_delta最小提升幅度0.001 或更小

实例代码

# 示例伪代码!!!
model = PretrainedModel.from_pretrained("bert-base")
optimizer = AdamW(model.parameters(), lr=2e-5)
scheduler = get_linear_schedule_with_warmup(...)
early_stopper = EarlyStopping(patience=3, monitor='val_loss')for epoch in range(max_epochs):train(model, dataloader_train)val_loss = evaluate(model, dataloader_val)if early_stopper(val_loss):break

面试押题:
| 什么是全参数微调?与 LoRA 有何区别? | 涉及更新参数量对比、效率与效果 |
| 如何设置学习率?你用过哪些调度策略? | 讲清楚 warmup + decay、分层 LR |
| 为什么需要早停机制?怎么设置? | 讲过拟合、Patience、验证集趋势 |
| 在资源有限的场景中,你还会用全参数微调吗?为什么? | 引出 PEFT 对比思考 |
| 微调中如何防止灾难性遗忘? | 可说混合训练、保持预训练权重小 LR 等 |

SFT 与预训练过程中 loss 的计算有什么不同?

🧠 一、预训练阶段的 loss 计算方式

✅ 核心特点:无监督(或自监督)学习

  • 输入:大量 未标注文本数据(比如网页、书籍、百科等)
  • 模型目标:通过语言建模任务来学习语言的“概率分布”

🧾 任务形式:通常是 自回归语言建模(Causal LM)

  • 即:给定前面一段文本,预测下一个词/Token

  • 例子:

    输入:The cat sat on the
    目标输出:mat
    
  • **Loss 计算:**对所有 token 的预测结果与真实 token 进行对比,使用 交叉熵(Cross-Entropy Loss)

    [
    \text{Loss} = -\sum*{t=1}^{T} \log P(y_t | y*{<t})
    ]

🎯 二、SFT 阶段的 loss 计算方式

✅ 核心特点:有监督微调

  • 输入:prompt + 正确的 response(带标注的问答对、对话数据等)
  • 模型目标:学习对任务的具体回答方式,而不仅是“语言建模”

🧾 数据格式:

Input: "Question: What is AI?"
Target: "AI stands for Artificial Intelligence."

❗ Loss 计算的关键不同:

  • 只在 response 部分计算 loss,忽略 prompt 部分的预测错误
  • 例如:
    Prompt: "What is AI?"
    Model output: "AI stands for Artificial Intelligence."
    
    • Loss 只在 “AI stands for Artificial Intelligence.” 这部分计算
    • Prompt 通常不会参与 loss 计算(或者 masked 掉)

📌 总结对比表

项目预训练SFT(监督微调)
数据类型无标签文本有标签问答/对话数据
loss 计算范围整个序列只在 label(response)部分
训练目标语言建模(预测下一个 token)对齐人类偏好/任务目标
任务类型自监督有监督

如果你在看代码实现,这种区别通常会体现在:

  • 预训练:labels = input_ids,shift 一位
  • SFT:labels = input_ids 但只在 response 区域保留有效 token,其余位置设为 -100(表示不计算 loss)

可以看出不管是 PreTraining 阶段还是 SFT 阶段,loss 函数都是一样的,只是计算的方式存在差异,PreTraining 阶段计算的是整段输入文本的 loss,而 SFT 阶段计算的是 response 部分的 loss。(https://zhuanlan.zhihu.com/p/652657011)

二、高效参数微调(Parameter-Efficient Fine-Tuning, PEFT)(部分参数微调)

熟悉常见的高效参数微调算法原理。如 LoRA、QLoRA、Prefix-TUning、P-Tuning、P-TuningV2、Adaper Tuning。以及不同方法的性能对比

全参数微调(Full Fine-tuning):
会更新模型的所有参数(通常是数十亿级别),缺点是训练成本高、而且容易出现灾难性遗忘问题。只微调一小部分参数,达到接近的效果——这就是高效微调的目标!

(1)LoRA(Low - Rank Adaptation)捞 ra

概念:在预训练模型的基础上,冻结原模型权重,通过注入可训练的低秩矩阵来实现模型的微调,只用极少参数微调大模型,而不是微调整个模型权重。
(在模型的每一层注入低秩矩阵,通过训练这些低秩矩阵来实现模型的适配。)

具体来说,对于模型中的每一个权重矩阵 W,将其分解为两个低秩矩阵 A 和 B 的乘积,即(W = W_0 + AB),其中(W_0)是预训练模型的原始权重,A 和 B 是在微调过程中学习的低秩矩阵。这样,只需要更新低秩矩阵 A 和 B 的参数,而不是整个权重矩阵 W,大大减少了需要调整的参数数量。

注入位置

  1. 注意力机制层:对 Query、Key、Value 矩阵和输出投影 注入低秩矩阵
  2. 前馈神经网络层:对 FFN 中的 2 层线性层注入低秩矩阵

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 在原始训练模型(PLM)的旁边增加一个旁路,做一个降维再升维的操作,来模拟所谓的内在秩。
  • A 是降维矩阵,B 是升维矩阵
  • 模型的输入输出维度不变,输出时将 BA 和预训练模型的参数叠加
  • 用随机高斯分布初始化 A,用 0 矩阵矩阵初始化 B,保证训练的开始此旁路矩阵依然是 0 矩阵

为什么不能都是 0 矩阵
如果 A 和 B 都是 0 矩阵初始化,会出现对称性问题。【对称性问题:如果多个权重参数被初始化为完全相同的值(比如都是 0),每次前向传播,它们输出相同;每次反向传播,它们梯度也相同;那么它们永远“走相同的路”,无法学到不同的特征表示。这种情况就叫做对称性 —— 多个参数或路径是对称的、没有差异,模型的表达能力因此受限。】

A 不能是 0 矩阵,否则 loRa 无法学习任何新的特征

如果都是高斯分布初始化,在模型初期会引入偏差,使得模型误差较大,收敛困难
为什么 A 是用高斯分布来初始化
A 使用高斯分布是为了帮助模型在训练初期打破对称性,加快收敛速度。

随机初始化 A,能够让 Lora 有更强的特征表达能力,帮助模型更快适应新任务。并且研究结果表明,A 采用高斯初始化,比 B 采用高斯初始化的学习效果更好,因为 A 高斯初始化通常能带来更好的特征学习效果,哪怕会带来一点训练的不稳定性,也是可以接受的

为什么 B 是用 0 矩阵初始化
LoRA 不能一上来就大幅改变与训练模型的权重,因为这样会训练不稳定。
B 初始化为 0,就能保证训练刚开始时 LoRA 分支是 0 矩阵,保证 LoRA 在微调初期不会对模型造成剧烈影响,从而保持训练稳定性。这样模型能在原来模型的基础上逐步调整,而不是突然改变,影响模型效果。
从梯度角度看,B 的梯度为 A 的转置*w 的偏导,即使 B 一开始为 0,B 的梯度不是 0,也能逐步学习。

LoRa 初始化策略的优势

  1. 训练稳定性更强。B=0 保证了训练初期的稳定,避免大幅波动。
  2. 采用渐进式调整的方式,不会一次性改变整个模型,而是逐步调整权重
  3. A 初始化为高斯分布更有利于学习新特征,而 B 初始化为 0 保证了训练的稳定性

(2)QLoRA(Quantized Low - Rank Adaptation)

结合了 4-bit 量化和 LoRA 技术。

  1. 首先对预训练模型进行量化:将模型权重从高精度(如 FP16 或 FP32)压缩到 4 位整数的低精度表示,从而减少存储空间和计算成本。
  2. 然后在量化后的模型上应用 LoRA 进行微调,通过学习低秩矩阵来适应下游任务。

优点:在进一步降低存储和计算成本的同时,能够保持较好的性能。通过量化和低秩适应的结合,有效地利用了两者的优势,使得在资源受限的设备上也能够进行高效的模型微调。
缺点:量化过程可能会引入一定的信息损失,需要精心设计量化策略和 LoRA 的参数设置,以平衡性能和压缩效果。

(3)Adapter Tuning

核心思想
Adapter 插件通过在预训练模型的 Transformer 层之间插入小型可训练模块(Adapter Modules),仅微调这些新增参数,而冻结原有预训练模型的主干参数。这种方法显著减少了微调所需的计算和存储资源,也避免全量微调的灾难性遗忘。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
工作机制

  • 插入位置:通常在多头自注意力层或前馈网络层(FFN)之后插入 Adapter。
  • 参数更新:训练时仅更新 Adapter 的参数,保留主干模型的权重。
  • 残差连接:Adapter 的输出通过残差连接加回原始输入,确保预训练模型的通用能力不被破坏。

结构

  1. 降维层(Down-Projection)
    将 Transformer 层的输出维度从高维(如 768 维)投影到低维(如 16-128 维),从而限制 Adapter 模块的参数量。
  2. 非线性激活层
    使用激活函数(如 ReLU)引入非线性,增强特征表达能力。
  3. 升维层(Up-Projection)
    将低维特征映射回原始高维,作为 Adapter 的最终输出。
  4. 残差连接
    将 Adapter 的输入与输出相加,这样即使 Adapter 一开始参数初始化接近 0,也能由于残差连接而接近于一个恒等映射,确保训练的有效性。
    降维层和升维层本质上属于前馈神经网络

优点

  1. 计算和存储效率高:仅需微调少量参数,避免全量微调的高昂成本。
  2. 保留预训练模型通用能力:主干参数冻结,确保模型在通用任务上的性能不受影响。
  3. 避免灾难性遗忘:Adapter 的局部调整降低了对主干参数的干扰,减少了过拟合和遗忘风险
  4. 模块化设计:不同任务的 Adapter 可独立训练和保存,便于多任务场景下的快速部署。

缺点

  1. 模型容量限制:Adapter 的容量可能不足以捕捉某些任务所需的复杂特征,导致性能下降。

实际应用
在实际应用中,通常会将两者结合使用,先冻结预训练模型的大部分参数,然后只对 Adapter 插件进行训练,这样可以在利用预训练模型的基础上,通过 Adapter 插件快速适应新任务,提高训练效率和模型性能。但这并不意味着 Adapter 插件是参数冻结的实现方式,它们各自有着不同的功能和作用,只是在模型训练中相互配合,以达到更好的效果。

作用

  1. Adapter 插件是一种参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)技术,旨在解决传统全量微调(Full Fine-Tuning, FFT)的高计算和存储成本问题。
  2. 多任务学习:在同一个主干模型中插入多个不同任务的 Adapter,根据需求切换或组合,实现多任务共享。
  3. 任务适配:通过插入不同任务的 Adapter,实现模型在多个下游任务上的定制化。
    示例:在金融、医疗、法律等领域的文本分类任务中,使用同一个预训练模型(如 BERT),通过插入不同的 Adapter 实现领域定制化。
  4. 解决“灾难性遗忘”

(4)Prefix Tuning(前缀微调)

相较于 Prompt-Tuning 和 P-Tuning,Prefix-TUning 不再将 Prompt 加在输入的 Embedding 层,而是将其作为可学习的前缀,放在 Transformer 模型的每一层中,具体表现形式为 past_key_values。
虽然也是有 Encoder 的部分,但是不会和 embedding 拼接起来,而是直接放在 transformer block 计算里面,是通过 past_key_values 放进去的
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
就是通过这种方式,把所有可学习的部分,扔到了正式的 key 和 value 前面

概念:冻结原始预训练参数,仅学习一段连续、可训练的 prefix 向量
插入位置:在每层 Transformer 的输入前添加一组可训练的 prefix 向量(虚拟 token),引导模型学习任务信息。

这个前缀向量会与输入序列一起经过模型的编码器。在微调过程中,只更新前缀向量的参数,而保持预训练模型的主体参数不变。

优点

  1. 不需要修改预训练模型的内部结构和参数,只需要学习一个相对较小的前缀向量,计算量和存储量增加较少。同时,由于不直接修改模型主体参数,一定程度上保留了预训练模型的通用性。
  2. 微调的参数量极小(仅几千个)。

缺点
适用于生成类任务(如 NLG),不适用于判别任务(如分类)。

(5)Prompt Tuning

概念:冻结主模型全部参数,在输入数据(训练数据前)加入一小段 Prompt(提示信息)(来引导模型生成期望输出的技术),只训练 Prompt 表示层,即一个 Embedding 模块。其中 Prompt 又存在两种形式,一种是 hard Prompt,一种是 soft Prompt

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
没有添加额外层
在前面输入部分多增加 Prompt 部分(长度可自定义),因为还需要 Embedding,所以又加了一个 Embedding 层,然后把输入的 Prompt 映射到 Embedding 层,得到向量表示之后,把它和原始的输入 embeddding 拼接起来,然后得到最后的运算
只会对橙色部分进行优化,计算量非常小

通过将任务相关的提示转化为模型输入的一部分,来产生相应任务的输出。

hard Prompt 是人为指定,稍微好一点
soft Prompt 是让模型自己去学,怎么能让他效果变好,看 P-Tuning

(6)P-Tuning

在 Prompt tuning 基础上,对 prompt 再进行一步编码计算,让它来加速训练收敛。具体来说,PEFT 中支持两种编码方式,一种是 LSTM,一种是 MLP。与 Prompt-Tuning 不同的是,Prompt 的形式只有 soft prompt

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
专注于通过优化连续的提示(prompt)向量来提高预训练模型在下游任务中的性能。
可以看作是 Prompt-Tuning 的优化。

思路
固定 LLM 参数,使用 MLP(多层感知机)和 LSTM 对 prompt 进行编码,编码后与其他向量进行拼接,正常输入 LLM。

相比于 Prefix Tuning,P-Tuning 加入的可微的 virtual token,但仅限于输入层,没有在每一层都加

Prefix Tuning 通过在每个 Attention 层加入 Prefix Embedding 来增加额外 Embedding,通过 MLP 来初始化;而 P-Tuning 只是在输入的时候加入 Embedding,并通过 LSTM+MLP 来初始化

与 Prefix - Tuning 不同的是,P - Tuning 的软提示可以分布在输入序列的不同位置,而不仅仅是前缀部分。

(7)P-Tuning v2

是 P-Tuning 的改进版本,引入动态参数调整策略来进一步提升微调的效率和性能
相比于 P-Tuning,P-Tuning v2 在每一层都加入了 Prompt Tuning 作为输入,而不仅仅加在输入层
和 Prefix Tuning 相比,P-Tuning v2 移除了重参数化编码器
完全变成生成模型,无需 verbalizer

http://www.xdnf.cn/news/312049.html

相关文章:

  • element-ui日期时间选择器禁止输入日期
  • Linux/AndroidOS中进程间的通信线程间的同步 - 内存映射
  • 【Linux】Linux入门——权限
  • ZYNQ-UART串口中断
  • 基于计算机视觉的试卷答题区表格识别与提取技术
  • HarmonyOS 5.0 低时延音视频开发​​
  • LeetCode 1. 两数之和(Java)
  • 高频电流探头:通信测试中的隐形守护者
  • 力扣118,1920题解
  • 工业质检/缺陷检测领域最新顶会期刊论文收集整理-AAAI2025【持续更新中】
  • 如何分析java对象占用内存大小
  • Linux操作系统如何杀掉close_wait 状态的连接
  • apk 安装后提示该应用未安装
  • neo4j 桌面版的配置信息
  • Labview培训5_以空间换时间的数据采集策略介绍
  • PLL工作原理
  • 【高级IO】多路转接之select
  • 实操3:6位数码管
  • Linux云计算训练营笔记day02(Linux、计算机网络、进制)
  • C++ 装饰器模式详解
  • 对windows的简单介绍
  • 导入飞帆的网页为组件并注入数据驱动
  • 【工具变量】数字人民币试点城市DID(2007-2024年)
  • NVIDIA AI Aerial 正式发布,旨在优化无线网络,并在单一平台上提供全新的生成式 AI 体验
  • DOM基础学习
  • VMware中虚拟机和主机的SSH远程连接
  • 椭球面长度计算的两种公式及投影选择
  • 关于类型转换的细节(隐式类型转换的临时变量和理解const权限)
  • YOLOv8的Python基础--函数篇
  • 【Java】不同变量类型的线程安全、不同修饰符下的继承