n A.shape[0] # 用 1 扩充维度 A torch.cat([A, torch.ones(n, 1)], dim 1) B torch.cat([B, torch.ones(n, 1)], dim 1) C torch.cat([C, torch.ones(n, 1)], dim 1) # 计算笛卡尔积 A A.unsqueeze(2) # [n, A, 1] B B.unsqueeze(1) # [n, 1, B] fusion_AB torch.einsum( nxt, nty- nxy , A, B) # [n, A, B] fusion_AB fusion_AB.flatten(start_dim 1).unsqueeze(1) # [n, AxB, 1] C C.unsqueeze(1) # [n, 1, C] fusion_ABC torch.einsum( ntx, nty- nxy , fusion_AB, C) # [n, AxB, C] fusion_ABC fusion_ABC.flatten(start_dim 1) # [n, AxBxC] # A, B, C分别代表原来的特征维度nA,nB,nC加上1
需要注意的是 实际编程实现时并未直接计算得到3-D的笛卡尔积 而是分别两两计算outer product。
LWF融合策略上面提到的TFN对计算了两/三模态间的相关性 也保留了单模态的相关性 但同时也大大地增加了特征维度。增加特征维度从而会影响计算效率以及增加内存消耗 并且TFN所增加的时间/空间复杂度都与输入模态数呈指数增加。并且参数量一多 就容易增加过拟合的风险。
LMF是发表于ACL2017年的工作 针对TFN的上述问题 作者采用了low-rank weight进行多模态融合 降低参数量的同时还提升了计算速度。
TFN中的融合后的特征Z维度为d1xd2xd3x....dm 其中m表示模态数 i模态特征维度为di。后续要将其送入推理模块中 通常需要降到h维的特征F 此时需要一个维度为(d1xd2xd3x....dm)xh的(M 1阶)权重W进行全连接操作。
全连接操作中 W可以视为dh个M阶矩阵 每个矩阵与融合特征Z计算后的结果为F中的一维。
LMF要做的是就是将W分解成M组与各模态相关的low-rank因子。按照上述的视角 将W视为dh个矩阵 每个特征矩阵Wk如下所示 其中使得分解成立的最小R称为秩(Rank)。
在LMF中 人为设定固定的秩r 得到每个Wk矩阵了 对特征矩阵进行重新排列 使其变为与模态m相关的特征Wm。
为了更好地理解排列过程 我画了一张图 展示了3个模态时 秩为r 期望维度为h的情况
那么对特征变换(Z→d维特征)的过程可以拆分为如下过程
但Z本身也是由不同模态的外积得到的 那么组合起来可得到下式。
其中



