Question answering visiva modulare tramite generazione di codice

Visually guided question answering through code generation.

Pubblicato da Sanjay Subramanian, dottorando presso UC Berkeley, e Arsha Nagrani, ricercatore presso Google Research, Perception Team

La visual question answering (VQA) è un compito di machine learning che richiede a un modello di rispondere a una domanda su un’immagine o un insieme di immagini. Gli approcci VQA convenzionali richiedono una grande quantità di dati di addestramento etichettati costituiti da migliaia di coppie domanda-risposta annotate dall’uomo associate alle immagini. Negli ultimi anni, i progressi nel pre-addestramento su larga scala hanno portato allo sviluppo di metodi VQA che funzionano bene con meno di cinquanta esempi di addestramento (few-shot) e senza alcun dato di addestramento VQA annotato dall’uomo (zero-shot). Tuttavia, c’è ancora un significativo divario di prestazioni tra questi metodi e i metodi VQA completamente supervisionati all’avanguardia, come MaMMUT e VinVL. In particolare, i metodi few-shot hanno difficoltà con il ragionamento spaziale, il conteggio e il ragionamento multi-hop. Inoltre, i metodi few-shot sono generalmente limitati a rispondere a domande su singole immagini.

Per migliorare la precisione degli esempi VQA che coinvolgono un ragionamento complesso, in “Modular Visual Question Answering via Code Generation”, che apparirà alla conferenza ACL 2023, introduciamo CodeVQA, un framework che risponde alle domande visuali utilizzando la sintesi di programmi. In particolare, quando viene fornita una domanda su un’immagine o un insieme di immagini, CodeVQA genera un programma Python (codice) con semplici funzioni visive che gli consentono di elaborare le immagini e esegue questo programma per determinare la risposta. Dimostriamo che nell’ambito few-shot, CodeVQA supera i lavori precedenti di circa il 3% sul dataset COVR e il 2% sul dataset GQA.

CodeVQA

L’approccio CodeVQA utilizza un grande modello di linguaggio (LLM) per la scrittura di codice, come PALM, per generare programmi Python (codice). Guidiamo l’LLM nell’uso corretto delle funzioni visive creando un prompt composto da una descrizione di queste funzioni e meno di quindici esempi “in contesto” di domande visive abbinati al codice Python associato ad esse. Per selezionare questi esempi, calcoliamo le rappresentazioni per la domanda di input e per tutte le domande per le quali abbiamo programmi annotati (un insieme di cinquanta scelto casualmente). Quindi, selezioniamo le domande che hanno la massima similarità con l’input e le usiamo come esempi in contesto. Dato il prompt e la domanda che vogliamo rispondere, l’LLM genera un programma Python che rappresenta quella domanda.

Istanziamo il framework CodeVQA utilizzando tre funzioni visive: (1) query, (2) get_pos e (3) find_matching_image.

  • Query, che risponde a una domanda su un’immagine singola, è implementata utilizzando il metodo Plug-and-Play VQA (PnP-VQA) few-shot. PnP-VQA genera didascalie utilizzando BLIP, un trasformatore di immagini e didascalie pre-addestrato su milioni di coppie immagine-didascalia, e le alimenta a un LLM che restituisce le risposte alla domanda.
  • Get_pos, che è un localizzatore di oggetti che prende in input una descrizione di un oggetto e restituisce la sua posizione nell’immagine, è implementato utilizzando GradCAM. In particolare, la descrizione e l’immagine vengono passate attraverso l’encoder di testo-immagine congiunto BLIP, che predice un punteggio di corrispondenza immagine-testo. GradCAM prende il gradiente di questo punteggio rispetto alle caratteristiche dell’immagine per trovare la regione più rilevante per il testo.
  • Find_matching_image, che viene utilizzato nelle domande multi-immagine per trovare l’immagine che corrisponde meglio a una determinata frase di input, è implementato utilizzando gli encoder di testo e immagini BLIP per calcolare una rappresentazione testuale per la frase e una rappresentazione delle immagini per ogni immagine. Quindi, i prodotti scalari della rappresentazione testuale con ciascuna rappresentazione dell’immagine rappresentano la rilevanza di ciascuna immagine rispetto alla frase e scegliamo l’immagine che massimizza questa rilevanza.

Le tre funzioni possono essere implementate utilizzando modelli che richiedono pochissima annotazione (ad esempio, testo e coppie testo-immagine raccolte dal web e un piccolo numero di esempi VQA). Inoltre, il framework CodeVQA può essere facilmente generalizzato oltre a queste funzioni ad altre che un utente potrebbe implementare (ad esempio, rilevamento degli oggetti, segmentazione delle immagini o recupero delle basi di conoscenza).

Illustrazione del metodo CodeVQA. Prima, un grande modello di linguaggio genera un programma Python (codice), che invoca funzioni visive che rappresentano la domanda. In questo esempio, viene utilizzato un metodo VQA semplice (query) per rispondere a una parte della domanda e un localizzatore di oggetti (get_pos) per trovare le posizioni degli oggetti menzionati. Successivamente, il programma produce una risposta alla domanda originale combinando le uscite di queste funzioni.

Risultati

Il framework CodeVQA genera ed esegue correttamente programmi Python non solo per domande su singole immagini, ma anche per domande su più immagini. Ad esempio, se vengono fornite due immagini, ognuna che mostra due panda, una domanda che potrebbe essere posta è: “È vero che ci sono quattro panda?” In questo caso, LLM converte la domanda di conteggio sulle due immagini in un programma in cui viene ottenuto un conteggio degli oggetti per ogni immagine (utilizzando la funzione di query). Quindi i conteggi per entrambe le immagini vengono sommati per calcolare un conteggio totale, che viene quindi confrontato con il numero nella domanda originale per ottenere una risposta sì o no.

Valutiamo CodeVQA su tre set di dati di ragionamento visivo: GQA (singola immagine), COVR (multi-immagine) e NLVR2 (multi-immagine). Per GQA, forniamo 12 esempi in contesto a ciascun metodo, e per COVR e NLVR2, forniamo sei esempi in contesto a ciascun metodo. La tabella qui sotto mostra che CodeVQA migliora costantemente rispetto al metodo di VQA con pochi esempi di base su tutti e tre i set di dati.

Metodo       GQA       COVR       NLVR2      
VQA con pochi esempi PnP       46.56       49.06       63.37      
CodeVQA       49.03       54.11       64.04      
Risultati sui set di dati GQA, COVR e NLVR2, che mostrano che CodeVQA migliora costantemente rispetto a VQA con pochi esempi di base. La metrica è l’accuratezza di corrispondenza esatta, cioè la percentuale di esempi in cui la risposta predetta corrisponde esattamente alla risposta corretta.

Riscontriamo che in GQA, l’accuratezza di CodeVQA è approssimativamente del 30% superiore rispetto alla linea di base nelle domande di ragionamento spaziale, del 4% superiore nelle domande “e” e del 3% superiore nelle domande “o”. La terza categoria include domande multi-hop come “Ci sono agitatori di sale o skateboard nell’immagine?”, per le quali il programma generato è mostrato di seguito.

img = open_image("Image13.jpg")
salt_shakers_exist = query(img, "Ci sono degli agitatori di sale?")
skateboards_exist = query(img, "Ci sono degli skateboard?")
if salt_shakers_exist == "sì" or skateboards_exist == "sì":
    risposta = "sì"
else:
    risposta = "no"

In COVR, riscontriamo che il vantaggio di CodeVQA rispetto alla linea di base è maggiore quando il numero di immagini in input è più grande, come mostrato nella tabella qui sotto. Questa tendenza indica che suddividere il problema in domande su singole immagini è vantaggioso.

         Numero di immagini      
Metodo    1    2    3    4    5   
Few-shot PnP-VQA     91.7    51.5    48.3    47.0    46.9   
CodeVQA    75.0    53.3    48.7    53.2    53.4   

Conclusioni

Presentiamo CodeVQA, un framework per il question answering visuale few-shot che si basa sulla generazione di codice per eseguire un ragionamento visuale a più passaggi. Direzioni entusiasmanti per lavori futuri includono l’espansione dell’insieme di moduli utilizzati e la creazione di un framework simile per compiti visivi al di là del VQA. Sottolineiamo che bisogna fare attenzione quando si considera se implementare un sistema come CodeVQA, poiché è stato dimostrato che i modelli di visione-linguaggio utilizzati nelle nostre funzioni visive mostrano dei pregiudizi sociali. Allo stesso tempo, rispetto ai modelli monolitici, CodeVQA offre un’interpretabilità aggiuntiva (attraverso il programma Python) e una controllabilità (modificando i prompt o le funzioni visive), che sono utili nei sistemi di produzione.

Ringraziamenti

Questa ricerca è stata una collaborazione tra il laboratorio di ricerca sull’intelligenza artificiale (BAIR) dell’UC Berkeley e Google Research, ed è stata condotta da Sanjay Subramanian, Medhini Narasimhan, Kushal Khangaonkar, Kevin Yang, Arsha Nagrani, Cordelia Schmid, Andy Zeng, Trevor Darrell e Dan Klein.