关于Cleverhans中实现的ElasticNet算法的问题

Question on ElasticNet algorithm implemented in Cleverhans

我正在尝试使用 Cleverhans 中实现的 Elastic-Net 算法在 classification 任务中生成对抗样本。主要问题是我试图以一种方式使用它来在目标class(与原始目标不同)的class化时获得更高的置信度,但我无法达到很好的效果。 我试图愚弄的系统是一个 DNN,其 softmax 输出为 10 classes.

例如:

  1. 给定 class 3 的样本,我想生成一个 class 0.
  2. 的对抗样本
  3. 使用 cleverhans 的 ElasticNetMethod 中实现的默认超参数,我能够获得成功的攻击,因此分配给对抗样本的 class 变成了 class 0,但是置信度是相当低(约 30%)。为超参数尝试不同的值也会发生这种情况。
  4. 我的目的是获得相当高的置信度(至少 90%)。
  5. 对于其他算法,如“FGSM”或“MadryEtAl”,我能够达到此目的,创建一个循环,在该循环中应用算法,直到样本 class 被确定为目标 class 置信度大于 90%,但我不能将此迭代应用于 EAD 算法,因为在迭代的每一步中,它都会产生第一步生成的对抗性样本,并且在随后的迭代中它保持不变。 (我知道这可能会发生,因为该算法与提到的其他两个算法不同,但我正在努力寻找一种解决方案来达到我的目的)。

这是我实际用来生成对抗样本的代码。

ead_params  = { 'binary_search_steps':9, 'max_iterations':100 , 'learning_rate':0.001, 'clip_min':0,'clip_max':1,'y_target':target}
adv_x = image
founded_adv = False
threshold = 0.9
wrap = KerasModelWrapper(model)
ead = ElasticNetMethod(wrap, sess=sess)

while (not founded_adv):

    adv_x = ead.generate_np(adv_x, **ead_params)
    prediction = model.predict(adv_x).tolist()
    pred_class = np.argmax(prediction[0])
    confidence = prediction[0][pred_class]    

    if (pred_class == 0 and confidence >= threshold):
        founded_adv = True
        

while 循环可能会生成一个样本,直到以大于 90% 的置信度达到目标 class。此代码实际上适用于 FGSM 和 Madry,但使用 EAD 可以无限运行。

库版本:

张量流:2.2.0 凯拉斯:2.4.3 聪明人:2.0.0-451ccecad450067f99c333fc53592201

谁能帮帮我?

非常感谢。

对于任何对此问题感兴趣的人,可以通过这种方式修改以前的代码以使其正常工作:

第一个解决方案:

prediction = model.predict(image)
initial_predicted_class = np.argmax(prediction[0])
ead_params  = { 'binary_search_steps':9, 'max_iterations':100 , 'learning_rate':0.001,'confidence':1, 'clip_min':0,'clip_max':1,'y_target':target}
adv_x = image
founded_adv = False
threshold = 0.9
wrap = KerasModelWrapper(model)
ead = ElasticNetMethod(wrap, sess=sess)

while (not founded_adv):

    adv_x = ead.generate_np(adv_x, **ead_params)
    prediction = model.predict(adv_x).tolist()
    pred_class = np.argmax(prediction[0])
    confidence = prediction[0][pred_class]    

    if (pred_class == initial_pred_class and confidence >= threshold):
        founded_adv = True
    else: 
        ead_params['confidence'] += 1 

使用库中实现的置信度参数。实际上,如果目标 class 的概率没有增加,我们将置信度参数增加 1。

第二种解决方案:

prediction = model.predict(image)
initial_predicted_class = np.argmax(prediction[0]) 

ead_params   = {'beta':5e-3 , 'binary_search_steps':6, 'max_iterations':10 , 'learning_rate':3e-2, 'clip_min':0,'clip_max':1}
threshold = 0.96
adv_x = image
founded_adv = False
wrap = KerasModelWrapper(model)
ead = ElasticNetMethod(wrap, sess=sess)

while (not founded_adv):

    eps_hyp = 0.5
    new_adv_x = ead.generate_np(adv_x, **ead_params)
    pert = new_adv_x-adv_x
    new_adv_x = adv_x - eps_hyp*pert
    new_adv_x = (new_adv_x - np.min(new_adv_x)) / (np.max(new_adv_x) - np.min(new_adv_x))
    adv_x = new_adv_x
    prediction = model.predict(new_adv_x).tolist()
    pred_class = np.argmax(prediction[0])
    confidence = prediction[0][pred_class]
    print(pred_class)
    print(confidence)


    if (pred_class == initial_predicted_class and confidence >= threshold): 
        founded_adv = True

方案二对原代码进行如下修改:

-Initial_predicted_class 是模型在良性样本上预测的 class(我们的示例为“0”)。

-在算法的参数中(ead_params)我们不插入目标class.

-然后我们可以得到算法计算pert = new_adv_x - adv_x给出的扰动 其中“adv_x”是原图(在for的第一步循环),new_adv_x为算法生成的扰动样本。

-前面的操作很有用,因为EAD原始算法计算扰动以最大化损失w.r.t class“0”,但在我们的例子中我们想最小化它。

-因此,我们可以将新的扰动图像计算为 new_adv_x = adv_x - eps_hyp*pert(其中 eps_hyp 是一个 epsilon 超参数,我'我们引入了减少扰动),然后我们将新的扰动图像归一化。

-我已经针对大量图像测试了代码,而且信心总是在增加,所以我认为这可能是一个很好的解决方案。

我认为第二种解决方案可以获得更好的扰动。