Re: [nexa] AI Training is Copyright Infringement
Dissento.
On 9 Sep 2024, at 11:10, nexa-request@server-nexa.polito.it wrote:
From: Giacomo Tesio <giacomo@tesio.it> ..l
On Mon, 9 Sep 2024 09:50:41 +0200 Giuseppe Attardi wrote:
Che significa “software programmato statisticamente”?
Un software (ovvero una sequenza di byte eseguibili da una macchina con una architettura nota in fase di compilazione) programmato attraverso tecniche statistiche, ovvero basate sull'elaborazione di grandi quantitativi di dati selezionati allo scopo.
Una rete neurale è realizzata con programmi come altri utilizzando algoritmi di ottimizzazione, con un processo di fit dei parametri del modello rispetto ai dati per minimizzare una funzione di loss.
Esatto, ottimo esempio.
Con il termine "rete neurale artificiale" si con-fondono due software diversi programmati con tecniche diverse:
- la macchina virtuale caratterizzata dall'architettura di interesse (la topologia della rete), tipicamente scritta in R, Python, C etc... - il software che quella macchina virtuale esegue, espresso come matrici numeriche, programmato appunto attraverso tecniche statistiche e compilato per quella specifica macchina virtuale
La domanda era proprio cosa significa programmare con tecniche statistiche. Posso capire implementare formule statistiche, ma il codice è pur sempre scritto in un linguaggio di programmazione. Quanto ai due software, proprio non li vedo, c’è solo un software ed è la rete neurale, scritta in un linguaggio di programmaziine a scelta che gira, direttamente o compilato, su una macchina, virtuale o reale. Le matrici sono dati, non software, e non vengono eseguite. Il programma di ottimizzazione (backpropagation) li modifica, ma non sono loro ad eseguire calcoli.
Si tratta di software distinti, anche quando usati insieme.
Il primo software (la macchina virtuale) viene eseguito dall'hardware (che può essere a sua volta virtuale, ovviamente), mentre il secondo (il cosiddetto "modello" della "rete neurale artificiale") viene eseguito dal primo.
La rete neurale implementa il modello direttamente, non in due fasi.
I sorgenti del primo vengono scritti. I sorgenti del secondo vengono selezionati.
I sorgenti del secondo non esistono. I parametri del modello (i contrnuti delle matrici), vengono calcolati attraverso l’ottimizzazione della loss function sui dati di apprendimento (sempre dati sono).
Cambiano le tecniche di programmazione e compilazione, ma rimangono sorgenti di software compilati per essere eseguiti dalle rispettive architetture di interesse.
Un modello statistico sarebbe quello costruito a partire da un campione statistico rappresentativo, selezionato appunto su basi statistiche.
Infatti!
Proprio il software programmato statisticamente a partire dai dataset sorgente non è un modello statistico, è sbagliato chiamarlo "modello".
Altrimenti finisce che i giuristi lo confondono con il data mining.
Ciò non vale per i LLM che usano tutti i dati disponibili, considerandoli la realtà stessa e non la loro rappresentazione.
Gli LLM non hanno alcuna consapevolezza dell'esistenza della realtà. Dunque non possono "considerare" i dati come la realtà.
Certo, intendevo chi li allena non usa tecniche statistiche perché non fa assunzioni statistiche sulla struttura dei dati da cui poter estrarre un campione rappresentativo: utilizza tutti i dati disponibili indistintamente.
Gli LLM sono programmati compilando i dati SCELTI da chi li programma. La scelta dei contenuti da includere nel dataset è l'aspetto predominante del processo di programmazione statistica.
Non proprio, non viene fatta una scelta basata su criteri statistici. Per i LARGE LM si usano quanti più dati possibile, al massimo si fa una deduplicazione.
Quanto a “imparare”, è discutibile usare termini antropomorfi riguardo alle macchine, ma per intenderci si può dire che fanno qualcosa che si avvicina al nostro concetto di apprendere, ossia saper usare quanto visto in precedenza in situazioni nuove.
No.
La calcolatrice non conosce l'aritmetica, anche se riesce a produrre in output una configurazione di cristalli liquidi che la tua mente può interpretare come somme che non le sono mai state sottoposte in passato.
Una calcolatrice non sa cosa sia un numero più di quanto un LLM non sappia cosa sia un testo.
Infatti una calcolatrice non impara: non saprebbe fare altre operazioni oltre a quelle per cui è stata programmata.
Chi l'ha programmata non le ha insegnato l'aritmetica e lei non l'ha appresa, per nessuna definizione ragionevole di "apprendimento". Chi l'ha programmata ha codificato la _propria_ conoscenza della aritmetica in una serie di circuiti che ne _riproducono_ le regole sulle rappresentazioni elettriche fornite in input.
Allo stesso modo, non c'è alcuna relazione fra il processo di programmazione statistica di una macchina in grado di ridurre vettori e l'apprendimento di un essere umano.
A parte il fatto che ancora non ho capito cosa sia la “programmazione statistica”, una relazione si trova sempre.
Entrambi i processi sono iterativi e producono un cambiamento nel ente che li subisce, non hanno null'altro in comune.
Se dicessi in una conferenza che la frutta "apprende" come comportarsi da marmellata, tutti riderebbero fragorosamente. :-D
Quale sarebbe l’analogia umana di un tale forma di apprendimento?
Dire che un software "apprende" come comportarsi è altrettanto ridicolo, ma hubris, ignoranza e soldi convincono troppe persone a non ridere quando sentono parlare di "machine learning".
Così rimangono solo bambini e buffoni a ricordare che il re è nudo... e i software si programmano.
La domanda era proprio cosa significa programmare con tecniche statistiche.
Significa utilizzare tecniche statistiche (raccolta dati, regressioni lineari, medie, analisi delle frequenze, analisi dei cluster, riduzioni della dimensionalità, etc...) per produrre un software eseguibile da una specifica macchina. La programmazione classica consiste nell'esprimere un algoritmo in una forma eseguibile dalla macchina. Un tempo si foravano le schede, oggi si esprime l'algoritmo in un linguaggio sufficientemente rigoroso da poter essere tradotto meccanicamente nella forma eseguibile dalla macchina. La sostanza non cambia. La programmazione statistica funziona diversamente. Ad esempio, per programmare una Vector Reducing Machine (quella che tu chiami "rete neurale artificiale") la cui topologia permette di mappare una matrice N-dimensionale verso una M-dimensionale - si raccoglie il dataset sorgente - ne si codifica gli elementi come vettori numerici attraverso una analisi statistica - si riduce la dimensionalità del dataset sorgente (selezionando e/o sintetizzando le feature da utilizzare attraverso tecniche statistiche) fino ad ottenere le N dimensioni da utilizzare in input (e le M dimensioni con cui confrontare l'output) - si carica nella VRM un programma che può essere - casuale quando si inizializzano le matrici per la prima volta - noto, se si decide di partire da un eseguibile "pre-trained" E' utile notare che a questo punto la VRM è già in grado di eseguire il programma (quello che tu chiami impropriamente "modello"), mappando i record N-dimensionali del dataset in record M-dimensionali. Tipicamente però questi record output sono inutili o poco utili per cui inizia una fase di compilazione del dataset: si utilizzano iterativamente le righe del dataset per alterare i valori nelle matrici riducendo pian piano l'errore statistico fra il risultato M dimensionale ottenuto dando in input alla VRM ogni record e quello desiderato, attraverso un processo di ottimizzazione statistica chiamato backpropagation. Alla fine del processo la VRM mappa i vettori N dimensionali di ingresso nei vettori M dimensionali di interesse entro un errore accettato. A quel punto si salva l'eseguibile codificato dalle matrici della VRM così da poterlo successivamente rieseguire con qualsiasi VRM che implementi la stessa topologia. Le matrici che tu chiami "modello" codificano un'eseguibile che tutte (e solo) le VRM con quella determinata topologia possono eseguire e nessuno può interpretare. Tale eseguibile è una codifica compressa con perdita di informazione del dataset sorgente che è stato compilato per produrlo, esattamente come i l'eseguibile di un kernel è una codifica compressa con perdita di informazione dei testi sorgente che sono stati compilati per produrlo.
I parametri del modello (i contrnuti delle matrici), vengono calcolati attraverso l’ottimizzazione della loss function sui dati di apprendimento (sempre dati sono).
La distinzione fra software e dato non ha fondamento informatico. Ogni dato è software eseguibile da almeno una macchina programmabile. Puoi infatti facilmente costruire una macchina programmabile che avanza il proprio program counter se riceve in input il byte corrente del proprio programma e si ferma altrimenti. Caricando su questa macchina i byte di un qualsiasi eseguibile x86, questa inizierà ad eseguirlo e fintanto che gli fornirai in input esattamente quegli stessi byte, in ordine, uno alla volta, mentre si fermerà altrimenti. Ma se gli carichi i byte di una foto, sostituendo il suo programma, e poi provi a passargli in input i byte dell'eseguibile x86 usato in precedenza, quella si fermerà, perché è cambiato il suo programma. Se invece gli passi in input i byte della foto, in ordine e uno alla volta, lei continuerà a lavorare come da programma. Caricagli sopra un film o un testo, e farà la stessa cosa con i rispettivi byte. La foto, il film e il testo diventano infatti software eseguibili per questa ipotetica macchina. E non credo di doverti dimostrare che per qualsiasi dato esistono infinite macchine programmabili in grado di eseguire tale dato. Dunque, dimostrato che ogni dato è codifica un eseguibile per infinite macchine virtuali, non dovrebbe sorprenderti che quella che tu chiami "rete neurale artificiale" altro non sia che una macchina in grado di eseguire determinati programmi, codificati sotto forma di matrici numeriche di dimensionalità compatibile.
La rete neurale implementa il modello direttamente, non in due fasi.
Il problema è che ciò che tu chiami "rete neurale artificiale" in realtà è la composizione di due software che vengono implementati e distribuiti separatamente. Il primo software, la macchina virtuale in grado di eseguire qualsiasi insieme di matrici che rispettino le dimensionalità previste dalla topologia scelta, viene programmata esplicitamente, in un linguaggio di programmazione come C, Python, R etc... ed eseguita da un hardware noto (che a sua volta può essere virtuale, come la JVM, o virtualizzato come avviene con QEMU, per intenderci). Il secondo software, è codificato dalle matrici programmate statisticamente con il processo che ho grossolanamente descritto sopra e viene eseguito dal primo software (la macchina virtuale). Il fatto che siano software diversi, oltre che ovvio, è evidente dal fatto che possono essere versionati e distribuiti separatamente nonché sviluppati da gruppi distinti ed indipendenti. Le Vector Reducing Machines sono macchine programmabili estremamente flessibili, in grado di mappare approssimativamente spazi vettoriali qualsiasi indipendentemente dal loro significato, dall'esistenza di una relazione reale etc... Ma il discorso vale per qualsiasi software programmato statisticamente, come ha già mostrato Antonio in questo thread con llama.cpp https://server-nexa.polito.it/pipermail/nexa/2024-September/053196.html Finché continueremo a con-fonderli (conflating) saremo costretti a descrizioni fantasiose e antropomorfe come "intelligenza artificiale" e crederemo che "apprendano" (subendo una inquietante alienazione), mentre le stiamo semplicemente programmando tramite tanti esempi.
Certo, intendevo chi li allena non usa tecniche statistiche perché non fa assunzioni statistiche sulla struttura dei dati da cui poter estrarre un campione rappresentativo: utilizza tutti i dati disponibili indistintamente. [...]
Non proprio, non viene fatta una scelta basata su criteri statistici.
Questo non è vero in generale per le Vector Reducing Machines (già la semplice scelta delle dimensioni rilevanti esprime assunzioni statistiche) ed è veramente ingenuo crederlo per le AI generative commerciali. Prendi banalmente GitHub CopyALot: pensi davvero che misure statistiche come il conteggio delle issue o il conteggio dei fork non abbiano avuto rilevanza del processo di programmazione statistica? Che il kernel di Linux abbia lo stesso peso del codice C scritto da migliaia di studenti alle prime armi?
Per i LARGE LM si usano quanti più dati possibile, al massimo si fa una deduplicazione.
Che è una analisi statistica, così come lo è l'analisi utilizzata per determinare i token da usare nel vocabolario, etc...
Infatti una calcolatrice non impara: non saprebbe fare altre operazioni oltre a quelle per cui è stata programmata.
Neanche una Vector Reducing Machine sa fare altre operazioni oltre alla mappatura fra spazi vettoriali codificata nelle matrici risultanti dal processo di programmazione statistica. Nelle intenzioni di chi la programma, quella mappatura dovrebbe approssima una funzione esistente fra dominio e codominio. Ma il fatto che riesca a fornirci un output a fronte di input non presenti nel dataset sorgente, non significa che abbia "imparato" a fare altre operazioni: semplicemente esegue meccanicamente l'eseguibile che gli viene caricato su qualsiasi input, indipendentemente dal suo significato. Infatti, se gli carichi un eseguibile costituito da matrici casuali, continuerà comunque a produrre un output.
Se dicessi in una conferenza che la frutta "apprende" come comportarsi da marmellata, tutti riderebbero fragorosamente. :-D
Quale sarebbe l’analogia umana di un tale forma di apprendimento?
Ero ironico. Se possiamo dire che una VRM impara mentre la programmi, allora possiamo dire anche che la frutta impara mentre la mescoli. Le due affermazioni hanno la stessa validità scientifica. Giacomo
participants (2)
-
Giacomo Tesio -
Giuseppe Attardi