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 的指针以获取研究文档。