文章主要通过稀疏多模机对特征进行融合。此处主要记录2.1节联合结构稀疏正则化,并作python实现。
符号说明:
********************************分割线****************************************************
题外话:铰链损失函数(hinge loss)
详情转https://blog.csdn.net/hustqb/article/details/78347713
********************************分割线****************************************************
文中的学习目标得到权重矩阵(即W),这个矩阵算出x中每个属性对于当前类别的重要性。优化目标为铰链损失函数的多分类推广并加入一个正则项(R)进行约束。
其中为一个不可训练的参数。
紧接着,论文加入了两个正则项
在解释这两个正则项前,必须弄懂L1,L2。
L1、L2参考这篇https://blog.csdn.net/aaalswaaa1/article/details/117448283。
下面分别解释两个正则项,省略惩罚系数,常数2是后续方便计算用的,无其他意义。
,可见,在模态之间使用 L1范数,它加强了不同模态之间的相似性,捕捉了模式之间的全局关系。(论文原文翻译)。使模态间的权重稀疏,选出对当前任务有用的模态的特征.
没有声明公式,但结合文中描述与其他同作者论文,得如下公式:
。即使一个模态中的大多数特征对某些视觉类别没有区别,来自同一模态的少量特征仍然具有高度的区别性。这组正则项捕捉了对多个类别都有区别度的特征。因此在对每个特征间用了L1范数,使特征间权重稀疏。
小结
通过两个损失函数,一个负责捕捉模式间的全局关系,找出对当前任务有用的模态的特征;另一个负责在所有特征中找出对当前任务有用的特征。从而自动进行特征选择。
python 实现
首先实现了一个简单版的,损失函数中加入一个L1范数,对所有特征进行选择。以下为核心代码,使用了tensorflow。
直接在输入层后面接了一个稀疏矩阵进行特征选择在进行后续操作,稀疏由损失函数中的正则项得到。
...
# 特征选择层,其中x为输入
w1 = tf.Variable(tf.random_normal(
[106], mean=0.5, stddev=0.1), dtype=tf.float32)
b1 = tf.Variable(tf.zeros([106]) + 0.1)
out1 = w1*x+b1
...
# l1RegLambda 为惩罚系数
loss = tf.reduce_mean( losses) + l1RegLambda * tensorflow.contrib.layers.l1_regularizer(config.model.l1RegLambda)(w1)
同理,后面尝试加入群1范数以及L21 范数。设前53与后53位为两种模态的特征。
loss = tf.reduce_mean(
losses) + config.model.l1RegLambda * l1_regularizer(config.model.l1RegLambda)(w1)+config.model.l21RegLambda *(tf.sqrt(l2_regularizer(2.0)(w1[:53]))+tf.sqrt(l2_regularizer(2.0)(w1[53:])))