闭关2.5天,Embedding模型微调VS蒸馏(Qwen3-0.6B),谁更胜一筹,数据会告诉你答案,从原理流程、代码实现到结果分析,完全可复现

原始影片內容展開影片
  • 大家好,这是关于Inbinding模型的微调与帧流的效果对比
  • 微调和帧流的损失函数及标签构造方法的区别
  • 实际训练过程中使用的具体代码和实现细节
  • 模型收敛和优化中的关键点,以及训练结果展示

Hello, 大家好,我是九月。我们之前介绍了Inbinding模型的智帧流,也测试了和原始模型相比,它确实有一个比较明显的性能提升。不过我们之前只是单纯去衡量了帧流模型和原始模型它效果的一个变化,并没有去把微调和帧流这两种方法去做一个对比,来看一看哪种方法它的一个效果会比较好。

今天我们就来测试一下Inbinding模型的微调,并且和我们之前帧流的模型去做一个效果对比,来探索一下微调和帧流在我们这个数据级上哪一个的效果更好。对智帧流不太了解的小伙伴可以去看一下之前的那一期介绍Inbinding模型帧流的视频,这里我们就不再过多的去介绍帧流的一个原理了。

我们来看一下微调的一个流程,和帧流一样,它的一个输入也是query、正样本、负样本。和帧流不一样的地方其实主要是两个地方。

第一个地方就是标签的构造方法不一样。在帧流里面,那个标签它其实是由教师模型去产生的,而在微调里面,这个标签它是样本的一个真实标签。至于这个真实标签是怎么去构造的,它就是不同的方法可能有一些区别,这里我们是把正样本对应的锁影来作为样本的真实标签。

第二个地方就是损失函数。在帧流里面其实主要是使用KL散度来作为损失函数,但在微调里面使用交叉熵会比较多一点。然后我们在有了输入之后,把这个输入输入到模型里面,模型会去生成query、正样本、负样本它的一个inbiting,然后我们分别去计算query和正样本、负样本它的一个语权相似度,得到一系列的分数。

然后我们将分数通过softmax转换成概率分布,正样本的锁影同样也会转换成一个one-hot的一个分布。然后我们计算它们两个分布的交叉熵,通过交叉熵损失去更新模型。但这里我们也不一定非要使用正样本对应那个锁影,然后转换成one-hot的分布来作为正式标价的分布,我们也可以把教师模型的输出分数的概率分布拿过来作为一个软标签来去计算交叉熵。

它其实本质上还是在做帧流,只是使用的损失函数不一样。这两种方法我其实都有测试,等会会给大家看一下不同方法它的一个效果。下面就给大家看一下代码部分,其他地方使用的其实还是之前自制征流部分的代码,然后微调这个我是又重新写了一个训练的代码。

我们来看一下这个是计算与线相似度的,然后这个是获取最后一个token,它对应的一个向量。这里也是继承了transformers的trainer类,然后只修改计算损失的这个函数就可以了,这里我们使用的损失函数是交叉熵损失函数。

然后我们来看一下这里标签是怎么构造的。我们刚才说了是使用正样本,它对应的一个锁影来作为标签。我们的数据里面所有的正样本其实都是排在第一位的,所以它对应的锁影其实都是零,我们就把零作为一个正式标签就可以了。

然后这里我们在自制征流那期其实也说过了,它输入过来的一个数据的形状是batch_size,然后这个样本数和序列长度。这个样本数是等于query加正样本以及负样本的一个数量。但是你这个形状的数据是不能直接输入到这个模型里面的,我们需要做一步转化,把前面这两个维度合成一个维度,就是把前面这两个维度给它展平。

因为我们输入到模型里面的数据,它的一个形状是batch_size加序列长度。我们给它做完这个处理之后就可以输入到模型里面。然后我们获取最后一个token它对应的项量作为inbiting,然后这里是获取query的inbiting,镇样本和复样本的inbiting。

这里就计算query和正样本的一个相似度,除了一个温度系数。我们可以看到,这里这个温度系数我们是默认的是0.01,使用这个温度系数它的一个目的是拉开正负样本它的一个差距,来更好地让模型去收敛。

然后这里是计算相似度分数和正样本标签的一个交叉熵损失。在计算交叉熵损失的时候,这个标签它可以是锁影也可以是对应的概率分布。如果是锁影的话,会转换成one-hot的分布;如果是概率分布的话,就不需要做转化了。

这个分数我们是不需要提前给它做一个softmax的,我们在输入的交叉熵损失函数里面,它会默认做一个softmax,所以我们就不需要再提前给它做softmax处理了。

然后下面就是使用transformers的trainer类去做模型训练的一个标准流程了。还有一部分,我们刚才说了,就是不一定要用正样本对应的一个锁影来作为正样本标签,我们也可以拿教师模型它输出分数的一个概率分布来作为正样本标签,然后使用交叉熵损失去做一个优化。

那么这一部分是怎么去修改的呢?这个其实直接就在我们之前那个做自征流的那个损失函数里面去新加了一部分处理逻辑,就是我们可以通过参数来控制我们使用的损失函数是KL散度还是使用交叉熵。我们来看使用交叉熵的这种情况。

使用KL散度我们之前介绍自征流的时候已经说过了,这里我们就不再去介绍了。我们主要看使用交叉熵的这一部分。

这里我们是对这个label,这个label就表示是教师模型输出的那个相似度分数,然后我们给它处理一个温度系数。学生模型我们也给它处理一个温度系数,为什么要处理温度系数,这个等会我们会说一下。

然后这里是对教师模型做一个softmax,因为我们需要给它转换成概率分布。学生模型我们就不用像做帧流那样提前给它做一个softmax,因为这个交叉熵的函数会默认对它做softmax,其他代码跟之前还是一样的,其实修改的地方不多。

帧流和微调它们本质上其实还是有一定联系的。在某些情况下,帧流和微调是几乎是等价的。然后我们来看一下训练的一个损失图,这个图是负样本数为10的情况下做的Laura微调,再看下面这个和上面一样,只是温度系数变成了0.01,它的一个效果变化。

这里是使用4B的教师模型它输出分数的一个概率分布来作为真实标签,使用交叉熵去优化它的一个损失变化。这里就是之前我们做帧流的那个损失的一个变化。我们看一下,其实这三个它的一个波动都是比较大的,不如我们之前做帧流的那个损失的变化图,这里是非常稳定的。

然后下面我们就通过具体的一个数字指标来去看一下效果的一个好坏,因为单纯损失函数其实看不出来太多的一个东西。我们先来看一下标签为正样本的所有那种情况,这里分别测试了温度系数为0.1和0.01这两种情况下的一个效果。

我们可以看到温度系数为0.01的情况下它的一个效果是要比温度系数为0.1要更好。然后我们再看一下之前我们做帧流的那个指标,我们做帧流那个指标效果最好的是负样本数为10,温度为1,使用教师模型4B的这种情况。

我们可以看一下它的一个指标和我们使用这个Laura微调负样本数为10,温度去除为0.01的情况下差别不是太大。就是这个的效果可能比之前帧流那个效果稍微低一点点,但低的不是特别明显。

然后第二种就是我们标签为教师模型分数的一个概率分布的这种情况。其实这个本质上也是在做帧流,因为它是有教师模型参与的,但你也可以把它理解成一种软标签的一个策略。我们看一下它的一个效果,指标其实比上面这个要稍微低一点点,但也低的不是特别多。

它们两个都是使用交叉熵损失来进行优化的。如果是在one-hot的情况下,也就是我们标签为正样本锁影的这种情况下,KL散度和交叉熵是等价的。我们看上面这个公式,KL散度是等于交叉熵减去真实分布的一个log。从上面的公式可以看出,在one-hot的情况下,真实分布的log是为零的,这个时候KL散度就等于交叉熵。

这就是说在这种情况下,我们使用KL散度去优化还是使用交叉熵去优化,它其实是一样的。只是交叉熵在计算起来比KL散度更加方便一点。

如果是我们使用教师模型预测的一个分数的分布作为真实标签的情况下,也就是下面这种情况,这个时候它就不再是one-hot的,KL散度和交叉熵这个时候是不等价的。KL散度和交叉熵它们的一个优化目标是有区别的,KL散度的一个优化目标是两个分布之间的一个相似程度,而交叉熵其实主要是在优化这个对应的概率。

如果这个时候我们直接拿教师模型它的一个预测分数不做任何处理去使用交叉熵去优化,这个时候是很难收敛的,因为这个我在测试的时候试过,损失基本上是不降的。

这个时候我们就需要给它先除以一个温度系数,然后再去做softmax,也就是去拉大正负样本的一个差距。当这个差距拉得足够大的时候,它的一个分布就可以近似为one-hot的分布了。

这个时候其实下面这种情况和上面这种直接使用one-hot的分布情况,它其实是基本上是一样的。为什么说就是如果我们不做任何处理直接使用交叉熵去做优化,模型可能很难收敛?

我们看下面这个,这个是学生模型它输出的一个相似度分数,下面这个是教师模型输出的一个相似度分数。我们直接计算它们两个的交叉熵损失,这个时候是2.3917。

然后我们增大学生模型对正样本的一个相似度分数,减小对负样本的一个相似度分数,再来计算它的一个交叉熵损失,这个时候是2.3907。我们可以看到它的一个减小幅度其实是非常小的。

这个时候我们的模型其实是在往好的地方去进行优化的,因为它是在增大正样本的一个分数,在减小负样本的一个分数,但交叉熵的变化是非常细微的,可能模型很难判断自己当前是在往好的地方去进行一个优化,这就导致模型很难去收敛。

然后我们再来看下面这种情况,就是我们都给它除以一个温度系数来拉开正负样本的一个差距。这个时候我们计算出来的交叉熵是1.2547。

然后我们增大正样本的一个相似度分数,减小负样本的一个相似度分数,再来计算交叉熵损失,这个时候是1.0947。这个的变动幅度就很大,模型能很容易地学习到自己当前是在往好的地方去进行优化,这对模型的收敛是非常有利的。

然后我们来看下面,就是在我们的实际场景中,正样本和负样本它的一个相似度分数的差距。可能我们计算出来的正样本的相似度分数可能就是0.7、0.8这样子,但负样本的相似度分数可能是0.5左右,它们的一个差距不是特别大。

这样我们在做完softmax之后,我们看前面两个,基本上你看不出来正负样本它的一个明显的差距。然后我们在除完这个0.1之后,再来看这个时候做完softmax之后,正负样本的一个差距就明显拉开了。

如果这里是0.01除完之后再做softmax,这个时候正负样本的差距就会拉得更大。这时候教师模型的一个概率分布就会无限趋向于一个1,这个时候再使用交叉熵损失去做优化就会变得容易收敛一点。

因为交叉熵主要适用于做分类任务,分类任务里面其实标签的一个分布它就是一个完好的分布。

整体测试下来,在我们当前这个数据级下,帧流的效果还是要稍微好那么一点点的,但也没有说好得特别多的那种OK。今天的视频就暂时先到这里。

喜欢的小伙伴可以点个关注,也欢迎在评论区交流和讨论。这里也祝大家国庆玩的愉快,拜拜,拜拜。