Come addestrare dinamicamente il tuo modello utilizzando dati avversari

Addestramento dinamico del modello utilizzando dati avversari.

Cosa imparerai qui
  • 💡 l’idea di base della raccolta dinamica di dati avversari e perché è importante.
  • ⚒ come raccogliere dinamicamente dati avversari e addestrare il tuo modello su di essi – utilizzando un compito di riconoscimento di cifre scritte a mano MNIST come esempio.

Raccolta dinamica di dati avversari (DADC)

I benchmark statici, pur essendo un modo ampiamente utilizzato per valutare le prestazioni del tuo modello, presentano molti problemi: saturano, hanno pregiudizi o falle e spesso portano i ricercatori a cercare un incremento delle metriche invece di costruire modelli affidabili che possano essere utilizzati dagli esseri umani 1.

La raccolta dinamica di dati avversari (DADC) offre grandi promesse come approccio per mitigare alcuni dei problemi dei benchmark statici. In DADC, gli esseri umani creano esempi per ingannare i modelli state-of-the-art (SOTA). Questo processo offre due vantaggi:

  1. permette agli utenti di valutare quanto sia robusto il loro modello;
  2. fornisce dati che possono essere utilizzati per addestrare modelli ancora più forti.

Questo processo di ingannare e addestrare il modello sui dati raccolti in modo avversario viene ripetuto in più fasi portando a un modello più robusto che si allinea agli esseri umani 1.

Addestrare il tuo modello in modo dinamico utilizzando dati avversari

Qui ti guiderò nella raccolta dinamica di dati avversari dagli utenti e nell’addestramento del tuo modello su di essi – utilizzando il compito di riconoscimento di cifre scritte a mano MNIST.

Nel compito di riconoscimento di cifre scritte a mano MNIST, il modello viene addestrato per prevedere il numero dato un’immagine in scala di grigi 28x28 della cifra scritta a mano (vedi esempi nella figura sottostante). I numeri vanno da 0 a 9.

Fonte dell’immagine: mnist | Tensorflow Datasets

Questo compito è ampiamente considerato l’hello world della computer vision ed è molto facile addestrare modelli che raggiungono un’alta accuratezza sul set di test di benchmark standard (e statico). Tuttavia, è stato dimostrato che questi modelli SOTA trovano comunque difficoltà a prevedere le cifre corrette quando sono scritte dagli esseri umani (e fornite come input al modello): i ricercatori ritengono che ciò sia in gran parte perché il set di test statico non rappresenta adeguatamente i modi molto diversi in cui gli esseri umani scrivono. Pertanto, sono necessari gli esseri umani nel processo per fornire ai modelli campioni avversari che li aiuteranno a generalizzare meglio.

Questo tutorial sarà diviso nelle seguenti sezioni:

  1. Configurazione del tuo modello
  2. Interazione con il tuo modello
  3. Identificazione del tuo modello
  4. Mettere tutto insieme

Configurazione del tuo modello

Prima di tutto, devi definire l’architettura del tuo modello. La mia semplice architettura del modello qui sotto è composta da due reti convoluzionali collegate a uno strato completamente connesso di 50 dimensioni e uno strato finale per le 10 classi. Infine, utilizziamo la funzione di attivazione softmax per trasformare l’output del modello in una distribuzione di probabilità sulle classi.

# Adattato da: https://nextjournal.com/gkoehler/pytorch-mnist
class MNIST_Model(nn.Module):
    def __init__(self):
        super(MNIST_Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x)

Ora che hai definito la struttura del tuo modello, devi addestrarlo sul set di dati standard MNIST di addestramento/validazione.

Interazione con il tuo modello

A questo punto presumiamo che tu abbia il tuo modello addestrato. Anche se questo modello è addestrato, vogliamo renderlo robusto utilizzando dati avversari con la collaborazione degli esseri umani. Per questo, hai bisogno di un modo per consentire agli utenti di interagire con esso: in particolare, desideri che gli utenti siano in grado di scrivere/disegnare numeri da 0 a 9 su un piano e far sì che il modello cerchi di classificarli. Puoi fare tutto questo con 🤗 Spaces che ti consente di creare rapidamente e facilmente una demo per i tuoi modelli di ML. Scopri di più su Spaces e come costruirli qui .

Di seguito è presente uno spazio semplice con cui interagire con il MNIST_Model che ho addestrato per 20 epoche (ha ottenuto una precisione dell’89% sul set di test). Disegna un numero sul canvas bianco e il modello prevederà il numero a partire dalla tua immagine. Lo spazio completo può essere accessibile qui. Cerca di ingannare questo modello 😁. Usa la tua calligrafia più divertente; scrivi sui lati del canvas; diventa selvaggio!

Segnalare il tuo modello

Sei riuscito a ingannare il modello sopra? Se sì, è arrivato il momento di segnalare il tuo esempio avversario. Segnalare implica:

  1. salvare l’esempio avversario in un dataset
  2. addestrare il modello sugli esempi avversari dopo aver raccolto un certo numero di campioni di soglia
  3. ripetere i passaggi 1-2 un certo numero di volte

Ho scritto una funzione personalizzata flag per fare tutto questo. Per ulteriori dettagli, sentiti libero di consultare il codice completo qui.

Nota: Gradio ha un callback di segnalazione integrato che ti consente di segnalare facilmente campioni avversari del tuo modello. Leggi di più a riguardo qui.

Mettere tutto insieme

Il passaggio finale consiste nel mettere insieme tutti e tre i componenti (configurare il modello, interagire con esso e segnalarlo) come un unico spazio demo! A tal fine, ho creato lo Spazio Avversario di MNIST per la raccolta dinamica di dati avversari per il compito di riconoscimento di scrittura a mano di MNIST. Sentiti libero di provarlo qui di seguito.

Conclusione

La Raccolta Dinamica di Dati Avversari (DADC) sta guadagnando popolarità nella comunità del machine learning come un modo per raccogliere dataset umani diversi e non saturanti, e migliorare la valutazione del modello e le prestazioni del compito. Raccogliendo dinamicamente dati avversari generati dall’utente con i modelli in esecuzione, possiamo migliorare il potenziale di generalizzazione dei nostri modelli.

Questo processo di ingannare e addestrare il modello sui dati raccolti avversari dovrebbe essere ripetuto per diverse iterazioni 1 . Eric Wallace et al , nei loro esperimenti sui compiti di inferenza del linguaggio naturale, dimostrano che mentre nel breve termine la raccolta standard di dati non avversari funziona meglio, nel lungo termine la raccolta dinamica di dati avversari porta alla precisione più alta con un margine significativo.

Utilizzando gli 🤗 Spazi, diventa relativamente facile creare una piattaforma per la raccolta dinamica di dati avversari per il tuo modello e addestrarlo su di essi.