Cómo manipular gradientes de cliente en tensorflow federated sgd

Oct 17 2020

Estoy siguiendo este tutorial para comenzar con tensorflow federated. Mi objetivo es ejecutar sgd federado (no avg federado) con algunas manipulaciones en los valores de gradiente del cliente antes de enviarlos al servidor.

Antes de seguir adelante, para reiterar brevemente el proceso sgd federado, para cada turno los clientes enviarán sus gradientes calculados (no pesos actualizados) al servidor, el servidor los agrega y difunde el modelo actualizado a los clientes.

Ahora, de lo que he recopilado hasta ahora, puedo usar la función en build_federated_sgd_processlugar del build_federated_averaging_processtutorial mencionado para realizar un sgd federado de la manera descrita anteriormente.

Donde estoy perdido es, necesito recortar los gradientes del cliente y agregarles algo de ruido (generado independientemente para cada valor de gradiente) antes de enviar los gradientes al servidor y no estoy seguro de cómo hacerlo. Generar el ruido es bastante sencillo, pero ¿qué función debo modificar / implementar para poder aplicar el ruido a los gradientes?

Respuestas

1 KeithRush Oct 19 2020 at 01:22

build_federated_sgd_processestá completamente enlatado; realmente está diseñado para servir como una implementación de referencia, no como un punto de extensibilidad.

Creo que lo que busca es la función que build_federated_sgd_processlas llamadas bajo las hoos, tff.learning.framework.build_model_delta_optimizer_process. Esta función le permite proporcionar su propio mapeo desde una función de modelo (IE, un invocable de cero argumentos que devuelve a tff.learning.Model) a a tff.learning.framework.ClientDeltaFn.

Tu ClientDeltaFnse vería algo como:

@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)

Y podría construir un tff.templates.IterativeProcessllamando a:

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, ...)

como más o menos en el cuerpo de build_federated_sgd_process.

Me parece que le interesa la privacidad diferencial; En realidad, TFF está diseñado para componer con privacidad diferencial generalmente a través de los procesos de agregación en lugar de escribir diferentes actualizaciones del cliente, aunque este es ciertamente un enfoque. Consulte los indicadores de TFF para obtener documentación de investigación sobre formas idiomáticas de conectar la privacidad diferencial a TFF.