Tutte le risposte qui sono fantastiche, ma, per qualche motivo, finora non è stato detto nulla sul perché questo effetto non dovrebbe sorprendervi . Riempirò lo spazio vuoto.
Vorrei iniziare con un requisito che è assolutamente essenziale affinché questo funzioni: l'aggressore deve conoscere l'architettura della rete neurale (numero di strati, dimensione di ogni strato, ecc.). Inoltre, in tutti i casi che ho esaminato me stesso, l'attaccante conosce l'istantanea del modello utilizzato nella produzione, vale a dire tutti i pesi. In altre parole, il "codice sorgente" della rete non è un segreto.
Non puoi ingannare una rete neurale se la tratti come una scatola nera. E non puoi riutilizzare la stessa immagine ingannevole per reti diverse. In effetti, devi "addestrare" tu stesso la rete di destinazione, e qui con l'allenamento intendo correre passanti e backprop, ma appositamente realizzati per un altro scopo.
Perché funziona affatto?
Ora, ecco l'intuizione. Le immagini hanno dimensioni molto elevate: anche lo spazio di piccole immagini a colori 32x32 ha 3 * 32 * 32 = 3072
dimensioni. Ma il set di dati di allenamento è relativamente piccolo e contiene immagini reali, che hanno tutte una struttura e buone proprietà statistiche (ad es. Fluidità del colore). Quindi il set di dati di allenamento si trova su una piccola varietà di questo enorme spazio di immagini.
Le reti convoluzionali funzionano molto bene su questa varietà, ma sostanzialmente non sanno nulla del resto dello spazio. La classificazione dei punti all'esterno del collettore è solo un'estrapolazione lineare basata sui punti all'interno del collettore. Non c'è da stupirsi che alcuni punti particolari siano estrapolati in modo errato. L'attaccante ha solo bisogno di un modo per raggiungere il più vicino di questi punti.
Esempio
Lascia che ti faccia un esempio concreto di come ingannare una rete neurale. Per renderlo compatto, userò una rete di regressione logistica molto semplice con una non linearità (sigmoid). Prende un input a 10 dimensioni x
, calcola un singolo numero p=sigmoid(W.dot(x))
, che è la probabilità della classe 1 (rispetto alla classe 0).
Supponiamo che tu sappia W=(-1, -1, 1, -1, 1, -1, 1, 1, -1, 1)
e inizi con un input x=(2, -1, 3, -2, 2, 2, 1, -4, 5, 1)
. Un passaggio in avanti dà sigmoid(W.dot(x))=0.0474
o una probabilità del 95% che x
è un esempio di classe 0.
Vorremmo trovare un altro esempio, y
che è molto vicino x
ma è classificato dalla rete come 1. Nota che x
è 10-dimensionale, quindi abbiamo la libertà di dare una spinta a 10 valori, che è molto.
Dato che W[0]=-1
è negativo, è meglio avere un piccolo y[0]
per dare un contributo totale di y[0]*W[0]
piccolo. Quindi, facciamo y[0]=x[0]-0.5=1.5
. Allo stesso modo, W[2]=1
è positivo, quindi è meglio aumentare y[2]
per fare y[2]*W[2]
più grande: y[2]=x[2]+0.5=3.5
. E così via.
Il risultato è y=(1.5, -1.5, 3.5, -2.5, 2.5, 1.5, 1.5, -3.5, 4.5, 1.5)
, e sigmoid(W.dot(y))=0.88
. Con questa modifica abbiamo migliorato la probabilità di classe 1 dal 5% all'88%!
Generalizzazione
Se osservi attentamente l'esempio precedente, noterai che sapevo esattamente come modificare x
per spostarlo nella classe target, perché conoscevo il gradiente di rete. Quello che ho fatto è stato in realtà una backpropagation , ma rispetto ai dati, anziché ai pesi.
In generale, l'attaccante inizia con la distribuzione del bersaglio (0, 0, ..., 1, 0, ..., 0)
(zero ovunque, tranne per la classe che vuole raggiungere), esegue la backpropagazione dei dati e fa una piccola mossa in quella direzione. Lo stato della rete non è aggiornato.
Ora dovrebbe essere chiaro che è una caratteristica comune delle reti feed-forward che si occupano di una piccola varietà di dati, indipendentemente dalla profondità o dalla natura dei dati (immagine, audio, video o testo).
potection
Il modo più semplice per impedire che il sistema venga ingannato è utilizzare un insieme di reti neurali, ovvero un sistema che aggrega i voti di più reti su ogni richiesta. È molto più difficile eseguire la backpropagazione rispetto a più reti contemporaneamente. L'attaccante potrebbe tentare di farlo in sequenza, una rete alla volta, ma l'aggiornamento per una rete potrebbe facilmente incasinare i risultati ottenuti per un'altra rete. Più reti vengono utilizzate, più complesso diventa un attacco.
Un'altra possibilità è rendere più fluido l'input prima di passarlo alla rete.
Uso positivo della stessa idea
Non dovresti pensare che la backpropagazione dell'immagine abbia solo applicazioni negative. Una tecnica molto simile, chiamata deconvoluzione , viene utilizzata per la visualizzazione e una migliore comprensione di ciò che i neuroni hanno imparato.
Questa tecnica consente di sintetizzare un'immagine che provoca un particolare neurone a sparare, fondamentalmente vedere visivamente "ciò che il neurone sta cercando", il che in generale rende più interpretabili le reti neurali convoluzionali.