Come ho creato un’animazione degli embeddings durante il fine-tuning
Creazione di un'animazione degli embeddings durante il fine-tuning
Utilizzo di Cleanlab, PCA e Procrustes per visualizzare il fine-tuning di ViT su CIFAR-10
Nel campo dell’apprendimento automatico, i Vision Transformers (ViT) sono un tipo di modello utilizzato per la classificazione delle immagini. A differenza delle tradizionali reti neurali convoluzionali, i ViT utilizzano l’architettura del transformer, originariamente progettata per compiti di elaborazione del linguaggio naturale, per elaborare le immagini. Il fine-tuning di questi modelli, per ottenere prestazioni ottimali, può essere un processo complesso.
In un articolo precedente, ho utilizzato un’animazione per mostrare i cambiamenti nelle rappresentazioni durante il processo di fine-tuning. Ciò è stato ottenuto eseguendo l’Analisi delle Componenti Principali (PCA) sulle rappresentazioni. Queste rappresentazioni sono state generate da modelli in diverse fasi di fine-tuning e dai rispettivi checkpoint corrispondenti.
![Proiezione delle rappresentazioni con PCA durante il fine-tuning di un modello Vision Transformer (ViT) [1] su CIFAR10 [3]; Fonte: creata dall'autore - Pubblicata precedentemente in Cambiamenti delle Rappresentazioni durante il Fine-Tuning](https://miro.medium.com/v2/resize:fit:640/1*jYdWl_8UM6ecV1ux8_qr1Q.gif)
L’animazione ha ricevuto oltre 200.000 visualizzazioni ed è stata ben accolta, con molti lettori interessati a sapere come è stata creata. Questo articolo è qui per supportare quei lettori e chiunque altro sia interessato a creare visualizzazioni simili.
In questo articolo, mi propongo di fornire una guida completa su come creare un’animazione del genere, dettagliando i passaggi coinvolti: fine-tuning, creazione delle rappresentazioni, rilevamento degli outlier, PCA, Procrustes, revisione e creazione dell’animazione.
- L’impronta di carbonio di GPT-4
- Il data storytelling – l’arte di raccontare storie attraverso i dati
- Le aziende tecnologiche sperano che gli allenamenti possano convincere le donne ad acquistare visori VR
Il codice completo per l’animazione è disponibile anche nel notebook allegato su GitHub.
Preparazione: Fine-tuning
Il primo passo è eseguire il fine-tuning del modello Vision Transformer (ViT) google/vit-base-patch16–224-in21k [1], che è pre-addestrato. Utilizziamo il dataset CIFAR-10 [2] per questo, contenente 60.000 immagini classificate in dieci classi diverse: aerei, auto, uccelli, gatti, cervi, cani, rane, cavalli, navi e camion.
Puoi seguire i passaggi descritti nel tutorial di Hugging Face per la classificazione delle immagini con i transformers per eseguire il processo di fine-tuning anche su CIFAR-10. Inoltre, utilizziamo un TrainerCallback
per salvare i valori di perdita durante l’addestramento in un file CSV per un uso successivo nell’animazione.
from transformers import TrainerCallbackclass PrinterCallback(TrainerCallback): def on_log(self, args, state, control, logs=None, **kwargs): _ = logs.pop("total_flos", None) if state.is_local_process_zero: if len(logs) == 3: # skip last row with open("log.csv", "a") as f: f.write(",".join(map(str, logs.values())) + "\n")
È importante aumentare l’intervallo di salvataggio per i checkpoint impostando save_strategy="step"
e un valore basso per save_step
in TrainingArguments
per garantire un numero sufficiente di checkpoint per l’animazione. Ogni frame nell’animazione corrisponde a un checkpoint. Durante l’addestramento viene creata una cartella per ogni checkpoint e il file CSV è pronto per ulteriori utilizzi.
Creazione delle Rappresentazioni
Utilizziamo la classe AutoFeatureExtractor
e AutoModel
della libreria Transformers per generare le rappresentazioni dal dataset di test di CIFAR-10 utilizzando diversi checkpoint del modello.
Ogni rappresentazione è un vettore a 768 dimensioni che rappresenta una delle 10.000 immagini di test per un determinato checkpoint del modello. Queste rappresentazioni possono essere salvate nella stessa cartella dei checkpoint per mantenere una buona panoramica.
Estrazione degli Outlier
Possiamo utilizzare la classe OutOfDistribution
fornita dalla libreria Cleanlab per identificare gli outlier basandosi sulle rappresentazioni per ogni checkpoint. I punteggi risultanti possono quindi identificare i primi 10 outlier per l’animazione.
from cleanlab.outlier import OutOfDistributiondef get_ood(sorted_checkpoint_folder, df): ... ood = OutOfDistribution() ood_train_feature_scores = ood.fit_score(features=embedding_np) df["scores"] = ood_train_feature_scores
Applicazione di PCA e Analisi di Procrustes
Con un’Analisi delle Componenti Principali (PCA) per il pacchetto scikit-learn, visualizziamo gli embedding in uno spazio bidimensionale riducendo i vettori da 768 dimensioni a 2 dimensioni. Quando ricalcoliamo la PCA per ogni passaggio temporale, possono verificarsi grandi salti nell’animazione a causa di inversioni di asse o rotazioni. Per affrontare questo problema, applichiamo un’ulteriore Analisi di Procrustes [3] dal pacchetto SciPy per trasformare geometricamente ogni fotogramma sull’ultimo fotogramma, che comporta solo traslazione, rotazione e ridimensionamento uniforme. Questo consente transizioni più fluide nell’animazione.
from sklearn.decomposition import PCAfrom scipy.spatial import procrustesdef make_pca(sorted_checkpoint_folder, pca_np): ... embedding_np_flat = embedding_np.reshape(-1, 768) pca = PCA(n_components=2) pca_np_new = pca.fit_transform(embedding_np_flat) _, pca_np_new, disparity = procrustes(pca_np, pca_np_new)
Revisione in primo piano
Prima di finalizzare l’intera animazione, effettuiamo una revisione in primo piano. In questo processo, utilizziamo il primo e l’ultimo checkpoint per generare l’embedding, la PCA e la rilevazione degli outlier. Carichiamo il DataFrame risultante in Spotlight:

Spotlight fornisce una tabella esaustiva in alto a sinistra, mostrando tutti i campi presenti nel dataset. In alto a destra vengono visualizzate due rappresentazioni PCA: una per gli embedding generati utilizzando il primo checkpoint e una per l’ultimo checkpoint. Infine, nella sezione inferiore, vengono presentate le immagini selezionate.
Avvertenza: l’autore di questo articolo è anche uno degli sviluppatori di Spotlight.
Creare l’animazione
Per ogni checkpoint, creiamo un’immagine, che poi memorizziamo insieme al suo checkpoint corrispondente.
Ciò viene realizzato attraverso l’utilizzo delle funzioni make_pca(...)
e get_ood(...)
, che generano i punti bidimensionali che rappresentano l’embedding ed estraggono i 8 outlier migliori, rispettivamente. I punti bidimensionali vengono tracciati con colori corrispondenti alle rispettive classi. Gli outlier vengono ordinati in base al loro punteggio e le immagini corrispondenti vengono visualizzate in una classifica di punteggio elevato. La perdita di addestramento viene caricata da un file CSV e tracciata come un grafico a linea.
Infine, tutte le immagini possono essere compilate in un GIF utilizzando librerie come imageio o simili.

Conclusioni
Questo articolo ha fornito una guida dettagliata su come creare un’animazione che visualizza il processo di fine-tuning di un modello Vision Transformer (ViT). Abbiamo esaminato i passaggi per generare e analizzare gli embedding, visualizzare i risultati e creare un’animazione che riunisca questi elementi.
Creare un’animazione del genere non solo aiuta a comprendere il complesso processo di fine-tuning di un modello ViT, ma rappresenta anche uno strumento potente per comunicare questi concetti agli altri.
Il codice completo per l’animazione è disponibile nel notebook allegato su GitHub.
Sono un professionista esperto nella creazione di soluzioni software avanzate per l’esplorazione interattiva dei dati non strutturati. Scrivo su dati non strutturati e utilizzo potenti strumenti di visualizzazione per analizzare e prendere decisioni informate.
Riferimenti
[1] Alexey Dosovitskiy, Lucas Beyer, Alexander Kolesnikov, Dirk Weissenborn, Xiaohua Zhai, Thomas Unterthiner, Mostafa Dehghani, Matthias Minderer, Georg Heigold, Sylvain Gelly, Jakob Uszkoreit, Neil Houlsby, Un’immagine vale 16×16 parole: i transformer per il riconoscimento delle immagini su scala (2020), arXiv
[2] Alex Krizhevsky, Apprendimento di più livelli di caratteristiche da immagini ridotte (2009), Università di Toronto
[3] Gower, John C. Analisi di Procrustes generalizzata (1975), Psychometrika