52  Linguaggi di programmazione probabilistici

Prerequisiti

Concetti e competenze chiave

52.1 Cos’è la programmazione probabilistica

La programmazione probabilistica è un paradigma della programmazione informatica che consente di creare modelli e algoritmi capaci di gestire l’incertezza e la casualità. Combina i principi della teoria delle probabilità con la programmazione, permettendo di costruire sistemi in grado di ragionare su dati incerti e di prendere decisioni informate. Questo approccio consente di esprimere modelli complessi in modo naturale e intuitivo, facilitando il processo di inferenza bayesiana.

La programmazione probabilistica si colloca all’intersezione tra algoritmi di machine learning, statistica e linguaggi di programmazione. I suoi obiettivi principali sono semplificare il processo di inferenza e automatizzarlo.

La gerarchia logica generale della programmazione probabilistica può essere vista così:

InferenzaSistema di programmazione probabilisticaLinguaggio di programmazione probabilisticaModelliApplicazioni

52.2 Perché abbiamo bisogno della programmazione probabilistica?

Scrivere un proprio campionatore per l’inferenza bayesiana è un compito estremamente difficile. Richiede competenze matematiche avanzate e una profonda conoscenza degli algoritmi di campionamento (sia MCMC che approssimati). Inoltre, ci sono numerosi problemi potenziali legati alla stabilità numerica e ai costi computazionali. Questo significa che per riuscirci bisogna essere allo stesso tempo degli ottimi sviluppatori e degli esperti statistici.

È però possibile delegare tutti questi compiti a un sistema che li automatizzi, permettendoci di concentrarci sulla risoluzione dei problemi scientifici.

52.3 Linguaggi di programmazione probabilistica (PPLs)

In questa sezione esamineremo il panorama moderno dei linguaggi di programmazione probabilistica (PPLs) e, nella sezione successiva, esploreremo le funzionalità di uno di questi, Stan.

Un PPL ci consente di formalizzare un modello bayesiano e di eseguire l’inferenza grazie a potenti algoritmi. L’utente deve solo definire il modello, scegliere un campionatore (se necessario) e “premere il pulsante dell’inferenza”.

In generale, ciò che si richiede da un linguaggio di programmazione probabilistica è la capacità di: - estrarre valori casuali da distribuzioni; - condizionare i valori delle variabili su osservazioni (dati).

Alcuni dei primi linguaggi e strumenti di programmazione probabilistica, come BUGS e WinBUGS, hanno aperto la strada, offrendo tre capacità chiave:

  • random: per creare variabili casuali,
  • constraint: per vincolare variabili ai dati osservati,
  • infer: per restituire la distribuzione di una variabile.

L’elenco dei linguaggi di programmazione probabilistica attualmente esistenti è molto lungo e in continua crescita. Ecco alcuni esempi:

  • BUGS, WinBUGS, JAGS,
  • Stan,
  • PyMC3, PyMC4, PyMC,
  • Nimble,
  • Pyro, NumPyro,
  • Edward, TensorFlow Probability, Edward 2,
  • Gen,
  • Turing,
  • Stheno,
  • SOSS,
  • Omega,
  • Infer.NET.

52.4 Come scegliere un PPL?

Dal punto di vista pratico, come si può decidere quale linguaggio di programmazione probabilistica scegliere? Ecco alcuni fattori chiave da considerare:

  • Funzionalità: valuta il linguaggio in base alla disponibilità di un ampio range di distribuzioni probabilistiche e campionatori.
  • Personalizzazione: verifica se il PPL permette di definire distribuzioni e campionatori personalizzati.
  • Performance: alcuni PPL offrono ottimizzazioni o capacità di elaborazione parallela per migliorare le prestazioni.
  • Documentazione: la disponibilità di risorse ben documentate, come guide, tutorial e documentazione ufficiale, può avere un grande impatto sulla tua curva di apprendimento e produttività.
  • Supporto della comunità: una comunità attiva e di supporto può essere una risorsa preziosa quando incontri difficoltà o hai domande. Forum, gruppi di discussione e contenuti condivisi dagli utenti possono offrire soluzioni e suggerimenti.
  • Integrazione: valuta se il PPL si integra facilmente con altri strumenti e framework che potresti utilizzare nel tuo progetto. La compatibilità con librerie per la manipolazione dei dati, la visualizzazione o il machine learning può semplificare il flusso di lavoro.

Questi criteri ci aiutano a scegliere il PPL più adatto alle nostre esigenze.