如何在使用 Tensorflow Federated 进行差分隐私训练期间更改剪裁和噪声参数

How to change clipping and noise parameters during differentially private training with Tensorflow Federated

我正在使用 Tensorflow Federated (TFF) 进行差分隐私训练。目前我正在创建 Tensorflow Privacy NormalizedQuery,然后将其传递到 TFF DifferentiallyPrivateFactory 以创建 AggregationProcess:

_weights_type = tff.learning.framework.weights_type_from_model(placeholder_model)
query = tensorflow_privacy.GaussianSumQuery(l2_norm_clip=10.0, stddev=0.1)
query = tensorflow_privacy.NormalizedQuery(query, 20)
agg_proc = tff.aggregators.DifferentiallyPrivateFactory(query)
agg_proc = agg_proc.create(_weights_type.trainable)

在向客户端广播服务器状态后,我 运行 一个客户端更新函数,然后像这样使用 AggregationProcess:

agg_output = agg_proc.next(
    server_state.delta_aggregate_state,
    client_outputs.weights_delta)

效果很好,但是我想在训练期间尝试多次更改 l2_norm_clip 和 stddev(在不同的训练轮次中使剪辑变大或变小),但似乎我只能在我设置这些参数时设置这些参数创建聚合过程。

是否可以在训练期间以某种方式更改这些参数?

我可以想出两种方法来做你想做的事:简单的方法和正确的方法。

正确的方法是制作一种新型的 DPQuery,在其全局状态下跟踪训练回合,并在其 get_noised_result 函数中按照您想要的方式调整剪辑和标准开发。然后你可以将这个新的 DPQuery 传递给 tff.aggregators.DifferentiallyPrivateFactory 并像平常一样使用它。

最简单的方法是直接入侵 server_state.delta_aggregate_state。在那里的某个地方,您应该找到 DPQuery 的全局状态,它应该包含 l2_norm_clipstddev,您可以在轮次之间直接操作它们。这种方法可能很脆弱,因为聚合器状态和 DPQuery 状态表示可能会发生变化。