LORA的核心思想基准模型不进行变化,我额外引入一部分参数来做专属内容处理,同时加上原有模型的推理能力,这部分新增加的的内容就是要训练出来的参数矩阵。
本征维度(Intrinsic Dimension):是指数据或空间中所需的最小维度,以便充分描述其中的结构或特征。换句话说,尽管数据可能存在于高维空间中,但其实际所包含的信息可能集中在一个更低维度的子空间内,本征维度就是描述这个低维子空间的维度。
比如一个3*3的矩阵,可以表是成一个1*3的矩阵和3*1的矩阵的乘积,这里原本9个参数就变成了6个参数。节约了参数空间,由此,可以把上面的新增矩阵变成矩阵A和矩阵B的乘积。
lora配置
矩阵A和矩阵B分别为正态分布矩阵和一个全为零的矩阵。
-
A正态分布,B零矩阵:
ΔW = A×B = 随机矩阵×零矩阵 = 零矩阵。
初始阶段模型行为不变,不干扰预训练权重,训练从“零扰动”开始。 -
A和B均零矩阵:
ΔW = 零矩阵,梯度消失,无法更新参数。 -
A和B均正态分布:
ΔW = 随机矩阵×随机矩阵,初始扰动过大,破坏预训练权重,引入噪声,收敛困难。
梯度传播的数学分析
以简单线性层为例,输入为 xx,输出为 x⋅(W+ΔW)=xW+xABx⋅(W+ΔW)=xW+xAB。
损失函数为 LL,反向传播时:
-
对B的梯度:
∂L∂B=AT⋅∂L∂(xAB)⋅xT∂B∂L=AT⋅∂(xAB)∂L⋅xT若B初始化为零矩阵,但A为随机正态分布,则梯度 ∂L∂B∂B∂L 非零,B可更新。
-
对A的梯度:
∂L∂A=∂L∂(xAB)⋅xT⋅BT∂A∂L=∂(xAB)∂L⋅xT⋅BT若B初始化为零,初始时 ∂L∂A=0∂A∂L=0,但随着B的更新,A的梯度逐渐非零。
具体示例对比
示例1:A和B均初始化为零矩阵
A = torch.zeros(in_dim, rank) # 全零
B = torch.zeros(rank, out_dim) # 全零
-
前向传播:ΔW = A×B = 0 → 输出与原始模型一致。
-
反向传播:
∂L/∂B=AT⋅梯度=0 ∂B/∂L=AT⋅梯度=0
∂L/∂A=梯度⋅BT=0 ∂A/∂L=梯度⋅BT=0
梯度消失,参数无法更新,训练停滞。
示例2:A和B均用正态分布初始化
A = torch.randn(in_dim, rank) * 0.01 # 小标准差
B = torch.randn(rank, out_dim) * 0.01
前向传播:ΔW = A×B,元素可能较大(如秩为1时,ΔW的每个元素是A和B对应行列的点积)。
例如,若A和B的元素均服从 N(0,0.012)N(0,0.012),则ΔW的元素方差为 0.014×rank0.014×rank,当rank较大时,ΔW的扰动显著。
破坏预训练权重,模型需要重新学习,收敛困难。
不同矩阵的作用