Interpretabilità

Leggendo il post di Massimo Belloni su Medium, che afferma provocatoriamente che nel campo della Machine Learning se si capisce come funziona un algoritmo allora esso è inutile, mi sono accorto di una cosa che in genere passa inosservata, o almeno che io non avevo ancora notato. Belloni fa l’esempio di un algoritmo di classificazione, per cui gli algoritmi “classici”, come un albero di decisione, si comportano a suo parere peggio di quelli moderni; e soprattutto afferma che il supposto vantaggio di potere interpretare i risultati non è affatto tale. L’interpretabilità per lui è una semplice questione di fiducia: se un modello funziona bene con i dati di addestramento e male con quelli di test la risposta è che o sono malfatti i dati oppure è sbagliato l’ambiente di test. In fin dei conti quello che noi abbiamo nel caso del machine learning (ML) è un caso in cui noi sappiamo qual è la domanda, sappiamo anche qual è la risposta, ma non conosciamo un modo facile per passare dalla domanda alla risposta. L’esempio che fa è distinguere tra un cane e un gatto: e la chiosa finale è che se ci fosse un modo facile per farlo, allora non servirebbe tutto l’armamentario del ML ma si potrebbe scrivere quello che quarant’anni fa passava per “sistema esperto”: una sfilza di if-then-else.

Il discorso tecnicamente fila, ma mi pare che ci sia un problema di base. È ovvio che noi possiamo seguire passo passo un programma e “capire cosa fa”, anche se nel caso non abbiamo la più pallida idea del perché lo faccia. Insomma la teleologia è al di fuori della nostra comprensione degli algoritmi. Ma tutto questo è poi vero? Torniamo un attimo indietro e rifugiamoci sull’informatica teorica. Come sapete, la classe di algoritmi NP comprende quelli “difficili”, nel senso che il costo computazionale per risolverli ottimamente cresce in modo esponenziale con la dimensione dei dati in ingresso. All’atto pratico si studiano algoritmi che danno un risultato quasi ottimale, o che portano quasi sempre alla risposta ottimale, e si vive felici; i teorici non sono però contenti di questo stato di cose. Immaginiamo però un sistema ML che risolva in tempo polinomiale uno di questi problemi. Dovremmo fidarci? La risposta è affermativa, ma per una semplice ragione: una caratteristica dei problemi NP è che anche se non sappiamo se esiste un algoritmo di soluzione che giri in tempo polinomiale possiamo però verificare la soluzione in tempo polinomiale. Quindi abbiamo un modo per verificare quanto ci è stato detto.

Il vero problema si ha quando usiamo questi algoritmi per risolvere un problema di cui non solo non conosciamo la risposta, ma non possiamo nemmeno verificarla. Pensiamo a un algoritmo che debba stabilire quanti sussidi dare a un insieme di persone, sapendo che la quantità di denaro totale a disposizione è limitata. In questo caso la matematica o l’informatica non ci possono aiutare: se non sappiamo verificare il risultato né interpretarlo, dobbiamo fidarci ciecamente di esso, e scaricare le responsabilità sull'”asettico algoritmo” che però forse tanto asettico non è, perché dà un peso esagerato a caratteristiche a noi ignote e che avremmo eliminato se solo le avessimo conosciute. In un certo senso, insomma, è come se lanciassimo una moneta: una tecnica a prova di imparzialità ma non necessariamente la migliore. Non si può far finta che gli algoritmi facciano tutto da soli!

Maurizio Codogno

Matematto divagatore; beatlesiano e tuttologo at large. Scrivo libri (trovi l'elenco qui) per raccontare le cose che a scuola non vi vogliono dire, perché altrimenti potreste apprezzare la matematica.