Path: blob/master/site/pt-br/federated/tutorials/private_heavy_hitters.ipynb
25118 views
Copyright 2022 The TensorFlow Authors.
Heavy hitters privados
OBSERVAÇÃO: foi verificado que este Colab funciona com a versão mais recente lançada do pacote pip tensorflow_federated
. Talvez não seja possível atualizar este Colab para funcionar no main
.
Este tutorial mostra como usar a API tff.analytics.heavy_hitters.iblt.build_iblt_computation
para construir uma computação analítica federada para descobrir as strings mais frequentes (heavy hitters privados) na população.
Configuração do ambiente
Execute o código abaixo para que o ambiente seja configurado corretamente. Se não for exibida uma saudação, consulte as instruções de instalação.
Histórico – Heavy hitters privados em análise federada
Considere o seguinte cenário: cada cliente tem uma lista de strings, e cada string é de um conjunto aberto, ou seja, pode ser arbitrário. O objetivo é descobrir as strings mais populares (heavy hitters) e suas contagens de forma privada em um ambiente federado. Este Colab demonstra uma solução para esse problema com as seguintes propriedades de privacidade:
Agregação segura – Computa as contagens agregadas de strings de tal forma que não deve ser possível para o servidor aprender um valor individual de qualquer cliente. Confira mais informações em
tff.federated_secure_sum
.Privacidade diferencial (DP, na sigla em inglês) – Método amplamente usado para limitação e quantificação do vazamento de dados confidenciais em análises. Você pode aplicar a privacidade diferencial central em nível de usuário aos resultados de heavy hitter.
A API de agregação segura tff.federated_secure_sum
tem suporte a somas lineares de vetores de inteiros. Se as strings forem de um conjunto fechado de tamanho n
, então é fácil codificar as strings de cada cliente em um vetor de tamanho n
– seja o valor no índice i
do vetor a contagem da i
ésima string no conjunto fechado; então, é possível somar de forma segura os vetores de todos os clientes para obter as contagens de strings de toda a população. Entretanto, se as strings forem de um conjunto aberto, não é óbvio como codificá-los adequadamente para fazer a soma segura. Neste trabalho, você pode codificar as strings em Invertible Bloom Lookup Tables (IBLT), que são uma estrutura de dados probabilística que tem a capacidade de codificar itens em um domínio grande (ou aberto) de maneira eficiente. Os sketches de IBLT podem ser somados linearmente, então são compatíveis com a soma segura.
Você pode usar tff.analytics.heavy_hitters.iblt.build_iblt_computation
para criar uma computação do TFF que codifique as strings locais de cada cliente em uma estrutura de IBLT. Essas estruturas são somadas de forma segura por meio de um protocolo de computação seguro criptográfico multiparte em uma estrutura de IBLT agregada que o servidor pode decodificar. O servidor pode então retornar os principais heavy hitters. As próximas seções mostram como usar essa API para criar uma computação do TFF e executar simulações com o dataset Shakespeare.
Carregue e pré-processe os dados de Shakespeare federados
O dataset Shakespeare contém falas de personagens das peças de Shakespeare. Neste exemplo, um subconjunto de personagens (isto é, clientes) são selecionados. Um pré-processador converte as falas de cada personagem em uma lista de strings, e qualquer string que é apenas um sinal de pontuação ou símbolos é descartada.
Simulações
Para executar simulações a fim de descobrir as palavras mais populares (heavy hitters) no dataset Shakespeare, primeiro você precisa criar uma computação do TFF usando a API tff.analytics.heavy_hitters.iblt.build_iblt_computation
com os seguintes parâmetros:
capacity
: capacidade do sketch de IBLT. Este número deve ser aproximadamente o número total de strings únicas que podem aparecer em uma rodada de computação. O padrão é1000
. Se esse número for pequeno demais, poderá haver falha na codificação devido à colisão de valores em hash. Se for grande demais, o consumo de memória poderá ser maior do que o necessário.string_max_bytes
: tamanho máximo de uma string na IBLT. O padrão é10
. Precisa ser positivo. Strings maiores do questring_max_bytes
serão truncadas.max_words_per_user
: número máximo de strings que cada cliente pode fornecer. Se não for igual aNone
, deve ser um inteiro positivo. O padrão éNone
, ou seja, todos os clientes fornecem todas as suas strings.max_heavy_hitters
: número máximo de itens a retornar. Se os resultados decodificados tiverem mais do que esse número de itens, a lista será ordenada de forma decrescente pelas contagens estimadas, e serão retornados os primeiros max_heavy_hitters itens. O padrão éNone
, ou seja, todos os heavy hitters são retornados no resultado.secure_sum_bitwidth
: comprimento de bits usado para a soma segura. O valor padrão éNone
, que desativa a soma segura. Se não forNone
, precisa estar no intervalo[1,62]
. Confiratff.federated_secure_sum
.multi_contribution
: define se cada cliente pode fornecer diversas contagens ou somente uma para cada palavra única. O padrão éTrue
. Esse argumento pode melhorar a utilidade quando for necessário ter privacidade diferencial.batch_size
: número de elementos em cada lote do dataset. O padrão é1
, ou seja, o dataset de entrada é processado portf.data.Dataset.batch(1)
. Deve ser um inteiro positivo.
Agora está tudo pronto para executar simulações com computação do TFF iblt_computation
e o dataset de entrada pré-processado. A saída iblt_computation
tem quatro atributos:
clients: número escalar de clientes que participaram da computação.
heavy_hitters: lista de heavy hitters agregados.
heavy_hitters_counts: lista das contagens de heavy hitters agregados.
num_not_decoded: número escalar de strings que não são decodificadas com êxito.
Heavy hitters privados com privacidade diferencial
Para obter heavy hitters privados com privacidade diferencial central, um mecanismo de privacidade diferencial é aplicado nos histogramas de datasets abertos. A ideia é adicionar ruído às contagens de strings no histograma agregado e apenas manter as strings com contagens acima de um determinado limiar. O ruído e o limiar dependem do budget (epsilon, delta)-DP (confira os detalhes do algoritmo e da prova neste documento). As contagens de ruído são arredondadas para inteiros como uma etapa de pré-processamento, o que não enfraquece a garantia de privacidade diferencial. Você descobrirá menos heavy hitters quando for necessário ter privacidade diferencial, pois a etapa de limiar filtra strings com baixas contagens.