LoRA微调大模型 - 从方程组的角度看矩阵的秩

flyfish

LoRA: Low-Rank Adaptation of Large Language Models
线性方程组通常用来描述多个变量之间的线性关系。线性方程组是由一组线性方程构成的集合,这些方程涉及一个或多个未知数。每个方程都是未知数的一次多项式,这意味着每个未知数的次数都是1。

线性方程组

一个线性方程组的一般形式可以写作:

a11x1+a12x2+⋯+a1nxn=b1a21x1+a22x2+⋯+a2nxn=b2⋮am1x1+am2x2+⋯+amnxn=bm a_{11}x_1 + a_{12}x_2 + \cdots + a_{1n}x_n = b_1 \\ a_{21}x_1 + a_{22}x_2 + \cdots + a_{2n}x_n = b_2 \\ \vdots \\ a_{m1}x_1 + a_{m2}x_2 + \cdots + a_{mn}x_n = b_m a11x1+a12x2++a1nxn=b1a21x1+a22x2++a2nxn=b2am1x1+am2x2++amnxn=bm

这里 x1,x2,…,xnx_1, x_2, \ldots, x_nx1,x2,,xn 是未知数,aija_{ij}aij 是方程中未知数的系数,而 b1,b2,…,bmb_1, b_2, \ldots, b_mb1,b2,,bm 是常数项。方程组包含 mmm 个方程和 nnn 个未知数。

示例

例如,以下是一个包含三个方程和三个未知数 x,y,zx, y, zx,y,z 的线性方程组:

13x+12y−2z=112x−12y+4z=2−3x+5y−4z=0 13x + 12y - 2z = 1 \\ 12x - 12y + 4z = 2 \\ -3x + 5y - 4z = 0 13x+12y2z=112x12y+4z=23x+5y4z=0

什么东西是不变的?怎么变的?

一个原始的线性方程组:

{7x1+8x2+9x3=134x1+5x2+6x3=121x1+2x2+3x3=11 \begin{cases} 7x_1 + 8x_2 + 9x_3 = 13 \\ 4x_1 + 5x_2 + 6x_3 = 12 \\ 1x_1 + 2x_2 + 3x_3 = 11 \end{cases} 7x1+8x2+9x3=134x1+5x2+6x3=121x1+2x2+3x3=11

将这个方程组写成矩阵形式:

(789456123)(x1x2x3)=(131211) \begin{pmatrix} 7 & 8 & 9 \\ 4 & 5 & 6 \\ 1 & 2 & 3 \end{pmatrix} \begin{pmatrix} x_1 \\ x_2 \\ x_3 \end{pmatrix} =\begin{pmatrix} 13 \\ 12 \\ 11 \end{pmatrix} 741852963 x1x2x3 = 131211
以下面的方式将矩阵的形式变来变去,但它们所代表的线性方程
组的解集保持不变。

初等行变换

初等行变换能够保留方程组的基本属性,是因为它们基于等价关系,如果两个矩阵可以通过一系列初等行变换相互转换,那么这两个矩阵代表相同的线性方程组,因此它们有相同的解集。

1. 交换两行(Ri↔RjR_i \leftrightarrow R_jRiRj

假设我们有以下矩阵:
(123456789) \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{pmatrix} 147258369

如果我们想交换第一行和第三行,执行 R1↔R3R_1 \leftrightarrow R_3R1R3 后,矩阵变为:
(789456123) \begin{pmatrix} 7 & 8 & 9 \\ 4 & 5 & 6 \\ 1 & 2 & 3 \end{pmatrix} 741852963

2. 将某一行乘以一个非零常数(kRi→Ri,k≠0kR_i \rightarrow R_i, k \neq 0kRiRi,k=0

考虑同样的初始矩阵:
(123456789) \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{pmatrix} 147258369

如果我们将第二行乘以 2,即执行 2R2→R22R_2 \rightarrow R_22R2R2,则得到:
(12381012789) \begin{pmatrix} 1 & 2 & 3 \\ 8 & 10 & 12 \\ 7 & 8 & 9 \end{pmatrix} 18721083129

3. 将某一行加上另一行的倍数(Ri+kRj→RiR_i + kR_j \rightarrow R_iRi+kRjRi

继续使用上面的原始矩阵:
(123456789) \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{pmatrix} 147258369

如果我们想将第一行替换为第一行加上第二行的 −4-44 倍,即执行 R1−4R2→R1R_1 - 4R_2 \rightarrow R_1R14R2R1,那么计算过程如下:
第一行为 1,2,31, 2, 31,2,3
第二行为4,5,64, 5, 64,5,6
计算后的新第一行为
1−4∗4,2−4∗5,3−4∗6=−15,−18,−211 - 4*4, 2 - 4*5, 3 - 4*6 = -15, -18, -21144,245,346=15,18,21

因此,矩阵变为:
(−15−18−21456789) \begin{pmatrix} -15 & -18 & -21 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{pmatrix} 154718582169

尽管上面的矩阵形式改变了,但它们所代表的线性方程组的解集保持不变。

给定方程组

{7x1+8x2+9x3=13……①4x1+5x2+6x3=12……②x1+2x2+3x3=11……③ \begin{cases} 7x_1 + 8x_2 + 9x_3 = 13 & \text{……①} \\ 4x_1 + 5x_2 + 6x_3 = 12 & \text{……②} \\ x_1 + 2x_2 + 3x_3 = 11 & \text{……③} \end{cases} 7x1+8x2+9x3=134x1+5x2+6x3=12x1+2x2+3x3=11………………

步骤 1: 消元操作

1.1 ①−-×2\times2×2消去x2x_2x2x3x_3x3

(7x1+8x2+9x3)−2×(4x1+5x2+6x3)=13−2×127x1+8x2+9x3−(8x1+10x2+12x3)=13−247x1+8x2+9x3−8x1−10x2−12x3=−11−x1−2x2−3x3=−11x1+2x2+3x3=11……④ \begin{align*} & (7x_1 + 8x_2 + 9x_3) - 2 \times (4x_1 + 5x_2 + 6x_3) = 13 - 2 \times 12 \\ & 7x_1 + 8x_2 + 9x_3 - (8x_1 + 10x_2 + 12x_3) = 13 - 24 \\ & 7x_1 + 8x_2 + 9x_3 - 8x_1 - 10x_2 - 12x_3 = -11 \\ & -x_1 - 2x_2 - 3x_3 = -11 \\ & x_1 + 2x_2 + 3x_3 = 11 \quad \text{……④} \end{align*} (7x1+8x2+9x3)2×(4x1+5x2+6x3)=132×127x1+8x2+9x3(8x1+10x2+12x3)=13247x1+8x2+9x38x110x212x3=11x12x23x3=11x1+2x2+3x3=11……

1.2 ③+++④消去x2x_2x2x3x_3x3

(x1+2x2+3x3)+(−x1−2x2−3x3)=11+(−11)0=0 \begin{align*} & (x_1 + 2x_2 + 3x_3) + (-x_1 - 2x_2 - 3x_3) = 11 + (-11) \\ & 0 = 0 \end{align*} (x1+2x2+3x3)+(x12x23x3)=11+(11)0=0

这表明通过这种方式无法直接得到x1x_1x1x2x_2x2x3x_3x3的值,需要换一种消元方法。

步骤 2: 再次尝试消元

2.1 ②−-×4\times4×4消去x1x_1x1

(4x1+5x2+6x3)−4×(x1+2x2+3x3)=12−4×114x1+5x2+6x3−(4x1+8x2+12x3)=12−444x1+5x2+6x3−4x1−8x2−12x3=−32−3x2−6x3=−32x2+2x3=323……⑤ \begin{align*} & (4x_1 + 5x_2 + 6x_3) - 4 \times (x_1 + 2x_2 + 3x_3) = 12 - 4 \times 11 \\ & 4x_1 + 5x_2 + 6x_3 - (4x_1 + 8x_2 + 12x_3) = 12 - 44 \\ & 4x_1 + 5x_2 + 6x_3 - 4x_1 - 8x_2 - 12x_3 = -32 \\ & -3x_2 - 6x_3 = -32 \\ & x_2 + 2x_3 = \frac{32}{3} \quad \text{……⑤} \end{align*} (4x1+5x2+6x3)4×(x1+2x2+3x3)=124×114x1+5x2+6x3(4x1+8x2+12x3)=12444x1+5x2+6x34x18x212x3=323x26x3=32x2+2x3=332……

2.2 ①−-×7\times7×7消去x1x_1x1

(7x1+8x2+9x3)−7×(x1+2x2+3x3)=13−7×117x1+8x2+9x3−(7x1+14x2+21x3)=13−777x1+8x2+9x3−7x1−14x2−21x3=−64−6x2−12x3=−64x2+2x3=323……⑥ \begin{align*} & (7x_1 + 8x_2 + 9x_3) - 7 \times (x_1 + 2x_2 + 3x_3) = 13 - 7 \times 11 \\ & 7x_1 + 8x_2 + 9x_3 - (7x_1 + 14x_2 + 21x_3) = 13 - 77 \\ & 7x_1 + 8x_2 + 9x_3 - 7x_1 - 14x_2 - 21x_3 = -64 \\ & -6x_2 - 12x_3 = -64 \\ & x_2 + 2x_3 = \frac{32}{3} \quad \text{……⑥} \end{align*} (7x1+8x2+9x3)7×(x1+2x2+3x3)=137×117x1+8x2+9x3(7x1+14x2+21x3)=13777x1+8x2+9x37x114x221x3=646x212x3=64x2+2x3=332……

由⑤⑥可知,x2+2x3=323x_2 + 2x_3 = \frac{32}{3}x2+2x3=332

步骤 3: 求解方程组

3.1 将x2=323−2x3x_2=\frac{32}{3}-2x_3x2=3322x3代入③式

x1+2×(323−2x3)+3x3=11x1+643−4x3+3x3=11x1−x3=333−643x1−x3=−313x1=x3−313 \begin{align*} & x_1 + 2 \times \left(\frac{32}{3} - 2x_3\right) + 3x_3 = 11 \\ & x_1 + \frac{64}{3} - 4x_3 + 3x_3 = 11 \\ & x_1 - x_3 = \frac{33}{3} - \frac{64}{3} \\ & x_1 - x_3 = -\frac{31}{3} \\ & x_1 = x_3 - \frac{31}{3} \end{align*} x1+2×(3322x3)+3x3=11x1+3644x3+3x3=11x1x3=333364x1x3=331x1=x3331

最终结果

x3=tx_3 = tx3=t,则:

{x1=t−313x2=323−2tx3=t \begin{cases} x_1 = t - \frac{31}{3} \\ x_2 = \frac{32}{3} - 2t \\ x_3 = t \end{cases} x1=t331x2=3322tx3=t

因此,方程组的解为:

(x1,x2,x3)=(t−313,323−2t,t) (x_1, x_2, x_3) = \left( t - \frac{31}{3}, \frac{32}{3} - 2t, t \right) (x1,x2,x3)=(t331,3322t,t)

其中 ttt 为任意实数。

用代码来解方程组

from sympy import symbols, Eq, solve, Matrix

# 定义变量
x1, x2, x3 = symbols('x1 x2 x3')

# 定义系数矩阵 A 和常数向量 b
A = Matrix([
    [7, 8, 9],
    [4, 5, 6],
    [1, 2, 3]
])

b = Matrix([13, 12, 11])

# 构建方程组
equations = [Eq(A.row(i).dot(Matrix([x1, x2, x3])), b[i]) for i in range(3)]

print(equations)

# 求解方程组
solution = solve(equations, (x1, x2, x3), dict=True)

print("解为:")
print(solution)

结果

[Eq(7*x1 + 8*x2 + 9*x3, 13),
 Eq(4*x1 + 5*x2 + 6*x3, 12), 
 Eq(x1 + 2*x2 + 3*x3, 11)]

解为:

[{x1: x3 - 31/3, x2: 32/3 - 2*x3}]

解释一下 solve 函数返回的结果 {x1: x3 - 31/3, x2: 32/3 - 2*x3}

这个结果表示了方程组的解依赖于一个自由变量x3x_3x3。这意味着x1x_1x1x2x_2x2 都可以表示为x3x_3x3 的函数。具体来说:

x1=x3−313 x_1 = x_3 - \frac{31}{3} x1=x3331
x2=323−2x3 x_2 = \frac{32}{3} - 2x_3 x2=3322x3

解释

这个结果表明方程组有无穷多解,其中x3x_3x3 是一个自由变量,可以取任意实数值。根据x3x_3x3 的不同取值,可以得到不同的解。

解的形式

可以将解表示为一个参数形式,其中x3x_3x3 是自由变量ttt

(x1,x2,x3)=(t−313,323−2t,t) (x_1, x_2, x_3) = \left( t - \frac{31}{3}, \frac{32}{3} - 2t, t \right) (x1,x2,x3)=(t331,3322t,t)

其中ttt 是任意实数。

矩阵的秩

  1. 先将方程组写成矩阵形式。
    原方程组{7x1+8x2+9x3=134x1+5x2+6x3=12x1+2x2+3x3=11\begin{cases}7x_1 + 8x_2 + 9x_3 = 13\\4x_1 + 5x_2 + 6x_3 = 12\\x_1 + 2x_2 + 3x_3 = 11\end{cases} 7x1+8x2+9x3=134x1+5x2+6x3=12x1+2x2+3x3=11
    可写成矩阵形式[789456123][x1x2x3]=[131211]\begin{bmatrix}7&8&9\\4&5&6\\1&2&3\end{bmatrix}\begin{bmatrix}x_1\\x_2\\x_3\end{bmatrix}=\begin{bmatrix}13\\12\\11\end{bmatrix} 741852963 x1x2x3 = 131211
    对应的增广矩阵为[789134561212311]\begin{bmatrix}7&8&9&13\\4&5&6&12\\1&2&3&11\end{bmatrix} 741852963131211
  2. 然后对增广矩阵进行初等行变换求秩。
    先将第一行乘以47\frac{4}{7}74,然后用第二行减去第一行得到:
    [789130376732712311]\begin{bmatrix}7&8&9&13\\0&\frac{3}{7}&\frac{6}{7}&\frac{32}{7}\\1&2&3&11\end{bmatrix} 701873297631373211
    再将第一行乘以17\frac{1}{7}71,然后用第三行减去第一行得到:
    [7891303767327067127647]\begin{bmatrix}7&8&9&13\\0&\frac{3}{7}&\frac{6}{7}&\frac{32}{7}\\0&\frac{6}{7}&\frac{12}{7}&\frac{64}{7}\end{bmatrix} 7008737697671213732764
    接着将第二行乘以222,然后用第三行减去第二行得到:
    [78913037676470000]\begin{bmatrix}7&8&9&13\\0&\frac{3}{7}&\frac{6}{7}&\frac{64}{7}\\0&0&0&0\end{bmatrix} 70087309760137640
  3. 最后确定矩阵的秩。
    此时可以看出,非0行有两行,全是0那个没用,所以独立的有2行,矩阵的秩为222

假设有一个2行3列的矩阵:
(123246) \begin{pmatrix} 1 & 2 & 3 \\ 2 & 4 & 6 \end{pmatrix} (122436)

看起来有2行,但实际上第二行(2, 4, 6)是第一行(1, 2, 3)乘以2得到的。所以,第二行并没有提供新的信息,它和第一行并不是“独立的”。
这里的秩就是1,因为只有一行是独立的。

通俗解释就是方程组中独立的方程个数,就是这个方程组对应矩阵的秩。 把多余的方程从方程组里删掉,删完了剩的个数就只秩。

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐