一、对于梯度的修改
接着上篇的思路,只有在local_learning中对梯度进行修改才算是真正意义上的worker遭受到攻击。于是有下面的代码:
def local_learning(model, mu: float, optimizer, train_data, n_SGD: int, loss_f, k):
model_0 = deepcopy(model)
for _ in range(n_SGD):
features, labels = next(iter(train_data))
features_ = features.to(DEVICE) # 1013
labels_ = labels.to(DEVICE) # 1013
optimizer.zero_grad()
predictions = model(features_)
batch_loss = loss_f(predictions, labels_)
batch_loss += mu / 2 * difference_models_norm_2(model, model_0)
batch_loss.backward()
# 1122 改变4个worker的梯度
AT = 1 # 设置攻击者类型
if AT == 0:
attack_type = backward
elif AT == 1:
attack_type = random_attack
elif AT == 2:
attack_type = same_value_attack
else:
raise Exception("No such type of attack!")
# 1124
attacker_count = 0
ATTACK_WORKER = 4 # 设置攻击者数量
if attacker_count < ATTACK_WORKER:
for param in model.parameters():
param.grad = attack_type(param.grad)
attacker_count += 1
optimizer.step()
实验结果:

很明显,对于worker的攻击产生效果了。不过这个攻击worker占比40%还是太高了。接下来需要对比一下,10%,20%,30%的情况看看。
???还有一个疑问点有待解决,在backward和same_value_attack时,会报错:The condensed distance matrix must contain only finite values。至于为什么会出现NaN可能与聚类的ward方法有关。
不过在StackOverflow上有相关的解答,明天试试看。ValueError: The condensed distance matrix must contain only finite values. in python - Stack Overflow
https://stackoverflow.com/questions/68039205/valueerror-the-condensed-distance-matrix-must-contain-only-finite-values-in-py
二、 对于样本量的修改
之前修改样本量是直接在算法里面改的,虽然效果一样,但这个也是不合理的。因为这里给的是weights数组来表示各个worker的数据量占比大小的,因此只需要调整weights数组即可,然后也实现了对于篡改worker的数据量也能影响到算法稳定性。实验结果如下:

这里也是修改了四个worker的数据量,让他们的数据量占比提高10倍,其实真实数据量还是相同的。
至此,符合预期的结果都出来了。接下来进一步的想法就是改变聚类方法或者相似性方法了。

本文探讨了如何通过修改梯度和调整样本量来应对基于模型相似性的Clustered Sampling攻击,重点关注了不同攻击者比例和数据量调整对算法稳定性的影响。作者还遇到并解决了计算过程中出现的数值问题。
1932

被折叠的 条评论
为什么被折叠?



