Path: blob/master/site/es-419/federated/tutorials/private_heavy_hitters.ipynb
25118 views
Copyright 2022 The TensorFlow Authors.
Heavy Hitters privados
NOTA: Se ha verificado que esta colaboración funciona con la última versión publicada del paquete pip tensorflow_federated
. Es posible que esta colaboración no se actualice para funcionar con main
.
Este tutorial muestra cómo usar la API tff.analytics.heavy_hitters.iblt.build_iblt_computation
para crear un cálculo analítico federado para descubrir las cadenas más frecuentes (heavy hitters privados) en la población.
Configuración del entorno
Ejecute lo que se encuentra a continuación, para asegurarse de que el entorno esté preparado correctamente. Si no ve un mensaje de inicio, consulte la guía de instalación para acceder a las instrucciones.
Antecedentes: Heavy Hitters privados en el análisis federado
Considere la siguiente configuración: cada cliente tiene una lista de cadenas y cada cadena pertenece a un conjunto abierto, lo que significa que podría ser arbitraria. El objetivo es descubrir las cadenas más populares (Heavy Hitters) y sus recuentos de forma privada en un entorno federado. Esta colaboración demuestra una solución a este problema con las siguientes propiedades de privacidad:
Agregación segura: calcula los recuentos de las cadenas agregadas de modo que el servidor no pueda conocer el valor individual de ningún cliente. Consulte
tff.federated_secure_sum
para obtener más información.Privacidad diferencial (DP): método ampliamente utilizado para delimitar y cuantificar la fuga de privacidad de datos confidenciales que se produce durante el análisis. Puede aplicar DP central a nivel de usuario a los resultados de Heavy Hitters.
La API de agregación segura tff.federated_secure_sum
admite sumas lineales de vectores enteros. Si las cadenas son de un conjunto cerrado de tamaño n
, entonces es fácil codificar las cadenas de cada cliente en un vector de tamaño n
: sea el valor en el índice i
del vector el recuento de la i
-ésima cadena en el conjunto cerrado. Luego puede sumar de forma segura los vectores de todos los clientes para obtener el recuento de cadenas en toda la población. Sin embargo, si las cadenas pertenecen a un conjunto abierto, no resulta obvio cómo codificarlas correctamente para obtener una suma segura. En este trabajo, puede codificar las cadenas en tablas de búsqueda invertibles de Bloom (IBLT), que es una estructura de datos probabilística que tiene la capacidad de codificar elementos en un dominio grande (o abierto) de una manera eficiente. Los esquemas de IBLT se pueden sumar linealmente, por lo que son compatibles con la suma segura.
Puede usar tff.analytics.heavy_hitters.iblt.build_iblt_computation
para crear un cálculo de TFF que codifique las cadenas locales de cada cliente en una estructura de IBLT. Estas estructuras se suman de forma segura a través de un protocolo criptográfico seguro de cálculo multipartito en una estructura de IBLT agregada que el servidor puede decodificar. Luego de esto, el servidor puede devolver a los Heavy Hitters. Las siguientes secciones muestran cómo se usa esta API para crear un cálculo de TFF y ejecutar simulaciones con el conjunto de datos de Shakespeare.
Carga y procesamiento previo de los datos federados de Shakespeare
El conjunto de datos de Shakespeare contiene líneas de personajes de obras de Shakespeare. En este ejemplo, se selecciona un subconjunto de caracteres (es decir, clientes). Un preprocesador convierte las líneas de cada personaje en una lista de cadenas y se eliminan todas las cadenas que solo contengan puntuación o símbolos.
Simulaciones
Para ejecutar simulaciones con el fin de descubrir las palabras más populares (heavy hitters) en el conjunto de datos de Shakespeare, primero debemos crear un cálculo de TFF a partir de la API tff.analytics.heavy_hitters.iblt.build_iblt_computation
con los siguientes parámetros:
capacity
: la capacidad del esquema de IBLT. Este número debería ser aproximadamente el número total de cadenas únicas que podrían aparecer en una ronda de cálculo. El valor predeterminado es1000
. Si este número es demasiado pequeño, la decodificación podría fallar a causa de una colisión de valores hash. Si este número fuera demasiado grande, consumiría más memoria de la necesaria.string_max_bytes
: la longitud máxima de una cadena en la IBLT. El valor predeterminado es10
. Debe ser positivo. Las cadenas más largas questring_max_bytes
se truncarán.max_words_per_user
: el número máximo de cadenas que cada cliente puede contribuir. Si no esNone
, debe ser un número entero positivo. El valor predeterminado esNone
, lo que significa que todos los clientes contribuyen con todas sus cadenas.max_heavy_hitters
: el número máximo de elementos que se devolverán. Si los elementos decodificados superan este número, se ordenarán de forma decreciente según los recuentos estimados y se devolverán los elementos max_heavy_hitters principales. El valor predeterminado esNone
, lo que significa devolver todos los heavy hitters del resultado.secure_sum_bitwidth
: el ancho de bits que se usa para obtener una suma segura. El valor predeterminado esNone
, que deshabilita la suma segura. Si no esNone
, debe estar en el rango[1,62]
. Consultetff.federated_secure_sum
.multi_contribution
: si a cada cliente se le permita contribuir con múltiples recuentos o solo con uno para cada palabra única. El valor predeterminado esTrue
. Este argumento podría mejorar la utilidad cuando se requiere privacidad diferencial.batch_size
: el número de elementos en cada lote del conjunto de datos. El valor predeterminado es1
, lo que significa que el conjunto de datos de entrada es procesado portf.data.Dataset.batch(1)
. Debe ser un número entero positivo.
Ahora tiene todo listo para ejecutar simulaciones con el cálculo de TFF iblt_computation
y el conjunto de datos de entrada de preprocesamiento. La salida de iblt_computation
tiene cuatro atributos:
clients: un número escalar de clientes que participaron en el cálculo.
heavy_hitters: una lista de heavy hitters agregados.
heavy_hitters_counts: una lista de los recuentos de heavy hitters agregados.
num_not_decoded: un número escalar de cadenas que no se decodifican correctamente.
Heavy Hitters privados con privacidad diferencial
Para obtener Heavy Hitters privados con DP central, se aplica un mecanismo de DP para histogramas de conjunto abierto. La idea es agregar ruido a los recuentos de cadenas en el histograma agregado y luego conservar solo las cadenas con recuentos que se sitúen por encima de un umbral específico. El ruido y el umbral dependen del presupuesto (épsilon, delta)-DP; consulte este documento para obtener pruebas y algoritmos detallados. Los recuentos ruidosos se redondean a números enteros como paso de posprocesamiento, lo que no debilita la garantía de DP. Tenga en cuenta que descubrirá heavy hitters menos importantes cuando la DP sea un requisito. Esto se debe a que el paso de umbral filtra las cadenas con recuentos bajos.