Il Machine Learning è divertente! — parte 8: Come imbrogliare una rete neurale

Uno sguardo all’hacking del futuro!

Giovanni Toschi
Aug 21, 2017 · 11 min read

Questo articolo è l’ultimo di una lunga serie, leggi le altre parti qui: parte 1, parte 2, parte 3, parte 4, parte 5, parte 6 e parte 7.

Fin dal primo momento in cui i programmatori hanno scritto programmi informatici, gli hacker hanno cercato modi per trarre vantaggio dalle falle in questi programmi.

Gli hacker maligni sfruttano anche le più piccole bug di un programma pur di entrare in sistemi, rubare dati e in generale causare danni.

Very Hacker al 100%

Ma i sistemi alimentati da algoritmi di “deep learning” dovrebbero essere sicuri dalle interferenze umane, giusto? Come è possibile che un hacker sia in grado di ingannare una rete neurale addestrata su terabyte di dati?

In realtà, anche i Neural Networks più avanzati possono essere facilmente ingannati. Con alcuni stratagemmi, puoi forzarli a prevedere qualsiasi risultato tu voglia:

Ho modificato quest’immagine per ingannare il Neural Network e fare in modo che la scambiasse per un tostapane

Quindi, prima di lanciare un nuovo prodotto basato su Deep Neural Networks, sarà meglio imparare come questi possano essere facilmente ingannati e cosa si può fare per proteggerci dagli aggressori.

Reti Neurali come guardie giurate

Immagina di gestire un sito d’aste sul web come Ebay. Nel nostro sito vogliamo impedire alle persone di vendere oggetti proibiti —come ad esempio animali vivi.

Se si dispone di milioni di utenti la messa in pratica di queste regole risulta piuttosto difficile. Potremmo assumere centinaia di persone per esaminare manualmente ogni prodotto messo all’asta, ma ci risulterebbe troppo costoso. Al contrario, possiamo usare il Deep Learning per controllare automaticamente le foto d’asta cercando oggetti vietati e contrassegnando quelli che violano le regole.

Questo è un tipico problema di classificazione delle immagini. Per costruire questo sistema, insegneremo a un Deep Convolutional Neural Network (DCNN) come distinguere gli oggetti proibiti dagli oggetti consentiti per poi fargli analizzare in automatico tutte le foto che vengono postate sulla nostra piattaforma di aste online.

Come prima cosa, abbiamo bisogno di un dataset di migliaia di immagini provenienti dalle liste d’asta passate. Abbiamo bisogno sia di immagini di oggetti consentiti che di oggetti vietati per poter insegnare al Neural Network la differenza:

Per allenare la rete neurale, usiamo l’algoritmo standard di propagazione all’indietro (back-propagation). Questo è un algoritmo dove analizziamo prima le immagini di prova, poi il risultato previsto per quell’immagine e infine procediamo all’indietro attraverso ogni livello della rete neurale regolando leggermente i loro pesi di ogni livello per renderli in grado di classificare un po meglio ogni singola foto:

Ripetiamo questo passaggio migliaia di volte con migliaia di foto finché il modello non sia in grado di produrre affidabilmente i risultati corretti con una precisione che riteniamo accettabile.

Il risultato finale è una rete neurale che può classificare in modo affidabile le immagini che vengono postate sul nostro sito:

Nota: se si desidera ulteriori dettagli su come i convolutional neural networks riconoscano oggetti nelle immagini, vi consiglio di rileggere la parte 3.

Ma le cose non sono sempre come appaiono

I Deep Convolutional Neural Networks sono modelli potenti che considerano l’intera immagine durante il processo di classificazione. Possono riconoscere forme e modelli complessi dalla loro posizione nell’immagine. In molte attività di riconoscimento delle immagini, performano come un essere umano se non meglio.

Con un modello affascinante come questo, cambiare alcuni pixel nell’immagine per essere più scuri o più chiari non dovrebbe avere un grande effetto sulla previsione finale, giusto? Certo, potrebbe cambiare leggermente la probabilità finale, ma non dovrebbe cambiare la categorizzazione da “proibita” a “consentita”.

Ma in un famoso documento del 2013 chiamato “Proprietà intriganti delle reti neurali”, è stato scoperto che questo non è sempre vero. Se sappiamo esattamente quali pixel cambiare e quanto cambiarli esattamente, possiamo forzare intenzionalmente la rete neurale a categorizzare in modo erroneo una data immagine senza cambiare di molto l’aspetto dell’immagine originale.

Ciò significa che possiamo editare intenzionalmente l’immagine di un prodotto proibito per fare in modo che non venga riconosciuta come tale:

Ma com’è possibile?

Il nostro Machine Learning Classifier funziona cercando di trovare una linea di divisione tra le cose che sta cercando di distinguere. Ecco appare il grafico di un semplice classificatore bidimensionale che abbia imparato a separare i punti verdi (accettabili) dai punti rossi (vietati):

Al momento, il classificatore lavora con precisione del 100%. È stata trovata una linea che separa perfettamente tutti i punti verdi dai punti rossi.

Ma cosa succede se vogliamo ingannarlo e fare in modo che classifichi uno dei punti rossi come un punto verde? Qual è la distanza minima di cui dobbiamo spostare un punto rosso per spingerlo in territorio verde?

Se aggiungiamo una piccola quantità al valore Y di un punto rosso accanto al confine, possiamo spingerlo appena al di la della linea che separa l’area verde da quella rossa.:

Quindi per ingannare un classificatore, è sufficiente sapere in quale direzione spingere il punto per farlo arrivare al di sopra della linea. E se non vogliamo essere troppo evidenti nell’inganno, cercheremo di spostare il punto rosso il meno possibile in modo da farlo sembrare un errore casuale.

Nella classificazione di immagini con Deep Neural Networks, ogni “punto” che stiamo classificando è un’intera immagine composta da migliaia di pixel. Questo ci dà migliaia di valori possibili che possiamo modificare per spingere il punto oltre la linea di classificazione. E se ci assicuriamo di modificare i pixel nell’immagine in un modo che non appaia troppo evidente per un essere umano, possiamo ingannare il classificatore senza che l’immagine sembri manipolata manualmente.

In altre parole, possiamo prendere l’immagine di un oggetto reale e modificare leggermente i pixel in modo che l’immagine inganni la rete neurale nel credere che che l’immagine sia di un altro oggetto— e possiamo perfino quale oggetto vogliamo che venga classificato al posto dell’oggetto originale:

Come imbrogliare una rete neurale

Abbiamo già parlato del processo base di formazione di una rete neurale per classificare le foto:

  1. Inserire un‘immagine di allenamento
  2. Controllare la previsione della rete neurale e vedere di quanto sia lontana dalla risposta corretta
  3. Modificare i pesi di ciascun strato nella rete neurale utilizzando la propagazione della schiena per rendere la previsione finale leggermente più vicina alla risposta corretta.
  4. Ripetere i passi 1–3 qualche migliaio di volte con poche migliaia di foto di allenamento diverse.

Ma cosa succede se, invece di modificare i pesi dei livelli della rete neurale, modifichiamo l’immagine di input finché non riceviamo la risposta che cerchiamo?

Prendiamo quindi la rete neurale già addestrata e alleniamola ancora. In questo caso però useremo la back-propagation per modificare l’immagine di allenamento invece che i livelli della rete neurale stessa.

Ecco il nuovo algoritmo:

  1. Inserire la foto che vogliamo hackare.
  2. Controllare la previsione della rete neurale e vedere quanto lontano è dalla risposta che vogliamo ottenere per questa foto.
  3. Modificare la nostra foto utilizzando la propagazione della schiena per rendere la previsione finale leggermente più vicina alla risposta che vogliamo ottenere.
  4. Ripetere i passi 1–3 a poche migliaia di volte con la stessa foto fino a quando la rete ci dà la risposta che vogliamo.

Alla fine di questo processo, avremo un’immagine in grado di ingannare la rete neurale senza aver dovuto cambiare nulla all’interno della rete neurale stessa.

L’unico problema è che, consentendo ad ogni singolo pixel di variare senza limitazioni, le modifiche all’immagine possono diventare abbastanza drastiche da essere visibili ad occhio nudo.

Le modifiche si presentano come macchie scolorite o aree ondulate:

Per evitare queste evidenti distorsioni, è sufficiente aggiungere un semplice vincolo al nostro algoritmo:

Nessun singolo pixel dell’immagine deve essere modificato più di una piccola quantità specifica rispetto all’immagine originale — diciamo qualcosa di simile allo 0.01%.

Questo vincolo forza il nostro algoritmo a modificare l’immagine in un modo che sia sempre in grado di ingannare la rete neurale ma senza che la modifica sia percettibile a occhio nudo.

Ecco come appare l’immagine generata quando aggiungiamo quel vincolo:

Anche se l’immagine ci sembra uguale, continua a ingannare la rete neurale!

E’ ora di provarlo

Per programmare questo algoritmo, abbiamo innanzitutto bisogno di una rete neurale pre-addestrata da poter ingannare. Invece di allenarne una da zero, utilizzeremo una già creata da Google.

Keras, il popolare sistema di Machine Learning, è dotato di diverse reti neurali pre-addestrate. Utilizzeremo la sua copia della rete neurale profonda Inception v3 creata da Google per individuare 1000 tipi diversi di oggetti.

Ecco il codice base di Keras per riconoscere ciò che è rappresentato in una foto. Assicurati di avere Python 3 e Keras installati prima di eseguirlo:

Quando lo eseguiamo, è in grado di riconoscere correttamente la nostra immagine di un gatto persiano:

$ python3 predict.pyThis is a Persian_cat with 85.7% confidence!

Ora facciamo in modo che la rete neurale scambi il nostro gatto persiano per un tostapane.

Keras non ha una modalità pre-programmata per allenarsi con l’immagine di ingresso invece di allenarsi sui livelli intermedi, quindi ho dovuto creare questa funzionalità manualmente.

Ecco il codice:

Quando lo eseguiamo, spunterà un’immagine che sarà in grado di ingannare la nostra rete neurale:

$ 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 non si dispone di una GPU, potrebbe essere necessario eseguire alcune ore. Se hai una GPU correttamente configurata con Keras e CUDA, non dovrebbe richiedere più di un paio di minuti per eseguire.

Ora proviamo l’immagine hacker che abbiamo appena creato:

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

Missione compiuta! Abbiamo ingannato la rete neurale facendole credere che il gatto persiano fosse in realtà un tostapane!

Cosa possiamo fare con un’immagine hackerata?

Una immagine come questa viene chiamato “generare un esempio contraddittorio”.

Stiamo progettando intenzionalmente un dato allo scopo di ingannare la rete neurale. È un trucco elegante, ma quali sono le implicazioni nel mondo reale?

La ricerca ha dimostrato che queste immagini hanno alcune proprietà sorprendenti:

  1. Le immagini sbarrate continuano a ingannare le reti neurali anche quando vengono stampate su carta! Quindi puoi utilizzare questo tipo di immagini per ingannare fotocamere o scanner fisici, e non solo i sistemi digitali all’interno dei quali le immagini vengono caricate come file.
  2. Le immagini che ingannano una rete neurale tendono a ingannare reti neurali con strutture completamente diverse se le stesse sono stati addestrati con dati simili.

Quindi potenzialmente possiamo fare molto con queste immagini hackerate!

Ma c’è ancora una grande limitazione nel processo di creazione di queste immagini: il nostro attacco richiede un accesso diretto alla rete neurale stessa. Questo perchè in realtà stiamo “allenando” la rete neurale contro se stessa allo scopo di ingannarla e per farlo abbiamo bisogno di una copia delle rete neurale originale. Nel mondo reale, nessuna società ti permetterà di scaricare il codice di rete neurale addestrata per evitare potenziali attacchi … giusto?

Sbagliato!

I ricercatori hanno recentemente dimostrato che è possibile addestrare la propria rete neurale sostitutiva per rispecchiare un’altra rete neurale sondandola per vedere come si comporta. Quindi puoi utilizzare la tua rete sostitutiva neurale per generare immagini che siano in grado di ingannare la rete originale! In gergo questo tipo di attacco è chiamato: attacco black-box.

Le applicazioni degli attacchi black box sono infinite. Ecco alcuni esempi plausibili:

  1. Truccare la rete neurale che controlla una vettura e guida autonoma per vedere un segnale di stop come luce verde — questo potrebbe causare incidenti automobilistici!
  2. Imparare i sistemi di filtraggio dei contenuti online per ignorare contenuti considerati offensivi / illegali.
  3. Ingannare lo scanner di un bancomat per fargli credere che la scrittura a mano su un assegno riporti un importo più alto di quello scritto in realtà.

E queste metodologie di attacco non sono limitate alle sole immagini. È possibile utilizzare lo stesso tipo di approccio ai classificatori che utilizzano altri tipi di dati. Ad esempio, potresti ingannare gli scanner per virus nel riconoscere il tuo virus come codice sicuro!

Come possiamo proteggersi da questi attacchi?

Ora che sappiamo che è possibile ingannare le reti neurali (e tutti gli altri modelli di Machine Learning), come possiamo difenderci da questo tipo di attacchi?

La risposta breve è che nessuno è ancora completamente sicuro. La prevenzione di questi tipi di attacchi è ancora un settore di ricerca. Il modo migliore per tenere il passo con gli ultimi sviluppi è leggere il blog di cleverhans gestito da Ian Goodfellow e Nicolas Papernot, due dei più influenti ricercatori in questo settore.

Ma ci sono alcune cose che sappiamo finora:

  • Se crei molte immagini hackerate e le inserisci nel tuo set di dati di allenamento, sei in grado di rendere la tua rete neurale più resistente a questo tipo di attacchi. Questo approccio si chiama Adversarial Training ed è probabilmente la difesa più ragionevole da prendere in considerazione in questo momento.
  • C’è un altro approccio piuttosto efficace chiamato Defensive Distillation dove si crea un secondo modello per imitare il tuo modello originale. Ma questo approccio è nuovo e piuttosto complicato, per cui sconsiglio di investire tempo in questa direzione se non si hanno le conoscenze necessarie.
  • Più o meno tutte le altre idee che i ricercatori hanno provato finora non è stata in grado di prevenire questi attacchi.

Poiché non si hanno ancora risposte finali, vale la pena riflettere sugli scenari in cui utilizziamo reti neurali al fine di ridurre il rischio che questo tipo di attacco possa causare.

Ad esempio, se si dispone di un singolo modello di machine learning come unica linea di difesa per prevenire l’accesso a dati protetti è probabilmente una cattiva idea. Ma se si utilizza il machine learning come un elemento aggiuntivo in un processo dove è ancora presente l’elemento umano, probabilmente i rischi saranno di gran lunga inferiori.

In altre parole, è importante trattare i modelli di machine learning come qualsiasi altro componente che potenzialmente può essere bypassato nella tua architettura.

Ulteriori informazioni

Vuoi saperne di più su esempi avversari e crearne alcuni per conto tuo?

Giovanni Toschi

Written by

On a mission to empower 1M support teams with Ai - Founder @ BotSupply.ai & Jatana.ai

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade