Imparare a scrivere come Aldo Giannuli

di | Marzo 12, 2023

Se siete degli appassionati di politica e di intelligence, avrete sicuramente sentito parlare di Aldo Giannuli.

Aldo Sabino Giannuli è un docente universitario e consulente per le procure italiane. Nel 1994, Giannuli è stato incaricato di elaborare due schede di sintesi sulle stragi di piazza Fontana e di piazza della Loggia. Da allora, è stato consulente per le procure di Palermo, Bari, Milano, Pavia e Brescia. Nel 1996, Giannuli ha trovato una grande quantità di documenti non catalogati dell’Ufficio Affari Riservati del Ministero dell’Interno, nascosti nell’archivio della circonvallazione Appia.

È uno dei principali esperti italiani di servizi segreti e di storia dell’intelligence e ha pubblicato diversi saggi sul tema. Giannuli è stato anche un collaboratore di vari quotidiani e periodici, come il manifesto, Limes, e Formiche. Ha pubblicato numerosi saggi in tema di intelligence, sicurezza nazionale e terrorismo, diventando uno dei maggiori esperti italiani in questo campo. Tra i suoi scritti più noti, si possono citare “Come i servizi segreti usano i media. Con quali tecniche l’intelligence influenza e interpreta l’informazione?” e “Come funzionano i servizi segreti. Dalla tradizione dello spionaggio alle guerre non convenzionali del prossimo futuro“. Inoltre, Giannuli ha anche partecipato a numerosi convegni e seminari, sia in Italia che all’estero, per discutere le tematiche legate alla sicurezza e all’intelligence. Insomma, il professor Giannuli è una autorità nel campo dell’intelligence e dei servizi segreti.

In questo articolo vedremo come utilizzare un modello di deep learning per imitare lo stile di scrittura di Aldo Giannuli. Utilizzeremo la libreria TensorFlow e il modello GPT-2 Simple, una libreria open-source scritta in Python che fornisce un’interfaccia semplice per utilizzare il modello di linguaggio naturale GPT-2, che è stato sviluppato da OpenAI.

Il modello GPT-2 ha una capacità di elaborazione del linguaggio naturale molto avanzata, grazie ad una architettura di deep learning basata su una rete neurale trasformatore. Il modello è stato allenato su enormi quantità di dati di testo, per generare testo in modo autoregressivo, cioè producendo ogni parola del testo in base alle parole precedenti.

Prima di iniziare, dobbiamo scaricare il dataset che utilizzeremo per addestrare il nostro modello. In questo caso, abbiamo utilizzato un file di testo contenente tutta l’opera omnia di Aldo Giannuli. Il file si chiama “aldo_giannuli.txt” e dovrà essere posizionato nella stessa cartella del codice.

import tensorflow as tf
import gpt_2_simple as gpt2
from datetime import datetime

import os
os.environ['TF_GPU_ALLOCATOR'] = 'cuda_malloc_async'
print(os.getenv('TF_GPU_ALLOCATOR'))


file_name = "aldo_giannuli.txt"
run_name = 'run2'
model_name = '124M'

gpt2.download_gpt2(model_name=model_name)
sess = gpt2.start_tf_sess()

In questo primo blocco di codice, importiamo le librerie TensorFlow e gpt_2_simple, che ci permetteranno di utilizzare il modello GPT-2. Inoltre, impostiamo alcune opzioni per l’addestramento del modello, come il nome del file di input (“aldo_giannuli.txt”), il nome del modello da utilizzare (“124M”) e il nome della cartella dove verrà salvato il modello (“run2”).

Successivamente, scarichiamo il modello GPT-2 utilizzando la funzione gpt2.download_gpt2(model_name=model_name), che si occuperà di scaricare i pesi del modello. Infine, avviamo una sessione TensorFlow utilizzando la funzione gpt2.start_tf_sess().

Dopo aver definito la configurazione del progetto, si può procedere con la fase di addestramento del modello. La funzione finetune() viene utilizzata per addestrare un modello GPT-2 su un dataset di testo specificato tramite l’argomento dataset. In questo caso, il dataset è il file aldo_giannuli.txt, che contiene tutte le opere di Aldo Giannuli.

gpt2.finetune(sess,
              dataset=file_name,
              model_name=model_name,
              steps=1000,
              restore_from='fresh',
              run_name=run_name,
              print_every=10,
              sample_every=200,
              save_every=500,
              only_train_transformer_layers=True,
              accumulate_gradients=1
              )

L’argomento model_name specifica la versione del modello GPT-2 che deve essere utilizzata durante l’addestramento, in questo caso la versione “124M”. Il modello GPT-2 Simple da 124M è una versione più piccola del modello GPT-2 originale, con 124 milioni di parametri anziché 1,5 miliardi. Questa versione più piccola è più facile da utilizzare e richiede meno risorse computazionali per l’elaborazione del testo, ma offre comunque una capacità di generazione del linguaggio naturale molto avanzata. L’argomento steps specifica il numero di iterazioni di addestramento da eseguire, in questo caso 1000. L’argomento restore_from specifica se deve essere caricato un modello esistente o se deve essere creato un nuovo modello. In questo caso, il valore “fresh” indica che deve essere creato un nuovo modello.

Gli argomenti print_every, sample_every e save_every specificano rispettivamente dopo quante epoche stampare informazioni sul progresso dell’addestramento, generare del testo campione e salvare il modello addestrato.

L’argomento only_train_transformer_layers indica se devono essere addestrate solo le ultime layer del modello, che sono quelle più specifiche per il task di generazione di testo, e non quelle preaddestrate. Questo permette di risparmiare tempo ed evitare di sovrascrivere le conoscenze pregresse del modello.

sess = gpt2.start_tf_sess()
gpt2.load_gpt2(sess, run_name=run_name)

Dopo aver addestrato il modello, è possibile caricare il modello addestrato per generare del testo. La funzione load_gpt2() viene utilizzata per caricare un modello GPT-2 addestrato a partire dal nome specificato nella variabile run_name.

input_prompt = "La guerra tra Russia e Stati Uniti è stata combattuta anche sul fronte dei servizi segreti, infatti"

gpt2.generate(sess, run_name=run_name, temperature=.7, length=500,
              prefix=input_prompt, top_k=40, nsamples=1)

Infine, la funzione generate() viene utilizzata per generare del testo a partire da un prompt specificato tramite l’argomento prefix. In questo caso, il prompt è la stringa “La guerra tra Russia e Stati Uniti è stata combattuta anche sul fronte dei servizi segreti, infatti”, ma si può usare qualsiasi testo. La lunghezza del testo generato è specificata tramite l’argomento length, in questo caso di 500 parole, mentre l’argomento temperature specifica il grado di creatività nella generazione del testo. L’argomento nsamples specifica quanti testi di esempio generare, a noi ne basta uno.

Valori più alti di temperatura produrranno testo più creativo e sorprendente, ma anche più aleatorio e a volte incoerente. Il parametro length indica il numero di caratteri massimo che il modello deve generare come risposta al prompt. Infine, top_k indica il numero di parole più probabili che il modello considererà durante la generazione del testo. Questi parametri possono essere regolati a seconda del tipo di testo che si desidera generare.

Riporto, a titolo di esempio, il testo generato dal modello dopo 2800 epoche:

e quello, invece, generato a partire dal modello addestrato per 3000 epoche e sul prompt fornito da me:

La guerra tra Russia e Stati Uniti è stata combattuta anche sul fronte dei servizi segreti, infatti c’è solo una svolta russa, che è il caporedattore dell’ambasciata russa.  L’esempio del genere è che quello dei sistemi russi e del francesi, che sono davvero appoggiati dall’Alleanza atlantica, sono anche di spesso una serie di fattori: ad esempio in fondo l’avvocato Fulvio Bellavita è stato definito come il caso della «Guerra rivoluzionaria» che ha portato a una sua grande capacità di comprensione che, per quanto andamento e che abbiamo citato, ha avuto qualche intervento privato della vita di Aloja. Poi questo, nel momento in cui l’autorità giudiziaria italiana si è diretta, ha avuto una sua capacità di comprensione senza precedenti e non infrequenti gradi di vita. Nel momento in cui si avverte nei confronti delle sue relazioni, uno dei quali ha avuto la sua esistenza con un altro.  La situazione si è dimostrata e lascia una grande capacità di comprensione. I paesi del mondo (non euro-americano di cui parleremo) hanno visto il proprio territorio (o «pacifico con la NATO») e, soprattutto, i paesi europei hanno saldamente visto la Libia nella Polonia e, in quel periodo, i paesi asiatici hanno saldamente cercando di raggiungere i territori (in particolare in Romania) di cui abbiamo detto. Questo si è esclusa con il problema di una rivoluzione internazionale, che ha sempre caratteri di «regionali internazionali». Il blocco di Mosca ha sempre avuto come esso è assolutamente autonomo, ma, nello stesso tempo, ha subito una soluzione più solidità di quelli sostanzialmente di una rivoluzione internazionale. Per tutti gli altri paesi europei hanno formato «federati dalle correnti» in cui si è fatto una forte differenza rispetto al partiti di governo, sia perché una quota di rivoluzione internazionale ha minato conto delle caratteristiche autonomamente nel blocco orientale.  Il blocco di Mosca è sempre stato raggiunto una prassi di rivoluzione internazionale per tutti gli altri paesi, ma per il loro tempo, è il passaggio all’Europa, segnato dalla fine del blocco di Mosca.  La situazione si è trasformata in forme di regolamentazione rivoluzionaria, in forme di regolamentazione neolistica, in forme di regolamentazione disinteressato, in forme di regolamentazione anticonstruarle, in forme di regolamentazione anticiclica. Questo è la partita più sofisticata dall’ascesa di un nuovo colpo di Stato che ha fatto una serie di regole all’immagine in senso filosofico.  Le considerazioni della situazione si intrecciano con la fine delle riviste, ma anche con l’elezione del presidente della Repubblica Mariano Barreca.

Ovviamente, il testo generato non è un gran ché oltre ad essere completamente privo di senso, e non si può certo paragonare alla prosa elegante e raffinata del professor Giannuli, ma con un addestramento migliore e con un modello più esteso, come quello dal 355 milioni di parametri o ancora maggiore, è possibile ottenere risultati più soddisfacenti e aderenti alla realtà. Io purtroppo non dispongo di architetture hardware che mi permettono di fare di meglio.

In conclusione, il codice mostrato sopra rappresenta solo un esempio di come si può utilizzare il modello GPT-2 di OpenAI per generare testo simile a quello di un autore specifico, in questo caso Aldo Giannuli.

Il modello può essere addestrato su qualsiasi insieme di testi, a patto che il formato sia corretto, e può essere utilizzato per diversi scopi, come la generazione automatica di testo, la creazione di chatbot o l’analisi dei sentimenti. Tuttavia, va sottolineato che l’utilizzo del modello richiede conoscenze di programmazione e di machine learning, e che il testo generato non deve essere considerato come una fonte affidabile di informazioni.

Lascia un commento