在学习大模型、Transformer 和参数高效微调时,经常会遇到三个概念:
- 矩阵是什么?
- 矩阵的秩(Rank)是什么意思?
- LoRA 和 DoRA 为什么都与低秩矩阵有关?
这些概念并不只是数学知识,它们直接决定了模型如何表示信息、如何进行参数更新,以及为什么 LoRA 能够减少微调成本。
一、矩阵:模型中的"信息变换器"
在机器学习中,矩阵可以理解为一个信息变换器。
一个线性层通常表示为:
y=Wx+b y=Wx+b y=Wx+b
其中:
- (x):输入向量;
- (W):参数矩阵;
- (b):偏置;
- (y):输出向量。
#mermaid-svg-z6bt8QzklvKrpGMp{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-z6bt8QzklvKrpGMp .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-z6bt8QzklvKrpGMp .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-z6bt8QzklvKrpGMp .error-icon{fill:#552222;}#mermaid-svg-z6bt8QzklvKrpGMp .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-z6bt8QzklvKrpGMp .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-z6bt8QzklvKrpGMp .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-z6bt8QzklvKrpGMp .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-z6bt8QzklvKrpGMp .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-z6bt8QzklvKrpGMp .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-z6bt8QzklvKrpGMp .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-z6bt8QzklvKrpGMp .marker{fill:#333333;stroke:#333333;}#mermaid-svg-z6bt8QzklvKrpGMp .marker.cross{stroke:#333333;}#mermaid-svg-z6bt8QzklvKrpGMp svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-z6bt8QzklvKrpGMp p{margin:0;}#mermaid-svg-z6bt8QzklvKrpGMp .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-z6bt8QzklvKrpGMp .cluster-label text{fill:#333;}#mermaid-svg-z6bt8QzklvKrpGMp .cluster-label span{color:#333;}#mermaid-svg-z6bt8QzklvKrpGMp .cluster-label span p{background-color:transparent;}#mermaid-svg-z6bt8QzklvKrpGMp .label text,#mermaid-svg-z6bt8QzklvKrpGMp span{fill:#333;color:#333;}#mermaid-svg-z6bt8QzklvKrpGMp .node rect,#mermaid-svg-z6bt8QzklvKrpGMp .node circle,#mermaid-svg-z6bt8QzklvKrpGMp .node ellipse,#mermaid-svg-z6bt8QzklvKrpGMp .node polygon,#mermaid-svg-z6bt8QzklvKrpGMp .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-z6bt8QzklvKrpGMp .rough-node .label text,#mermaid-svg-z6bt8QzklvKrpGMp .node .label text,#mermaid-svg-z6bt8QzklvKrpGMp .image-shape .label,#mermaid-svg-z6bt8QzklvKrpGMp .icon-shape .label{text-anchor:middle;}#mermaid-svg-z6bt8QzklvKrpGMp .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-z6bt8QzklvKrpGMp .rough-node .label,#mermaid-svg-z6bt8QzklvKrpGMp .node .label,#mermaid-svg-z6bt8QzklvKrpGMp .image-shape .label,#mermaid-svg-z6bt8QzklvKrpGMp .icon-shape .label{text-align:center;}#mermaid-svg-z6bt8QzklvKrpGMp .node.clickable{cursor:pointer;}#mermaid-svg-z6bt8QzklvKrpGMp .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-z6bt8QzklvKrpGMp .arrowheadPath{fill:#333333;}#mermaid-svg-z6bt8QzklvKrpGMp .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-z6bt8QzklvKrpGMp .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-z6bt8QzklvKrpGMp .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z6bt8QzklvKrpGMp .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-z6bt8QzklvKrpGMp .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z6bt8QzklvKrpGMp .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-z6bt8QzklvKrpGMp .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-z6bt8QzklvKrpGMp .cluster text{fill:#333;}#mermaid-svg-z6bt8QzklvKrpGMp .cluster span{color:#333;}#mermaid-svg-z6bt8QzklvKrpGMp div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-z6bt8QzklvKrpGMp .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-z6bt8QzklvKrpGMp rect.text{fill:none;stroke-width:0;}#mermaid-svg-z6bt8QzklvKrpGMp .icon-shape,#mermaid-svg-z6bt8QzklvKrpGMp .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z6bt8QzklvKrpGMp .icon-shape p,#mermaid-svg-z6bt8QzklvKrpGMp .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-z6bt8QzklvKrpGMp .icon-shape .label rect,#mermaid-svg-z6bt8QzklvKrpGMp .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z6bt8QzklvKrpGMp .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-z6bt8QzklvKrpGMp .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-z6bt8QzklvKrpGMp :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输入向量 x
参数矩阵 W
线性变换 Wx+b
输出向量 y
例如:
W=2001 W= \begin{bmatrix} 2&0\\ 0&1 \end{bmatrix} W=2001
它会将:
x=x1x2 x= \begin{bmatrix} x_1\\ x_2 \end{bmatrix} x=x1x2
变换为:
Wx=2x1x2 Wx= \begin{bmatrix} 2x_1\\ x_2 \end{bmatrix} Wx=2x1x2
这表示:
- 第一个特征被放大 2 倍;
- 第二个特征保持不变。
因此,矩阵可以完成:
- 特征放大;
- 特征缩小;
- 不同特征混合;
- 空间旋转;
- 维度压缩;
- 信息投影。
二、大模型为什么大量使用矩阵?
Transformer 中最核心的计算,基本都离不开矩阵。
以 Attention 为例:
Q=XWQ Q=XW_Q Q=XWQ
K=XWK K=XW_K K=XWK
V=XWV V=XW_V V=XWV
其中:
- (X):输入 token 的向量表示;
- (W_Q):Query 参数矩阵;
- (W_K):Key 参数矩阵;
- (W_V):Value 参数矩阵。
#mermaid-svg-hJtwaPbDcWt5aMyl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-hJtwaPbDcWt5aMyl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-hJtwaPbDcWt5aMyl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-hJtwaPbDcWt5aMyl .error-icon{fill:#552222;}#mermaid-svg-hJtwaPbDcWt5aMyl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-hJtwaPbDcWt5aMyl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-hJtwaPbDcWt5aMyl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-hJtwaPbDcWt5aMyl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-hJtwaPbDcWt5aMyl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-hJtwaPbDcWt5aMyl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-hJtwaPbDcWt5aMyl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-hJtwaPbDcWt5aMyl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-hJtwaPbDcWt5aMyl .marker.cross{stroke:#333333;}#mermaid-svg-hJtwaPbDcWt5aMyl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-hJtwaPbDcWt5aMyl p{margin:0;}#mermaid-svg-hJtwaPbDcWt5aMyl .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-hJtwaPbDcWt5aMyl .cluster-label text{fill:#333;}#mermaid-svg-hJtwaPbDcWt5aMyl .cluster-label span{color:#333;}#mermaid-svg-hJtwaPbDcWt5aMyl .cluster-label span p{background-color:transparent;}#mermaid-svg-hJtwaPbDcWt5aMyl .label text,#mermaid-svg-hJtwaPbDcWt5aMyl span{fill:#333;color:#333;}#mermaid-svg-hJtwaPbDcWt5aMyl .node rect,#mermaid-svg-hJtwaPbDcWt5aMyl .node circle,#mermaid-svg-hJtwaPbDcWt5aMyl .node ellipse,#mermaid-svg-hJtwaPbDcWt5aMyl .node polygon,#mermaid-svg-hJtwaPbDcWt5aMyl .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-hJtwaPbDcWt5aMyl .rough-node .label text,#mermaid-svg-hJtwaPbDcWt5aMyl .node .label text,#mermaid-svg-hJtwaPbDcWt5aMyl .image-shape .label,#mermaid-svg-hJtwaPbDcWt5aMyl .icon-shape .label{text-anchor:middle;}#mermaid-svg-hJtwaPbDcWt5aMyl .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-hJtwaPbDcWt5aMyl .rough-node .label,#mermaid-svg-hJtwaPbDcWt5aMyl .node .label,#mermaid-svg-hJtwaPbDcWt5aMyl .image-shape .label,#mermaid-svg-hJtwaPbDcWt5aMyl .icon-shape .label{text-align:center;}#mermaid-svg-hJtwaPbDcWt5aMyl .node.clickable{cursor:pointer;}#mermaid-svg-hJtwaPbDcWt5aMyl .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-hJtwaPbDcWt5aMyl .arrowheadPath{fill:#333333;}#mermaid-svg-hJtwaPbDcWt5aMyl .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-hJtwaPbDcWt5aMyl .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-hJtwaPbDcWt5aMyl .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hJtwaPbDcWt5aMyl .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-hJtwaPbDcWt5aMyl .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hJtwaPbDcWt5aMyl .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-hJtwaPbDcWt5aMyl .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-hJtwaPbDcWt5aMyl .cluster text{fill:#333;}#mermaid-svg-hJtwaPbDcWt5aMyl .cluster span{color:#333;}#mermaid-svg-hJtwaPbDcWt5aMyl div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-hJtwaPbDcWt5aMyl .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-hJtwaPbDcWt5aMyl rect.text{fill:none;stroke-width:0;}#mermaid-svg-hJtwaPbDcWt5aMyl .icon-shape,#mermaid-svg-hJtwaPbDcWt5aMyl .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-hJtwaPbDcWt5aMyl .icon-shape p,#mermaid-svg-hJtwaPbDcWt5aMyl .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-hJtwaPbDcWt5aMyl .icon-shape .label rect,#mermaid-svg-hJtwaPbDcWt5aMyl .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-hJtwaPbDcWt5aMyl .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-hJtwaPbDcWt5aMyl .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-hJtwaPbDcWt5aMyl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Token 表示 X
WQ
WK
WV
Query Q
Key K
Value V
Attention
Feed-Forward Network 同样是矩阵变换:
H=σ(XW1+b1) H=\sigma(XW_1+b_1) H=σ(XW1+b1)
Y=HW2+b2 Y=HW_2+b_2 Y=HW2+b2
因此,Transformer 可以简单理解为:
text
Token 向量
↓
矩阵变换
↓
Attention / FFN
↓
新的 Token 表示
模型训练的本质,就是不断调整这些矩阵中的参数。
三、矩阵的 Rank 是什么?
矩阵的 Rank,也叫矩阵的秩,可以理解为:
矩阵中真正独立的信息方向或变化模式的数量。
例如:
A=1224 A= \begin{bmatrix} 1&2\\ 2&4 \end{bmatrix} A=1224
第二行是第一行的 2 倍:
2,4\]=2\[1,2\] \[2,4\]=2\[1,2\] \[2,4\]=2\[1,2
因此,第二行没有提供新的独立方向:
rank(A)=1 rank(A)=1 rank(A)=1
虽然矩阵中有 4 个数字,但真正独立的信息只有一个方向。
再看:
B=1001 B= \begin{bmatrix} 1&0\\ 0&1 \end{bmatrix} B=1001
它的两行和两列都相互独立:
rank(B)=2 rank(B)=2 rank(B)=2
四、Rank 的几何含义
矩阵也可以看成一种空间变换。
#mermaid-svg-Wf4PUetogTYiSNkf{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Wf4PUetogTYiSNkf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Wf4PUetogTYiSNkf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Wf4PUetogTYiSNkf .error-icon{fill:#552222;}#mermaid-svg-Wf4PUetogTYiSNkf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Wf4PUetogTYiSNkf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Wf4PUetogTYiSNkf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Wf4PUetogTYiSNkf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Wf4PUetogTYiSNkf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Wf4PUetogTYiSNkf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Wf4PUetogTYiSNkf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Wf4PUetogTYiSNkf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Wf4PUetogTYiSNkf .marker.cross{stroke:#333333;}#mermaid-svg-Wf4PUetogTYiSNkf svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Wf4PUetogTYiSNkf p{margin:0;}#mermaid-svg-Wf4PUetogTYiSNkf .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Wf4PUetogTYiSNkf .cluster-label text{fill:#333;}#mermaid-svg-Wf4PUetogTYiSNkf .cluster-label span{color:#333;}#mermaid-svg-Wf4PUetogTYiSNkf .cluster-label span p{background-color:transparent;}#mermaid-svg-Wf4PUetogTYiSNkf .label text,#mermaid-svg-Wf4PUetogTYiSNkf span{fill:#333;color:#333;}#mermaid-svg-Wf4PUetogTYiSNkf .node rect,#mermaid-svg-Wf4PUetogTYiSNkf .node circle,#mermaid-svg-Wf4PUetogTYiSNkf .node ellipse,#mermaid-svg-Wf4PUetogTYiSNkf .node polygon,#mermaid-svg-Wf4PUetogTYiSNkf .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Wf4PUetogTYiSNkf .rough-node .label text,#mermaid-svg-Wf4PUetogTYiSNkf .node .label text,#mermaid-svg-Wf4PUetogTYiSNkf .image-shape .label,#mermaid-svg-Wf4PUetogTYiSNkf .icon-shape .label{text-anchor:middle;}#mermaid-svg-Wf4PUetogTYiSNkf .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Wf4PUetogTYiSNkf .rough-node .label,#mermaid-svg-Wf4PUetogTYiSNkf .node .label,#mermaid-svg-Wf4PUetogTYiSNkf .image-shape .label,#mermaid-svg-Wf4PUetogTYiSNkf .icon-shape .label{text-align:center;}#mermaid-svg-Wf4PUetogTYiSNkf .node.clickable{cursor:pointer;}#mermaid-svg-Wf4PUetogTYiSNkf .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Wf4PUetogTYiSNkf .arrowheadPath{fill:#333333;}#mermaid-svg-Wf4PUetogTYiSNkf .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Wf4PUetogTYiSNkf .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Wf4PUetogTYiSNkf .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Wf4PUetogTYiSNkf .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Wf4PUetogTYiSNkf .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Wf4PUetogTYiSNkf .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Wf4PUetogTYiSNkf .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Wf4PUetogTYiSNkf .cluster text{fill:#333;}#mermaid-svg-Wf4PUetogTYiSNkf .cluster span{color:#333;}#mermaid-svg-Wf4PUetogTYiSNkf div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Wf4PUetogTYiSNkf .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Wf4PUetogTYiSNkf rect.text{fill:none;stroke-width:0;}#mermaid-svg-Wf4PUetogTYiSNkf .icon-shape,#mermaid-svg-Wf4PUetogTYiSNkf .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Wf4PUetogTYiSNkf .icon-shape p,#mermaid-svg-Wf4PUetogTYiSNkf .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Wf4PUetogTYiSNkf .icon-shape .label rect,#mermaid-svg-Wf4PUetogTYiSNkf .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Wf4PUetogTYiSNkf .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Wf4PUetogTYiSNkf .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Wf4PUetogTYiSNkf :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 二维平面
矩阵 Rank
Rank=2:仍是二维区域
Rank=1:压缩成一条线
Rank=0:压缩成一个点
因此:
- Rank=2:保留两个独立方向;
- Rank=1:只保留一个有效方向;
- Rank=0:没有有效变化。
所以 Rank 也可以理解为:
矩阵变换之后,信息保留下来的有效维度。
五、矩阵大小和 Rank 不是一回事
一个 (n\times n) 的矩阵拥有:
n2 n^2 n2
个参数,但它的 Rank 最大只有:
n n n
例如:
| 项目 | 含义 |
|---|---|
| 矩阵大小 | (10000\times10000) |
| 参数数量 | 1 亿 |
| 最大 Rank | 10000 |
| Rank 的含义 | 独立信息方向数量 |
因此:
参数很多,不代表信息方向同样多。
对于任意 (n\times n) 矩阵:
0≤rank(W)≤n 0\leq rank(W)\leq n 0≤rank(W)≤n
所以一个 (n\times n) 的矩阵完全可能满足:
rank(W)<n rank(W)<n rank(W)<n
六、Rank=1 的矩阵能表达什么?
Rank=1 的矩阵可以写成两个向量的外积:
A=uvT A=uv^T A=uvT
例如:
u=12,v=34 u= \begin{bmatrix} 1\\ 2 \end{bmatrix}, \quad v= \begin{bmatrix} 3&4 \end{bmatrix} u=12,v=34
那么:
A=uvT=3468 A=uv^T= \begin{bmatrix} 3&4\\ 6&8 \end{bmatrix} A=uvT=3648
矩阵中的 4 个位置都发生了变化,但第二行是第一行的 2 倍。
这说明:
Rank=1 并不是只能修改一个参数,而是所有变化必须共享同一种模式。
#mermaid-svg-YFRvlZc3UkztxB7X{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-YFRvlZc3UkztxB7X .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-YFRvlZc3UkztxB7X .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-YFRvlZc3UkztxB7X .error-icon{fill:#552222;}#mermaid-svg-YFRvlZc3UkztxB7X .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-YFRvlZc3UkztxB7X .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-YFRvlZc3UkztxB7X .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-YFRvlZc3UkztxB7X .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-YFRvlZc3UkztxB7X .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-YFRvlZc3UkztxB7X .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-YFRvlZc3UkztxB7X .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-YFRvlZc3UkztxB7X .marker{fill:#333333;stroke:#333333;}#mermaid-svg-YFRvlZc3UkztxB7X .marker.cross{stroke:#333333;}#mermaid-svg-YFRvlZc3UkztxB7X svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-YFRvlZc3UkztxB7X p{margin:0;}#mermaid-svg-YFRvlZc3UkztxB7X .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-YFRvlZc3UkztxB7X .cluster-label text{fill:#333;}#mermaid-svg-YFRvlZc3UkztxB7X .cluster-label span{color:#333;}#mermaid-svg-YFRvlZc3UkztxB7X .cluster-label span p{background-color:transparent;}#mermaid-svg-YFRvlZc3UkztxB7X .label text,#mermaid-svg-YFRvlZc3UkztxB7X span{fill:#333;color:#333;}#mermaid-svg-YFRvlZc3UkztxB7X .node rect,#mermaid-svg-YFRvlZc3UkztxB7X .node circle,#mermaid-svg-YFRvlZc3UkztxB7X .node ellipse,#mermaid-svg-YFRvlZc3UkztxB7X .node polygon,#mermaid-svg-YFRvlZc3UkztxB7X .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-YFRvlZc3UkztxB7X .rough-node .label text,#mermaid-svg-YFRvlZc3UkztxB7X .node .label text,#mermaid-svg-YFRvlZc3UkztxB7X .image-shape .label,#mermaid-svg-YFRvlZc3UkztxB7X .icon-shape .label{text-anchor:middle;}#mermaid-svg-YFRvlZc3UkztxB7X .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-YFRvlZc3UkztxB7X .rough-node .label,#mermaid-svg-YFRvlZc3UkztxB7X .node .label,#mermaid-svg-YFRvlZc3UkztxB7X .image-shape .label,#mermaid-svg-YFRvlZc3UkztxB7X .icon-shape .label{text-align:center;}#mermaid-svg-YFRvlZc3UkztxB7X .node.clickable{cursor:pointer;}#mermaid-svg-YFRvlZc3UkztxB7X .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-YFRvlZc3UkztxB7X .arrowheadPath{fill:#333333;}#mermaid-svg-YFRvlZc3UkztxB7X .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-YFRvlZc3UkztxB7X .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-YFRvlZc3UkztxB7X .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YFRvlZc3UkztxB7X .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-YFRvlZc3UkztxB7X .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YFRvlZc3UkztxB7X .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-YFRvlZc3UkztxB7X .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-YFRvlZc3UkztxB7X .cluster text{fill:#333;}#mermaid-svg-YFRvlZc3UkztxB7X .cluster span{color:#333;}#mermaid-svg-YFRvlZc3UkztxB7X div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-YFRvlZc3UkztxB7X .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-YFRvlZc3UkztxB7X rect.text{fill:none;stroke-width:0;}#mermaid-svg-YFRvlZc3UkztxB7X .icon-shape,#mermaid-svg-YFRvlZc3UkztxB7X .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-YFRvlZc3UkztxB7X .icon-shape p,#mermaid-svg-YFRvlZc3UkztxB7X .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-YFRvlZc3UkztxB7X .icon-shape .label rect,#mermaid-svg-YFRvlZc3UkztxB7X .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-YFRvlZc3UkztxB7X .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-YFRvlZc3UkztxB7X .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-YFRvlZc3UkztxB7X :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基础方向 1
组合后的 Rank=1 矩阵
基础方向 2
多个参数同步变化
但变化之间存在固定关联
七、为什么 Rank=1 不能表达所有变化?
假设我们想要:
ΔW=100−1 \Delta W= \begin{bmatrix} 1&0\\ 0&-1 \end{bmatrix} ΔW=100−1
这个变化表示:
- 左上角增加 1;
- 右下角减少 1;
- 其他位置不变。
这是两个相互独立的变化方向,因此:
rank(ΔW)=2 rank(\Delta W)=2 rank(ΔW)=2
如果使用 Rank=1 的矩阵,就无法精确表达它,只能得到一个近似结果。
所以:
- Rank=1:只能表达一个主要变化模式;
- Rank=2:可以表达两个独立变化模式;
- Rank=8:可以组合八个基础变化方向。
注意:
Rank=8 不是只能修改 8 个参数,而是所有参数变化都由 8 个基础方向组合而来。
八、矩阵分解可以是精确的,也可以是近似的
矩阵分解不一定只能近似。
如果目标矩阵的 Rank 不超过分解使用的 Rank,就可以精确表示:
ΔW=BA \Delta W=BA ΔW=BA
如果目标矩阵的 Rank 大于分解使用的 Rank,则只能近似:
ΔW≈BA \Delta W\approx BA ΔW≈BA
例如,目标矩阵的 Rank 是 2:
| 分解 Rank | 结果 |
|---|---|
| (r=1) | 只能近似 |
| (r=2) | 可以精确表示 |
| (r>2) | 也可以精确表示,但可能存在冗余 |
因此,低秩分解的核心是:
用较少的独立方向,表示一个可能更复杂的矩阵。
九、LoRA:用低秩矩阵表示参数更新
LoRA 的基本公式是:
W′=W+ΔW W'=W+\Delta W W′=W+ΔW
LoRA 不直接训练完整的 (\Delta W),而是将它表示为:
ΔW=BA \Delta W=BA ΔW=BA
因此:
W′=W+BA W'=W+BA W′=W+BA
其中:
- (W):原始模型参数,保持冻结;
- (A,B):可训练的小矩阵;
- (r):LoRA 的 Rank。
#mermaid-svg-OZHQI7sZHFwxgWWJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OZHQI7sZHFwxgWWJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OZHQI7sZHFwxgWWJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OZHQI7sZHFwxgWWJ .error-icon{fill:#552222;}#mermaid-svg-OZHQI7sZHFwxgWWJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OZHQI7sZHFwxgWWJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OZHQI7sZHFwxgWWJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OZHQI7sZHFwxgWWJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OZHQI7sZHFwxgWWJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OZHQI7sZHFwxgWWJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OZHQI7sZHFwxgWWJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OZHQI7sZHFwxgWWJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OZHQI7sZHFwxgWWJ .marker.cross{stroke:#333333;}#mermaid-svg-OZHQI7sZHFwxgWWJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OZHQI7sZHFwxgWWJ p{margin:0;}#mermaid-svg-OZHQI7sZHFwxgWWJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OZHQI7sZHFwxgWWJ .cluster-label text{fill:#333;}#mermaid-svg-OZHQI7sZHFwxgWWJ .cluster-label span{color:#333;}#mermaid-svg-OZHQI7sZHFwxgWWJ .cluster-label span p{background-color:transparent;}#mermaid-svg-OZHQI7sZHFwxgWWJ .label text,#mermaid-svg-OZHQI7sZHFwxgWWJ span{fill:#333;color:#333;}#mermaid-svg-OZHQI7sZHFwxgWWJ .node rect,#mermaid-svg-OZHQI7sZHFwxgWWJ .node circle,#mermaid-svg-OZHQI7sZHFwxgWWJ .node ellipse,#mermaid-svg-OZHQI7sZHFwxgWWJ .node polygon,#mermaid-svg-OZHQI7sZHFwxgWWJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OZHQI7sZHFwxgWWJ .rough-node .label text,#mermaid-svg-OZHQI7sZHFwxgWWJ .node .label text,#mermaid-svg-OZHQI7sZHFwxgWWJ .image-shape .label,#mermaid-svg-OZHQI7sZHFwxgWWJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-OZHQI7sZHFwxgWWJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OZHQI7sZHFwxgWWJ .rough-node .label,#mermaid-svg-OZHQI7sZHFwxgWWJ .node .label,#mermaid-svg-OZHQI7sZHFwxgWWJ .image-shape .label,#mermaid-svg-OZHQI7sZHFwxgWWJ .icon-shape .label{text-align:center;}#mermaid-svg-OZHQI7sZHFwxgWWJ .node.clickable{cursor:pointer;}#mermaid-svg-OZHQI7sZHFwxgWWJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OZHQI7sZHFwxgWWJ .arrowheadPath{fill:#333333;}#mermaid-svg-OZHQI7sZHFwxgWWJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OZHQI7sZHFwxgWWJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OZHQI7sZHFwxgWWJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OZHQI7sZHFwxgWWJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OZHQI7sZHFwxgWWJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OZHQI7sZHFwxgWWJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OZHQI7sZHFwxgWWJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OZHQI7sZHFwxgWWJ .cluster text{fill:#333;}#mermaid-svg-OZHQI7sZHFwxgWWJ .cluster span{color:#333;}#mermaid-svg-OZHQI7sZHFwxgWWJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OZHQI7sZHFwxgWWJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OZHQI7sZHFwxgWWJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-OZHQI7sZHFwxgWWJ .icon-shape,#mermaid-svg-OZHQI7sZHFwxgWWJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OZHQI7sZHFwxgWWJ .icon-shape p,#mermaid-svg-OZHQI7sZHFwxgWWJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OZHQI7sZHFwxgWWJ .icon-shape .label rect,#mermaid-svg-OZHQI7sZHFwxgWWJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OZHQI7sZHFwxgWWJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OZHQI7sZHFwxgWWJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OZHQI7sZHFwxgWWJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原始权重 W
最终权重 W+BA
低秩矩阵 A、B
冻结
训练
十、LoRA 为什么能减少参数?
假设原始矩阵为:
W∈R4096×4096 W\in\mathbb{R}^{4096\times4096} W∈R4096×4096
如果直接训练完整更新矩阵,需要:
4096×4096≈16.8 million 4096\times4096\approx16.8\text{ million} 4096×4096≈16.8 million
个参数。
如果使用 LoRA,并设置:
r=8 r=8 r=8
那么只需训练:
4096×8+8×4096=65,536 4096\times8+8\times4096=65,536 4096×8+8×4096=65,536
个参数。
对比:
| 方法 | 可训练参数量 |
|---|---|
| 全量微调 | 约 1680 万 |
| LoRA,(r=8) | 约 6.5 万 |
因此,LoRA 具有:
- 显存占用低;
- 训练速度快;
- 参数量少;
- Adapter 易于保存;
- 多个任务可以共享基础模型。
十一、LoRA 中 Rank 小意味着什么?
LoRA 的 (r) 不是"只能学习 (r) 个参数",而是:
最多使用 (r) 个基础变化方向。
例如:
#mermaid-svg-ghf7g9KcZHWxWrYA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ghf7g9KcZHWxWrYA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ghf7g9KcZHWxWrYA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ghf7g9KcZHWxWrYA .error-icon{fill:#552222;}#mermaid-svg-ghf7g9KcZHWxWrYA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ghf7g9KcZHWxWrYA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ghf7g9KcZHWxWrYA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ghf7g9KcZHWxWrYA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ghf7g9KcZHWxWrYA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ghf7g9KcZHWxWrYA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ghf7g9KcZHWxWrYA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ghf7g9KcZHWxWrYA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ghf7g9KcZHWxWrYA .marker.cross{stroke:#333333;}#mermaid-svg-ghf7g9KcZHWxWrYA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ghf7g9KcZHWxWrYA p{margin:0;}#mermaid-svg-ghf7g9KcZHWxWrYA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ghf7g9KcZHWxWrYA .cluster-label text{fill:#333;}#mermaid-svg-ghf7g9KcZHWxWrYA .cluster-label span{color:#333;}#mermaid-svg-ghf7g9KcZHWxWrYA .cluster-label span p{background-color:transparent;}#mermaid-svg-ghf7g9KcZHWxWrYA .label text,#mermaid-svg-ghf7g9KcZHWxWrYA span{fill:#333;color:#333;}#mermaid-svg-ghf7g9KcZHWxWrYA .node rect,#mermaid-svg-ghf7g9KcZHWxWrYA .node circle,#mermaid-svg-ghf7g9KcZHWxWrYA .node ellipse,#mermaid-svg-ghf7g9KcZHWxWrYA .node polygon,#mermaid-svg-ghf7g9KcZHWxWrYA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ghf7g9KcZHWxWrYA .rough-node .label text,#mermaid-svg-ghf7g9KcZHWxWrYA .node .label text,#mermaid-svg-ghf7g9KcZHWxWrYA .image-shape .label,#mermaid-svg-ghf7g9KcZHWxWrYA .icon-shape .label{text-anchor:middle;}#mermaid-svg-ghf7g9KcZHWxWrYA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ghf7g9KcZHWxWrYA .rough-node .label,#mermaid-svg-ghf7g9KcZHWxWrYA .node .label,#mermaid-svg-ghf7g9KcZHWxWrYA .image-shape .label,#mermaid-svg-ghf7g9KcZHWxWrYA .icon-shape .label{text-align:center;}#mermaid-svg-ghf7g9KcZHWxWrYA .node.clickable{cursor:pointer;}#mermaid-svg-ghf7g9KcZHWxWrYA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ghf7g9KcZHWxWrYA .arrowheadPath{fill:#333333;}#mermaid-svg-ghf7g9KcZHWxWrYA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ghf7g9KcZHWxWrYA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ghf7g9KcZHWxWrYA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ghf7g9KcZHWxWrYA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ghf7g9KcZHWxWrYA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ghf7g9KcZHWxWrYA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ghf7g9KcZHWxWrYA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ghf7g9KcZHWxWrYA .cluster text{fill:#333;}#mermaid-svg-ghf7g9KcZHWxWrYA .cluster span{color:#333;}#mermaid-svg-ghf7g9KcZHWxWrYA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ghf7g9KcZHWxWrYA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ghf7g9KcZHWxWrYA rect.text{fill:none;stroke-width:0;}#mermaid-svg-ghf7g9KcZHWxWrYA .icon-shape,#mermaid-svg-ghf7g9KcZHWxWrYA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ghf7g9KcZHWxWrYA .icon-shape p,#mermaid-svg-ghf7g9KcZHWxWrYA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ghf7g9KcZHWxWrYA .icon-shape .label rect,#mermaid-svg-ghf7g9KcZHWxWrYA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ghf7g9KcZHWxWrYA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ghf7g9KcZHWxWrYA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ghf7g9KcZHWxWrYA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 任务微调需求
变化方向 1
变化方向 2
变化方向 3
变化方向 4
LoRA Rank=2
无法完整表达
如果任务只需要一个主要变化模式,(r=1) 可能就够。
如果任务同时涉及:
- 中文语义;
- 代码保护;
- JSON 结构;
- 工具调用;
- 专业术语;
- 风格变化;
这些变化可能更加独立,就需要更大的 Rank,或者直接使用全量微调。
十二、LoRA 的问题是什么?
LoRA 直接使用:
ΔW=BA \Delta W=BA ΔW=BA
但实际权重变化通常包含两部分:
- 权重大小变化;
- 权重方向变化。
可以把权重想象成一个箭头:
- 箭头长度:权重大小;
- 箭头方向:权重方向。
例如:
text
原始权重:长度 10,方向 30°
微调权重:长度 12,方向 35°
这包含两种变化:
text
长度:10 → 12
方向:30° → 35°
LoRA 需要用同一个低秩更新同时学习这两种变化。
当 Rank 较小或训练数据较少时,不同变化可能争夺有限的低秩表达空间:
text
一个更新方向同时负责:
- 增强某些特征
- 改变某些语义方向
- 保留某些结构信息
这可能导致:
- 某些变化学得不充分;
- 不同任务之间互相干扰;
- 在训练数据上有效,但泛化不稳定。
十三、DoRA:将大小和方向分开学习
DoRA 的核心思想是:
将权重大小和权重方向拆开学习。
它将权重表示为:
W=mV∥V∥ W=m\frac{V}{\|V\|} W=m∥V∥V
其中:
- (m):权重大小;
- (V/|V|):权重方向。
微调后的权重可以写成:
W′=m′W+BA∥W+BA∥ W'=m'\frac{W+BA}{\|W+BA\|} W′=m′∥W+BA∥W+BA
其中:
- (m'):单独训练的大小参数;
- (BA):使用 LoRA 学习方向变化。
#mermaid-svg-tIPzM1eFn3aUgknC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-tIPzM1eFn3aUgknC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-tIPzM1eFn3aUgknC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-tIPzM1eFn3aUgknC .error-icon{fill:#552222;}#mermaid-svg-tIPzM1eFn3aUgknC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tIPzM1eFn3aUgknC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-tIPzM1eFn3aUgknC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tIPzM1eFn3aUgknC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tIPzM1eFn3aUgknC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-tIPzM1eFn3aUgknC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tIPzM1eFn3aUgknC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tIPzM1eFn3aUgknC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tIPzM1eFn3aUgknC .marker.cross{stroke:#333333;}#mermaid-svg-tIPzM1eFn3aUgknC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tIPzM1eFn3aUgknC p{margin:0;}#mermaid-svg-tIPzM1eFn3aUgknC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tIPzM1eFn3aUgknC .cluster-label text{fill:#333;}#mermaid-svg-tIPzM1eFn3aUgknC .cluster-label span{color:#333;}#mermaid-svg-tIPzM1eFn3aUgknC .cluster-label span p{background-color:transparent;}#mermaid-svg-tIPzM1eFn3aUgknC .label text,#mermaid-svg-tIPzM1eFn3aUgknC span{fill:#333;color:#333;}#mermaid-svg-tIPzM1eFn3aUgknC .node rect,#mermaid-svg-tIPzM1eFn3aUgknC .node circle,#mermaid-svg-tIPzM1eFn3aUgknC .node ellipse,#mermaid-svg-tIPzM1eFn3aUgknC .node polygon,#mermaid-svg-tIPzM1eFn3aUgknC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tIPzM1eFn3aUgknC .rough-node .label text,#mermaid-svg-tIPzM1eFn3aUgknC .node .label text,#mermaid-svg-tIPzM1eFn3aUgknC .image-shape .label,#mermaid-svg-tIPzM1eFn3aUgknC .icon-shape .label{text-anchor:middle;}#mermaid-svg-tIPzM1eFn3aUgknC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-tIPzM1eFn3aUgknC .rough-node .label,#mermaid-svg-tIPzM1eFn3aUgknC .node .label,#mermaid-svg-tIPzM1eFn3aUgknC .image-shape .label,#mermaid-svg-tIPzM1eFn3aUgknC .icon-shape .label{text-align:center;}#mermaid-svg-tIPzM1eFn3aUgknC .node.clickable{cursor:pointer;}#mermaid-svg-tIPzM1eFn3aUgknC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-tIPzM1eFn3aUgknC .arrowheadPath{fill:#333333;}#mermaid-svg-tIPzM1eFn3aUgknC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tIPzM1eFn3aUgknC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tIPzM1eFn3aUgknC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tIPzM1eFn3aUgknC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-tIPzM1eFn3aUgknC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tIPzM1eFn3aUgknC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-tIPzM1eFn3aUgknC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tIPzM1eFn3aUgknC .cluster text{fill:#333;}#mermaid-svg-tIPzM1eFn3aUgknC .cluster span{color:#333;}#mermaid-svg-tIPzM1eFn3aUgknC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tIPzM1eFn3aUgknC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-tIPzM1eFn3aUgknC rect.text{fill:none;stroke-width:0;}#mermaid-svg-tIPzM1eFn3aUgknC .icon-shape,#mermaid-svg-tIPzM1eFn3aUgknC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-tIPzM1eFn3aUgknC .icon-shape p,#mermaid-svg-tIPzM1eFn3aUgknC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-tIPzM1eFn3aUgknC .icon-shape .label rect,#mermaid-svg-tIPzM1eFn3aUgknC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-tIPzM1eFn3aUgknC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-tIPzM1eFn3aUgknC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-tIPzM1eFn3aUgknC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原始权重 W
方向分支
大小分支
LoRA BA
可训练 magnitude m
归一化方向
权重大小
最终权重 W'
可以简单理解为:
text
LoRA:
一个补丁同时负责"改变大小"和"改变方向"
DoRA:
一个模块负责"改变大小"
一个 LoRA 模块负责"改变方向"
十四、LoRA 和 DoRA 的区别
| 对比项 | LoRA | DoRA |
|---|---|---|
| 基本公式 | (W'=W+BA) | (W'=m'\frac{W+BA}{|W+BA|}) |
| 学习内容 | 整体权重变化 | 权重大小与方向 |
| 参数量 | 少 | 略多 |
| 训练复杂度 | 较低 | 略高 |
| 工程成熟度 | 很高 | 相对较低 |
| 适合定位 | 默认高效微调 | LoRA 的增强方案 |
DoRA 的优化点是:
减少"大小变化"和"方向变化"之间的相互干扰,使模型能够更细致地学习参数变化。
但 DoRA 并不意味着:
- 一定比 LoRA 好;
- 一定不会遗忘;
- 一定降低显存;
- 可以替代高质量训练数据。
十五、如何选择全量微调、LoRA、QLoRA 和 DoRA?
#mermaid-svg-B6TQytRk9uzeV7DC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-B6TQytRk9uzeV7DC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-B6TQytRk9uzeV7DC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-B6TQytRk9uzeV7DC .error-icon{fill:#552222;}#mermaid-svg-B6TQytRk9uzeV7DC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-B6TQytRk9uzeV7DC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-B6TQytRk9uzeV7DC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-B6TQytRk9uzeV7DC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-B6TQytRk9uzeV7DC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-B6TQytRk9uzeV7DC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-B6TQytRk9uzeV7DC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-B6TQytRk9uzeV7DC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-B6TQytRk9uzeV7DC .marker.cross{stroke:#333333;}#mermaid-svg-B6TQytRk9uzeV7DC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-B6TQytRk9uzeV7DC p{margin:0;}#mermaid-svg-B6TQytRk9uzeV7DC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-B6TQytRk9uzeV7DC .cluster-label text{fill:#333;}#mermaid-svg-B6TQytRk9uzeV7DC .cluster-label span{color:#333;}#mermaid-svg-B6TQytRk9uzeV7DC .cluster-label span p{background-color:transparent;}#mermaid-svg-B6TQytRk9uzeV7DC .label text,#mermaid-svg-B6TQytRk9uzeV7DC span{fill:#333;color:#333;}#mermaid-svg-B6TQytRk9uzeV7DC .node rect,#mermaid-svg-B6TQytRk9uzeV7DC .node circle,#mermaid-svg-B6TQytRk9uzeV7DC .node ellipse,#mermaid-svg-B6TQytRk9uzeV7DC .node polygon,#mermaid-svg-B6TQytRk9uzeV7DC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-B6TQytRk9uzeV7DC .rough-node .label text,#mermaid-svg-B6TQytRk9uzeV7DC .node .label text,#mermaid-svg-B6TQytRk9uzeV7DC .image-shape .label,#mermaid-svg-B6TQytRk9uzeV7DC .icon-shape .label{text-anchor:middle;}#mermaid-svg-B6TQytRk9uzeV7DC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-B6TQytRk9uzeV7DC .rough-node .label,#mermaid-svg-B6TQytRk9uzeV7DC .node .label,#mermaid-svg-B6TQytRk9uzeV7DC .image-shape .label,#mermaid-svg-B6TQytRk9uzeV7DC .icon-shape .label{text-align:center;}#mermaid-svg-B6TQytRk9uzeV7DC .node.clickable{cursor:pointer;}#mermaid-svg-B6TQytRk9uzeV7DC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-B6TQytRk9uzeV7DC .arrowheadPath{fill:#333333;}#mermaid-svg-B6TQytRk9uzeV7DC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-B6TQytRk9uzeV7DC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-B6TQytRk9uzeV7DC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B6TQytRk9uzeV7DC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-B6TQytRk9uzeV7DC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B6TQytRk9uzeV7DC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-B6TQytRk9uzeV7DC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-B6TQytRk9uzeV7DC .cluster text{fill:#333;}#mermaid-svg-B6TQytRk9uzeV7DC .cluster span{color:#333;}#mermaid-svg-B6TQytRk9uzeV7DC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-B6TQytRk9uzeV7DC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-B6TQytRk9uzeV7DC rect.text{fill:none;stroke-width:0;}#mermaid-svg-B6TQytRk9uzeV7DC .icon-shape,#mermaid-svg-B6TQytRk9uzeV7DC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-B6TQytRk9uzeV7DC .icon-shape p,#mermaid-svg-B6TQytRk9uzeV7DC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-B6TQytRk9uzeV7DC .icon-shape .label rect,#mermaid-svg-B6TQytRk9uzeV7DC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-B6TQytRk9uzeV7DC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-B6TQytRk9uzeV7DC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-B6TQytRk9uzeV7DC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
是
否
是
否
开始微调
显存是否紧张?
优先 QLoRA
模型规模和数据量是否可控?
先做全量微调基线
优先 LoRA
LoRA 效果是否不足?
尝试 DoRA
继续使用 LoRA
一般建议:
| 方法 | 适用场景 |
|---|---|
| 全量微调 | 模型较小、数据充足、追求效果上限 |
| LoRA | 通用生产首选 |
| QLoRA | 显存不足时使用 |
| DoRA | LoRA 效果不足时尝试 |
| QDoRA | 量化模型上使用 DoRA |
十六、如何增强新能力又保留原始能力?
如果只使用新领域数据进行全量微调,可能出现灾难性遗忘。
例如:
text
中文能力提升
英文能力下降
代码能力下降
原始领域泛化能力下降
更稳妥的方式是:
方案一:使用独立 Adapter
text
基础模型
├── 中文 Adapter
├── 英文 Adapter
└── 代码 Adapter
根据请求语言和任务类型选择不同 Adapter。
方案二:混合新旧数据
训练数据同时包含:
text
新领域数据 + 原始能力数据 + 多领域数据
损失函数可以表示为:
L=λLnew+(1−λ)Loriginal L=\lambda L_{\text{new}}+(1-\lambda)L_{\text{original}} L=λLnew+(1−λ)Loriginal
这样模型在学习新能力的同时,也会复习原始能力。
方案三:建立回归评测集
需要分别评估:
- 新领域任务效果;
- 原始任务效果;
- 不同语言表现;
- 代码能力;
- 工具调用能力;
- 推理延迟;
- 显存和训练成本。
十七、最终总结
矩阵是大模型进行特征变换和信息传递的基本工具。
Rank 表示矩阵中真正独立的信息方向数量,也可以理解为矩阵变换后保留下来的有效维度。
LoRA 的核心是:
W′=W+BA W'=W+BA W′=W+BA
它假设:
ΔW=W′−W \Delta W=W'-W ΔW=W′−W
可以用较低的 Rank 近似表示。
DoRA 则进一步将权重变化拆成:
text
权重大小变化
+
权重方向变化
从而减少两类变化之间的相互干扰。
可以用一句话概括:
矩阵负责变换信息,Rank 表示独立信息方向,LoRA 用低秩矩阵高效学习任务变化,DoRA 则把权重大小和方向分开学习。