最近在项目中用到了多个模型,需要进行融合,便写此文章记录。模型融合(fusion)一般来说会使得算法整体的效果更好,典型的融合方法有early fusion和late fusion。遇到以下这两种情况,可以进行模型融合。

  1. 已经训练了多个单特征模型,每个模型都能单独进行预测,那么可以将多个模型进行融合,使得每个模型发挥自己的作用,进而让整体精度得到提高。
  2. 已经提取了多种特征,则可以合并特征,使得不同的特征之间的隐含关系得到一定的关联,一定程度上会提高模型的效果。

以上第一种情况下,可以使用late fusion,第二种情况下,可以进行early fusion或late fusion。

Late Fusion

考虑上面的第一种情况。假设现在我有N个模型,需要预测C个类,这N个模型都是用不同特征训练出来的。这里我们使用F1值作为模型评估的标准,首先用这N个模型计算它们预测这C个类的F1值,即每一个模型输出C个F1值,总共可以得到NxC个F1值,我们将其当作矩阵。然后计算每一项在对应列中的占比,即可得到一个NxC大小的权重矩阵,这个权重矩阵可以将多个模型联系起来,形成融合的效果。

那么这个权重矩阵如何用呢?我的做法很简单,在预测的时候,使用每一个模型输出每一个类的概率,这时候可以得到一个NxC大小的矩阵,然后将这个矩阵点乘权重矩阵,再将每一列相加,即可得到一个C维的横向量,即对应每一个类别的输出的概率,这便完成了模型的融合。当然还可以选择其他的方法来计算权重矩阵,具体怎么样可能需要自己实验了,我只尝试了一种方法。

Early Fusion

这个没什么好说的,但是还是有一些细节。考虑上面第二种情况,假如已经构建了一个DNN,并且提取了多个特征,那么可以选择“多任务学习”的方式,网络可能会学到更多东西,从而效果更好,小样本的情况也不会太差。此外,还可以直接就把提取的多个特征合并成一个特征作为输入。不过还是要提醒一下,不同特征取值范围差异过大的数据最好都先做归一化。

具体应该选取哪种融合方式,还是要看实际情况的,特征之间可能具有某种联系时,可以尝试使用Early Fusion。