Path: blob/master/site/es-419/federated/tutorials/random_noise_generation.ipynb
25118 views
Copyright 2021 The TensorFlow Federated Authors.
Generación de ruido aleatorio en TFF
En este tutorial se analizan las prácticas recomendadas para la generación de ruido aleatorio en TFF. La generación de ruido aleatorio es un componente importante de muchas técnicas de protección de la privacidad en algoritmos de aprendizaje federados, por ejemplo, privacidad diferencial.
Antes de empezar
Primero, asegurémonos de que este notebook esté conectado a un servidor que tenga los componentes relevantes compilados.
Intente ejecutar el siguiente ejemplo de "Hola mundo" para asegurarse de que su entorno esté configurado correctamente. Si no funciona, consulte la guía Instalación para acceder a las instrucciones.
Ruido aleatorio en los clientes
La necesidad de ruido en los clientes generalmente se divide en dos casos: ruido idéntico y ruido i.i.d.
Para ruido idéntico, el patrón recomendado es mantener una semilla en el servidor, difundirla a los clientes y usar las funciones
tf.random.stateless
para generar ruido.Para ruido i.i.d., use un tf.random.Generator inicializado en el cliente con from_non_deterministic_state, de acuerdo con la recomendación de TF de evitar las funciones tf.random.<distribution>.
El cliente se comporta de forma diferente al servidor (no sufre los inconvenientes que se analizan más adelante) porque cada cliente creará su propio gráfico de cálculo e inicializará su propia semilla predeterminada.
Ruido idéntico en los clientes
Ruido independiente en los clientes
Inicializador del modelo en los clientes
Ruido aleatorio en el servidor
Uso desaconsejado: uso directo de tf.random.normal
TF1.x como las API tf.random.normal
para la generación de ruido aleatorio se desaconsejan en TF2 de acuerdo con el tutorial de generación de ruido aleatorio en TF. Cuando estas API se usan junto con tf.function
y tf.random.set_seed
se puede generar un comportamiento sorprendente. Por ejemplo, el siguiente código generará el mismo valor con cada llamada. Este comportamiento sorprendente es esperado en TF y la explicación se puede encontrar en la documentación de tf.random.set_seed
.
En TFF, las cosas son ligeramente diferentes. Si ajustamos la generación de ruido como tff.tf_computation
en lugar de como tf.function
, se generará ruido aleatorio no determinista. Sin embargo, si ejecutamos este fragmento de código varias veces, cada vez se generará un conjunto diferente de (n1, n2)
. No existe una manera fácil de establecer una semilla aleatoria global para TFF.
Además, se puede generar ruido determinista en TFF sin que se establezca explícitamente una semilla. La función return_two_noise
en el siguiente fragmento de código devuelve dos valores de ruido idénticos. Este es el comportamiento esperado porque TFF creará un gráfico de cálculo antes de la ejecución. Sin embargo, esto sugiere que los usuarios deben prestar atención al uso de tf.random.normal
en TFF.
Uso prudente: tf.random.Generator
Podemos usar tf.random.Generator
como se sugiere en el tutorial de TF.
Sin embargo, es posible que los usuarios deban tener cuidado con su uso.
tf.random.Generator
usatf.Variable
para mantener los estados de los algoritmos RNG. En TFF, se recomienda construir el generador dentro detff.tf_computation
; y es difícil pasar el generador y su estado entre funcionestff.tf_computation
.El fragmento de código anterior también se basa en la cuidadosa colocación de semillas en los generadores. Es posible que obtengamos resultados esperados pero sorprendentes (
n1==n2
deterministas) si en su lugar usamostf.random.Generator.from_non_deterministic_state()
.
En general, TFF prefiere las operaciones funcionales y mostraremos el uso de las funciones tf.random.stateless_*
en las siguientes secciones.
En TFF para el aprendizaje federado, a menudo trabajamos con estructuras anidadas en lugar de escalares y el fragmento de código anterior se puede extender sin problemas a estructuras anidadas.
Uso recomendado: tf.random.stateless_*
con un ayudante
En TFF se suele recomendar el uso de las funciones funcionales tf.random.stateless_*
para la generación de ruido aleatorio. Estas funciones toman seed
(un tensor con forma [2]
o una tuple
de dos tensores escalares) como argumento de entrada explícito para generar ruido aleatorio. Primero definimos una clase ayudante para mantener la semilla como pseudoestado. El ayudante RandomSeedGenerator
tiene operadores funcionales en estado dentro y fuera. Es razonable utilizar un contador como pseudoestado para tf.random.stateless_*
ya que estas funciones codifican la semilla antes de usarla para hacer que los ruidos generados por semillas correlacionadas no estén estadísticamente correlacionados.
Ahora usemos la clase ayudante y tf.random.stateless_normal
para generar (estructura anidada de) ruido aleatorio en TFF. El siguiente fragmento de código se parece mucho a un proceso iterativo de TFF; consulte simple_fedavg como ejemplo de expresión del algoritmo de aprendizaje federado como un proceso iterativo de TFF. Aquí, el pseudoestado semilla para la generación de ruido aleatorio es tf.Tensor
que se puede transportar fácilmente en funciones de TFF y de TF.