【论文笔记】Multimodal Learning with Incomplete Modalities by Knowledge Distillation

861 阅读6分钟

Multimodal Learning with Incomplete Modalities by Knowledge Distillation

论文链接

简介

模态的定义为从不同的领域采集或从不同的特征提取器中提取的异构特征集合。由于异构数据的迅猛增长,多模态学习近些年获得巨大的关注。

模态特征集描述了相同的主体并提供了主体的共享和补充信息。多模态学习通过整合不同模态的预测信息来提高学习模型的性能。不同的模态是从不同的域或特征提取器中提取出来的,因此模态彼此间的表示可能会有很大的差距。

这篇文章提出了一个新的多模态学习框架,用来整合多模态中的补充信息,这个方法基于知识蒸馏(Knowledge Distillation),可以使用包括不完整模态样本在内的所有样本。该方法的主要步骤如下:

  • 首先对每个模态及其所有可用数据分别训练模型。
  • 然后将训练出的这些模型当做教师来训练一个学生模型,这个学生模型就是多模态学习模型,它融合了来自多种模态的补充信息。

学生模型的训练中使用来自教师模型标注的软标签和实数独热标签(one-hot label)。这个方法的特点是即不舍弃不完整模态样本也不填充它们,而是使用这些样本训练教师模型并保证教师模型为专家。

研究方法

知识蒸馏简介

知识蒸馏用于将教师的“dark knowledge”传授给学生,为了实现知识传授,首先需要基于数据集训练教师。将训练出的教师模型定义为Te(ϕ)Te(\phi),其中ϕ\phi是教师模型的参数。然后基于训练数据集训练学生模型,其训练目的在于可以模仿教师的输出。

给定数据集 D={{X1,y1},{X2,y2},...,{XN,yN}}D=\{\{X_1,y_1\},\{X_2,y_2\},...,\{X_N,y_N\}\},用于训练学生,教师首先应用于这些数据并标记这些数据和logits。假设总共有CC个类型,可以得到标注集:zi=Te(Xi;ϕ)z_i=Te(X_i;\phi),此处ziRC×1z_i \in \mathbb{R}^{C \times 1}为被教师模型对样本XiX_i标记的logits。学生模型通过实数独热标签{y1,y2,...,yN}\{y_1,y_2,...,y_N\}和logits{z1,z2,...,zN}\{z_1,z_2,...,z_N\}进行训练。

假设学生模型为一个带参数θ\theta深度神经网络f(θ)f(\theta),其输入为XiX_i输出为一个C×1C \times 1 logit向量。然后,给logit向量添加一个softmax函数来输出XiX_i被分类为CC类的概率。

PS:logits在深度学习中指神经网络的一层输出结果,该输出一般会再接一个softmax layer输出normalize后的概率,用于多分类,来自链接

训练学生网络的损失函数为:

image.png

其中lcl_c为分类损失:

image.png

此处的HH为负交叉熵损失(negative cross-entropy loss),且σ(x):RCRC\sigma(x):\mathbb{R}^C \rightarrow \mathbb{R}^C为softmax函数:

image.png

ld(Xi,zi;θ)l_d(X_i,z_i;\theta)为蒸馏损失,蒸馏损失的例子有负交叉熵损失和KL-divergence,这篇文章使用KL-divergence作为蒸馏损失:

image.png

此处的σ(x;T)\sigma(x;T)为带温度系数TT的softmax函数(具体参考:深度学习中的temperature parameter是什么):

image.png

通过 TT,输出概率被重新调整并平滑,TT值越大概率值越平滑。σT(zi;T)\sigma_T(z_i;T)称为软标签,它通过教师模型基于样本XiX_i标注,软标标签相比独热标签会包含更多的信息。

带缺失模态的多模态学习

首先用两个模态举例说明,然后拓展至多模态。

给定两个带标签的模态{X1Rn1×d1,X2Rn2×d2}\{X^1 \in \mathbb{R}^{n_1 \times d_1},X^2 \in \mathbb{R}^{n_2 \times d_2}\}

  • 假定拥有完整模态的样本为:{X1cRnc×d1,X2cRnc×d2,ycRnc}\{X^{1c} \in \mathbb{R}^{n_c \times d_1},X^{2c} \in \mathbb{R}^{n_c \times d_2},y^c\in \mathbb{R}^{nc}\}
  • 假定仅拥有第一个模态的样本为:{X1uRn1u×d1,y1uRn1u}\{X^{1u} \in \mathbb{R}^{n_{1u} \times d_1},y^{1u}\in \mathbb{R}^{n_{1u}}\}
  • 假定仅拥有第二个模态的样本为:{X2uRn2u×d2,y2uRn2u}\{X^{2u} \in \mathbb{R}^{n_{2u} \times d_2},y^{2u}\in \mathbb{R}^{n_{2u}}\}

此时,n1=nc+n1un_1=n_c+n_{1u}n2=nc+n2un_2=n_c+n_{2u}

如图1(a)所示,蓝色虚线框中的样本是具有完整模态的,而黄色虚线框中的样本只有一种模态。

image.png

为了利用所有的样本,首先使用包括缺失模态样本的所有可用数据来训练出两个单模态模型,这两个模型在本文设计的框架中为教师模型。假设两个教师为两个神经网络g1(ϕ1)g_1(\phi_1)g2(ϕ2)g_2(\phi_2),其中ϕ1,ϕ2\phi_1, \phi_2为输入的参数。g1(ϕ1)g_1(\phi_1)的将[X1c,X1u][X^{1c},X^{1u}]中的样本作为输入,输出为logits,同理g2(ϕ2)g_2(\phi_2)。教师通过最小化下面的损失函数进行训练:

image.png

之后使用两个教师来标注{X1cX2c}\{X^{1c}和X^{2c}\}中的样本,样本ithi-th的logits为:

image.png 此处的zijz^j_i为教师jj对样本ithi-th标记的logit。

为了聚合不同模态的补充信息,通过多模态深度学习网络(multimodal DNN, M-DNN)训练出一个学生模型。两个模态的M-DNN包括两个分支,每个分支将一个模态作为输入,后面接着几个非线性全连接层。所有分支的输出被链接起来合成一个联合表示。然后这个联合表示和一个线性层连接并输出logit zz

定义学生网络为f(θ)f(\theta),其中θ\theta为参数,其损失函数为:

image.png

其中,ld1,ld2l_{d1}, l_{d2}为蒸馏损失,α,β\alpha, \beta为控制学生模型从教师模型学习知识多少的两个可调参数,如果参数值很大,则表示学生模型需要更多的知识。 image.png

图2给出了整个框架的总览,这篇文章提出方法的伪码如算法1所示。

image.png

image.png

将两个模态的方法推广到多模态

给定mm个模态,X1Rn1×d1X^1 \in \mathbb{R}^{n_1 \times d_1}X2Rn2×d2X^2 \in \mathbb{R}^{n_2 \times d_2},...,XmRnm×dmX^m \in \mathbb{R}^{n_m \times d_m}。这个数据集可以被分成nn个部分:

  • 带全模态的样本:XicRnc×di,i={1,2,...,m}X^{ic} \in \mathbb{R}^{n_c \times d_i}, i = \{1,2,...,m\}
  • 带单模态的样本:XiuRnui×di,i={1,2,...,m}X^{iu} \in \mathbb{R}^{n_{ui} \times d_i}, i = \{1,2,...,m\}
  • 带两个模态的样本:Xku{ij}Rnu{ij}×dk,X^{ku\{ij\}} \in \mathbb{R}^{n_{u}\{ij\} \times d_k}, i,j = {1,2,...,n},k={i,j}, k = \{i,j\}Xku{ij}X^{ku\{ij\}}为包括第i个模态和第j个模态的样本的子集中的第k个模态。
  • 带n-1个模态的样本:Xku{Mi}Rn{Mi}×dk,i={1,2,...,m}X^{ku_{\{M \setminus i\}}} \in \mathbb{R}^{n_{\{M \setminus i\}} \times d_k}, i = \{1,2,...,m\}

使用{M}\{M\}表示所有mm个模态的索引集,{M}={1,2,...,m}\{M\}=\{1,2,...,m\},则{Mi}\{M \setminus i\}表示没有索引ii的集合,kk{Mi}\{M \setminus i\}中的一个索引。Xku{Mi}X^{ku_{\{M \setminus i\}}}为包含{Mi}\{M \setminus i\}模态的样本构成的子集中的第kk个模态。

通过分层的方式训练教师模型们:

  1. 对每个模态分别训练教师模型,获得Tei,i={1,2,...,m}Te_i, i=\{1,2,...,m\}
  2. 用这些教师模型来教授带两个模态的教师模型,得到教师模型Teij,i,j={1,2,...,m}Te_{ij}, i,j=\{1,2,...,m\}
  3. 使用所有的TeijTe_{ij}来教授带三个模态的教师模型……以此类推,最后通过分层的方法得到所有的教师。

定义带hh个模态训练的教师为h-level教师。{Ch}\{C_h\}表示从集合MM采样的hh个索引的所有组合组成的集合。{Ch}\{C_h\}的规模为(mh)\tbinom{m}{h}。H-level教师模型根据{Ch}\{C_h\}中的元素索引的模态式进行训练。将h-level教师中的第t个教师模型定义为 TeCht(ϕht)Te_{C_{ht}}(\phi_{ht})ϕht\phi_{ht}为网络参数,ChtC_{ht}为集合{Ch}\{C_h\}的第t个元素。TeCht(ϕht)Te_{C_{ht}}(\phi_{ht})通过最小化下面的损失函数训练:

image.png

其中Ch1|C_{h-1}|为集合Ch1C_{h-1}的大小,NChtN_{C_{ht}}为以ChtC_{ht}为索引的模态的样本的大小。在得到所有教师后,通过它们可以训练处最后的学生模型。

一个隐含的问题在于在模态量很大时,可能需要大量的教师模型,对于mm个模态,教师模型的数量最大为2m12^m-1。因此训练所有教师模型需要很大的算力成本。未来解决这个问题,这篇文章提出通过修剪教师模型来提升框架的可伸缩性,只选取那些拥有高性能的教师们来训练第二级教师,并以同样的方式训练剩下几级的教师。