huanranchen / DiffusionClassifier

Official code implement of Robust Classification via a Single Diffusion Model
44 stars 4 forks source link

代码参数 #2

Closed Lyan-ing closed 3 months ago

Lyan-ing commented 5 months ago

在运行RDCN+TK.py代码时,看到Likelihood maximization更新x时使用的似乎是L2_clamp,与paper中的似乎不同,参数设置也不太一样。不知您是否方便在readme中给出比较详细的解释,谢谢

huanranchen commented 5 months ago

这里是因为后来Likelihood Maximization进行了升级,效果更好了,时间复杂度也更低,因此与paper中不一样(这点我会在后续的blog or paper中说明)。

另外L2_clamp其实没啥用,因为iter_step=5的情况下,L2距离本身就很近,这个clamp的范围就完全到不了。

MisterPANDC commented 4 months ago

你好,我也想请教一下这个问题 defenses/PurificationDefenses/DiffPure/LikelihoodMaximization/EDMLM.pylikelihood_maximization_T1这个函数的改进之处主要是在于用了Adam optimizer吗?


同时,以下代码相当于每张image只每次只对一个time_step来进行Likelihood Maximization的计算,这样降低时间复杂度对效果有什么影响呢?

            epsilon = torch.randn_like(ori_x)
            noised = x + t.view(-1, 1, 1, 1) * epsilon
            denoised = self.dc.unet(noised, t)
huanranchen commented 4 months ago

你好,我也想请教一下这个问题 defenses/PurificationDefenses/DiffPure/LikelihoodMaximization/EDMLM.pylikelihood_maximization_T1这个函数的改进之处主要是在于用了Adam optimizer吗?

同时,以下代码相当于每张image只每次只对一个time_step来进行Likelihood Maximization的计算,这样降低时间复杂度对效果有什么影响呢?

            epsilon = torch.randn_like(ori_x)
            noised = x + t.view(-1, 1, 1, 1) * epsilon
            denoised = self.dc.unet(noised, t)

@MisterPANDC 非常抱歉刚刚看到您的消息。非常建议您如果不是开新的issue,而是在别人的issue下提新的问题的话,最好@我,否则我是没有邮件提醒的,就很容易看不到。

我们的likelihood maximization有2个版本。一个是2023年5月arxiv版本。当时每次算loss是算T个timestep的全部loss。优化器使用的是MI-FGSM。这样做的时间复杂度是O(NT),因为每次算loss需要O(T),总共优化N次。

在ICLR版本中,我们修改了likelihood maximization。现在每次算loss是算1个timestep,因此时间复杂度是O(N),速度非常快, 远远快于diffpure。

另外这样做似乎也有鲁棒性的提升,这一点在ICLR版本的第21页有解释: image image