在联邦学习设置中迭代后准确率下降

问题描述

我正在研究检测不良客户端的联合学习。

联邦学习简介 - 数据被分成不同的客户端,在客户端进行训练,然后每个客户端将结果发送到中央服务器,在那里完成客户端权重的聚合,然后将聚合模型再次发送到当地客户进行培训。

我正在检测客户端向中央服务器发送恶意更新。我正在使用现有的基本代码 here

我编写了一个方法过滤客户端,它会检测某个客户端是否是恶意的,并从聚合步骤中删除该客户端。我预计如果从全局聚合中删除一个客户端权重不会有太大的性能差异,但结果让我感到困惑。我添加了这段代码。 Noise_client[itr] != 0 只会出现在 1/10 的客户端上,并且会在每次迭代中出现在同一个客户端上。

name = input("What's your name? (first,last)")
fileName = name.replace(' ','.')

如果不使用此代码,则每次迭代的准确率都在稳步上升

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.01 降低到 0.001 并减小批量大小,但之后看到了相同的行为。 这可能是什么原因以及如何纠正?

解决方法

一个常见问题可能是您试图在 no_grad() 范围内进行聚合。发生在我身上一次。即使模型正在聚合,优化器本质上也会在每个联合轮次重置一次。

这是一种预感,因为我没有看到任何代码,所以我不能说更多。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...