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

LLaMA-Factory 微调可配置的LoRA参数

LLaMA-Factory 微调可配置的LoRA参数

flyfish

LoRA 参数配置表

参数名称类型描述默认值
additional_targetOptional[str]除 LoRA 层之外设置为可训练并保存在最终检查点中的模块名称。使用逗号分隔多个模块。None
lora_alphaOptional[int]LoRA 缩放系数。一般情况下为 lora_rank * 2None
lora_dropoutfloatLoRA 微调中的 dropout 率。0
lora_rankintLoRA 微调的本征维数 rr 越大可训练的参数越多。8
lora_targetstr应用 LoRA 方法的模块名称。使用逗号分隔多个模块,使用 all 指定所有模块。all
loraplus_lr_ratioOptional[float]LoRA+ 学习率比例(λ = ηB/ηA)。 ηA, ηB 分别是 adapter matrices A 与 B 的学习率。None
loraplus_lr_embeddingOptional[float]LoRA+ 嵌入层的学习率。1e-6
use_rslorabool是否使用秩稳定 LoRA (Rank-Stabilized LoRA)。False
use_dorabool是否使用权重分解 LoRA(Weight-Decomposed LoRA)。False
pissa_initbool是否初始化 PiSSA 适配器。False
pissa_iterOptional[int]PiSSA 中 FSVD 执行的迭代步数。使用 -1 将其禁用。16
pissa_convertbool是否将 PiSSA 适配器转换为正常的 LoRA 适配器。False
create_new_adapterbool是否创建一个具有随机初始化权重的新适配器。False

lora_target:指定需要优化的模块(如 q_proj,k_proj,v_proj,o_proj 等注意力层)。
在LoRA(Low-Rank Adaptation)微调中,线性投影层(如 q_proj, k_proj, v_proj, o_proj)是主要优化目标
线性投影层(Linear Projection Layer)是神经网络中的基础组件,用于将输入数据通过线性变换映射到新的特征空间。

1. 数学定义

给定输入向量 x∈Rmx \in \mathbb{R}^mxRm,线性投影层通过权重矩阵 W∈Rn×mW \in \mathbb{R}^{n \times m}WRn×m 和偏置向量 b∈Rnb \in \mathbb{R}^nbRn 进行变换,输出为:
y=Wx+by = Wx + by=Wx+b
其中:
WWW 是可学习的参数矩阵,决定了投影的方向和尺度
bbb 是可选的偏置项,提供平移能力
yyy 是变换后的输出向量,维度为 nnn

2. 在神经网络中的作用

线性投影层本质是一个全连接层(Fully Connected Layer),其核心作用包括:

  1. 维度变换:将输入特征从 mmm 维映射到 nnn 维。例如:
    在Transformer中,将词嵌入从768维投影到64维(用于注意力计算)。
  2. 特征组合:通过权重矩阵 WWW,将输入的各个维度进行线性组合,提取更高层次的特征。
  3. 表达能力:多个线性层叠加(配合非线性激活函数)可逼近任意复杂函数。

3. 在注意力机制中的应用

在Transformer的注意力机制中,线性投影层被用于生成查询(Query)、键(Key)和值(Value)向量:
查询投影Q=Linearq(X)=XWq+bqQ = \text{Linear}_q(X) = XW_q + b_qQ=Linearq(X)=XWq+bq
键投影K=Lineark(X)=XWk+bkK = \text{Linear}_k(X) = XW_k + b_kK=Lineark(X)=XWk+bk
值投影V=Linearv(X)=XWv+bvV = \text{Linear}_v(X) = XW_v + b_vV=Linearv(X)=XWv+bv

其中:
XXX 是输入序列的嵌入表示
Wq,Wk,WvW_q, W_k, W_vWq,Wk,Wv 是不同的权重矩阵(通常维度为 dmodel×dkd_{\text{model}} \times d_kdmodel×dk
bq,bk,bvb_q, b_k, b_vbq,bk,bv 是可选的偏置项

4. 为什么称为“投影”?

在线性代数中,投影指将向量映射到另一个子空间的操作。在神经网络中:
权重矩阵 WWW 定义了目标子空间的基向量
矩阵乘法 WxWxWx 将输入向量 xxx 分解为这些基向量的线性组合
因此,y=Wxy = Wxy=Wx 可视为将 xxx 投影到由 WWW 的列向量张成的子空间中

例如,在多头注意力中,不同的头通过不同的投影矩阵关注输入的不同方面。

5. 代码示例

在PyTorch中,线性投影层通常用 nn.Linear 实现:

import torch
import torch.nn as nn# 创建一个将768维映射到64维的线性投影层
linear_projection = nn.Linear(in_features=768,    # 输入维度out_features=64,    # 输出维度bias=True           # 是否使用偏置项
)# 假设有一个批次的输入:[batch_size, seq_len, 768]
x = torch.randn(16, 32, 768)# 应用线性投影
output = linear_projection(x)  # 输出形状:[16, 32, 64]

在Transformer模型的自注意力机制(Self-Attention)中,q_projk_projv_projo_proj是四个核心的线性投影层,负责将输入特征转换为注意力计算所需的关键向量,并最终输出注意力层的结果。它们是连接模型隐藏状态与注意力机制的“桥梁”,直接决定了模型如何“关注”输入序列中的信息。

背景:自注意力的核心逻辑

自注意力机制的核心是通过查询(Query, Q)键(Key, K)值(Value, V) 三个向量计算注意力权重,具体流程可简化为:

  1. 对输入序列的每个位置,生成对应的Q、K、V向量;
  2. 通过Q与K的相似度计算注意力分数(哪些位置需要被关注);
  3. 用注意力分数对V进行加权求和,得到该位置的注意力输出;
  4. 整合所有位置的注意力输出,作为整个注意力层的结果。

q_projk_projv_proj正是生成Q、K、V的关键组件,o_proj则负责整合注意力结果。

四个投影层

1. q_proj(Query Projection,查询投影层)

作用:将输入的隐藏状态投影到“查询空间”,生成查询向量(Query, Q)
输入:模型当前层的隐藏状态(通常是一个维度为[batch_size, seq_len, hidden_dim]的张量,其中hidden_dim是模型的隐藏维度,如768、1024等)。
输出:查询矩阵Q,维度通常为[batch_size, seq_len, d_k]d_k是每个注意力头的维度,如hidden_dim / num_heads)。
核心意义:Q向量代表“当前位置想要查询什么信息”。例如,在文本任务中,某个词的Q向量会用于匹配其他词的K向量,以确定该词需要重点关注序列中的哪些部分。

2. k_proj(Key Projection,键投影层)

作用:将输入的隐藏状态投影到“键空间”,生成键向量(Key, K)
输入:与q_proj相同,即当前层的隐藏状态[batch_size, seq_len, hidden_dim]
输出:键矩阵K,维度与Q一致,为[batch_size, seq_len, d_k]
核心意义:K向量代表“其他位置提供了什么信息”,是被查询的“索引”。Q与K的相似度(通常通过点积计算)会直接决定注意力分数——相似度越高,说明该位置的信息与当前查询的相关性越强,会被赋予更高的注意力权重。

3. v_proj(Value Projection,值投影层)

作用:将输入的隐藏状态投影到“值空间”,生成值向量(Value, V)
输入:同样是当前层的隐藏状态[batch_size, seq_len, hidden_dim]
输出:值矩阵V,维度通常为[batch_size, seq_len, d_v]d_v一般与d_k相等,即d_v = d_k)。
核心意义:V向量代表“其他位置的具体信息内容”。当注意力分数计算完成后,模型会用这些分数对V进行加权求和(即“关注重要位置的V,忽略不重要的”),得到该位置的注意力输出。

4. o_proj(Output Projection,输出投影层)

作用:将注意力机制的中间结果投影到模型的输出维度,生成注意力层的最终输出。
输入:注意力加权求和的结果(对于多头注意力,先将多个头的输出拼接,得到[batch_size, seq_len, num_heads * d_k],通常等于hidden_dim)。
输出:注意力层的最终输出,维度为[batch_size, seq_len, hidden_dim],与输入隐藏状态的维度一致,可直接传入下一层(如前馈网络FFN)。
核心意义:整合多头注意力的信息(或单头注意力的结果),并将其映射回模型的隐藏维度,保证网络层之间的维度兼容,同时进一步提炼注意力计算的有效信息。

共性与关键细节

  1. 均为线性层:这四个投影层本质上都是线性变换(y = Wx + b),其中W是可学习的权重矩阵,b是偏置(部分模型可能省略偏置)。例如,q_proj的权重矩阵维度为[d_k, hidden_dim](或[hidden_dim, d_k],取决于实现方式),通过矩阵乘法将高维隐藏状态压缩(或映射)到低维的Q空间。

  2. 与多头注意力的关系:在多头注意力中,通常会将hidden_dim拆分为num_heads个头部(每个头部维度d_k = hidden_dim / num_heads)。此时,q_projk_projv_proj的权重矩阵会同时处理所有头的投影(例如,q_proj的权重维度为[hidden_dim, num_heads * d_k],输出后再拆分为num_heads个Q向量),而o_proj则负责将所有头的输出拼接后投影回hidden_dim

  3. 在微调中的重要性:这些投影层直接决定了Q、K、V的生成,而Q、K、V是注意力机制的核心——它们控制模型“关注什么”“如何匹配信息”“如何整合信息”。因此,在LoRA等微调方法中,指定q_proj, k_proj, v_proj, o_proj作为优化目标,能高效调整模型的注意力模式,使其适应下游任务(如文本分类、问答等),同时避免微调整个模型带来的高计算成本。

在Transformer模型中,q_projk_projv_projo_proj四个投影层的数学表达式

1. 单头注意力的基础公式

给定输入序列 X∈RL×dmodelX \in \mathbb{R}^{L \times d_{\text{model}}}XRL×dmodel(其中 LLL 是序列长度,dmodeld_{\text{model}}dmodel 是模型隐藏维度),四个投影层的计算过程如下:

1.1 查询(Query)投影

Q=XWq+bqQ = XW_q + b_qQ=XWq+bq
Q∈RL×dkQ \in \mathbb{R}^{L \times d_k}QRL×dk:查询矩阵,dkd_kdk 是键/查询维度
Wq∈Rdmodel×dkW_q \in \mathbb{R}^{d_{\text{model}} \times d_k}WqRdmodel×dkq_proj的权重矩阵
bq∈Rdkb_q \in \mathbb{R}^{d_k}bqRdk:偏置向量(可选,部分实现中省略)

1.2 键(Key)投影

K=XWk+bkK = XW_k + b_kK=XWk+bk
K∈RL×dkK \in \mathbb{R}^{L \times d_k}KRL×dk:键矩阵
Wk∈Rdmodel×dkW_k \in \mathbb{R}^{d_{\text{model}} \times d_k}WkRdmodel×dkk_proj的权重矩阵
bk∈Rdkb_k \in \mathbb{R}^{d_k}bkRdk:偏置向量

1.3 值(Value)投影

V=XWv+bvV = XW_v + b_vV=XWv+bv
V∈RL×dvV \in \mathbb{R}^{L \times d_v}VRL×dv:值矩阵,dvd_vdv 是值维度(通常 dv=dkd_v = d_kdv=dk
Wv∈Rdmodel×dvW_v \in \mathbb{R}^{d_{\text{model}} \times d_v}WvRdmodel×dvv_proj的权重矩阵
bv∈Rdvb_v \in \mathbb{R}^{d_v}bvRdv:偏置向量

1.4 注意力分数计算

Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttention(Q,K,V)=softmax(dkQKT)V
QKT∈RL×LQK^T \in \mathbb{R}^{L \times L}QKTRL×L:注意力分数矩阵(未归一化)
dk\sqrt{d_k}dk:缩放因子,防止梯度消失
softmax\text{softmax}softmax:按行归一化,确保权重和为1

1.5 输出(Output)投影

Output=Attention(Q,K,V)Wo+bo\text{Output} = \text{Attention}(Q, K, V)W_o + b_oOutput=Attention(Q,K,V)Wo+bo
Output∈RL×dmodel\text{Output} \in \mathbb{R}^{L \times d_{\text{model}}}OutputRL×dmodel:注意力层的最终输出
Wo∈Rdv×dmodelW_o \in \mathbb{R}^{d_v \times d_{\text{model}}}WoRdv×dmodelo_proj的权重矩阵
bo∈Rdmodelb_o \in \mathbb{R}^{d_{\text{model}}}boRdmodel:偏置向量

2. 多头注意力的公式

在实际应用中,通常使用多头注意力(Multi-Head Attention)来捕获不同子空间的信息。假设头数为 hhh,则:

2.1 投影层的矩阵分解

将原始投影矩阵分解为 hhh 个头的子矩阵:
Wq=[Wq1Wq2…Wqh],Wqi∈Rdmodel×dk′W_q = \begin{bmatrix} W_q^1 & W_q^2 & \dots & W_q^h \end{bmatrix}, \quad W_q^i \in \mathbb{R}^{d_{\text{model}} \times d_{k'}}Wq=[Wq1Wq2Wqh],WqiRdmodel×dk
Wk=[Wk1Wk2…Wkh],Wki∈Rdmodel×dk′W_k = \begin{bmatrix} W_k^1 & W_k^2 & \dots & W_k^h \end{bmatrix}, \quad W_k^i \in \mathbb{R}^{d_{\text{model}} \times d_{k'}}Wk=[Wk1Wk2Wkh],WkiRdmodel×dk
Wv=[Wv1Wv2…Wvh],Wvi∈Rdmodel×dv′W_v = \begin{bmatrix} W_v^1 & W_v^2 & \dots & W_v^h \end{bmatrix}, \quad W_v^i \in \mathbb{R}^{d_{\text{model}} \times d_{v'}}Wv=[Wv1Wv2Wvh],WviRdmodel×dv
其中 dk′=dmodel/hd_{k'} = d_{\text{model}} / hdk=dmodel/hdv′=dmodel/hd_{v'} = d_{\text{model}} / hdv=dmodel/h(通常 dk′=dv′d_{k'} = d_{v'}dk=dv)。

2.2 多头注意力计算

MultiHead(Q,K,V)=Concat(head1,…,headh)Wo\text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W_oMultiHead(Q,K,V)=Concat(head1,,headh)Wo
其中每个头的计算为:
headi=Attention(XWqi,XWki,XWvi)\text{head}_i = \text{Attention}(XW_q^i, XW_k^i, XW_v^i)headi=Attention(XWqi,XWki,XWvi)
Concat\text{Concat}Concat:将 hhh 个头的输出拼接为 L×(h⋅dv′)L \times (h \cdot d_{v'})L×(hdv) 矩阵
Wo∈R(h⋅dv′)×dmodelW_o \in \mathbb{R}^{(h \cdot d_{v'}) \times d_{\text{model}}}WoR(hdv)×dmodelo_proj的权重矩阵,将拼接后的多头输出投影回 dmodeld_{\text{model}}dmodel 维度

3. 向量化实现的统一形式

在实际代码中,为了高效计算,通常将四个投影层合并为一个矩阵操作:

3.1 合并投影计算

QKV=XWqkv+bqkvQKV = XW_{\text{qkv}} + b_{\text{qkv}}QKV=XWqkv+bqkv
Wqkv∈Rdmodel×(3⋅dmodel)W_{\text{qkv}} \in \mathbb{R}^{d_{\text{model}} \times (3 \cdot d_{\text{model}})}WqkvRdmodel×(3dmodel):合并后的权重矩阵
bqkv∈R3⋅dmodelb_{\text{qkv}} \in \mathbb{R}^{3 \cdot d_{\text{model}}}bqkvR3dmodel:合并后的偏置向量
QKV∈RL×(3⋅dmodel)QKV \in \mathbb{R}^{L \times (3 \cdot d_{\text{model}})}QKVRL×(3dmodel):合并后的输出,后续拆分为 QQQKKKVVV

3.2 向量化多头注意力

Attention(Q,K,V)=softmax(QKTdk′)V\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_{k'}}}\right)VAttention(Q,K,V)=softmax(dkQKT)V
其中 QQQKKKVVV 是经过维度重组后的张量,支持批量和多头的并行计算:
Q∈RB×h×L×dk′,K∈RB×h×L×dk′,V∈RB×h×L×dv′Q \in \mathbb{R}^{B \times h \times L \times d_{k'}}, \quad K \in \mathbb{R}^{B \times h \times L \times d_{k'}}, \quad V \in \mathbb{R}^{B \times h \times L \times d_{v'}}QRB×h×L×dk,KRB×h×L×dk,VRB×h×L×dv
BBB:批次大小
hhh:头数
LLL:序列长度
dk′d_{k'}dkdv′d_{v'}dv:每个头的维度

4. 在LoRA中的应用

在LoRA(Low-Rank Adaptation)微调中,会对上述投影层的权重矩阵进行低秩分解:
Wq≈Wq(0)+ΔWq,ΔWq=BqAqW_q \approx W_q^{(0)} + \Delta W_q, \quad \Delta W_q = B_qA_qWqWq(0)+ΔWq,ΔWq=BqAq
Wk≈Wk(0)+ΔWk,ΔWk=BkAkW_k \approx W_k^{(0)} + \Delta W_k, \quad \Delta W_k = B_kA_kWkWk(0)+ΔWk,ΔWk=BkAk
Wv≈Wv(0)+ΔWv,ΔWv=BvAvW_v \approx W_v^{(0)} + \Delta W_v, \quad \Delta W_v = B_vA_vWvWv(0)+ΔWv,ΔWv=BvAv
Wo≈Wo(0)+ΔWo,ΔWo=BoAoW_o \approx W_o^{(0)} + \Delta W_o, \quad \Delta W_o = B_oA_oWoWo(0)+ΔWo,ΔWo=BoAo
其中:
Wq(0)W_q^{(0)}Wq(0)Wk(0)W_k^{(0)}Wk(0)Wv(0)W_v^{(0)}Wv(0)Wo(0)W_o^{(0)}Wo(0):原始预训练权重(冻结)
B∈Rdmodel×rB \in \mathbb{R}^{d_{\text{model}} \times r}BRdmodel×rA∈Rr×dmodelA \in \mathbb{R}^{r \times d_{\text{model}}}ARr×dmodel:可训练的低秩矩阵(r≪dmodelr \ll d_{\text{model}}rdmodel
rrr:LoRA的秩参数,控制可训练参数量

汇总

投影层输入维度输出维度核心公式在多头注意力中的作用
q_projL×dmodelL \times d_{\text{model}}L×dmodelL×dkL \times d_kL×dkQ=XWq+bqQ = XW_q + b_qQ=XWq+bq生成查询向量,决定关注哪些位置
k_projL×dmodelL \times d_{\text{model}}L×dmodelL×dkL \times d_kL×dkK=XWk+bkK = XW_k + b_kK=XWk+bk生成键向量,提供被关注的“索引”
v_projL×dmodelL \times d_{\text{model}}L×dmodelL×dvL \times d_vL×dvV=XWv+bvV = XW_v + b_vV=XWv+bv生成值向量,存储被关注位置的信息
o_projL×(h⋅dv′)L \times (h \cdot d_{v'})L×(hdv)L×dmodelL \times d_{\text{model}}L×dmodelOutput=Concat(heads)Wo+bo\text{Output} = \text{Concat}(\text{heads})W_o + b_oOutput=Concat(heads)Wo+bo整合多头注意力结果,投影回原始维度
http://www.lryc.cn/news/595228.html

相关文章:

  • MySQL:表的增删查改
  • DFS习题篇【上】
  • buntu 22.04 上离线安装Docker 25.0.5(二)
  • 宝塔访问lnmp项目,跳转不到项目根目录问题解决
  • 【每日算法】专题四_前缀和
  • BERT 的“池化策略”
  • 基于WebSocket的安卓眼镜视频流GPU硬解码与OpenCV目标追踪系统实现
  • day058-docker常见面试题与初识zabbix
  • docker 常见命令使用记录
  • 【docker】分享一个好用的docker镜像国内站点
  • 【图论】CF——B. Chamber of Secrets (0-1BFS)
  • 文本数据分析
  • 本地部署Dify、Docker重装
  • neuronxcc包介绍及示例代码
  • 【Java学习|黑马笔记|Day19】方法引用、异常(try...catch、自定义异常)及其练习
  • seata at使用
  • 深度学习 -- 梯度计算及上下文控制
  • 7月21日总结
  • registry-ui docker搭建私有仓库的一些问题笔记
  • 服务器后台崩溃的原因
  • 使用Langchain调用模型上下文协议 (MCP)服务
  • 【未限制消息消费导致数据库CPU告警问题排查及解决方案】
  • WEB前端登陆页面(复习)
  • 随笔20250721 PostgreSQL实体类生成器
  • Elasticsearch X-Pack安全功能未启用的解决方案
  • OpenEuler 22.03 系统上安装配置gitlab runner
  • 笔试——Day14
  • 【PTA数据结构 | C语言版】求单源最短路的Dijkstra算法
  • 打造自己的 Jar 文件分析工具:类名匹配 + 二进制搜索 + 日志输出全搞定
  • Laravel 后台登录 403 Forbidden 错误深度解决方案-优雅草卓伊凡|泡泡龙