Capítulo 12 — Laboratório contido I
Mapa da aula
Aula 12 publicada. Mapa, exemplo, EX045.
flowchart TD
N0["12.1 Regras do laboratório"]
N1["12.2 Inferência de pertencimento"]
N2["12.3 Extração de modelos"]
N3["12.4 Relação com a configuração"]
N4["12.5 Registro de laboratório"]
N5["12.5b Compartilhando os resultados"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
N6 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX045"]
Desenho lógico
flowchart LR
N0["12.1 Regras do laboratório"]
N1["12.2 Inferência de pertencimento"]
N2["12.3 Extração de modelos"]
N3["12.4 Relação com a configuração"]
N4["12.5 Registro de laboratório"]
N5["12.5b Compartilhando os resultados"]
N6["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX045"]
[12.1 Regras do laboratório]
|
v
[12.2 Inferência de pertencimento]
|
v
[12.3 Extração de modelos]
|
v
[12.4 Relação com a configuração]
|
v
[12.5 Registro de laboratório]
|
v
[12.5b Compartilhando os resultados]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX045]
Objetivos de aprendizagem
Você vai (1) conduzir laboratórios contidos com segurança; (2) observar evasão, inferência de pertencimento e extração em modelos de brinquedo; (3) relacionar cada uma delas à configuração do serviço; (4) escrever um registro de laboratório.
12.1 Regras do laboratório
Rode os laboratórios apenas na sua própria máquina ou no ambiente do curso, offline, com dados sintéticos. São modelos de brinquedo para tornar as ideias mensuráveis, não ferramentas para sistemas reais. Neste curso, isso significa que os arquivos de laboratório rodam com python3 e a biblioteca padrão na máquina do curso, sem chamadas de rede e sem dados reais de clientes. O laboratório de extração consulta uma função de pontuação definida no próprio arquivo, não o SpamShield. Aplicar essas técnicas à API de parceiros da Kestrel ou a qualquer serviço real exigiria uma autorização por escrito separada, e o curso não a fornece. Os resultados descrevem modelos de brinquedo construídos para tornar um mecanismo mensurável.
12.2 Inferência de pertencimento
"""Lab M: membership inference against an overfit 1-nearest-neighbour 'model'
that returns a confidence score. Synthetic records only; teaching model."""
import random, math
rng = random.Random(5)
def rec():
y = rng.random() < 0.5
return [rng.gauss(0.6 if y else -0.6, 1.0) for _ in range(4)], int(y)
members = [rec() for _ in range(150)]; nonmembers = [rec() for _ in range(150)]
def confidence(x, y, k):
# k-NN vote share for the true label, computed over the training set
d = sorted((sum((a-b)**2 for a, b in zip(x, m)), my) for m, my in members)
return sum(1 for _, my in d[:k] if my == y)/k
def auc(pos, neg):
s = sum((p > n) + 0.5*(p == n) for p in pos for n in neg)
return s/(len(pos)*len(neg))
for k in (1, 5, 25):
pos = [confidence(x, y, k) for x, y in members]
neg = [confidence(x, y, k) for x, y in nonmembers]
best = max(sum(p >= t for p in pos)/len(pos) - sum(n >= t for n in neg)/len(neg)
for t in sorted(set(pos + neg)))
print(f"k={k:2d} attack_auc={auc(pos, neg):.3f} best_advantage={best:.3f}")
Saída esperada:
k= 1 attack_auc=0.600 best_advantage=0.200
k= 5 attack_auc=0.521 best_advantage=0.073
k=25 attack_auc=0.520 best_advantage=0.060
A inferência de pertencimento pergunta se um registro estava nos dados de treinamento (Shokri et al., arXiv:1610.05820). No laboratório, a vantagem do ataque é de 0,20 quando a pontuação vem do registro de treinamento mais próximo (k = 1) e cai para cerca de 0,06 quando ela tira a média de 25 vizinhos. Relevância para o serviço: limitar o detalhe da saída (rótulos em vez de pontuações exatas) e manter os dados de treinamento no mínimo necessário. Os valores de k mostram o mecanismo. Com k = 1, a pontuação depende de um único registro de treinamento, então o próprio registro de um membro sempre vota em seu rótulo e o atacante ganha uma vantagem de 0,20 sobre o chute. Tirar a média de 5 ou 25 vizinhos borra esse sinal para 0,073 e 0,060. Pontuações exatas dão ao atacante mais material para trabalhar, e é por isso que a recomendação para o SpamShield, mais abaixo, devolve categorias.
12.3 Extração de modelos
"""Lab X: model extraction of a toy linear scoring API by querying it.
The 'API' returns a real-valued score; d+1 well-chosen queries recover the
weights exactly, and rounding the output limits fidelity. Synthetic model."""
import random
rng = random.Random(9)
d = 5
secret_w = [round(rng.uniform(-2, 2), 3) for _ in range(d)]; secret_b = 0.42
def api(x, decimals=None):
s = sum(a*b for a, b in zip(secret_w, x)) + secret_b
return round(s, decimals) if decimals is not None else s
for dec in (None, 2, 0):
b = api([0]*d, dec)
w = [api([1 if j == i else 0 for j in range(d)], dec) - b for i in range(d)]
err = max(abs(a-c) for a, c in zip(w, secret_w))
test = [[rng.uniform(-1, 1) for _ in range(d)] for _ in range(500)]
agree = sum((sum(a*c for a, c in zip(w, x))+b > 0) == (api(x) > 0) for x in test)/500
print(f"output_rounding={str(dec):4s} queries={d+1} max_weight_error={err:.3f} label_agreement={agree:.3f}")
Saída esperada:
output_rounding=None queries=6 max_weight_error=0.000 label_agreement=1.000
output_rounding=2 queries=6 max_weight_error=0.004 label_agreement=0.998
output_rounding=0 queries=6 max_weight_error=0.534 label_agreement=0.882
Com pontuações exatas, seis consultas recuperam exatamente o modelo de brinquedo; arredondar para duas casas decimais mantém o erro pequeno (0,004); arredondar para números inteiros o eleva para 0,534. Relevância para o serviço: devolver saídas grosseiras, limitar a taxa e monitorar as APIs de pontuação (Tramèr et al., arXiv:1609.02943). As linhas de arredondamento são a lição útil. Com pontuações exatas, as seis consultas recuperam todos os pesos com erro zero, e o modelo copiado concorda com o original em todas as 500 entradas de teste. Arredondar para duas casas decimais quase não muda nada: erro de 0,004, concordância de 0,998. Só arredondar para números inteiros remove informação suficiente para levar o erro a 0,534 e a concordância a 0,882. Um arredondamento leve, portanto, não é uma defesa; devolver apenas uma categoria, como Ana recomendou para o SpamShield, remove muito mais.
12.4 Relação com a configuração
Cada laboratório sugere configurações: granularidade da saída, limites de taxa, monitoramento dos padrões de consulta e controle de acesso aos endpoints de pontuação. Para a API de parceiros do SpamShield, os laboratórios se traduzem em quatro configurações. Devolver "spam / não é spam / revisão" em vez de probabilidades, o que remove tanto o sinal de pertencimento quanto a maior parte do que a extração exige. Definir limites de taxa por parceiro, para que recuperar um modelo leve muito mais que seis consultas. Alertar sobre parceiros cujo volume de consultas seja um valor muito discrepante, como no laboratório do escore z robusto. Exigir uma chave por parceiro, para que um parceiro que se comporte mal possa ser limitado sem afetar os demais.
12.5 Registro de laboratório
Registre: nome do laboratório, o que foi variado, resultados, o que ele mostra, o que ele não mostra e a configuração que ele sugere. O registro de Ana para o laboratório de extração: nome, Lab X; variado, arredondamento da saída (nenhum, duas casas decimais, números inteiros); resultados, erro de 0,000, 0,004 e 0,534, com concordância de 1,000, 0,998 e 0,882; mostra, pontuações exatas permitem copiar um modelo linear com d + 1 consultas; não mostra, quantas consultas um modelo real não linear como o SpamShield exigiria; sugere, saída só com categorias, limites por parceiro e alertas de volume. O campo "não mostra" é o que mais costuma ficar em branco, e é ele que impede que um resultado de brinquedo seja citado como um fato sobre o SpamShield.
12.5b Compartilhando os resultados
Compartilhe os registros de laboratório com a equipe numa nota curta: uma tabela, três frases sobre o significado e os limites e a configuração recomendada. Peça a um colega que rode o laboratório de novo para conferir se as saídas coincidem. Laboratórios cujos resultados não podem ser reproduzidos não devem motivar mudanças de configuração. A nota de Ana sobre a extração foi executada de novo por um colega em outro notebook, e as três linhas de saída coincidiram exatamente, que é o que a semente aleatória fixa de cada laboratório garante. Quando duas execuções discordam, as causas habituais são uma versão diferente do Python ou uma linha editada, e vale a pena encontrar as duas antes que alguém mude uma configuração.
12.6 Exemplo resolvido (caso sintético da Kestrel)
O SpamShield expõe uma API interna que devolve probabilidades exatas de spam para os aplicativos parceiros. Depois do laboratório de extração, Ana recomenda devolver apenas "spam / não é spam / revisão", acrescentar limites de taxa por parceiro e alertar sobre parceiros cujo volume de consultas esteja muito acima do normal. O laboratório de extração motivou a primeira mudança, e o de pertencimento, a segunda: as probabilidades exatas são o que alimenta os dois ataques. Os limites de taxa usam a mesma abordagem de balde de fichas do gateway do HelpBot, definidos por chave de parceiro, para que o pico de um parceiro não afete os outros. Ana não afirmou que o SpamShield podia ser copiado com seis consultas; afirmou apenas que pontuações exatas facilitam a cópia e que os parceiros não precisam delas.
12.7 Erros e limites
Dois erros são comuns: rodar os laboratórios contra serviços reais; e ler números de brinquedo como taxas do mundo real. Rodar o padrão de consultas do Lab X contra a API de parceiros do SpamShield seria um teste não autorizado de um serviço em produção, qualquer que fosse a intenção. Ler números de brinquedo como taxas reais é o erro mais sutil: a vantagem de 0,20 do laboratório vem de um modelo de 1 vizinho mais próximo sobre 150 registros sintéticos e não diz nada sobre quanto o SpamShield vaza. Os laboratórios justificam a direção de uma configuração, saídas mais grosseiras e limites mais estritos, não uma afirmação sobre o risco no mundo real. Por isso a nota de recomendação de Ana dizia "pontuações exatas facilitam a cópia", e nunca "o SpamShield pode ser copiado".
Exercícios
- EX045 — Inferência de pertencimento. Explique o que significa "vantagem de 0,20". Rubrica: 3 = o atacante supera o chute em 20 pontos; 2 = parcial; 1 = vago; 0 = errado.
- EX046 — Extração. Por que arredondar para números inteiros aumenta tanto o erro? Rubrica: 3 = menos informação por consulta; 2 = parcial; 1 = vago; 0 = errado.
- EX047 — Configuração. Dê três configurações da API do SpamShield sugeridas pelos laboratórios. Rubrica: 3 = saída grosseira, limite de taxa, monitoramento; 2 = duas; 1 = uma; 0 = nenhuma.
- EX048 — Registro de laboratório. Escreva um registro de laboratório para o laboratório de extração. Rubrica: 3 = os seis campos; 2 = quatro; 1 = dois; 0 = nenhum.
Síntese
Os laboratórios contidos tornam visíveis os ataques de privacidade e de extração e apontam diretamente para configurações de saída, de taxa e de monitoramento.
Continue estudando — capítulo 12 de 18
← Capítulo 11 (rascunho) · Índice de capítulos do curso · Capítulo 13 (rascunho) →