Mapa da aula
Aula 06 publicada. Mapa, exemplo, EX033.
flowchart TD
N0["6.1 Execução do estudo principal"]
N1["6.2 Verificações de qualidade dos dados"]
N2["6.3 Análise primária"]
N3["6.4 Desfechos secundários e custos"]
N4["6.6 Atividades práticas"]
N5["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5
N5 --> EX["Exemplo resolvido"]
EX --> Q["Exercício EX033"]
Desenho lógico
flowchart LR
N0["6.1 Execução do estudo principal"]
N1["6.2 Verificações de qualidade dos dados"]
N2["6.3 Análise primária"]
N3["6.4 Desfechos secundários e custos"]
N4["6.6 Atividades práticas"]
N5["Síntese"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> Q["EX033"]
[6.1 Execução do estudo principal]
|
v
[6.2 Verificações de qualidade dos dados]
|
v
[6.3 Análise primária]
|
v
[6.4 Desfechos secundários e custos]
|
v
[6.6 Atividades práticas]
|
v
[Síntese]
|
v
[Exemplo resolvido] --> [Exercício EX033]
Objetivos de aprendizagem
Você vai (1) executar os experimentos principais exatamente como planejado e registrar os desvios; (2) verificar a qualidade dos dados antes da análise; (3) calcular os desfechos primários com incerteza (intervalos de Wilson, bootstrap, variação entre sementes); (4) analisar comparações pareadas e desfechos secundários; e (5) apresentar os resultados em tabelas e figuras que respondam à pergunta de pesquisa.
6.1 Execução do estudo principal
Congele o código num commit marcado com tag, trave os arquivos de configuração e execute as condições em ordem intercalada ou aleatorizada, para que problemas dependentes do tempo (um nó ficando lento, uma atualização de biblioteca) não coincidam com uma única condição. Cada execução grava um registro: condição, semente, hash da configuração, horários de início e fim, métricas e caminhos para as saídas brutas. Mantenha um registro de desvios, como no piloto. As execuções de Leo foram intercaladas por condição e semente, e o seu registro de desvios anotou a execução ausente da semente 4 e a sua reexecução. Confira o registro antes da análise, não depois.
6.2 Verificações de qualidade dos dados
Antes de calcular qualquer coisa, verifique: todas as execuções esperadas estão presentes? As verificações-canário passam (o modelo sem defesa precisa ser atacável; um modelo treinado com rótulos embaralhados deve ter desempenho de acaso)? Há duplicatas entre as partições? Os valores das métricas estão em faixas plausíveis? Essas verificações pegam defeitos que, de outro modo, virariam "achados". As verificações de Leo encontraram uma execução ausente da semente 4, que foi reexecutada e registrada antes da análise. Escreva as verificações como um script, para que rodem sempre da mesma forma, e guarde a saída delas junto com os resultados.
6.3 Análise primária
Calcule o desfecho primário por condição, com intervalos. Para taxas, use intervalos de Wilson; para métricas calculadas como média sobre itens, faça bootstrap sobre os itens; relate a variação entre sementes separadamente. Para comparações pareadas (os mesmos registros ou prompts em todas as condições), faça bootstrap da diferença. Siga o plano de análise; rotule qualquer análise extra como exploratória. Quando fizer várias comparações, corrija para a multiplicidade ou apresente-as como exploratórias. O laboratório abaixo demonstra as três ferramentas. Com 3 sucessos em 20, o intervalo de Wilson vai de 5% a 36%: uma amostra tão pequena não sustenta uma alegação precisa. As taxas por semente mostram a dispersão de uma semente para outra. O bootstrap pareado estima a redução proporcionada por uma defesa sobre os mesmos prompts, com um intervalo que exclui o zero.
"""Lab S: reporting attack-success rates honestly: Wilson intervals,
seed variation and a paired bootstrap. Synthetic trial outcomes only."""
import math, random
def wilson(k, n, z=1.96):
p = k/n; d = 1 + z*z/n
c = (p + z*z/(2*n))/d; h = z*math.sqrt(p*(1-p)/n + z*z/(4*n*n))/d
return c - h, c + h
for k, n in ((3, 20), (30, 200), (300, 2000)):
lo, hi = wilson(k, n); print(f"successes={k}/{n} rate={k/n:.3f} wilson95=[{lo:.3f}, {hi:.3f}]")
# five seeds of a synthetic defence evaluation: per-seed attack success rate
rates = []
for seed in range(5):
r = random.Random(seed); rates.append(sum(r.random() < 0.12 for _ in range(200))/200)
m = sum(rates)/5; sd = math.sqrt(sum((x-m)**2 for x in rates)/4)
print("per-seed rates:", " ".join(f"{x:.3f}" for x in rates), f"mean={m:.3f} sd={sd:.3f}")
# paired bootstrap: baseline vs defence on the same 300 synthetic prompts
r = random.Random(42)
base = [r.random() < 0.30 for _ in range(300)]
defn = [b and r.random() < 0.6 for b in base] # defence blocks ~40% of successes
diffs = []
for _ in range(2000):
idx = [r.randrange(300) for _ in range(300)]
diffs.append(sum(base[i] for i in idx)/300 - sum(defn[i] for i in idx)/300)
diffs.sort()
print(f"baseline_asr={sum(base)/300:.3f} defended_asr={sum(defn)/300:.3f} "
f"reduction_ci95=[{diffs[50]:.3f}, {diffs[1949]:.3f}]")
Saída esperada:
successes=3/20 rate=0.150 wilson95=[0.052, 0.360]
successes=30/200 rate=0.150 wilson95=[0.107, 0.206]
successes=300/2000 rate=0.150 wilson95=[0.135, 0.166]
per-seed rates: 0.110 0.130 0.135 0.105 0.145 mean=0.125 sd=0.017
baseline_asr=0.350 defended_asr=0.190 reduction_ci95=[0.120, 0.203]
6.4 Desfechos secundários e custos
Toda melhoria de segurança tem custos: acurácia, latência, recusas de pedidos legítimos, computação, manutenibilidade. Relate-os sobre os mesmos itens. Uma defesa de privacidade que reduz o vazamento pela metade, mas derruba o macro-F1 em 10 pontos, é uma proposta diferente de uma que custa 1 ponto. Faça o gráfico do compromisso (por exemplo, TPR com FPR de 1% versus macro-F1) para todas as condições. O resultado de Leo é do segundo tipo: a dedup aproximada reduziu a TPR com FPR de 1% a menos da metade, para 4,2%, enquanto o macro-F1 caiu menos de um ponto. Relate os dois números juntos, com intervalos, para que os leitores possam pesar o compromisso por si mesmos.
6.5 Exemplo resolvido (caso sintético da Harbourline)
Os resultados principais de Leo (sintéticos, cinco sementes, 20.000 registros): a TPR com FPR de 1% sob o ataque calibrado foi de 9,8% (original), 7,9% (remoção aleatória), 5,1% (dedup exata) e 4,2% (dedup aproximada). A diferença pareada entre a dedup aproximada e a remoção aleatória foi de 3,7 pontos (IC de 95% por bootstrap: 2,6–4,9). O macro-F1 caiu de 0,912 para 0,905 com a dedup aproximada. As verificações de qualidade dos dados encontraram uma execução ausente da semente 4, reexecutada e registrada. Uma análise exploratória, rotulada como tal, mostrou o vazamento concentrado em registros que tinham aparecido três ou mais vezes. O achado exploratório sobre registros vistos três ou mais vezes é uma hipótese para trabalhos futuros, não um resultado confirmado.
6.6 Atividades práticas
- Escreva uma lista de verificação de qualidade dos dados para o seu estudo e execute-a. 2. Produza a tabela primária com intervalos. 3. Faça o gráfico do compromisso entre segurança e utilidade. Na lista de verificação, inclua todas as execuções esperadas, verificações-canário, duplicatas entre partições e faixas plausíveis, e execute-a antes de qualquer análise. Na tabela primária, dê o desfecho de cada condição com um intervalo e o número de sementes. No gráfico, coloque a métrica de privacidade contra o macro-F1 para cada condição, para que um leitor veja o compromisso de relance, como faz a figura de Leo.
6.7 Erros e limites
Quatro erros se repetem, e cada um enviesa os resultados ou esconde custos; confira a sua análise quanto aos quatro:
- Executar todas as sementes de uma condição antes de outra; isso deixa problemas dependentes do tempo, como um nó ficando mais lento, coincidirem com essa condição.
- Analisar antes das verificações de qualidade; isso transforma defeitos, como a execução ausente da semente 4 que as verificações de Leo encontraram, em achados.
- Misturar resultados exploratórios e confirmatórios; isso exagera a certeza.
- Relatar ganhos de segurança sem os custos; isso esconde compromissos, como a queda do macro-F1 de 0,912 para 0,905 que Leo relatou.
Exercícios
- EX033 — Intercalação. Por que intercalar as condições durante as execuções? Rubrica: 3 = impede que problemas dependentes do tempo se confundam com as condições; 2 = parcial; 1 = vago; 0 = errado.
- EX034 — Verificações de qualidade. Liste quatro verificações de qualidade dos dados. Rubrica: 3 = completude, canários, duplicatas entre partições, faixas plausíveis; 2 = três; 1 = uma ou duas; 0 = nenhuma.
- EX035 — Leitura do laboratório. Quais são a ASR de base, a ASR com defesa e o intervalo da redução no laboratório de estatística? Rubrica: 3 = 0.350, 0.190, [0.120, 0.203]; 2 = dois; 1 = um; 0 = errado.
- EX036 — Pareado vs não pareado. Por que fazer bootstrap da diferença sobre itens compartilhados, em vez de comparar dois intervalos separados? Rubrica: 3 = a dificuldade dos itens se cancela; inferência mais estreita e correta; 2 = parcial; 1 = vago; 0 = errado.
- EX037 — Custos. Nomeie quatro custos a relatar para uma defesa de segurança. Rubrica: 3 = acurácia/utilidade, latência, recusas indevidas, computação/manutenção; 2 = três; 1 = um ou dois; 0 = nenhum.
- EX038 — Exploratório. Como Leo deve relatar o achado das "três ou mais aparições"? Rubrica: 3 = rotulado como exploratório, hipótese para trabalhos futuros, não confirmatório; 2 = parcial; 1 = relatado como resultado principal; 0 = omitido sem razão.
Síntese
A análise é onde o desenho cuidadoso compensa: execuções intercaladas, verificações de qualidade, intervalos e comparações pareadas transformam registros brutos numa resposta defensável, e os custos tornam a resposta útil.
Continue estudando — capítulo 06 de 08
← Capítulo 05 (rascunho) · Índice de capítulos do curso · Capítulo 07 (rascunho) →