FederatedAI / Practicing-Federated-Learning

Apache License 2.0
795 stars 245 forks source link

关于第15章差分隐私下联邦学习的代码 #13

Open Niujie-hot opened 1 year ago

Niujie-hot commented 1 year ago

第15章中差分隐私下联邦学习的代码,在联邦学习进行模型聚合后,添加噪声会导致模型预测值均为Nan,导致loss为Nan,acc为10,请问这是为什么呀

xiaoqu1 commented 1 year ago

请问有答案了吗

xiaoqu1 commented 1 year ago

试了试,多跑几轮就好了。 image

Niujie-hot commented 1 year ago

答案

我自己写了一个resnet18网络,然后简化了一下网络,就没有出现过这种情况了

Niujie-hot commented 1 year ago

试了试,多跑几轮就好了。 image

好的,谢谢

ZL-BUAA commented 1 year ago

您好,请问简化的网络有么,超参数调多少会好呀

Niujie-hot commented 1 year ago

您好,请问简化的网络有么,超参数调多少会好呀

就是要resnet18原来的参数,只是减少了一部分层数

ZL-BUAA commented 1 year ago

请问您具体减少的是那些层呢?

ZL-BUAA commented 1 year ago

您好,代码里差分隐私用的是高斯机制,按照你代码里设置的超参数,对应的\epsilon应该是多少呢

TyrQueen commented 1 year ago

您好,请问在客户端侧计算裁剪系数norm_scale时,他的分母是0这个错误该怎么通过调整系数来修正。 File "DP-FedAvg/client.py", line 62, in local_train norm_scale = min(1, self.conf['C'] / (model_norm)) ZeroDivisionError: float division by zero

我看了一下问题出在model.py文件

def model_norm(model_1, model_2):
    squared_sum = 0
    for name, layer in model_1.named_parameters():
        # print(torch.mean(layer.data), torch.mean(model_2.state_dict()[name].data))
        squared_sum += torch.sum(torch.pow(layer.data - model_2.state_dict()[name].data, 2))
    # print(squared_sum)
    return math.sqrt(squared_sum)

这里的两个模型参数是完全相同的,所以得到的squared_sum也是0。

所以想问这个地方应该如何修改呢?