◇ OpenCyber Academy
Mestrado · Capítulo 5 · Português

Capítulo 5 — Proposta e piloto

Ensino gratuito e aberto para quem deseja proteger pessoas e tecnologias. Não é preciso criar uma conta para estudar ou consultar as respostas.

Capítulo 5 — Proposta e piloto

Mapa da aula

Aula 05 publicada. Mapa, exemplo, EX027.

flowchart TD
  N0["5.1 A proposta"]
  N1["5.2 O piloto"]
  N2["5.3 Tamanho da amostra e poder"]
  N3["5.4 Revisão do plano"]
  N4["5.6 Atividades práticas"]
  N5["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5
  N5 --> EX["Exemplo resolvido"]
  EX --> Q["Exercício EX027"]

Desenho lógico

flowchart LR
  N0["5.1 A proposta"]
  N1["5.2 O piloto"]
  N2["5.3 Tamanho da amostra e poder"]
  N3["5.4 Revisão do plano"]
  N4["5.6 Atividades práticas"]
  N5["Síntese"]
  N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> Q["EX027"]
[5.1 A proposta]
    |
    v
[5.2 O piloto]
    |
    v
[5.3 Tamanho da amostra e poder]
    |
    v
[5.4 Revisão do plano]
    |
    v
[5.6 Atividades práticas]
    |
    v
[Síntese]
    |
    v
[Exemplo resolvido] --> [Exercício EX027]

Objetivos de aprendizagem

Você vai (1) escrever uma proposta de dissertação com pergunta, contexto, desenho, plano de análise, ética, riscos e cronograma; (2) executar um piloto para testar a viabilidade e estimar a variabilidade; (3) calcular tamanhos de amostra; (4) revisar o plano a partir da evidência do piloto; e (5) obter aprovação com um registro claro das decisões.

5.1 A proposta

Uma proposta de mestrado tem tipicamente de 3.000 a 6.000 palavras. Seções: pergunta e motivação (um parágrafo cada); contexto, a partir da sua matriz de evidências; desenho (Capítulo 3), incluindo explicações concorrentes e ablações (Capítulo 4); plano de análise, com desfechos primários e secundários e a estatística que você vai usar; ética e proteção de dados; riscos (técnicos, de dados, de cronograma) com mitigações; cronograma com marcos; e contribuição esperada, enunciada com modéstia. O plano de análise é a parte mais negligenciada — escreva-o agora, antes dos dados, para que escolhas posteriores não possam ser guiadas pelos resultados. A proposta de Leo seguiu esse roteiro.

5.2 O piloto

Um piloto executa o pipeline completo em pequena escala. Objetivos: confirmar que o código funciona de ponta a ponta, medir o tempo de execução, medir a variabilidade do desfecho primário, verificar que o ataque e as métricas se comportam de forma sensata (por exemplo, que o modelo sem defesa é atacável) e encontrar surpresas. Resultados de piloto não são testes de hipótese; não os relate como achados e mantenha os dados finais de teste fora do piloto. O piloto de Leo encontrou um efeito piso e uma falha no gerador. Registre os dois no registro de decisões.

5.3 Tamanho da amostra e poder

Para taxas, a aproximação normal n ≈ z² p(1−p)/h² dá o número de tentativas necessário para uma semiamplitude h do intervalo de confiança. Para comparações entre condições, a análise de poder pergunta quantas repetições são necessárias para detectar uma diferença d com probabilidade (poder) 0,8 a um nível de significância de 0,05; em desenhos pareados, o que importa é a variância das diferenças. Com poucas sementes (o típico em aprendizado de máquina), relate intervalos sobre as sementes e sobre os itens de avaliação, em vez de depender de um único teste de significância. O piloto de Leo mostrou cerca de 0,8 ponto de variação entre sementes, o que, junto com o bootstrap sobre os registros, tornou cinco sementes adequadas. Use a variação que você de fato observa, não um palpite.

5.4 Revisão do plano

Pilotos costumam mudar alguma coisa: um ataque fraco demais para separar as condições, uma avaliação que demora demais, uma métrica com efeito piso (todas as condições perto de zero). Registre cada mudança num registro de decisões, com a razão. Orientadores e examinadores reagem bem a uma proposta que mostra ter aprendido com o seu piloto. O registro de Leo anota duas mudanças vindas do piloto: a substituição do ataque limitado pelo piso por um ataque calibrado e a correção dos modelos que produziam notas quase idênticas entre classes. Cada uma tem data e razão. Mantenha o registro junto com a proposta para que os examinadores possam acompanhar a evolução do plano.

5.5 Exemplo resolvido (caso sintético da Harbourline)

O piloto de Leo usou 2.000 registros e duas sementes. Levou 40 minutos por execução, então o plano completo (20.000 registros, quatro condições, cinco sementes) exige cerca de 130 horas de computação — viável no cluster do laboratório. O ataque simples por limiar de confiança produziu TPR com FPR de 1% entre 1% e 2% em todas as condições: um efeito piso. Ele o substituiu por um ataque calibrado com modelos de referência, que separou as condições. A variabilidade entre sementes foi de cerca de 0,8 ponto, então cinco sementes mais bootstrap sobre os registros foram consideradas adequadas. Ele também descobriu que dois modelos geravam notas quase idênticas entre classes, introduzindo ruído de rótulo; corrigiu o gerador e registrou a mudança.

O laboratório de evasão oferece um exemplo de varredura em piloto: antes de escolher um orçamento de perturbação para o estudo principal, varra vários para descobrir onde o efeito é mensurável, em vez de estar no piso ou no teto.

"""Lab E: evasion of a toy linear classifier (synthetic data, stdlib only).
Trains logistic regression on two synthetic clusters, then applies a
fast-gradient-sign (FGSM-style) perturbation of size eps to every test point
and reports clean vs adversarial accuracy. Teaching model only."""
import math, random
rng = random.Random(7)
def point(label):
    cx = 1.0 if label else -1.0
    return [rng.gauss(cx, 0.7), rng.gauss(cx, 0.7)], label
train = [point(i % 2) for i in range(400)]
test = [point(i % 2) for i in range(200)]
w, b = [0.0, 0.0], 0.0
sig = lambda z: 1 / (1 + math.exp(-z))
for epoch in range(200):
    gw, gb = [0.0, 0.0], 0.0
    for x, y in train:
        p = sig(w[0]*x[0] + w[1]*x[1] + b)
        gw[0] += (p - y)*x[0]; gw[1] += (p - y)*x[1]; gb += p - y
    w = [w[i] - 0.1*gw[i]/len(train) for i in range(2)]; b -= 0.1*gb/len(train)
def acc(data, eps):
    ok = 0
    for x, y in data:
        # gradient of the loss w.r.t. x is (p - y) * w; FGSM steps along its sign
        p = sig(w[0]*x[0] + w[1]*x[1] + b)
        xa = [x[i] + eps*math.copysign(1, (p - y)*w[i]) for i in range(2)]
        ok += (sig(w[0]*xa[0] + w[1]*xa[1] + b) >= 0.5) == bool(y)
    return ok / len(data)
print(f"weights w=({w[0]:.3f}, {w[1]:.3f}) b={b:.3f}")
for eps in (0.0, 0.25, 0.5, 0.75, 1.0):
    print(f"eps={eps:.2f} accuracy={acc(test, eps):.3f}")

Saída esperada:

weights w=(1.795, 1.756) b=-0.080
eps=0.00 accuracy=0.985
eps=0.25 accuracy=0.950
eps=0.50 accuracy=0.840
eps=0.75 accuracy=0.660
eps=1.00 accuracy=0.505

5.6 Atividades práticas

  1. Escreva o seu plano de análise com desfechos primários e secundários. 2. Execute um piloto e preencha um registro de decisões. 3. Calcule o tamanho da amostra para o seu desfecho primário. No plano de análise, nomeie o desfecho primário, como a TPR com FPR de 1%, e os secundários, com a estatística de cada um. No piloto, execute o pipeline inteiro em pequena escala e registre cada mudança com a sua razão, como Leo fez. No tamanho da amostra, use a fórmula acima com a variação que o seu piloto observou e diga se o seu orçamento de computação o permite.

5.7 Erros e limites

Quatro erros se repetem, e cada um enfraquece o estudo; confira a sua proposta quanto aos quatro:

Exercícios

Síntese

A proposta fixa o que você vai fazer e como vai analisar; o piloto mostra se você consegue. Revisões registradas com as suas razões transformam surpresas em evidência de um processo cuidadoso.

Continue estudando — capítulo 05 de 08

← Capítulo 04 (rascunho) · Índice de capítulos do curso · Capítulo 06 (rascunho) →