三个秩 4 的 LoRA 两两余弦只有 0.0131/-0.0105/-0.0138。 1 比 1 融合后范数是单个的 1.41 倍,和两边的余弦都掉到 0.71; 2 比 2 时范数 2.83 倍,输出偏离从 2.55% 涨到 8.11%。
上一节集成学习是训出一堆模型投票。 这一节是另一件事:手上已经有好几个训好的模型,怎么把它们合成一个。
一、融合和集成不是一回事
集成:多个模型都留着,每次推理都要各跑一遍,最后投票或平均。 代价是推理成本按模型个数翻倍,显存也要装得下所有模型。 融合(也叫模型合并):把多个模型的权重直接算成一个,推理时只跑一个。 体积不变、速度不变、部署最简单。 代价是不可逆。合完就只剩一个模型,拿不回原来任何一个;想调比例只能从头再合一遍。 现在最常做的是 LoRA 合并:底座大模型不动,只把几份几 MB 的增量权重加起来。 底座共享,所以几份风格能同时存在一个文件里。
二、三种融法,按成本排
权重级:把每份增量权重乘上系数再相加,Demo 用的就是这种。 零额外成本,但要接受「合出来的效果谁也没见过」。 输出级:多个模型各跑一遍,输出取平均或加权平均。效果最稳,因为每个模型都是原样的; 成本按模型个数线性增长。 特征级:在中间层把特征拼接或加权。要改模型结构,实践里最少用,一般是研究场景。 选择逻辑很直接:能接受推理成本翻倍、又要求效果可控,就用输出级;要上线、要省资源,就用权重级。
三、实测:正交相加不是「各出一半」
Demo 里三个秩 4 的源,两两余弦是 0.0131、-0.0105、-0.0138——几乎正交,确实是三种完全不同的方向。 「1 比 1」融合后,范数从 0.3026 变成 0.4278,是 1.41 倍,不是 2 倍。 因为正交向量相加按平方和开根号算:根号 2 等于 1.414。 更反直觉的是相似度:合出来的方向和第一个源的余弦掉到 0.7166,和第二个的余弦是 0.7068。 两个都不到 1,也都不等于 0.5。 0.707 就是 1 除以根号 2。几何上的意思是:两条正交等长向量相加,合向量和每一条的夹角都是 45 度。 所以「1 比 1 融合」不是「两个风格各出一半」,是造了一个新方向,它和两边都保持 45 度。 想让结果明显偏某一方,1 比 1 是不够的。
四、权重和必须等于 1,还有秩会累加
「2 比 2」那行:范数是单个的 2.83 倍(同样是根号 8),输出偏离从 2.55% 涨到 8.11%, 三倍多。 权重和超过 1 时改动被整体放大,画面往往过曝或者结构散掉。 所以经验做法是所有权重加起来等于 1,比如 0.4 比 0.4 比 0.2。这样总强度可控,变的只是风格比例。 还有一个技术细节:秩会累加。两个秩 4 的加起来最多秩 8,三个最多 12。 所以融合多个 LoRA 之后文件不会变小,反而变大。 这也解释了为什么融合结果不能被任何一个源复现——它的秩已经比任何一个源都高, 落在原来那些源张不成的方向上了。
五、动手 Demo:融合:1 比 1 的范数是单个的 1.41 倍,不是 2 倍
造三个 64 × 64、秩都是 4 的增量矩阵当三个 LoRA,先算它们两两的余弦相似度; 再按不同权重把它们加起来,看合起来的范数、和两个源的余弦、以及对一组输入造成的相对偏离。
for i in range(3):
A = rg.normal(0, 1, (d, r)) / np.sqrt(r)
B = rg.normal(0, 1, (r, d)) / np.sqrt(r)
L.append(A @ B * (alpha / r)) # 秩 4 的 ΔW
mix = w[0] * L[0] + w[1] * L[1] # 按权重相加
dev = np.linalg.norm(mix @ x) / np.linalg.norm(base)
实跑输出:
--------------------------------------------------------------------
融合模型:两个 LoRA 按权重加起来会发生什么
--------------------------------------------------------------------
权重矩阵 64 × 64
三个 LoRA 各是秩 4 的 ΔW,alpha 取 4
单条 ΔW 的秩 最多 4
三个源之间的相似度(余弦):
组合 余弦相似度
------------------------------
第 1 个 对 第 2 个 0.0131
第 1 个 对 第 3 个 -0.0105
第 2 个 对 第 3 个 -0.0138
三个源两两余弦都接近 0,说明它们的方向几乎正交——是三种完全不同的风格。
按不同权重融合,看 ΔW 的范数、和两个源的相似度、以及对输出的影响:
融合方式 ΔW 的范数 与原第 1 个的余弦 与原第 2 个的余弦 输出偏离
-------------------------------------------------------------------------------
只用第 1 个 0.3026 1.0000 0.0131 2.55%
1 比 1 0.4278 0.7166 0.7068 4.05%
0.5 比 0.5 0.2139 0.7166 0.7068 2.03%
1 比 1 比 1 0.5114 0.5936 0.5835 5.17%
0.4 比 0.4 比 0.2 0.1796 0.6794 0.6690 1.78%
2 比 2 0.8556 0.7166 0.7068 8.11%
第一行是基准:只用第 1 个 LoRA,它的范数是 0.3026,输出偏离 2.55%。
「1 比 1」的范数是单个的 1.41 倍——因为两条 ΔW 方向正交,向量相加时范数是按平方和开根号算的,不是直接相加。
「1 比 1」和源的余弦都掉到 0.71 左右(等于 1 除以根号 2),这是纯几何结果:两条正交等长向量相加,合向量和每一条的夹角都是 45 度。
所以「1 比 1 融合」不是「两个风格各出一半」,是「一个新方向,和两边都有 45 度夹角」。这一点和很多人直觉相反。
再看「2 比 2」那一行:范数翻到单个的 **2.83** 倍,输出偏离从 2.55% 涨到 **8.11%**。权重和超过 1 时改动会被放大,画面往往会过曝或结构散掉。
所以融合权重的经验做法是:**所有权重加起来等于 1**(比如 0.4 比 0.4 比 0.2)。这样总强度可控,只是风格比例在变。
还有一个技术细节:秩会累加。两个秩 4 的 LoRA 加起来,结果最多是秩 8;三个加起来最多秩 12。所以融合多个 LoRA 之后,文件不会变小,而且效果也不再是「任何一个源能单独复现」的。
第一行是基准:只用第一个,范数 0.3026、输出偏离 2.55%。 「1 比 1」范数 0.4278,是 1.41 倍;「1 比 1 比 1」是 0.5114,约 1.69 倍(根号 3); 「2 比 2」是 0.8556,2.83 倍(根号 8)。三个数都是平方和开根号的结果,没有一个等于权重和。 余弦那两列最能说明问题:「1 比 1」「0.5 比 0.5」「2 比 2」三行的余弦完全相同(0.7166 和 0.7068)。 因为余弦只看方向,乘系数不改方向。 「1 比 1 比 1」的余弦掉到 0.59 左右,三个正交向量相加,夹角自然是更大的角度。 所以源越多,合出来的东西离每一个都越远。 这个 Demo 是在权重矩阵这一层做的,没有真的训 LoRA,也没有真的出图。 但范数、余弦、输出偏离这三件事是纯线性的,跟真模型那一层的规律一样。
30 秒实验
- 把权重改成 0.8 比 0.2,看和第一个源的余弦会不会明显回升。
- 把三个源换成同一个矩阵复制三份,看余弦变成 1.0、范数变成 3 倍。
- 想一想:为什么融合之后没法「拆回」原来的某一个模型?
常见误区
- 「融合就是取平均」——正交向量相加时范数按平方和开根号,不是算术平均。
- 「权重加起来多少无所谓」——超过 1 会放大改动,画面过曝或结构散掉。
- 「融合越多风格越丰富」——秩累加、方向偏移,源越多离每个源都越远。
自测三问(点开对答案)
1. 融合和集成在推理成本上有什么区别? —— 集成每次要跑多个模型,成本按个数翻倍;融合只跑一个,成本不变。 2. 为什么两条正交的等长向量相加,合向量和每条的余弦都是 0.707? —— 平方和后范数是根号 2 倍,除以范数正好是 1 除以根号 2,夹角 45 度。 3. 为什么融合两个秩 4 的 LoRA 之后,结果不能被任何一个源复现? —— 秩累加到最多 8,结果落在原来那些源张不成的方向上。模型合成一个了。最后一步是拿它真跑一批,看输出到底能不能用。
- ☐ (本节完,下一节 9.3.2 测试模型:应用模型生成AI画作)