🧠 第九章 模型评估和优化
📄 一句话概括

三个秩 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 秒实验

  1. 把权重改成 0.8 比 0.2,看和第一个源的余弦会不会明显回升。
  2. 把三个源换成同一个矩阵复制三份,看余弦变成 1.0、范数变成 3 倍。
  3. 想一想:为什么融合之后没法「拆回」原来的某一个模型?

常见误区

  1. 「融合就是取平均」——正交向量相加时范数按平方和开根号,不是算术平均。
  2. 「权重加起来多少无所谓」——超过 1 会放大改动,画面过曝或结构散掉。
  3. 「融合越多风格越丰富」——秩累加、方向偏移,源越多离每个源都越远。
自测三问(点开对答案) 1. 融合和集成在推理成本上有什么区别? —— 集成每次要跑多个模型,成本按个数翻倍;融合只跑一个,成本不变。 2. 为什么两条正交的等长向量相加,合向量和每条的余弦都是 0.707? —— 平方和后范数是根号 2 倍,除以范数正好是 1 除以根号 2,夹角 45 度。 3. 为什么融合两个秩 4 的 LoRA 之后,结果不能被任何一个源复现? —— 秩累加到最多 8,结果落在原来那些源张不成的方向上。

模型合成一个了。最后一步是拿它真跑一批,看输出到底能不能用。

相关笔记