【干货】虚拟对抗训练简介

虚拟对抗训练是一种有效的正则化技术,在监督学习,半监督学习和无监督聚类方面取得了良好的效果。

虚拟对抗训练已用于:

  1. 提高监督学习绩效
  2. 半监督学习
  3. 深度无监督聚类

有几种正则化技术可以防止过度拟合,并有助于模型更好地概括出看不见的例子。正则化有助于模型参数更少地依赖于训练数据。两种最常用的正则化技术是Dropout和L1 / L2正则化。

在L1 / L2正则化中,我们添加一个损失项,试图减小权重矩阵的L1范数或L2范数。较小的权重值将导致更简单的模型,这些模型不易过度拟合。

在Dropout中,我们在训练时随机忽略一些神经元。这使得网络对噪声和输入变化更加鲁棒。

在所提到的两种技术中,都没有考虑输入数据分布。

局部分布平滑

局部分布平滑度(LDS)可以定义为模型输出分布相对于输入的平滑度。我们不希望模型对输入中的小扰动敏感。我们可以说,对于模型输入的微小变化,模型输出不应该有大的变化。

在LDS正则化中,模型分布的平滑性得到奖励。它也是网络上参数的不变量,仅取决于模型输出。具有平滑的模型分布应该有助于模型更好地推广,因为模型将为看不见的数据点提供类似的输出,这些数据点接近训练集中的数据点。一些研究表明,使模型对小的随机扰动具有鲁棒性对于正则化是有效的。

LDS正则化的一种简单方法是通过在实际数据点上应用小的随机扰动来生成人工数据点。之后,鼓励模型为真实和扰动的数据点提供类似的输出。领域知识也可用于产生更好的扰动。例如,如果输入是图像,则可以使用各种图像增强技术,例如翻转,旋转,变换颜色。

输入数据转换的示例

虚拟对抗训练

虚拟对抗训练是一种有效的局部分配平滑性技术。采用成对的数据点,这些数据点在输入空间中非常接近,但在模型输出空间中非常接近。然后训练模型以使它们的输出彼此接近。为此,采用给定的输入并且发现扰动,模型给出非常不同的输出。然后,模型因扰动而对灵敏度进行处罚。

虚拟对抗训练的关键步骤是:

  1. 从输入数据点x开始
  2. 通过添加小的扰动r来变换x,因此变换的数据点将是T(x)= x + r
  3. 扰动r应该在对侧方向 - 扰动输入T(x)的模型输出应该与非扰动输入的输出不同。特别是,两个输出分布之间的KL差异应该是最大的,同时确保r的L2范数很小。从所有的扰动r,让r v-adv成为对抗方向的扰动。

  1. 在找到对抗扰动和变换输入之后,更新模型的权重,使得KL散度最小化。这将使模型对不同的扰动具有鲁棒性。通过梯度下降最小化以下损失:

在虚拟对抗训练期间,模型对于不同的输入扰动变得更加鲁棒。随着模型变得更加稳健,产生扰动变得更加困难并且观察到损失的下降。

可以将此方法视为与生成性对抗网络类似。但是有几个不同之处:

  1. 不是让发生器欺骗鉴别器,而是在输入中添加一个小扰动,以欺骗模型,认为它们是两个截然不同的输入。
  2. 不是区分伪造和真实,而是使用模型输出之间的KL分歧。在训练模型时(类似于训练鉴别器),我们最小化KL分歧。

虚拟对抗训练可以被认为是一种有效的数据增强技术,我们不需要先前的领域知识。这可以应用于所有类型的输入分布,因此对于真正的“无监督学习”是有用的。

虚拟对抗训练与对抗训练有何不同?

在对抗训练中,标签也用于产生对抗性扰动。产生扰动使得分类器的预测标签y'变得与实际标签y不同。

在虚拟对抗训练中,不使用标签信息,仅使用模型输出生成扰动。产生扰动使得扰动输入的输出不同于原始输入的模型输出(与地面实况标签相反)。

实施虚拟对抗训练

现在我们将使用Tensorflow和Keras实现基本的虚拟对抗训练。完整的代码可以在这里找到

首先,在Keras中定义神经网络

network = Sequential()

network.add( Dense(100 ,activation='relu' , input_shape=(2,)))

network.add( Dense( 2 ))

定义model_input中,logits p_logit通过将输入到网络和概率得分p通过在logits施加SOFTMAX活化。

model_input = Input((2,))

p_logit = network( model_input )

p = Activation('softmax')( p_logit )

为了产生对抗性扰动,从随机扰动开始r并使其成为单位范数。

r = tf.random_normal(shape=tf.shape( model_input ))

r = make_unit_norm( r )

扰动输入的输出logits将是 p_logit_r

p_logit_r = network( model_input + 10*r )

现在计算来自输入和扰动输入的log的KL偏差。

kl = tf.reduce_mean(compute_kld( p_logit , p_logit_r ))

为了获得对抗性扰动,我们需要r使KL-发散最大化。因此,采取kl相对于的梯度 r。对抗性扰动将是梯度。我们使用该stop_gradient函数是因为我们希望r_vadv在反向传播时保持固定。

grad_kl = tf.gradients( kl , [r ])[0]

最后,规范化范数对抗性扰动。我们将范数设定r_vadv为一个较小的值,即我们想要沿着对抗方向前进的距离。

r_vadv = make_unit_norm( r_vadv )/3.0

现在我们有对抗扰动r_vadv,模型给出了非常大的输出差异。我们需要在模型中添加一个损失,这会损害模型,使其具有与原始输入和扰动输入的输出相比具有较大KL偏差的模型。

p_logit_r_adv = network( model_input + r_vadv )

vat_loss = tf.reduce_mean(compute_kld( tf.stop_gradient(p_logit), p_logit_r_adv ))

最后,构建模型并附加vat_loss。

model_vat = Model(model_input , p )

model_vat.add_loss( vat_loss )

model_vat.compile( 'sgd' , 'categorical_crossentropy' , metrics=['accuracy'])

现在让我们使用一些合成数据来训练和测试模型。该数据集是二维的,有两个类。1类数据点位于外环中,2类数据点位于内环中。我们每班仅使用8个数据点进行培训,并使用1000个数据点进行测试。

合成数据集在2D平面上的图

让我们通过调用fit函数来训练模型。

model.fit( X_train , Y_train_cat )

可视化模型输出

现在,让我们可视化模型的输出空间以及训练和测试数据。

模拟决策边界与虚拟对抗训练

对于这个示例数据集,非常明显的是,具有虚拟对抗训练的模型已经更好地推广并且其决策边界也在于测试数据的边界。

没有虚拟对抗训练的模型决策边界

对于没有虚拟对抗训练的模型,我们看到训练数据点有些过度拟合。在这种情况下,决策边界不好并且与其他类重叠。

虚拟对抗训练的应用

虚拟对抗训练已经在半监督学习和无监督学习中的各种应用中显示出令人难以置信的结果。

半监督学习的增值税:虚拟对抗性训练在半监督学习中表现出良好的效果。在这里,我们有大量未标记的数据点和一些标记的数据点。应用vat_loss未标记的集合和标记集合上的监督损失可以提高测试精度。作者表明该方法优于其他几种半监督学习方法。您可以在此处阅读更多内容。

虚拟对抗梯形网络:梯形网络已经显示出半监督分类的有希望的结果。在那里,在每个输入层,添加随机噪声并且训练解码器以对每层的输出进行去同化。在虚拟对抗梯形网络中,不使用随机噪声,而是使用对抗性噪声。您可以在此处阅读更多内容。

使用自增强训练的无监督聚类:这里的目标是在不使用任何标记样本的情况下将数据点聚类在固定数量的聚类中。 规范化信息最大化是一种用于无监督聚类的技术。这里输入和模型输出之间的相互信息被最大化。IMSAT通过添加虚拟对抗训练扩展了该方法。随着互信息的丢失,作者应用了vat_loss。在添加虚拟对抗训练后,它们显示出很大的改进。您可以在论文和我之前的博客文章中阅读更多内容。

结论

在这篇文章中,我们讨论了一种称为虚拟对抗训练的有效正则化技术。我们还使用Tensorflow和Keras进行实施。我们观察到,当训练样本很少时,含增值税的模型表现更好。我们还讨论了使用虚拟对抗训练的各种其他作品。如果您有任何疑问或想要建议任何更改,请随时与我联系或在下面写评论。

相关源码关注微信公众号:“图像算法”或者微信搜索账号imalg_cn 获取

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值