我正在研究一个联邦学习来检测不良客户端。
联邦学习简介-数据被划分到不同的客户端,在客户端进行训练,然后每个客户端将结果发送到中央服务器,在中央服务器上对客户端权重进行聚合,然后将聚合模型再次发送到本地客户端进行训练。
我正在检测客户端发送恶意更新到中央服务器。我使用的是这里的基本代码。
我写了一个方法筛选客户端,它将检测某些客户端是否恶意并从聚合步骤中删除该客户端。我预计,如果从全局聚合中删除一个客户端权重,不会有太大的性能差异,但结果让我感到困惑。我添加了这段代码。Noisy_client [itr] != 0只会出现在1/10个客户端中,并且在每次迭代中都会出现在同一个客户端中。
if noisy_client[itr] == 0:
scaled_local_weight_list.append(scaled_weights)
如果不使用此代码,则每次迭代的精度都在稳步增加
0.6102380952380952
0.7195238095238096
0.7723809523809524
0.8014285714285714
0.8195238095238095
0.8314285714285714
0.8397619047619047
0.8438095238095238
0.8516666666666667
0.8545238095238096
0.8573809523809524
0.8602380952380952
0.861904761904762
0.8635714285714285
0.8654761904761905
0.8671428571428571
0.8683333333333333
但是当使用代码时,精度在前几次迭代中增加,然后在每次迭代中降低
0.6883333333333334 0.7373809523809524 0.7552380952380953 0.765 0.763095238095238 0.7559523809523809 0.7497619047619047 0.7414285714285714 0.7323809523809524 0.7221428571428572 0.7154761904761905 0.705952380952381 0.6966666666666667 0.6895238095238095 0.6819047619047619 0.6730952380952381 0.6597619047619048 0.6102380952380952
我尝试将学习率从0.01降低到0.001,并减少批大小,但之后看到了相同的行为。造成这种情况的原因是什么?如何纠正这种情况?
一个常见的问题可能是您试图在no_grad()范围内进行聚合。我也遇到过一次。优化器本质上是在每个联邦回合重置一次,即使模型正在聚合。
这是一种直觉,因为我没有看到任何代码,所以我不能说更多。