【发布时间】:2020-12-07 08:33:16
【问题描述】:
我一直在尝试实现这个 paper 。基本上我想做的是总结每个客户的损失,并与前一个时期进行比较。然后对于模型的每个组成层,比较服务器和客户端模型的权重之间的 KL 散度,以获取特定于层的参数更新,然后进行 softmax 并决定是否需要自适应更新或正常的 FedAvg 方法。
算法如下- FedMed
我尝试使用代码here 来构建一个自定义的联合平均流程。我基本了解其中涉及一些 tf.computations 和一些 tff.computations。我知道我需要在 run_one_round 函数中更改编排逻辑,并基本上操纵客户端输出以进行自适应平均,而不是普通的联合平均。 client_update tf.computation 函数基本上返回我需要的所有值,即 weights_delta(可用于基于客户端的模型权重)、model_output(可用于计算损失)。
但我不确定我应该在哪里进行更改。
@tff.federated_computation(federated_server_state_type,
federated_dataset_type)
def run_one_round(server_state, federated_dataset):
server_message = tff.federated_map(server_message_fn, server_state)
server_message_at_client = tff.federated_broadcast(server_message)
client_outputs = tff.federated_map(
client_update_fn, (federated_dataset, server_message_at_client))
weight_denom = client_outputs.client_weight
# todo
# instead of using tff.federated_mean I wish to do a adaptive aggregation based on the client_outputs.weights_delta and server_state model
round_model_delta = tff.federated_mean(
client_outputs.weights_delta, weight=weight_denom)
#client_outputs.weights_delta has all the client model weights.
#client_outputs.client_weight has the number of examples per client.
#client_outputs.model_output has the output of the model per client example.
我想通过 server_state 对象来使用服务器模型权重。
我想计算每层服务器模型的权重和每个客户端模型的权重之间的 KL 散度。然后使用相对权重来聚合客户端权重,而不是普通的联合平均。
而不是使用 tff.federated_mean 我希望使用不同的策略,基本上是基于上述算法的自适应策略。
所以我需要一些关于如何实施的建议。
基本上我想做的是:
1)总结客户损失的所有价值。
2)计算所有客户端与服务器的每层KL散度,然后确定是使用自适应优化还是FedAvg。
还有一种方法可以将此值作为 python 值进行操作,这将有助于调试目的(我尝试使用 tf.print 但这也没有帮助)。谢谢!
【问题讨论】:
-
您介意在您的问题中添加代码 sn-ps 吗?这将有助于获得更好的答案,因为它将减少对尝试的内容和目标的任何潜在混淆。
-
@ZacharyGarrett 我已经进行了更改并添加了部分代码并添加了我希望进行更改的 cmets。
标签: tensorflow tensorflow-federated