#finetune后的模型参数,还可以继续怎么玩?

通过对不同下游任务的task vectors进行简单的计算,组合得到的新参数(构成一个线性子空间),可以扩展出更多的使用场景。

看到了一篇很有意思的paper,文章对预训练和finetune之后的模型参数之差(task vector = 两个weight按位相减)做了分析,发现了一些奇妙的用法:通过对不同下游任务的task vectors进行简单的计算,组合得到的新参数(构成一个线性子空间),可以扩展出更多的使用场景,如:功能抑制(遗忘),多任务学习,迁移学习。

Editing Models with Task Arithmetic:https://arxiv.org/abs/2212.04089

以下, 我们记task vector 为

我们可以构造一系列新的参数

1. 反向即遗忘

也就是

显然,这可以让模型的效果变差,有多差呢?

作者用CLIP分别在八个下游任务上finetune,然后反向,并观察在ImageNet上zero-shot效果的变化。

同时,还对比了另外两种做法,一是把梯度下降改成梯度上升,也就是loss最大化,另一种是改变 τ\tau\tau 的方向,每一层随机一个方向(长度不变)。

结果非常amazing啊,取反后在目标任务上的平均效果有了明显的下降,但在ImageNet上只相对下降了不到5%,也就是实现了部分的遗忘(精准控制)。

上面是一个负面的用例,那这种方法有什么好的使用场景呢?文中也给了一个在text generation中降低文本恶意的例子,就好比先让模型学会骂人,再跟它说,刚才学的都是不对的。

2. 相加即多任务

把多个任务的task vector求加权和(,文中只做了简单相加)之后,可以得到能用于更多场景的组合vector。当然,和直接多任务最优化的效果还是有差异的(接近8个点),但好处是方便。

这些任务本身相关性不高。

而当任务之间有一定的相关性时,可能会够起到1+1>2的效果。

可以算是以finetune为抓手,沉淀多套模型,以参数赋能打出的组合拳。

3. Task Analogy

最有意思的部分来了。众所周知,以word2vec为代表的(静态)词向量当年能够大火的原因之一是word analogy,也就是那个著名的例子:king - man + woman = queen。同理,如果两个任务有一定的共性,那么,是否可以通过构造特色特色来实现任务的迁移呢?

文中给了两个例子

1.

其中yelp和amazon是两个域,sent指的是情感分类任务,lm是在各自语料上finetune的语言模型。

2.

其中lion indoors(室内的狮子)的样本很少甚至没有,但是可以通过组合outdoor lion和indoor dog得到。

4. 分析

文中没有给出理论上的分析,这里仅做一些猜测。

文中使用的预训练模型基本都是transformer-based,可以粗略地理解为模式匹配+kv记忆。finetune强化了下游任务的模式敏感度(QK相似度提升),补充/加强了任务相关的特有记忆(FFN的近似查找敏感度提升)。这一部分增量是有一定的可加性的(激活函数会salient)。所以可以认为,task vector相当于特定任务神经元连接的加强,反之,也就是减弱,甚至抑制。而对于多任务场景,任务之间只要没有明显的冲突(夹角大于90度),相加不会有明显问题。

因为,所以,新的参数可以看成是原模型和finetune之后参数的插值。finetune时learning rate的选择对task vector的效果有一定影响。如果太大,新参数可能会跳到另一个局部最优点附近,而此时,并不能保证和pretrain model之间没有barrier(也就是不一定有mode connectivity),插值的参数可能不再是最优的。

文中只考虑了来自于同一个预训练模型的task vector之间的组合,那是否可以结合weight alignment一类的方法组合来自不同上游的vector呢?

task vector的可插拔性是它最大的优点,也就是说达到了一定程度上的模块化,可以组合出不同类型的下游任务,比如:结合1,3,如果只有英文toxic data,是否可以快速组合出低恶意的中文model呢。

同样是模型参数,为什么word embedding和entity embedding不能直接相加?因为task vector不是直接的参数,只是差分。

最后,再从实用的角度来说,虽然相比于直接finetune还是有一定差距,但是作为迁移任务的初始化参数可能是一个不错的选择。