如何在 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 的惯用方法。
我正在关注 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 的惯用方法。