论文笔记---Adversarial Learning for Robust Deep Clustering

introduction

以前的工作:K-means ------- 谱聚类 ------- 子空间聚类

  • K-means: 相似度度量对于高纬样本不准确
  • 谱聚类: 核函数很难确定
  • 子空间聚类:依赖线性子空间假设构建亲和矩阵,但数据在很多情况下并不自然地符合线性模型。

深度聚类:将embedding和聚类作为一个单一的过程来获得最优嵌入(或表示)空间的聚类。

现有的大部分深度聚类方法都是尽量减少重构损失,使目标嵌入空间更具分辨力,因为嵌入空间直接决定了聚类的质量,但是自编码器网络使用的重构耗损不能充分感知对抗性扰动。

this paper:

  • 引入一种对抗学习算法提高网络深度聚类的鲁棒性,定义对抗性样本作为深度聚类的嵌入空间。
  • 针对聚类网络提出一种强大的对抗攻击策略来探索不稳定样本,提出对应的防御算法

背景和准备

  • 输入: X = { x 1 , x 2 , . . . , x n } X =\begin{Bmatrix} x_1, x_2,...,x_n \end{Bmatrix} X={x1,x2,...,xn}, 嵌入特征: Z = { z 1 , z 2 , . . . , z n } Z =\begin{Bmatrix} z_1, z_2,...,z_n \end{Bmatrix} Z={z1,z2,...,zn}
  • z i ∈ R d z_i\in \mathbb{R}^d ziRd通过嵌入网络E学习,另一方面用于重构原始样本 x x x
  • 聚类函数 F : z → y ∈ R K F: z\rightarrow y\in \mathbb{R}^K F:zyRK, K为聚类总数, Y = { y 1 , . . . . y n } Y = \begin{Bmatrix} y_1,....y_n \end{Bmatrix} Y={y1,....yn}保留最终聚类结果。

网络结构:

x ⇋ z → y x\leftrightharpoons z\rightarrow y xzy

损失函数(通过相对熵(KL散度)最小化共同优化):在这里插入图片描述
引入生成模型:
在这里插入图片描述

  • π \pi π是权重
    聚类的损失变成:
    在这里插入图片描述
  • 第一项是重建损失。
  • 在深度聚类场景中,y可以被解释为代表数据中的一些离散簇,z代表高斯混合,编码簇间和簇内的变化。
  • Q ( y ) Q(y) Q(y)是一个固定的均匀先验。其权重由 π \pi π指定。

方法

网络架构

在这里插入图片描述

  • 红线表示对抗攻击策略
  • 蓝线表示防御策略

具体方法

1

  • 预训练网络(嵌入子网和聚类层)网络参数: θ \theta θ
  • 攻击网络生成小的扰动 δ \delta δ , z ^ = z + δ \hat{z} = z +\delta z^=z+δ ,网络参数: ϕ \phi ϕ
  • z ^ \hat{z} z^ 送入目标聚类网络得到重构样本 x ^ 和 聚 类 标 签 y ^ \hat{x}和聚类标签\hat{y} x^y^

2

对抗性攻击的目的是:使受扰特征与干净特征相似,重构样本差异较小,但使相应的聚类结构相差较大。对抗性攻击学习的损失可以定义为:
-

  • 其中,第一项是重构特征受扰动样本
  • 第二项保证学习到的扰动不会破坏聚类网络的基本功能
  • 最后一项是最大化聚类结构的差异。
  • β 和 γ \beta和\gamma βγ是权衡超参数
  • 小的扰动可以欺骗集群层,但是不会影响嵌入的性能,因为一些样本的簇结构在嵌入空间中不清晰。

3

我们最终希望由扰动特征生成的样本及其聚类结构应该与干净样本的聚类结构完全一致。

因此,将聚类结构与重构样本相结合,得到新的特征映射,并采用鉴别器(参数为 ψ \psi ψ)来识别(x,y)与z之间的互信息:
在这里插入图片描述

  • ((x,y),z)组成一个正的数据对,鉴别器给予高分
  • 随机选择(x,y),构造一个关于z的负数据对,鉴别器给予低分
  • 符号T表示鉴别器的映射函数, 用于鉴别输入的互信息, σ \sigma σ表示鉴别器的激活函数。
  • 这样使得(x,y)与z之间的相关性增强

同时,需要增加重构之后的( x ~ , y \tilde{x},y x~,y)与z的相关性。
在这里插入图片描述

  • 利用鉴别器优化 z ^ \hat{z} z^ ( x ^ , y ) (\hat{x},y) (x^,y)以及负数据对( x t ~ , y t \tilde{x_t},y_t xt~,yt). x ~ \tilde{x} x~是经过decoder重构的x
  • 同样,构建了 z 和 ( x ^ , y ^ ) z和(\hat{x}, \hat{y}) zx^,y^之间的相关性。
  • L c L_c Lc是原始深度聚类方法的目标函数,包含该方法以保证聚类网络的基本性能。 L c L_c Lc随着集群模型的更改而更改。

总之,防御算法是在原始聚类网络中整合一组基于扰动的对比约束,可以迫使嵌入的特征原理聚类的决策边界, 来消除学习到的扰动造成不同的结果,来提高聚类网络的鲁棒性和整体性能。

4.相关方法

深度聚类

image-to-Image Translation with Conditional Adversarial Networks(条件对抗网络的图像到图像转换)是一种用于图像转换的深度学习方法。它通过训练一个生成器网络和一个判别器网络来实现图像的转换。生成器网络将输入图像转换为目标图像,而判别器网络则试图区分生成的图像和真实的目标图像。 这种方法的关键是使用对抗性训练。生成器网络和判别器网络相互竞争,以提高生成器网络生成逼真图像的能力。生成器网络通过最小化判别器网络对生成的图像的判别误差来学习生成逼真的图像。判别器网络则通过最大化对生成的图像和真实图像的判别能力来学习区分真实图像和生成图像。 在条件对抗网络中,生成器网络和判别器网络都接收额外的条件输入,以指导图像转换的过程。这个条件输入可以是任何与图像转换任务相关的信息,例如标签、语义分割图或其他图像。 通过训练生成器网络和判别器网络,条件对抗网络可以实现各种图像转换任务,例如将黑白图像转换为彩色图像、将马的图像转换为斑马的图像等。 这是一个使用条件对抗网络进行图像到图像转换的示例代码: ```python import tensorflow as tf from tensorflow.keras import layers # 定义生成器网络 def build_generator(): # 定义生成器网络结构 generator = tf.keras.Sequential() generator.add(layers.Conv2DTranspose(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(32, (4, 4), strides=(2, 2), padding='same')) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(3, (4, 4), strides=(2, 2), padding='same', activation='tanh')) return generator # 定义判别器网络 def build_discriminator(): # 定义判别器网络结构 discriminator = tf.keras.Sequential() discriminator.add(layers.Conv2D(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(128, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(256, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(1, (4, 4), strides=(1, 1), padding='same')) return discriminator # 定义条件对抗网络 class cGAN(tf.keras.Model): def __init__(self, generator, discriminator): super(cGAN, self).__init__() self.generator = generator self.discriminator = discriminator def compile(self, g_optimizer, d_optimizer, loss_fn): super(cGAN, self).compile() self.g_optimizer = g_optimizer self.d_optimizer = d_optimizer self.loss_fn = loss_fn def train_step(self, real_images, labels): # 生成器网络生成假图像 with tf.GradientTape() as tape: fake_images = self.generator([real_images, labels], training=True) # 判别器网络判别真实图像和假图像 real_output = self.discriminator([real_images, labels], training=True) fake_output = self.discriminator([fake_images, labels], training=True) # 计算生成器和判别器的损失 g_loss = self.loss_fn(fake_output, tf.ones_like(fake_output)) d_loss_real = self.loss_fn(real_output, tf.ones_like(real_output)) d_loss_fake = self.loss_fn(fake_output, tf.zeros_like(fake_output)) d_loss = d_loss_real + d_loss_fake # 更新生成器和判别器的参数 g_gradients = tape.gradient(g_loss, self.generator.trainable_variables) d_gradients = tape.gradient(d_loss, self.discriminator.trainable_variables) self.g_optimizer.apply_gradients(zip(g_gradients, self.generator.trainable_variables)) self.d_optimizer.apply_gradients(zip(d_gradients, self.discriminator.trainable_variables)) return {"g_loss": g_loss, "d_loss": d_loss} # 创建生成器和判别器 generator = build_generator() discriminator = build_discriminator() # 创建条件对抗网络 cgan = cGAN(generator, discriminator) # 编译条件对抗网络 cgan.compile( g_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), d_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), loss_fn=tf.keras.losses.BinaryCrossentropy(from_logits=True) ) # 训练条件对抗网络 cgan.fit(dataset, epochs=100) # 使用生成器网络进行图像转换 input_image = ... label = ... output_image = generator([input_image, label]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值