如何在 tensorflow federated sgd 中操作客户端梯度

How to manipulate client gradients in tensorflow federated sgd

我正在关注 this tutorial 开始使用 tensorflow federated。我的目标是 运行 联合 sgd(不是联合 avg),在将客户端梯度值发送到服务器之前对其进行一些操作。

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

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

我迷路的地方是,在将渐变发送到服务器之前,我需要裁剪客户端渐变并向它们添加一些噪声(为每个渐变值独立生成),但我不确定该怎么做.生成噪声非常简单,但是我应该 modify/implement 哪个函数能够将噪声应用于梯度?

build_federated_sgd_process 是 fully-canned;它实际上是作为一个参考实现而设计的,而不是作为一个可扩展点。

我相信您正在寻找的是 build_federated_sgd_process 在 hoos 下调用的函数,tff.learning.framework.build_model_delta_optimizer_process. This function allows you to supply your own mapping from a model function (IE, a zero-arg callable that returns a tff.learning.Model) to 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 for research documentation 中的指针,了解将差分隐私连接到 TFF 的惯用方法。