Aprendizagem de Máquina é Divertido! Parte 8

Como enganar redes neurais intencionalmente

Josenildo Costa da Silva
11 min readSep 28, 2018

Nota do Tradutor: Este post é uma tradução de um artigo por Adam Geitgey, de uma série de artigos originalmente em inglês. Leia a série completa original: Part 1, Part 2, Part 3, Part 4, Part 5, Part 6, Part 7 e Part 8!

Você pode ler em português a Parte 1, Parte 2, Parte 3, Parte 4, Parte 5, Parte 6, Parte 7 e Parte 8.

Desde que programadores começaram escrever programas de computadores, hackers tentam descobrir maneiras de tirar vantagens destes programas. Hackers maliciosos exploram mesmo os menores bugs em programas para conseguir invadir sistemas, roubar dados e geralmente causar estragos.

100% Real Hackers™

Entretanto, sistemas baseados em algoritmos de aprendizagem profunda deveriam ser imunes à interferencia humana, certo? Como um hacker vai vencer uma rede neural treinada com terabytes de dados?

A verdade é que mesmo a mais avançada rede neural profunda pode ser enganada facilmente. Com alguns poucos truques, podemos fazê-la predizer qualquer coisa que você deseje:

Modifiquei esta foto de um gato para que fosse reconhecida como uma torradeira.

Portanto, antes de você lançar um novo sistema utilizando uma rede neural profunda, vamos aprender como fazê-las falhar e o que se pode fazer para se proteger contra tais ataques.

Redes Neurais como Guardas de Segurança

Imagine que lançamos um site de leilão como o Ebay. Em nosso website, queremos impedir que pessoas vendam item proibidos — como por exemplo animais vivos.

Fazer valer este tipo de regra é muito difícil quando se tem milhões de usuários. Poderíamos contratar centena de pessoas para revisar cada leilão manualmente, mas isto seria muito caro. Ao invés disso, podemos utilizar aprendizagem profunda para verificar automaticamente itens proibidos nas fotos dos anúncios dos leilões e denunciar aqueles que violem as regras.

Este é um exemplo típico de classificação de imagens. Para implementar este classificador, treinaremos uma rede neural profunda para identificar itens proibidos dentre os permitidos e então aplicaremos a rede a todas as fotos do nosso site.

Primeiro, precisamos de um conjunto de dados de milhares de imagens das listas de leilões passados. Precisaremos de imagens tanto de itens permitidos quanto de itens proibidos para que possamos treinar a rede para saber distinguir estes daqueles:

Para treinar a rede neural, vamos utilizar o algoritmo backpropagation padrão. Neste algoritmo, mostramos uma imagem de treinamento, junto com o resultado esperado, e corrigimos cada camada na rede neural ajustando levemente os pesos para que ela fique um pouco melhor na tarefa de produzir a saída correta para aquela imagem:

Repetimos este ciclo milhares de vezes com milhares de fotos até que o modelo produza os resultados corretos de modo consistente e dentro de uma taxa de acurácia aceitável.

O resultado final é uma rede neural que pode classificar imagens de modo confiável:

Nota: se você que saber mais detalhes sobre como as redes neurais convolutivas reconhecem imagens, veja a Parte 3 desta série de artigos.

Mas as coisas não são tão confiáveis quanto parecem …

Redes neurais convolutivas são modelos eficientes que consideram a imagem completa para a classificação. Elas podem reconhecer formas e padrões complexos não importa onde apareçam na imagem. Em muitas tarefas de reconhecimento de imagens, elas podem se igualar ou até superar a performance humana.

Com um modelo tão bacana como este, mudar alguns pixels na imagem para ficar mais claro ou mais escuro não deve ter um grande efeito na predição final, certo? Claro, pode mudar a probabilidade um pouco, mas não deveria mudar a classificação de uma imagem de “proibido” para “permitido”, não?

A expectativa: pequenas modificações na imagem de entrada deve causar apenas pequenas modificações na predição final.

Entretanto, em um famoso artigo de 2013 chamado Intriguing properties of neural networks, foi descoberto que isto nem sempre é verdade. Se você souber exatamente quais pixels modificar e quanto de mudanças aplicar a eles, você pode intencionalmnte induzir a rede neural ao erro para uma determinada imagem sem ter que modificar muito a sua aparencia.

Isto significa que podemos intencionalmente criar uma imagem que é claramente de um item proibido, mas que engana completamente a nossa rede neural:

Por que isto ocorre? Um classificador automático tenta encontrar uma linha divisória entre as coisas que ele quer classificar. Para um classificador bidimensional simples que aprendeu a separar pontos verdes (aceitaveis) dos pontos vermelhos (proibidos):

Neste ponto, o classificador funciona com acurácia de 100%. Ele encontrou uma linha que separa perfeitamente todos os pontos verdes dos pontos vermelhos.

Mas e se quisermos enganar o classificador para confundir um ponto vermelho e classificá-lo como verde? Qual é o a menor modificação que precisamos fazer em um ponto vermelho para que ele caia em um território verde?

Se adicionarmos um pouco ao valor de Y em um ponto vermelho que esteja muito próximo da fronteira, poderemos empurrá-lo para o território verde:

Deste modo, para enganar um classificador, precisamos apenas saber em qual direção devemos empurrar o ponto para que ele ultrapasse a fronteira. E se não quisermos ser tão óbvios em nossa trapaça, idealmente iremos mover o ponto o mínimo possível para que pareça um erro não intencional.

Em classificação de imagem com redes neurais profundas, cada “ponto” que estamos classificando é uma imagem completa composta de milhares de pixels. Isto nos dá milhares de valores possíveis que podemos alterar para empurrar o ponto para o outro lado da linha de decisão. E se tomarmos o cuidado de modificar os pixels de modo que não seja tão óbvio para o olho humano, podemos enganar o classificador sem que a imagem pareça ter sido manipulada.

Em outras palavras, podemos modificar levemente os pixels de uma imagem real de um objeto para que a imagem confunda completamente a rede neral e a faça pensar que a imagem representa uma outra coisa — e estaremos no controle de qual objeto ela irá detectar:

Transformando um gato em uma torradeira. A deteção de imagem é do Keras.js web-based demo

Como Enganar uma Rede Neural

Já discutimos sobre o processo básico de treinamento de uma rede neural para classificação de fotos:

  1. Apresente uma imagem de treinamento
  2. Verifique a predição da rede neural e veja quão errada está da resposta correta
  3. Ajuste os pesos de cada camada da rede neural usando backpropagation para que a predição final seja um pouco mais próxima da resposta correta
  4. Repita os passos 1 a 3 algumas milhares de vezes com algumas milhares de imagens

Mas o que acontece se ao invés de ajustar os pesos da rede neural, mexermos nos pixels da imagem até que consigamos a resposta que desejamos?

Vamos utilizar uma rede neural já treinada e vamos “treiná-la” novamente. Mas desta vez iremos utilizar o backpropagation para modificar a imagem de entrada ao invés da camadas da rede neural:

Aqui está nosso novo algoritmo:

  1. Apresente a imagem que você quer modificar
  2. Verifique a predição da rede neural e veja quão errada está em relação a resposta que desejamos para esta imagem
  3. Modifique a imagem utilizando backpropagation para que a predição final fique mais próxima da resposta que desejamos
  4. Repita os passos 1 a 3 algumas milhares de vezes com a mesma imagem até que a rede dê a resposta que desejamos.

Ao final deste processo, teremos uma imagem que engana a rede neural sem que nada na rede seja modificado.

O único problema é que ao permitir modificações em cada pixel sem limitações, as mudanças na imagem podem ser drásticas o suficiente para que você as perceba. Eles irão se mostrar como pontos com cores distorcidas ou áreas onduladas:

Uma imagem modificada sem restrições da quantidade de modificação de cada pixel. Observe os pontos verdes ao redor do gato e os padrões ondulados na parede branca.

Para evitar estas distroçoes óbvias, podemos adicionar uma restrição simples ao nosso algoritmo. Vamos restringir cada pixel na imagem modificada de modo que o seu valor não pode ser alterado mais que uma pequena quantidade em relação à imagem original — algo em torno de 0.01%, por exemplo. Isto irá forçar o algoritmo de modo a ainda enganar a rede neural mas sem parecer tão diferente da imagem original.

Veja como a imagem modificada pode ficar quando se adiciona esta restrição:

Uma imagem modificda com restrição de quantidade de modificação por pixel.

Mesmo parecendo a mesma imagem visualmente, ela ainda consegue enganar a rede neural!

Mão à Obra

Para implementar esta ideia, primeiro precisamos de uma rede pré-treinada. Ao invés de treinar uma do zero, vamos utilizar uma criada pela Google.

Kera, a framework popular para aprendizado profundo, vem com várias redes pré-treinadas. Vamos utilizar a sua versão da rede neural Google Inception v3, que foi pre-treinada para detectar 1000 tipos de objetos diferentes.

Aqui está o código básico em Keras para reconhecer o que há em uma imagem utilizando a Inception v3. Certifique-se de que Python 3 e Keras já estejam instalados antes de executar o código abaixo:

Quando executado, este código detecta um gato persa na imagem, como esperado:

This is a Persian_cat with 85.7% confidence!

Agora, vamos forçar a rede a pensar que este gato é uma torradeira modificando a imagem até que a rede seja enganada.

Keras não tem uma maneira já implementada para fazer isto com a imagem, só modifica as camadas da rede. Por isso, eu tive que implementar este passo eu mesmo:

Aqui está o código:

Se executarmos este código, ele irá acabar produzindo uma imagem que irá enganar a rede neural:

$ python3 generated_hacked_image.pyModel's predicted likelihood that the image is a toaster: 0.00072%[ .... a few thousand lines of training .... ]Model's predicted likelihood that the image is a toaster: 99.4212%

Nota: se seu computador não possui uma GPU, este processo poderá levar algumas horas pra completar. Se sua máquina possui uma GPU configurada adequadamente com Kekas e CUDA, não deve demorar mais que alguns minutos de execução.

Agora vamos testar nossa imagem modificada apresentando-a à rede neural:

$ python3 predict.pyThis is a toaster with 98.09% confidence!

Conseguimos! Fizemos a rede neural pensar que o gato é uma torradeira!

O Que Podemos Fazer com uma Imagem Hackeada?

Uma imagem criada do modo como fizemos é chamada de “gerar um exemplo adversário”. Criamos um item de dados de modo intencional para fazer a rede aprendiz errar. É um truque bacana, mas o que isto importa no mundo real?

Pesquisas tem mostrado que estas imagens adversárias apresentam algumas propriedades surpreendentes:

  1. Imagens hackeadas podem enganar redes neural mesmo quando impressas em papel! Portanto, você pode utilizá-las para enganar câmeras físicas ou scanners, não apenas sistemas para os quais você faz um upload de imagem diretamente.
  2. Imagens que enganam uma rede neural podem enganar outras redes neurais mesmo que possuam arquitetura completamente diferente, desde que treinadas com os mesmo dados, ou similares.

Então, podemos fazer potencialmente um monte de coisas com estas imagens hackeadas!

Mas há ainda uma grande limitação quanto ao modo de gerar estas imagens — nosso ataque requer acesso direto à rede neural alvo. Como estamos “treinando” contra a rede para enganá-la, precisamos de uma cópia da mesma. No mundo real, nenhuma empresa vai permitir que você faça download da sua rede neural treinada. Logo, não podemos atacá-las … certo?

Não é bem assim! Pesquisadores demonstraram que você pode treinar sua própria rede neural substituta para espelhar uma outra rede através de consultas para ver como ela se comporta. Depois, você pode utilizar sua rede substituta para gerar imagens hackeadas que serão capazes de enganar a rede neural original! Isto é chamado de ataque de caixa preta.

As possibilidades de aplicação do ataque de caixa preta são sem limites. Veja algums exemplos plausíveis:

  • Enganar carros autônomos para interpretarem sinal de pare como um sinal verde — isto poderia causar acidentes de trânsito!
  • Enganar sistemas de filtragem de conteúdo para permitir conteúdo ofensivo/ilegal.
  • Enganar scanners de cheques em caixas automáticos para que eles pensem que o valor manuscrito é maior do que é realmente (com possibilidade de alegação de inocência, caso você seja pego!)

E tais metodos de ataques não se limitam à imagens. Você pode utilizar o mesmo modo para enganar classificadords que trabalham com outros tipos de dados. Por exemplo, você poderia enganar seu anti-vírus para reconhecer seu víruso como código confiável.

Como Proteger-se Destes Ataques?

Agora que sabemos ser possível enganar uma rede neural (e todos os outros modelos de aprendizagem de máquina também), como nos defender de tais ataques?

A resposta curta é que nunca estaremos completamente seguros. Prevenir este tipo de ataque é ainda pesquisa em andamento. A melhor maneira de ficar atualizado é ler o cleverhans blog que é mantido por Ian Goodfellow e Nicolas Papernot, dois dos mais importantes pesquisadores nesta área.

Mas aqui estão algumas coisas que sabemos até agora:

  • Se você simplesmente criar um monte de imagens hackeadas e incluí-las no seus dados de treinamento, isto parece tornar a rede neural um pouco mais resitente a tais ataques. Isto é chamado de treinamento adversarial e é provavelmente a medida mais adequada para se adotar de imediato.
  • Há outra abordagem, efetiva de certo modo, chamada Defensive Distillation. Neste método, você treina uma segunda rede para imitar o modelo original. Mas esta abordagem é nova e bem complexa, portanto eu não investiria nela a não ser que você tenha necessidades bem específicas.
  • Praticamente todas as outras ideias de defesa que pesquisadores tentaram até agora não obtiveram sucesso contra estes ataques.

Como não temos respostas definitivas ainda, vale a pena pensar sobre os cenários onde você utiliza redes neurais para que se possa diminuir os riscos de danos deste tipo de ataque para os seus negócios.

Por exemplo, se você tem um só modelo de aprendizagem de máquina como única linha de defesa para permitir acesso à recursos restritos e você assume que ele é infalível, isto é provavelmente um má ideia. Mas se você utiliza aprendizagem de máquina como um passo dentro de um processo onde ainda há verificação humana, provavelmente está tudo bem.

Em outras palavras, trate modelos de aprendizagem de máquina na sua arquitetura como qualquer outro componente que pode ser contornado. Pense nas implicações que podem acontecer se um usuário tentar intencionamente enganar tais componente e pense nas maneira de mitigar tais cenários.

Continue aprendendo

Você quer aprender mais sobre exemplos adversariais e proteção contra os mesmos?

Nota do autor: Se você gostou deste artigo, considere assinar a minha lista de emails Machine Learning is Fun! Só irei enviar mensagens quando eu tiver alguma coisa nova e interessante para compartilhar. Esta é a melhor maneira de ficar sabendo quando eu escrever mais artigos iguais a este.

Você pode me seguir no Twitter em @ageitgey, me enviar email diretamente ou me encontrar no linkedin. Eu vou adorar poder ajudá-lo ou a sua equipe com aprendizagem de máquina.

--

--