Re: [nexa] "pogrammazione statistica" o "intelligenza artificiale"? [era: AI Training is Copyright Infringement]
Date: Wed, 11 Sep 2024 21:53:58 +0000 From: Giacomo Tesio <giacomo@tesio.it>
Ciao Giuseppe,
Il 11 Settembre 2024 16:38:55 UTC, Giuseppe Attardi <attardi@di.unipi.it> ha scritto:
Mi spiace dover dissentire da Enrico.
Dissenti anche da me o solo da Enrico?
Ti ho proposto una semplice dimostrazione dell'equivalenza fra dato e programma:
``` 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. ``` (qui <https://server-nexa.polito.it/pipermail/nexa/2024-September/053214.html>)
Non ti convince?
Te ne propongo un'altra: ho qui una macchina programmabile che ad ogni ciclo legge un nuovo bit dal programma caricato e chiude un circuito se il bit vale 1, mentre lo apre se vale 0.
Ho provato a caricargli un binario ARM e l'ha eseguito senza problemi. Ho provato con un COFF e un ELF e li ha eseguiti senza problemi. Allora ho provato con una foto, e ha continuato ad accendere e spegnere una lampadina esattamente secondo l'ordine dei bit forniti. Infine ho provato a caricare la tua mail, e la macchina (me ne scuso) ne ha eseguito ogni bit, dal primo all'ultimo.
Perché la mia macchina irriverente continua ad eseguire qualsiasi dato che io gli carico senza distinguere fra istruzioni e non?
Il tuo programma esegue istruzioni che leggono dei dati qualunque, non eseguono quei dati. Il fatto che quei dati siano una *rappresentazione* in un certo formato di istruzioni non li fa eseguire dalla tua macchina, perché non passano dal suo interprete (CPU), ma dalla sua ALU. L’architettura Von Neumann e la MTU prevedono che i programmi vengano rappresentati nella stessa forma, per comodità nel primo caso (in alternativa alla Harvard architecture) e per generalità la seconda (una singola macchina anziché infinite), ma c’è un passo ineludibile passaggio di trasformazione prr ottenere larappresentazione come dato di un programma, tipicamente un compilatore.
In altri termini, qualunque istruzione può essere rappresentata come dato, ma non ogni dato può essere interpretato come istruzione...
Perché questo predicato diventi vero è necessario aggiungere "da una qualsiasi macchina programmabile"
No, qualunque sia la macchina, esiste un dato (anzi infiniti) che non sono interpretabili da quella macchina, o, se vuoi, che danno errore se eseguiti. L’insieme delle rappresentazioni dei programmi è un sottoinsieme stretto di quello dei dati.
La verità di tale predicato però non esclude in alcun modo che possano esistere infinite macchine programmabili in grado di eseguire un qualsiasi dato.
Ossia la semantica di un’istruzione è strettamente legata al suo interprete, quella di un dato no.
Anche qui, perché il predicato diventi vero dobbiamo sostiire "dato" con "quasiasi dato": molte macchine infatti possolo eseguire solo certe sequenze di bit e non altre.
Un x86 non eseguirà correttamente un eseguibile ARM o JVM.
D'altto canto ogni Vector Reducing Machine è in grado di eseguire solo le matrici numeriche la cui dimensionalità è compatibile
Sono macchine programmabili diverse, ma pur sempre macchine il cui comportamento dipende esclusivamente dal programma fornito.
Mi puoi spiegare dove sbaglio?
L’errore sta nel verbo “eseguire”: si eseguono istruzioni, sui dati si opera. Le Vector Reducing Machine effettuano operazioni matriciali su vettori e matrici, le matrici non eseguono alcunché. C’è una circuiteria apposta nelle GPU per operare su matrici, seguendo le *istruzioni* fornite tramite la libreria CUDA; se le matrici eseguissero, potresti fare a meno delle GPU e di CUDA.
Giacomo
Scusa Giuseppe, evidentemente la mia dimostrazione per costruzione non è stata abbastanza chiara. On Thu, 12 Sep 2024 09:04:12 +0200 Giuseppe Attardi wrote:
From: Giacomo Tesio <giacomo@tesio.it>
ho qui una macchina programmabile che ad ogni ciclo legge un nuovo bit dal programma caricato e chiude un circuito se il bit vale 1, mentre lo apre se vale 0.
Il tuo programma esegue istruzioni che leggono dei dati qualunque, non eseguono quei dati. Il fatto che quei dati siano una *rappresentazione* in un certo formato di istruzioni non li fa eseguire dalla tua macchina, perché non passano dal suo interprete (CPU), ma dalla sua ALU.
Programma? CPU? ALU? No, no... io parlo di una macchina fisica! Utilizza due pile stilo e puoi costruirtene una anche tu! Sono sufficienti: - un buon vecchio mangianastri, di quelli analogici senza alcuna diavolerie informatica (bonus point se rotto e con più di 30 anni :-D) - una porta seriale femmina - un relè normalmente aperto - cavetti, resistenze, amplificatori e quelle robe lì. Connetti la seriale ai cavi dell'ingresso audio e i controlli del relé all'uscita audio (se necessario, aggiustando propriamente il segnale). Se sei buono con l'elettronica, puoi anche costruirtelo da zero, a partire da due induttanze, un motorino, qualche interruttore etc... (io non lo sono per nulla e infatti non l'ho montata io) Per programmare questa macchina ci metto dentro una cassetta (la memoria) e connetto la seriale al mio laptop. Poi semplicemente imposto il baud rate della seriale a 8, premo il pulsante REC e avvio il comando `cat file.jpeg > /dev/ttyS0` Quando il comando ritorna aspetto ancora qualche secondo e poi interrompo la registrazione. Ora che il mio file.jpeg è caricato sulla macchina, non mi rimane che farglielo eseguire: connetto il circuito che preferisco ai contatti del relè e schiaccio play. La mia macchina programmabile esegue il file.jpeg senza alcuna esitazione, dall'inizio alla fine, aprendo e chiudendo il circuito esattamente come previsto. Se ci carico sopra un eseguibile COFF o un ELF, lo esegue senza indugi, esattamente come fa con la tua mail.
L’architettura Von Neumann e la MTU...
Definiscono sottoinsiemi delle macchine programmabili. Ma una macchina programmabile è qualsiasi macchina il cui comportamento possa essere cambiato "without changing a single wire" [1].
No, qualunque sia la macchina, esiste un dato (anzi infiniti) che non sono interpretabili da quella macchina, o, se vuoi, che danno errore se eseguiti.
Bene, ti sfido: inviami un file non vuoto che la mia macchina non riesca ad eseguire, così ci avrai dimostrato che
L’insieme delle rappresentazioni dei programmi è un sottoinsieme stretto di quello dei dati.
Altrimenti sapremo che "data is code <=> code is data". Inoltre, se ci riesci, ti offro una birra (o un caffé, se preferisci). Se ti arrendi, la offri a me. Ci stai? Quando ce la beviamo?
Le Vector Reducing Machine effettuano operazioni matriciali su vettori e matrici, le matrici non eseguono alcunché.
Le VRM hanno un vettore in input e producono un vettore in output. Come effettuano questa mappatura è determinato precisamente dalle matrici che gli carichi dentro, esattamente come il comportamento della mia macchinetta dipende dai byte che gli carico dentro. Sono realizzate in modo diverso, programmate in modo diverso e usate in modo diverso, ma entrambe sono macchine programmabili. (fino a prova contraria... che attendo con ansia! :-D) Giacomo [1] Dijkstra scriveva "the general purpose computer is no more than a handy device for implementing any thinkable mechanism without changing a single wire", ma non tutte le macchine programmabili sono general purpose. Purtuttavia eseguono programmi. https://www.cs.utexas.edu/~EWD/transcriptions/EWD08xx/EWD898.html
Giacomo, la tua macchina è decisamente degenere come programmazione: - (Pseudo)istruzioni di un solo bit; - Incapacità di operare su dati ("esegue" un "programma" copiando l'input nell'output: è irrilevante che in ingresso ci sia un bit e in uscita una lampadina; di fatto è un amplificatore, non un computer, ...perché non "computa" niente); - Perfetta per considerare qualunque dato un'istruzione; questo sì (è l'unica cosa che fa). Non mi è chiaro a cosa vuoi arrivare. E' un fatto che ogni set di istruzioni sia in numero limitato (le tue "istruzioni" sono due). Se e solo se il numero di istruzioni è pari alla potenza di due del numero di bit con cui si codificano (ed è il tuo caso: 2^1 = 2), allora qualunque dato è un'istruzione. Ad es. se prendi un byte (8 bit), e costruisci un set di 256 istruzioni, viene fuori una macchina un po' più furba della tua: se poi ogni indirizzo è compatibile con la memoria disponibile (anche questo è facile da ottenere), allora hai una macchina che esegue qualsiasi cosa. Però la vera domanda è: "...E ALLORA?" ("...SO WHAT?"). Dopo aver inventato tu l'acqua tiepida, e io l'acqua calda, non mi sembra che andiamo molto lontano... Ribadisco il mio punto: (inizio di) "istruzione" è PER DEFINIZIONE l'indirizzo a cui punta il program counter. Se poi la macchina "esegue" o "si pianta", ...è tutto un altro discorso. Puoi costruire una macchina con 3 istruzioni "serie" codificate in 8 bit più 253 NOP (not operation, ovvero istruzioni fasulle che mandano solo avanti il program counter) per riempire tutti gli spazi di codifica degli 8 bit, ma di nuovo, ...E ALLORA? ----- Original Message ----- From: Giacomo Tesio To: nexa@server-nexa.polito.it Sent: Thursday, September 12, 2024 4:42 PM Subject: Re: [nexa] "pogrammazione statistica" o "intelligenza artificiale"? [era: AI Training is Copyright Infringement] Scusa Giuseppe, evidentemente la mia dimostrazione per costruzione non è stata abbastanza chiara. On Thu, 12 Sep 2024 09:04:12 +0200 Giuseppe Attardi wrote:
From: Giacomo Tesio <giacomo@tesio.it>
ho qui una macchina programmabile che ad ogni ciclo legge un nuovo bit dal programma caricato e chiude un circuito se il bit vale 1, mentre lo apre se vale 0.
Il tuo programma esegue istruzioni che leggono dei dati qualunque, non eseguono quei dati. Il fatto che quei dati siano una *rappresentazione* in un certo formato di istruzioni non li fa eseguire dalla tua macchina, perché non passano dal suo interprete (CPU), ma dalla sua ALU.
Programma? CPU? ALU? No, no... io parlo di una macchina fisica! Utilizza due pile stilo e puoi costruirtene una anche tu! Sono sufficienti: - un buon vecchio mangianastri, di quelli analogici senza alcuna diavolerie informatica (bonus point se rotto e con più di 30 anni :-D) - una porta seriale femmina - un relè normalmente aperto - cavetti, resistenze, amplificatori e quelle robe lì. Connetti la seriale ai cavi dell'ingresso audio e i controlli del relé all'uscita audio (se necessario, aggiustando propriamente il segnale). Se sei buono con l'elettronica, puoi anche costruirtelo da zero, a partire da due induttanze, un motorino, qualche interruttore etc... (io non lo sono per nulla e infatti non l'ho montata io) Per programmare questa macchina ci metto dentro una cassetta (la memoria) e connetto la seriale al mio laptop. Poi semplicemente imposto il baud rate della seriale a 8, premo il pulsante REC e avvio il comando `cat file.jpeg > /dev/ttyS0` Quando il comando ritorna aspetto ancora qualche secondo e poi interrompo la registrazione. Ora che il mio file.jpeg è caricato sulla macchina, non mi rimane che farglielo eseguire: connetto il circuito che preferisco ai contatti del relè e schiaccio play. La mia macchina programmabile esegue il file.jpeg senza alcuna esitazione, dall'inizio alla fine, aprendo e chiudendo il circuito esattamente come previsto. Se ci carico sopra un eseguibile COFF o un ELF, lo esegue senza indugi, esattamente come fa con la tua mail.
L’architettura Von Neumann e la MTU...
Definiscono sottoinsiemi delle macchine programmabili. Ma una macchina programmabile è qualsiasi macchina il cui comportamento possa essere cambiato "without changing a single wire" [1].
No, qualunque sia la macchina, esiste un dato (anzi infiniti) che non sono interpretabili da quella macchina, o, se vuoi, che danno errore se eseguiti.
Bene, ti sfido: inviami un file non vuoto che la mia macchina non riesca ad eseguire, così ci avrai dimostrato che
L’insieme delle rappresentazioni dei programmi è un sottoinsieme stretto di quello dei dati.
Altrimenti sapremo che "data is code <=> code is data". Inoltre, se ci riesci, ti offro una birra (o un caffé, se preferisci). Se ti arrendi, la offri a me. Ci stai? Quando ce la beviamo?
Le Vector Reducing Machine effettuano operazioni matriciali su vettori e matrici, le matrici non eseguono alcunché.
Le VRM hanno un vettore in input e producono un vettore in output. Come effettuano questa mappatura è determinato precisamente dalle matrici che gli carichi dentro, esattamente come il comportamento della mia macchinetta dipende dai byte che gli carico dentro. Sono realizzate in modo diverso, programmate in modo diverso e usate in modo diverso, ma entrambe sono macchine programmabili. (fino a prova contraria... che attendo con ansia! :-D) Giacomo [1] Dijkstra scriveva "the general purpose computer is no more than a handy device for implementing any thinkable mechanism without changing a single wire", ma non tutte le macchine programmabili sono general purpose. Purtuttavia eseguono programmi. https://www.cs.utexas.edu/~EWD/transcriptions/EWD08xx/EWD898.html
Ciao Alfredo, On Thu, 12 Sep 2024 17:14:43 +0200 "Alfredo Bregni" wrote:
Giacomo, la tua macchina è decisamente degenere
piano con i termini, che questa è una mailing list pubblica... per fortuna che è una macchina e non se la prende! :-D
Perfetta per considerare qualunque dato un'istruzione; questo sì
Beh, è una macchina programmabile molto semplice, ma l'ho menzionata e descritta proprio per dimostrare a Giuseppe l'equivalenza fra dato e programma. Sono assolutamente d'accordo che sia la scoperta dell'acqua calda, ma purtroppo c'è chi crede che esista una distinzione.
"esegue" un "programma" copiando l'input nell'output
No, non ha alcun dispositivo di input, solo un canale di caricamento del programma nella memoria.
di fatto è un amplificatore, non un computer
No. Certamente non è un computer, ma non è un amplificatore. E certamente è un hack, ma non è inutile. E' un timer programmabile con memoria a cassette e un'accuratezza di 1/8 di secondo. Di timer programmabili ne trovi diversi in commercio, ma NESSUNO a cassette e programmabili solo via seriale! ;-)
Non mi è chiaro a cosa vuoi arrivare. "...E ALLORA?"
Sto cercando di spiegare come funzionino queste "intelligenze artificiali" e perché le "IA generative" non sono altro che grossi archivi lossy delle opere utilizzate per programmarle e dunque, ad esempio è ovvio che se gli chiedi di risolvere un problema matematico tratto da uno degli eserciziari presenti nel dataset, ti ritornerà la soluzione che lo segue nell'eserciziario. Uno degli scogli per comprenderlo sembra essere la distinzione fra dati ed eseguibili, per cui ho cercato di evidenziarne e dimostrarne l'infondatezza. Per altro, le implicazioni della equivalenza fra dato e codice sono piuttosto controintuitive... distanti dall'interpretazione comune di software e dato.... ma qui e ora sarebbero off-topic. A presto! Giacomo
Ciao Giacomo. 1.
per dimostrare a Giuseppe l'equivalenza fra dato e programma
NON C'E' "equivalenza fra dato e programma". SONO TUTTI DATI. Poi c'è un program counter che suggerisce / impone a una macchina di considerare quel particolare dato come prossima istruzione. E la cosa può funzionare, o anche no. Dipende dalla codifica delle istruzioni della macchina, e da quale dato è stato messo lì. Nel tuo caso, la codifica delle istruzioni è di 1 bit, qualunque dato va bene (il che non è sempre vero), non c'è nulla da eseguire su altri (veri) dati perché sta tutto scritto nel singolo bit, che viene trasferito pari pari dall'istruzione a una lampadina (ogni macchina è alla fine un megashifter di bit, ma almeno shifta bit prendendone altri in memoria e facendoci calcoli sopra; la tua no). 2.
non ha alcun dispositivo di input, solo un canale di caricamento del programma nella memoria.
Nel funzionamento -- il canale di caricamento del programma nella memoria è cosa che ha operato prima -- l'istruzione stessa è il dato che entra dalla memoria (se l'architettura è quella classica, un input da memoria c'è) ed esce sulla lampadina. 3.
non è un computer, ma non è un amplificatore
E' un computer (banale), che sposta il dato di memoria (chiamato pomposamente "istruzione") da dentro a fuori. E' anche un amplificatore perché prende un bit e ci accende una lampadina (utilizzando qualcosa che amplifica il dato 0-1 in tensione e corrente adatte ad accendere una lampadina). 4.
Sto cercando di spiegare come funzionino queste "intelligenze artificiali"...
Sono alla fine dei grossi motori di ricerca "più furbi", ...ma tutto il discorso di dati e istruzioni c'entra ben poco (anche perché sta millanta strati sotto, e a un livello di complessità millemila volte inferiore). Aloha. ----- Original Message ----- From: Giacomo Tesio To: nexa@server-nexa.polito.it Sent: Thursday, September 12, 2024 11:04 PM Subject: Re: [nexa] "pogrammazione statistica" o "intelligenza artificiale"? [era: AI Training is Copyright Infringement] Ciao Alfredo, On Thu, 12 Sep 2024 17:14:43 +0200 "Alfredo Bregni" wrote:
Giacomo, la tua macchina è decisamente degenere
piano con i termini, che questa è una mailing list pubblica... per fortuna che è una macchina e non se la prende! :-D
Perfetta per considerare qualunque dato un'istruzione; questo sì
Beh, è una macchina programmabile molto semplice, ma l'ho menzionata e descritta proprio per dimostrare a Giuseppe l'equivalenza fra dato e programma. Sono assolutamente d'accordo che sia la scoperta dell'acqua calda, ma purtroppo c'è chi crede che esista una distinzione.
"esegue" un "programma" copiando l'input nell'output
No, non ha alcun dispositivo di input, solo un canale di caricamento del programma nella memoria.
di fatto è un amplificatore, non un computer
No. Certamente non è un computer, ma non è un amplificatore. E certamente è un hack, ma non è inutile. E' un timer programmabile con memoria a cassette e un'accuratezza di 1/8 di secondo. Di timer programmabili ne trovi diversi in commercio, ma NESSUNO a cassette e programmabili solo via seriale! ;-)
Non mi è chiaro a cosa vuoi arrivare. "...E ALLORA?"
Sto cercando di spiegare come funzionino queste "intelligenze artificiali" e perché le "IA generative" non sono altro che grossi archivi lossy delle opere utilizzate per programmarle e dunque, ad esempio è ovvio che se gli chiedi di risolvere un problema matematico tratto da uno degli eserciziari presenti nel dataset, ti ritornerà la soluzione che lo segue nell'eserciziario. Uno degli scogli per comprenderlo sembra essere la distinzione fra dati ed eseguibili, per cui ho cercato di evidenziarne e dimostrarne l'infondatezza. Per altro, le implicazioni della equivalenza fra dato e codice sono piuttosto controintuitive... distanti dall'interpretazione comune di software e dato.... ma qui e ora sarebbero off-topic. A presto! Giacomo
Ciao Alfredo, On Thu, 12 Sep 2024 23:48:27 +0200 "Alfredo Bregni" wrote:
NON C'E' "equivalenza fra dato e programma". SONO TUTTI DATI.
Amen! Sono letteralmente anni che lo sostengo: https://video.linuxtrent.it/w/sWFcXj4DpWPTkvdi7jA61u?start=18m18s Il problema era fornire una dimostrazione solida a Giuseppe che sostiene l'esistenza di una differenza fra dati e programmi. Una volta superata questa differenza, tutta una serie di problemi viene meno. Ad esempio, una volta chiarito che le "reti neurali artificiali" non sono altro che macchine programmabili statisticamente per mappare due spazi vettoriali, il fatto che i "modelli" non siano altro che l'eseguibile che ne definisce il comportamento appare evidente, come appare evidente che tale eseguibile sia il prodotto del processo di compilazione dei dataset sorgente. Con tutto ciò che ne consegue in termini di diritto d'autore. Se poi per compiacere OpenAI decidessero che la compilazione fa venir meno il diritto d'autore, io ne sarei felicissimo! Purché valga per tutti i processi di compilazione, non solo a quelli che fanno comodo a OpenAI & friends! Ad esempio, se gli LLM sono sollevati dal copyright degli autori che ne hanno scritto il sorgente, allora devono esserlo neanche i binari per Windows o iOS. Tutto qui. Ora non ci resta che aspettare il file non-eseguibile di Giuseppe. Non tratterrei il fiato, comunque... ;-) Giacomo PS
non è un computer, ma non è un amplificatore
E' un computer (banale), che sposta il dato di memoria (chiamato pomposamente "istruzione") da dentro a fuori.
No, non è un computer perché non fa calcoli. Sulla banalità non saprei... tu quante ne hai a casa? :-D Comunque è una macchina programmabile. E non è inutile. Prendi una semplice automobilina telecomandata di quelle super-economiche che sterzano solo in un verso e connetti la mia macchina programmabile ai cavetti che controllano lo sterzo. Hai appena costruito un'automobilina programmabile a cassette.
Le Vector Reducing Machine effettuano operazioni matriciali su vettori e matrici, le matrici non eseguono alcunché. C’è una circuiteria apposta nelle GPU per operare su matrici, seguendo le *istruzioni* fornite tramite la libreria CUDA; se le matrici eseguissero, potresti fare a meno delle GPU e di CUDA.
Infatti si può fare a meno delle GPU e di CUDA ... se si ha tanto tempo a disposizione. GPU è solo un acceleratore computazionale. Calcoli eseguiti decine, centinaia di volte più velocemente di una CPU. Che a sua volta li esegue migliaia di volte più veloce di un apparato a transistor, prima meccanico ... fino alla prima macchina in grado di eseguire moltiplicazioni, e siamo nel 1671 con Leibniz. Nell'informatica "classica" sui dati si opera, nell'informatica dell'AI i dati si eseguono (perché sottoposti a priori ad un processo "classico" che, *operando sui dati*, ha creato un "semilavorato" eseguibile (attenzione, eseguibile non nel senso che ha per i programmatori). Un paio di esempi. Un software che legge file audio. Il programma contiene le istruzioni. I dati, la musica digitalizzata. Il programma opera sui dati, legge i dati digitalizzati e li trasforma in onde sonore. Stessa cosa avviene con le immagini, i video, ecc. Se i dati hanno un byte errato, nel 99% dei casi non succede nulla di particolarmente grave. Un puntino in uno schermo, un millesimo di secondo di audio perso, ecc. Se i dati contenenti i pesi hanno byte errati in alcune posizioni non funziona nulla. Magari il termine "eseguibile" non è quello esatto, ma di sicuro c'è che i dati AI hanno importanza tale da costituire un cambiamento di paradigma. A.
participants (4)
-
Alfredo Bregni -
Antonio -
Giacomo Tesio -
Giuseppe Attardi