LLaMA-Factory 微调可配置的LoRA参数
LLaMA-Factory 微调可配置的LoRA参数
flyfish
LoRA 参数配置表
参数名称 | 类型 | 描述 | 默认值 |
---|---|---|---|
additional_target | Optional[str] | 除 LoRA 层之外设置为可训练并保存在最终检查点中的模块名称。使用逗号分隔多个模块。 | None |
lora_alpha | Optional[int] | LoRA 缩放系数。一般情况下为 lora_rank * 2 。 | None |
lora_dropout | float | LoRA 微调中的 dropout 率。 | 0 |
lora_rank | int | LoRA 微调的本征维数 r ,r 越大可训练的参数越多。 | 8 |
lora_target | str | 应用 LoRA 方法的模块名称。使用逗号分隔多个模块,使用 all 指定所有模块。 | all |
loraplus_lr_ratio | Optional[float] | LoRA+ 学习率比例(λ = ηB/ηA)。 ηA, ηB 分别是 adapter matrices A 与 B 的学习率。 | None |
loraplus_lr_embedding | Optional[float] | LoRA+ 嵌入层的学习率。 | 1e-6 |
use_rslora | bool | 是否使用秩稳定 LoRA (Rank-Stabilized LoRA)。 | False |
use_dora | bool | 是否使用权重分解 LoRA(Weight-Decomposed LoRA)。 | False |
pissa_init | bool | 是否初始化 PiSSA 适配器。 | False |
pissa_iter | Optional[int] | PiSSA 中 FSVD 执行的迭代步数。使用 -1 将其禁用。 | 16 |
pissa_convert | bool | 是否将 PiSSA 适配器转换为正常的 LoRA 适配器。 | False |
create_new_adapter | bool | 是否创建一个具有随机初始化权重的新适配器。 | 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}^mx∈Rm,线性投影层通过权重矩阵 W∈Rn×mW \in \mathbb{R}^{n \times m}W∈Rn×m 和偏置向量 b∈Rnb \in \mathbb{R}^nb∈Rn 进行变换,输出为:
y=Wx+by = Wx + by=Wx+b
其中:
WWW 是可学习的参数矩阵,决定了投影的方向和尺度
bbb 是可选的偏置项,提供平移能力
yyy 是变换后的输出向量,维度为 nnn
2. 在神经网络中的作用
线性投影层本质是一个全连接层(Fully Connected Layer),其核心作用包括:
- 维度变换:将输入特征从 mmm 维映射到 nnn 维。例如:
在Transformer中,将词嵌入从768维投影到64维(用于注意力计算)。 - 特征组合:通过权重矩阵 WWW,将输入的各个维度进行线性组合,提取更高层次的特征。
- 表达能力:多个线性层叠加(配合非线性激活函数)可逼近任意复杂函数。
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_proj
、k_proj
、v_proj
、o_proj
是四个核心的线性投影层,负责将输入特征转换为注意力计算所需的关键向量,并最终输出注意力层的结果。它们是连接模型隐藏状态与注意力机制的“桥梁”,直接决定了模型如何“关注”输入序列中的信息。
背景:自注意力的核心逻辑
自注意力机制的核心是通过查询(Query, Q)、键(Key, K)、值(Value, V) 三个向量计算注意力权重,具体流程可简化为:
- 对输入序列的每个位置,生成对应的Q、K、V向量;
- 通过Q与K的相似度计算注意力分数(哪些位置需要被关注);
- 用注意力分数对V进行加权求和,得到该位置的注意力输出;
- 整合所有位置的注意力输出,作为整个注意力层的结果。
而q_proj
、k_proj
、v_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)。
核心意义:整合多头注意力的信息(或单头注意力的结果),并将其映射回模型的隐藏维度,保证网络层之间的维度兼容,同时进一步提炼注意力计算的有效信息。
共性与关键细节
-
均为线性层:这四个投影层本质上都是线性变换(
y = Wx + b
),其中W
是可学习的权重矩阵,b
是偏置(部分模型可能省略偏置)。例如,q_proj
的权重矩阵维度为[d_k, hidden_dim]
(或[hidden_dim, d_k]
,取决于实现方式),通过矩阵乘法将高维隐藏状态压缩(或映射)到低维的Q空间。 -
与多头注意力的关系:在多头注意力中,通常会将
hidden_dim
拆分为num_heads
个头部(每个头部维度d_k = hidden_dim / num_heads
)。此时,q_proj
、k_proj
、v_proj
的权重矩阵会同时处理所有头的投影(例如,q_proj
的权重维度为[hidden_dim, num_heads * d_k]
,输出后再拆分为num_heads
个Q向量),而o_proj
则负责将所有头的输出拼接后投影回hidden_dim
。 -
在微调中的重要性:这些投影层直接决定了Q、K、V的生成,而Q、K、V是注意力机制的核心——它们控制模型“关注什么”“如何匹配信息”“如何整合信息”。因此,在LoRA等微调方法中,指定
q_proj, k_proj, v_proj, o_proj
作为优化目标,能高效调整模型的注意力模式,使其适应下游任务(如文本分类、问答等),同时避免微调整个模型带来的高计算成本。
在Transformer模型中,q_proj
、k_proj
、v_proj
、o_proj
四个投影层的数学表达式
1. 单头注意力的基础公式
给定输入序列 X∈RL×dmodelX \in \mathbb{R}^{L \times d_{\text{model}}}X∈RL×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}Q∈RL×dk:查询矩阵,dkd_kdk 是键/查询维度
Wq∈Rdmodel×dkW_q \in \mathbb{R}^{d_{\text{model}} \times d_k}Wq∈Rdmodel×dk:q_proj
的权重矩阵
bq∈Rdkb_q \in \mathbb{R}^{d_k}bq∈Rdk:偏置向量(可选,部分实现中省略)
1.2 键(Key)投影
K=XWk+bkK = XW_k + b_kK=XWk+bk
K∈RL×dkK \in \mathbb{R}^{L \times d_k}K∈RL×dk:键矩阵
Wk∈Rdmodel×dkW_k \in \mathbb{R}^{d_{\text{model}} \times d_k}Wk∈Rdmodel×dk:k_proj
的权重矩阵
bk∈Rdkb_k \in \mathbb{R}^{d_k}bk∈Rdk:偏置向量
1.3 值(Value)投影
V=XWv+bvV = XW_v + b_vV=XWv+bv
V∈RL×dvV \in \mathbb{R}^{L \times d_v}V∈RL×dv:值矩阵,dvd_vdv 是值维度(通常 dv=dkd_v = d_kdv=dk)
Wv∈Rdmodel×dvW_v \in \mathbb{R}^{d_{\text{model}} \times d_v}Wv∈Rdmodel×dv:v_proj
的权重矩阵
bv∈Rdvb_v \in \mathbb{R}^{d_v}bv∈Rdv:偏置向量
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}QKT∈RL×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}}}Output∈RL×dmodel:注意力层的最终输出
Wo∈Rdv×dmodelW_o \in \mathbb{R}^{d_v \times d_{\text{model}}}Wo∈Rdv×dmodel:o_proj
的权重矩阵
bo∈Rdmodelb_o \in \mathbb{R}^{d_{\text{model}}}bo∈Rdmodel:偏置向量
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=[Wq1Wq2…Wqh],Wqi∈Rdmodel×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=[Wk1Wk2…Wkh],Wki∈Rdmodel×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=[Wv1Wv2…Wvh],Wvi∈Rdmodel×dv′
其中 dk′=dmodel/hd_{k'} = d_{\text{model}} / hdk′=dmodel/h,dv′=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×(h⋅dv′) 矩阵
Wo∈R(h⋅dv′)×dmodelW_o \in \mathbb{R}^{(h \cdot d_{v'}) \times d_{\text{model}}}Wo∈R(h⋅dv′)×dmodel:o_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}})}Wqkv∈Rdmodel×(3⋅dmodel):合并后的权重矩阵
bqkv∈R3⋅dmodelb_{\text{qkv}} \in \mathbb{R}^{3 \cdot d_{\text{model}}}bqkv∈R3⋅dmodel:合并后的偏置向量
QKV∈RL×(3⋅dmodel)QKV \in \mathbb{R}^{L \times (3 \cdot d_{\text{model}})}QKV∈RL×(3⋅dmodel):合并后的输出,后续拆分为 QQQ、KKK、VVV
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(dk′QKT)V
其中 QQQ、KKK、VVV 是经过维度重组后的张量,支持批量和多头的并行计算:
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'}}Q∈RB×h×L×dk′,K∈RB×h×L×dk′,V∈RB×h×L×dv′
BBB:批次大小
hhh:头数
LLL:序列长度
dk′d_{k'}dk′、dv′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_qWq≈Wq(0)+ΔWq,ΔWq=BqAq
Wk≈Wk(0)+ΔWk,ΔWk=BkAkW_k \approx W_k^{(0)} + \Delta W_k, \quad \Delta W_k = B_kA_kWk≈Wk(0)+ΔWk,ΔWk=BkAk
Wv≈Wv(0)+ΔWv,ΔWv=BvAvW_v \approx W_v^{(0)} + \Delta W_v, \quad \Delta W_v = B_vA_vWv≈Wv(0)+ΔWv,ΔWv=BvAv
Wo≈Wo(0)+ΔWo,ΔWo=BoAoW_o \approx W_o^{(0)} + \Delta W_o, \quad \Delta W_o = B_oA_oWo≈Wo(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}B∈Rdmodel×r、A∈Rr×dmodelA \in \mathbb{R}^{r \times d_{\text{model}}}A∈Rr×dmodel:可训练的低秩矩阵(r≪dmodelr \ll d_{\text{model}}r≪dmodel)
rrr:LoRA的秩参数,控制可训练参数量
汇总
投影层 | 输入维度 | 输出维度 | 核心公式 | 在多头注意力中的作用 |
---|---|---|---|---|
q_proj | L×dmodelL \times d_{\text{model}}L×dmodel | L×dkL \times d_kL×dk | Q=XWq+bqQ = XW_q + b_qQ=XWq+bq | 生成查询向量,决定关注哪些位置 |
k_proj | L×dmodelL \times d_{\text{model}}L×dmodel | L×dkL \times d_kL×dk | K=XWk+bkK = XW_k + b_kK=XWk+bk | 生成键向量,提供被关注的“索引” |
v_proj | L×dmodelL \times d_{\text{model}}L×dmodel | L×dvL \times d_vL×dv | V=XWv+bvV = XW_v + b_vV=XWv+bv | 生成值向量,存储被关注位置的信息 |
o_proj | L×(h⋅dv′)L \times (h \cdot d_{v'})L×(h⋅dv′) | L×dmodelL \times d_{\text{model}}L×dmodel | Output=Concat(heads)Wo+bo\text{Output} = \text{Concat}(\text{heads})W_o + b_oOutput=Concat(heads)Wo+bo | 整合多头注意力结果,投影回原始维度 |