大家好,我是亦束,本期来讲模型融合的功能,在讲具体操作之前呢,我们需要先学习几个概念。
Checkpoint 是在计算过程中保存当前状态的一种技术。现在大部分的模型都是从预训练的稳定扩散模型开始微调的,微调生成了特定的风格,人物等,在这里它保留了模型的权重(weights)。
你也可以用游戏中的存档点来理解它,玩到某一部分进行存档。
在神经网络中,"权重"(weights)指的是模型中的可学习参数,权重用于计算每个神经元的输出,每个神经元接收一组输入,将其与对应的权重相乘,并加上偏差(bias)得到一个加权和,即:∑(weight∗input)+bias。
bias 是偏置单元,在神经网络中,偏置也是对神经元激活状态的控制,它允许将激活函数向左或向右移位。
我们可以用线性方程 y = Wx + b中的 b 来理解偏置值( bias ),不管权重( w )怎么变,该方程都受制于原点,当方程加入截距 ( b ) 后,函数便能向左或向右偏移,详解链接。
当然,使用这个功能不需要用到以上概念,这只是为了让大家更好的理解以及区分下面的同名概念而补充的说明。如果想看详细说明可以再上面的蓝色标记文字跳转到对应的介绍。
在模型融合里插值算法的"权重"(weights)指的是插值中用于调整模型 A和模型 B对最终结果的偏向程度的系数。
在神经网络中的权重和融合插值算法中的权重都叫一个名字,其中加权和的计算公式也相似,不要混淆了。
Checkpoint Merger ,就是将两个模型计算融合得到一个新模型,虽然可以选择三个,但计算方式不同,这个放到下面算法再讲。
这里是选择模型,选择多少根据算法决定,三个模型分别标记为 A B C ,当然这个标记只是为了方便你代入计算公式。
自定义命名,顾名思义就是融合成新模型的名字。
乘法器,根据数值大小决定新生成的模型更偏向哪一边。
插值算法,No interpolation 不使用插值,用于转换模型格式和 VAE 的烘焙。
第二个加权和,在前面我已经提到过关于权重的概念,在这里的计算公式为 A * (1 - M ) + B * M ,数值越大越偏向 B ,数值越小则偏向 A 。
我们拿一个真人的模型(majicmixRealistic)和一个卡通的模型(toonyou)来测试一下,在一级和二级分别选上这两个模型,然后随便命个名,乘法器开到 0.5 ,融合。然后用相同的参数来看看三个模型分别生成出来的效果。
第三个计算公式A + (B - C ) * M ,这个公式可以理解为,将 B 相较于 C 的变化应用到 A 上,获得一个综合考虑了差异的结果,权重系数 M ,可以控制 B 与 C 的差异在最终结果上影响的程度。
基于之前的模型和参数,在三级模型上再选一个水墨风的模型(jasghPhrasmInky_jasghphrasmV11),融合,我们再对比一下效果。
在上面的几个差值算法公式中,模型 A 、 B 、 C 都是直接相加减的,这也意味着这三个模型需要具有相同的结构和相同的神经网络权重数量,否则模型的差异越大,效果也越差。不过,大部分的模型都是从预训练的稳定扩散模型开始微调的,如 SDv1.4、SDv1.5 等,所以大部分权重都是相同或相似的。
保存新模型的格式,ckpt 和 safetensors的文件都是用来保存模型的权重和参数的,safetensors相较于 ckpt 加载速度更快也更安全。
ckpt 文件是用 pickle 序列化的,pickle 具有潜在的安全漏洞,因为它可以执行反序列化时的任意代码。这使得 pickle 在处理不受信任的数据时可能容易受到恶意代码的攻击。
而 safetensors 文件是用 NumPy 保存的,NumPy 对数据类型进行严格的控制,并且没有执行反序列化时的代码,从而减少了潜在的安全风险。
Safetensors 只是相较于 cpkt 更安全,但在处理不受信任的模型,仍然需要谨慎。
Save as float16,保存成 float16 精度,不勾选则是 float32 精度。Float32 数据量大,保存的信息量多,自然模型效果也更好,但占用内存多。
Copy config from ,从原始模型复制配置文件到新模型里。因为在之前 SD v1.x 版本都默认用的 v1 的配置文件,现在新出了 SD v2.x 版本,需要不同的配置文件,这个功能可以直接从原始模型拷贝配置文件,避免你手动创建了。
第一个选项是指复制自身(A,B or C),后面两个选项意思是从 A也就是一级模型中复制配置到目标模型中,也意味着,B 与 C必须与 A 具有相同的神经网络权重,否则合并可能无法工作,这个在之前也提到过。不过大部分都是基于 v1.x 版本训练的模型,合并时就不用管它了。
Bake in VAE,如果你想把 VAE 模型也融合进去,在这里选择对应的模型即可,选择 None ,生成的模型则没有 VAE 效果,使用时依旧需要外挂 VAE 。
为了控制变量,我们使用一个模型来烘焙 VAE ,选择一个一级模型,不使用插值算法,选择 VAE ,融合。然后我们用两个模型同样的参数生成的图像对比一下。
修剪匹配名的权重,通过名字来修剪 NonEMA 权重。NonEMA = 训练权重,EMA = 推断(使用模型进行预测)权重,因为在这个过程中只关注推断权重,几乎不会发生恢复训练,所以一般都不用去管它。
我们快速过一遍流程,如果你只是想给一个模型换格式或者融合一个 VAE ,我们只需要在一级模型中选择对应模型,然后插值算法选择不使用插值算法,选择对应格式,最后融合。
你想合并两个,就在一二级模型中选择对应的模型,算法使用加权和,通过调整乘法器来控制新生成的模型更偏向哪一个,然后选择生成的格式,是否融入特定的 VAE ,最后融合。
如果你想合并三个,则算法选择添加不同,乘法器用来调整B 与 C差异在最终结果上影响程度的权重(指融合中的权重),其它的跟前面一样,最后融合。
[BGM]:Roa - Winter 【Official】