Path: blob/master/site/pt-br/tutorials/generative/adversarial_fgsm.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Licensed under the Apache License, Version 2.0 (the "License");
Exemplo adversário usando o método FGSM
Este tutorial cria um exemplo adversário usando o ataque Método Rápido de Sinal de Gradiente (FGSM, na sigla em inglês), conforme descrito no artigo Explicação e Demonstração de Exemplos Adversários, por Goodfellow et al. Este foi um dos primeiros e mais populares ataques para enganar uma rede neural.
O que é um exemplo adversário?
Os exemplos adversários são entradas especializadas, criadas para confundir uma rede neural, resultando na classificação incorreta de uma determinada entrada. Essas entradas notórias são indistinguíveis a olho nu, mas fazem a rede não conseguir identificar o conteúdo da imagem. Existem diversos tipos desse ataque, porém o foco deste artigo é o ataque Método Rápido de Sinal de Gradiente, que é um ataque white-box, cujo objetivo é mensurar as classificações incorretas. Um ataque white-box ocorre quando o invasor tem acesso completo ao modelo que está sob ataque. Um dos exemplos mais famosos de uma imagem adversária exibida abaixo foi tirado do artigo mencionado acima.
Começando com a imagem de um panda, o invasor adiciona pequenas perturbações (distorções) à imagem original, o que faz o modelo rotular esta imagem como um gibão com alta confiança. O processo de adicionar essas perturbações é explicado abaixo.
Método Rápido de Sinal de Gradiente
O Método Rápido de Sinal de Gradiente funciona usando-se os gradientes da rede neural para criar um exemplo adversário. Para uma imagem de entrada, o método usa os gradientes da perda em relação à imagem de entrada para criar uma nova imagem que maximiza a perda. Essa nova imagem é chamada de imagem adversária. A seguinte expressão pode resumir isso:
em que
adv_x: imagem adversária.
x: imagem de entrada original.
y: rótulo da entrada original.
: multiplicador para garantir que as perturbações sejam pequenas.
: parâmetros do modelo.
: perda.
Um aspecto intrigante é que os gradientes são obtidos em relação à imagem de entrada, pois o objetivo é criar uma imagem que maximize a perda. Um método para atingir essa objetivo é descobrir quanto cada pixel da imagem contribui para o valor de perda e adicionar uma perturbação com base nisso. Isso é muito rápido, pois é fácil descobrir quanto cada pixel da entrada contribui para a perda usando-se a regra da cadeia e encontrando-se os gradientes necessários. Por isso, os gradientes são obtidos em relação à imagem. Além disso, como o modelo não está mais sendo treinado (e, portanto, o gradiente não é obtido em relação às variáveis treinadas, isto é, os parâmetros do modelo), os parâmetros do modelo permanecem constantes. O único objetivo é enganar um modelo já treinado.
Então, vamos tentar enganar um modelo pré-treinado. Neste tutorial, o modelo é MobileNetV2, pré-treinado com o ImageNet.
Vamos carregar o modelo MobileNetV2 pré-treinado e os nomes da classe ImageNet.
Imagem original
Vamos usar uma imagem de amostra de um labrador por Mirko (CC-BY-SA 3.0 do Wikimedia Common) e criar exemplos adversários a partir dela. O primeiro passo é pré-processá-la para que ela possa ser usada como entrada no modelo MobileNetV2.
Vamos dar uma olhada na imagem.
Criar a imagem adversária
Implementação do Método Rápido de Sinal de Gradiente
O primeiro passo é criar perturbações, que serão usadas para distorcer a imagem original, resultando em uma imagem adversária. Conforme mencionado, para esta tarefa, os gradientes são obtidos em relação à imagem.
As perturbações resultantes também podem ser visualizadas.
Vamos tentar usar diferentes valores de épsilon e observar a imagem resultante. Você notará que, à medida que o valor de épsilon aumenta, fica mais fácil enganar a rede. Entretanto, em compensação, fica mais fácil identificar as perturbações.
Próximos passos
Agora que você sabe o que são ataques adversários, experimente esse método em diferentes datasets e diversas arquiteturas. Além disso, você pode criar e treinar seu próprio modelo, e depois pode tentar enganá-lo usando o mesmo método. E você pode tentar ver como a confiança das previsões variam à medida que você altera o épsilon.
Embora poderoso, o ataque mostrado neste tutorial foi apenas o começo das pesquisas sobre ataques adversários e, desde então, foram escritos diversos artigos sobre a criação de ataques mais poderosos. Além dos ataques adversários, as pesquisas também levaram à criação de defesas, que têm o objetivo de criar modelos de aprendizado de máquina mais robustos. Confira este artigo de pesquisa para ver uma lista abrangente de ataques e defesas adversários.
Se quiser ver mais implementações de ataques e defesas adversários, confira a biblioteca de exemplos adversários CleverHans.