1

我正在按照本教程开始使用 tensorflow federated。我的目标是在将客户端梯度值发送到服务器之前运行联邦 sgd(不是联邦 avg),并对客户端梯度值进行一些操作。

在继续之前,简要重申联邦 sgd 过程,对于每一轮,客户端将其计算的梯度(不是更新的权重)发送到服务器,服务器聚合它们并将更新的模型广播给客户端。

现在,根据我到目前为止收集到的信息,我可以使用该函数build_federated_sgd_process而不是build_federated_averaging_process在提到的教程中以上述方式执行联合 sgd。

我迷路的地方是,在将渐变发送到服务器之前,我需要剪辑客户端渐变并向它们添加一些噪声(为每个渐变值独立生成),我不知道该怎么做。生成噪声很简单,但是我应该修改/实现哪个函数才能将噪声应用于渐变?

4

1 回答 1

1

build_federated_sgd_process完全罐装;它实际上是为了作为参考实现而设计的,而不是作为可扩展点。

我相信您正在寻找的是build_federated_sgd_process在后台调用的函数,tff.learning.framework.build_model_delta_optimizer_process. 此函数允许您提供自己的从模型函数(IE,一个返回 a 的零参数可调用函数tff.learning.Model)到 a的映射tff.learning.framework.ClientDeltaFn

ClientDeltaFn会看起来像:

@tf.function
def _clip_and_noise(grads):
  return ...

class ClippedGradClientDeltaFn(tff.learning.framework.ClientDeltaFn)

def __init__(self, model, ...):
  self._model = model
  ...

@tf.function
def __call__(dataset, weights):
  # Compute gradients grads
  return _clip_and_noise(grads)

你可以tff.templates.IterativeProcess通过调用来构造一个:

def clipped_sgd(model_fn: Callable[[], model_lib.Model]) -> ClippedGradClientDeltaFn:
    return ClippedGradClientDeltaFn(
        model_fn(),
        ...)

iterproc = optimizer_utils.build_model_delta_optimizer_process(
      model_fn, model_to_client_delta_fn=clipped_sgd, ...)

作为或多或少的身体build_federated_sgd_process

在我看来,您对差分隐私感兴趣;TFF 实际上被设计成通常通过聚合过程来组合不同的隐私,而不是编写不同的客户端更新,尽管这肯定是一种方法。有关将差分隐私连接到 TFF 的惯用方法,请参阅TFF 的指针以获取研究文档。

于 2020-10-18T18:22:33.867 回答