Stai pensando di perfezionare un LLM? Ecco 3 considerazioni da tenere a mente prima di iniziare.

Thinking of pursuing an LLM? Here are 3 things to consider before starting.

Foto di Brett Jordan su Unsplash

LLMs (Large Language Models) e l’AI generativa sono al centro dell’attenzione al momento. Una statistica sbalorditiva di IBM rivela che quasi 2 su 3 dirigenti di alto livello sentono la pressione degli investitori per accelerare l’adozione di AI generativa. Naturalmente, questa pressione sta filtrando fino alle squadre di Data Science e Machine Learning, responsabili di navigare l’hype e creare implementazioni vincenti.

Con l’evolversi del panorama, l’ecosistema per LLMs si è divergente tra modelli open source e industriali, con un fossato che si riempie rapidamente. Questa scena emergente ha spinto molte squadre a considerare la seguente domanda: come possiamo rendere un LLM più specifico per il nostro caso d’uso?

In questo articolo esploriamo alcune considerazioni chiave che dovrebbero essere in cima alla mente quando si contempla l’investimento di tempo e cicli di ingegneria per costruire un LLM di nicchia. In questo viaggio, è cruciale essere consapevoli di alcune delle ricerche recenti che riguardano le potenziali limitazioni e le migliori pratiche per la costruzione di modelli di linguaggio raffinati. Dopo aver letto questo articolo, sarai dotato di alcune idee in più per guidare la tua organizzazione alla decisione corretta di addestrare o meno e come addestrare.

Potresti non riuscire a imitare GPT con un modello open source

Non è un segreto per nessuno che OpenAI stia guidando la carica dei LLM con le sue ultime iterazioni di GPT. Per questo motivo, molti stakeholder potrebbero chiedere a un team di sviluppo di implementare un modello che imiti i risultati del modello più robusto per vari motivi (limiti di velocità, privacy dei dati, costi, ecc.). Ciò porta naturalmente i developer a chiedersi: possiamo generare output da GPT e utilizzarli per raffinare un modello?

La risposta a questa domanda rimane incerta, poiché sembra dipendere da diversi fattori. Questo particolare compito, noto come apprendimento per imitazione, prevede l’addestramento di un nuovo modello di linguaggio attraverso il raffinamento utilizzando osservazioni di destinazione da un modello più avanzato come GPT. Sebbene sembri un ottimo modo per ottenere buone prestazioni da un modello downstream, presenta alcune potenziali problematiche.

Figura tratta dal riferimento Gudibande et al. [1].

Un recente articolo intitolato “The False Promise of Imitating Proprietary LLMs” [1] getta un po’ di luce sui potenziali ostacoli che potresti incontrare con questo approccio. Gli autori presentano alcuni esperimenti che dimostrano che l’aggiunta di ulteriori dati di imitazione può potenzialmente portare a una degradazione delle prestazioni del modello. Guardando la figura sopra, possiamo vedere che nel grafico centrale l’accuratezza del compito di riferimento diminuisce all’aumentare del numero di token. Ma perché succede questo?

Gli autori suggeriscono che ciò accade perché i modelli di imitazione imparano lo stile del modello che stanno imitando, anziché imparare e comprendere il contenuto del modello. Guardando il riquadro a sinistra della figura sopra, i revisori umani hanno preferito i risultati del modello di imitazione rispetto a quelli di ChatGPT. Dopo aver esplorato, è emerso che i revisori apprezzavano lo stile del modello di imitazione, ma non esaminavano attentamente il contenuto. Si è notato che il contenuto prodotto dal modello di imitazione tendeva ad avere una debole fattualità, portando gli autori a riassumere “i modelli di imitazione incarnano in realtà alcuni degli aspetti peggiori degli assistenti AI: le loro risposte suonano sicure ma sono meno factual di ChatGPT”.

È importante notare che ci sono alcuni scenari in cui i modelli di imitazione possono raggiungere ottime prestazioni. Gli autori fanno notare che i modelli di imitazione possono ottenere buone prestazioni su compiti locali o compiti che replicano un comportamento molto specifico del modello di insegnamento. In un compito creato per lo studio chiamato NQ-Synthetic, gli autori hanno chiesto al modello di linguaggio di generare 10 domande e risposte relative a un determinato contesto. Sorprendentemente, il modello di imitazione ha ottenuto un punteggio vicino a quello di GPT. Ciò suggerisce che modelli più specifici potrebbero ottenere risultati favorevoli quando si cerca di imitare comportamenti da un modello di insegnamento.

Un corollario affascinante del documento è che il raffinamento di un modello utilizzando un modello di insegnamento potrebbe effettivamente aiutare a ridurre il punteggio di tossicità del modello di imitazione. Questo potrebbe essere estremamente utile per le aziende che vogliono esporre rapidamente un LLM open source senza dover affrontare il laborioso compito di costruire filtri che circondano gli output. Invece di cercare manualmente di costruire filtri, le aziende potrebbero invece addestrarsi sugli output di un insieme di dati attentamente curati da un modello di insegnamento per ottenere un solido punto di partenza.

Vale la pena menzionare la recente pubblicazione di Orca, un modello sviluppato da Microsoft Research, che incorpora i segnali di GPT come parte dei dati di addestramento. La differenza qui sta nella dimensione dei dati di addestramento utilizzati per il modello. Orca è sintonizzato su 5 milioni di esempi, mentre il modello di imitazione per una copertura ampia è stato sintonizzato su circa 151mila osservazioni. Poiché presumo che la maggior parte del mio pubblico non investirà $16.000 per addestrare un LLM come esperimento occasionale, sono incline a fare affermazioni che si riferiscono più da vicino al paper di modellizzazione per imitazione che ad Orca. Detto ciò, dovremo aspettare ulteriori ricerche per capire quale sia il numero minimo di esempi richiesti per far emergere l’apprendimento per imitazione come opzione vantaggiosa per compiti più ampi.

Takeaway: A seconda della complessità del tuo compito, tentare di imitare gli output di GPT o di qualsiasi modello sofisticato con un modello più debole potrebbe comportare una scarsa performance del modello.

L’apprendimento in contesto è tutto ciò di cui hai bisogno?

L’apprendimento in contesto, o apprendimento in pochi passi, è il processo di includere esempi specifici del compito nella prompt. Questo approccio è specifico per modelli di linguaggio sofisticati, poiché i modelli open source non hanno ancora raggiunto la flessibilità desiderata per gestire l’apprendimento in contesto. Di solito è possibile ottenere ottimi risultati da questo approccio, ma ti sei mai chiesto perché?

La risposta a questa domanda è esplorata in un paper di Dai et al. [3], dove hanno esplorato le connessioni matematiche tra il caricamento degli esempi nella prompt e il fine-tuning utilizzando gli stessi esempi. Gli autori dimostrano che gli esempi della prompt producono meta-gradienti che vengono riflessi durante la propagazione in avanti al momento dell’infertenza. Nel caso del fine-tuning, gli esempi producono effettivamente gradienti reali che vengono utilizzati per aggiornare i pesi. Pertanto, sembra che l’apprendimento in contesto raggiunga risultati simili al fine-tuning. Per una comprensione più approfondita di questi risultati, incoraggerei a leggere il paper, che non risparmia dettagli sulle connessioni matematiche.

Anche se l’approccio dell’apprendimento in contesto è eccellente, esiste una limitazione che non è evidente nel fine-tuning. Nel caso in cui abbiamo un grande corpus di dati di addestramento, un modello sintonizzato farà uso di tutti quei dati aggiornando il modello con gradienti reali durante l’addestramento. Durante l’apprendimento in contesto possiamo fornire solo un numero limitato di osservazioni. Quindi qui sorge una domanda: dato un corpus di addestramento sostanziale, come possiamo utilizzare gli esempi più rilevanti dati in ingresso per ottenere i migliori risultati?

Un approccio per affrontare questo problema è selezionare gli esempi utilizzando un’euristica, e fortunatamente, LangChain fornisce supporto per questo. LangChain è un modulo Python che sostanzialmente ospita prompt pre-costruiti che semplificano il lavoro con modelli di linguaggio. Lo strumento di LangChain che ci interessa in questo momento è l’ExampleSelector .

def get_similarity(seq_a: str, seq_b: str) -> Union[float, int]:    """     Crea un'euristica di similarità,    qui usiamo la similarità di Jaccard o IOU        seq_a: Prima sequenza da confrontare    seq_b: Seconda sequenza da confrontare        Returns:    Punteggio di similarità (float o int)    """    # Tokenizzazione    set_a = set(seq_a.split(' '))    set_b = set(seq_b.split(' '))         # Calcola la similarità di IOU/Jaccard    return len(set_a.intersection(set_b)) / len(set_a.union(set_b))def example_selector(examples: List[str], input: str, examples2use: int) -> List[str]:    """     Pseudo codice per un selettore di esempi        examples: Elenco di corpus di addestramento    input: Sequenza di destinazione da tradurre    examples2use: Numero di esempi da utilizzare        Returns:    Elenco di esempi selezionati    """    scores = [get_similarity(example, input) for example in examples]    sorted_idx = [i for i, _ in sorted(enumerate(scores), key=lambda x: x[1], reverse=True)]    return examples[sorted_idx[:examples2use]]

Gli ExampleSelector sono un tipo di manipolatore di prompt che ci consente di cambiare dinamicamente gli esempi utilizzati durante l’infertenza. Ci sono molte euristiche che possono essere utilizzate. Sopra ho creato del pseudo codice di come funziona essenzialmente un selettore di LangChain. Ho usato la similarità di Jaccard tra la sequenza di input e la sequenza di esempio sopra. In LangChain ci sono molte altre opzioni, quindi controllale qui .

Ci sono due vantaggi primari nell’avere un approccio del genere. Il primo è che permetti al tuo LLM di essere efficiente nei dati, scegliendo selettivamente gli esempi più rilevanti per l’input dato. Questo è opposto ad avere alcuni esempi staticamente caricati per tutte le osservazioni. Il secondo vantaggio deriva dai risparmi di costo, se si sintonizza attraverso un servizio gestito. Al momento della stesura, utilizzare un modello di base Davinci sintonizzato costa $0,12 per 1.000 token. In contrasto, utilizzare instruct Davinci costa $0,02, che è un aumento del 400% del prezzo! Questi prezzi non includono nemmeno il costo dell’addestramento.

È importante notare che questi prezzi sono soggetti a cambiamenti poiché OpenAI non sta ancora utilizzando LoRa o Adattatori, come rivelato in un post del blog ora cancellato [5]. Tuttavia, i modelli raffinati sono comunque più costosi a causa della necessità di mantenere pesi personalizzati per singoli utenti. Ciò non tiene conto neanche del costo degli esempi in contesto. Il tuo team dovrà valutare se ICL o il raffinamento sono più sensati per il tuo compito dal punto di vista dei costi e dell’accuratezza.

Considerazioni: l’Apprendimento in Contesto con caricamento dinamico degli esempi potrebbe ottenere gli stessi risultati del raffinamento senza costi aggiuntivi sostanziali che deriverebbero da un servizio gestito.

Il tuo compito beneficia di uno o più passaggi intermedi prima dell’infine inferenza?

Supponiamo che tu stia cercando di rispondere a domande complesse su documenti lunghi. Questo compito richiede fondamentalmente che il modello linguistico abbia una buona padronanza del linguaggio e della comprensione. Ciò ci porta a una domanda: e se assistessimo il modello linguistico nella suddivisione del processo di ragionamento in sottotasks, simili a come un essere umano analizzerebbe un documento ed eseguirebbe sequenzialmente i compiti?

Figura tratta da Jörke et al. [4].

Questo è esattamente ciò che i ricercatori di Microsoft hanno cercato di realizzare e la loro risposta a questo problema è PEARL [4]. PEARL sta per Planning and Executing Actions for Reasoning over Long documents. Il framework generale è suddiviso in tre fasi:

  1. Action Mining: Il modello linguistico viene prima invitato a leggere i documenti ed estrarre le possibili azioni che potrebbero essere utilizzate per rispondere a domande specifiche del dominio. Per estrarre queste azioni, il modello linguistico viene dato alcuni esempi di azioni. Ho incluso un esempio di come potrebbe apparire un’azione di seguito.
  2. Plan Generation: Dopo aver generato un insieme di azioni specifiche per il compito, il LLM è ora chiesto di generare una successiva lista di azioni da eseguire in ordine dato una domanda e un contesto. Il LLM viene fornito di alcuni esempi di piani per altri compiti che aiutano nella costruzione di un piano di qualità. Maggiori dettagli sulle tecnicalità si possono trovare nella carta.
  3. Plan Execution: Il modello ha ora il piano. Forniamo ora gli input al modello ed eseguiamo il piano.
Esempio di azione tratta da Jörke et al. [4].

Ci sono alcuni passaggi intermedi che vengono utilizzati per garantire la qualità tra le fasi. Gli autori includono una fase di auto-correzione che garantisce che il piano sia conforme al formato richiesto. C’è anche una fase di auto-raffinamento che determina se il piano può essere utilizzato in seguito come esempio a poche riprese.

Tabella tratta da Jörke et al. [4].

Nell’evaluazione, PEARL ha dimostrato notevoli miglioramenti rispetto ad altri modelli GPT, in particolare quando sono stati inclusi documenti lunghi. Il punto chiave di questo processo è che in alcuni casi avere più passaggi può assistere significativamente il modello.

Un altro scenario in cui avere passaggi intermedi si dimostra vantaggioso è quando il numero di documenti da includere nel contesto supera quello supportato dal modello linguistico. Come attualmente si presenta, il meccanismo di attenzione utilizzato da OpenAI scala a O(n²) e non c’è ancora una soluzione per superare questo problema [5]. Ciò suscita un notevole interesse per ridurre il contesto alla forma più minimale possibile.

A seconda del tuo compito, ci sono modi per gestirlo. Ad esempio, se il tuo compito ruota interamente attorno alle entità, c’è l’opportunità di estrarre le entità rilevanti e le loro proprietà correlate. Puoi pensare a questo approccio come una compressione lossy che ti consente di alimentare più contesto nel LLM. Un altro vantaggio di questo passaggio intermedio è che hai convertito dati non strutturati in un formato strutturato, il che ti consente di prendere decisioni informate senza il LLM. Un esempio di questo compito è mostrato di seguito nella figura di Fei et al. [6].

Figura tratta da Fei et al. [6]

Conclusione: Suddividere un compito in problemi più piccoli può aiutare a semplificare un problema più grande in pezzi più gestibili. Puoi anche utilizzare questi compiti più piccoli per risolvere i collo di bottiglia legati alle limitazioni del modello.

Pensieri conclusivi

Queste sono alcune idee generali su ciò che i ricercatori stanno esplorando nelle nuove frontiere delle prestazioni e dell’efficienza di LLM. Questo non è un elenco esaustivo di tutte le cose da considerare quando si affina un modello, ma è un buon punto di partenza quando si considera il percorso.

Per ulteriori letture, questo post di Hugging Face riguardante l’addestramento di LLM è piuttosto interessante e sarebbe un ottimo punto di partenza quando si esplorano modelli di imitazione su un problema locale. Ottenere una comprensione concreta di LangChain è anche estremamente utile. Sebbene la maggior parte della libreria potrebbe essere riscritta per il tuo caso d’uso, il principale vantaggio è che è più facile tenersi aggiornati con la ricerca se altre persone scrivono il codice per te!

Ecco di nuovo le conclusioni:

  1. A seconda della complessità del tuo compito, cercare di imitare le uscite di GPT o di qualsiasi modello sofisticato con un modello più debole potrebbe portare a una scarsa performance del modello.
  2. L’apprendimento in contesto con il caricamento dinamico degli esempi può ottenere gli stessi risultati del fine-tuning senza costi aggiuntivi sostanziali che deriverebbero da un servizio gestito.
  3. Suddividere un compito in problemi più piccoli può aiutare a semplificare un problema più grande in pezzi più gestibili. Puoi anche utilizzare questi compiti più piccoli per risolvere i collo di bottiglia legati alle limitazioni del modello.

Grazie per aver letto l’articolo! Le mie principali aree di interesse sono la creazione di interazioni personalizzate per gli utenti. Ti preghiamo di interagire con l’articolo e di seguirmi su Nisoo! Se vuoi contattarmi riguardo a eventuali errori tecnici in questo articolo o per rimanere in contatto, ti preghiamo di contattarmi su LinkedIn.

Riferimenti

[1] Arnav Gudibande, Eric Wallace, Charlie Snell, Xinyang Geng, Hao Liu, Pieter Abbeel, Sergey Levine, & Dawn Song. (2023). La falsa promessa di imitare LLM proprietari.

[2] Mukherjee, S., Mitra, A., Jawahar, G., Agarwal, S., Palangi, H., & Awadallah, A. (2023). Orca: apprendimento progressivo dalle tracce di spiegazione complesse di GPT-4. arXiv: Calcolo e Linguaggio.

[3] Damai Dai, Yutao Sun, Li Dong, Yaru Hao, Shuming Ma, Zhifang Sui, & Furu Wei. (2023). Perché GPT può apprendere in contesto? I modelli di linguaggio eseguono implicitamente la discesa del gradiente come meta-ottimizzatori.

[4] Jörke, M., Sefidgar, Y., Massachi, T., Suh, J., & Ramos, G. (2023). Pearl: una sonda tecnologica per la riflessione assistita dalla macchina sui dati personali. In IUI 2023.

[5] Habib, R.. (2023). I piani di OpenAI secondo Sam Altman.

[6] Hao Fei, Fei Li, Chenliang Li, Shengqiong Wu, Jingye Li e Donghong Ji, (2022). Ereditare la saggezza dei predecessori: un framework a cascata multiplex per l’analisi unificata del sentimento basata sugli aspetti.