Programación probabilística

La programación probabilística (PP) es un paradigma de programación en el que se especifican modelos probabilísticos y la inferencia a partir de estos modelos se realiza automáticamente.[1]​ Representa un intento de unificar el modelado probabilístico y la programación tradicional de propósito general para hacer que el primero sea más fácil y más aplicable.[2][3]​ Este paradigma se puede usar para crear sistemas que ayuden a tomar decisiones ante la incertidumbre.

Los lenguajes de programación utilizados para la programación probabilística se denominan "lenguajes de programación probabilística" (PPL por sus siglas en inglés).

Aplicaciones

editar

El razonamiento probabilístico se ha utilizado para una amplia variedad de tareas tales como la predicción de los precios de las acciones, recomendación de películas, diagnóstico por computadora, detección de intrusiones cibernéticas y de objetos en imágenes.[4]​ Sin embargo, hasta hace poco (en parte debido al poder de cómputo limitado), la programación probabilística tenía un alcance limitado y la mayoría de los algoritmos de inferencia tenían que escribirse manualmente para cada tarea.

Sin embargo, en 2015, se utilizó un programa probabilístico de visión por computadora de 50 líneas para generar modelos 3D de rostros humanos basados en imágenes 2D de esos rostros. El programa utilizaba gráficos inversos como base de su método de inferencia y se creó utilizando el paquete Picture de Julia.[4]​ Esto hizo posible "en 50 líneas de código lo que solía tomar miles".[5][6]

La biblioteca de programación probabilística Gen (también escrita en Julia) se ha aplicado a tareas de visión y robótica.[7]

Más recientemente, los sistemas de programación probabilística Turing.jl han tenido diversas aplicaciones farmacéuticas y económicas.[8]

La programación probabilística en Julia también se ha combinado con programación diferenciable al combinar el paquete de Julia Zygote.jl con Turing.jl.[9]

Lenguajes de programación probabilísticos

editar

Los PPL a menudo se extienden a partir de algún otro lenguaje base. La elección del lenguaje subyacente depende de la similitud del modelo con la ontología del lenguaje básico así como de consideraciones comerciales y preferencias personales. Por ejemplo, Dimple y Chimple se basan en Java, Infer.NET se basa en .NET, mientras PRISM se extiende desde Prolog. Sin embargo, algunos PPL como WinBUGS y Stan ofrecen un lenguaje auto-contenido, sin un origen obvio en otro lenguaje.

Varios PPL están en desarrollo activo, incluidos algunos en prueba beta. Las dos herramientas más populares son Stan y PyMC3.[10]

Relacional

editar

Un lenguaje de programación relacional probabilístico (PRPL) es un PPL especialmente diseñado para describir e inferir con modelos relacionales probabilísticos (PRM).

Un PRM generalmente se desarrolla con un conjunto de algoritmos para reducir, inferir y descubrir distribuciones.

Lista de lenguajes de programación probabilísticos.

editar
Nombre Extendido de Lenguaje anfitrión
Analytica C++
bayesloop Python Python
CuPPL NOVA
Venture Scheme C++
Probabilistic-C C C
Anglican Clojure Clojure
IBAL OCaml
BayesDB SQLite, Python
PRISM B-Prolog
Infer.NET .NET Framework .NET Framework
dimple MATLAB, Java
chimple MATLAB, Java
BLOG Java
delSAT SAT (DIMACS CNF)
PSQL SQL
BUGS
FACTORIE Scala
PMTK MATLAB MATLAB
Alchemy C++
Dyna Prolog
Figaro Scala
Church Scheme Various: JavaScript, Scheme
ProbLog Prolog Python, Jython
ProBT C++, Python
Stan C++
Hakaru Haskell Haskell
BAli-Phy Haskell C++
ProbCog Java, Python
Gamble Racket
PWhile While Python
Tuffy Java
PyMC3 Python, Theano Python
PyMC4[11] Python, TensorFlow Probability Python
greta[12] TensorFlow R
pomegranate[13] Python Python
Lea Python Python
WebPPL JavaScript JavaScript
Picture[4] Julia Julia
Turing.jl Julia Julia
Gen[14] Julia Julia
Low-level First-order PPL Python, Clojure, Pytorch Various: Python, Clojure
Troll Moscow ML
Edward[15] TensorFlow Python
TensorFlow Probability[16] TensorFlow Python
Edward2[17] TensorFlow Probability Python
Pyro[18] PyTorch Python
Saul[19] Scala Scala
RankPL[20] Java
Birch[21] C++
PSI[22] D

Dificultad

editar

El razonamiento sobre las variables como distribuciones de probabilidad causa dificultades a los programadores novatos pero estas dificultades pueden abordarse mediante el uso de visualizaciones de red bayesianas y gráficos de distribuciones de variables incrustadas en el editor de código fuente.[23]

Véase también

editar

Referencias

editar
  1. «Probabilistic programming does in 50 lines of code what used to take thousands». 13 de abril de 2015. Consultado el 13 de abril de 2015. 
  2. «Probabilistic Programming». probabilistic-programming.org. Archivado desde el original el 10 de enero de 2016. Consultado el 24 de diciembre de 2013. 
  3. Pfeffer, Avrom (2014), Practical Probabilistic Programming, Manning Publications. p.28. ISBN 978-1 6172-9233-0
  4. a b c «Short probabilistic programming machine-learning code replaces complex programs for computer-vision tasks». 13 de abril de 2015. Consultado el 27 de noviembre de 2017. 
  5. Hardesty, Larry (13 de abril de 2015). «Graphics in reverse». 
  6. «MIT shows off machine-learning script to make CREEPY HEADS». 
  7. «MIT's Gen programming system flattens the learning curve for AI projects». VentureBeat (en inglés estadounidense). 27 de junio de 2019. Consultado el 27 de junio de 2019. 
  8. Predicting Drug-Induced Liver Injury with Bayesian Machine Learning, 2019 .
  9. ∂P: A Differentiable Programming System to Bridge Machine Learning and Scientific Computing, 2019 .
  10. «The Algorithms Behind Probabilistic Programming». Consultado el 10 de marzo de 2017. 
  11. Developers, PyMC (17 de mayo de 2018). «Theano, TensorFlow and the Future of PyMC». PyMC Developers. Consultado el 25 de enero de 2019. 
  12. «greta: simple and scalable statistical modelling in R». GitHub. Archivado desde el original el 3 de octubre de 2018. Consultado el 2 de octubre de 2018. 
  13. «Home — pomegranate 0.10.0 documentation». pomegranate.readthedocs.io (en inglés). Consultado el 2 de octubre de 2018. 
  14. «Gen: A General Purpose Probabilistic Programming Language with Programmable Inference». Archivado desde el original el 12 de noviembre de 2020. Consultado el 17 de junio de 2019. 
  15. «Edward – Home». edwardlib.org. Consultado el 17 de enero de 2017. 
  16. TensorFlow (11 de abril de 2018). «Introducing TensorFlow Probability». TensorFlow. Consultado el 2 de octubre de 2018. 
  17. «'Edward2' TensorFlow Probability module». GitHub (en inglés). Consultado el 2 de octubre de 2018. 
  18. «Pyro». pyro.ai (en inglés). Consultado el 9 de febrero de 2018. 
  19. «CogComp - Home». Archivado desde el original el 16 de enero de 2018. Consultado el 25 de julio de 2020. 
  20. Rienstra, Tjitze (18 de enero de 2018), RankPL: A qualitative probabilistic programming language based on ranking theory, consultado el 18 de enero de 2018 .
  21. «Probabilistic Programming in Birch». birch-lang.org. Consultado el 20 de abril de 2018. 
  22. «PSI Solver - Exact inference for probabilistic programs». psisolver.org. Consultado el 18 de agosto de 2019. 
  23. Gorinova, Maria I.; Sarkar, Advait; Blackwell, Alan F.; Syme, Don (1 de enero de 2016). A Live, Multiple-Representation Probabilistic Programming Environment for Novices. CHI '16. New York, NY, USA: ACM. pp. 2533-2537. ISBN 9781450333627. doi:10.1145/2858036.2858221. 

Enlaces externos

editar