# Programació diferenciable

La programació diferenciable és un paradigma de programació en el qual un programa d'ordinador numèric es pot diferenciar mitjançant la diferenciació automàtica. Això permet l'optimització basada en el gradient dels paràmetres del programa, sovint mitjançant el descens del gradient, així com altres enfocaments d'aprenentatge que es basen en informació derivada d'ordre superior. La programació diferenciable ha trobat ús en una gran varietat d'àrees, especialment la informàtica científica i l'aprenentatge automàtic. Una de les primeres propostes per adoptar aquest marc de manera sistemàtica per millorar els algorismes d'aprenentatge va ser feta per l'equip de conceptes avançats de l'Agència Espacial Europea a principis de 2016.

## Enfocaments

La majoria dels marcs de programació diferenciables funcionen mitjançant la construcció d'un gràfic que conté el flux de control i les estructures de dades del programa. Els intents generalment es divideixen en dos grups:
* Gràfic estàtic compilat enfocaments basats en com ara TensorFlow, Theano i MXNet. Acostumen a permetre una bona optimització del compilador i una escala més fàcil a sistemes grans, però la seva naturalesa estàtica limita la interactivitat i els tipus de programes que es poden crear fàcilment (per exemple, els que impliquen bucles o recursivitat), a més de dificultar el raonament dels usuaris. eficaçment sobre els seus programes. Una cadena d'eines del compilador de prova de concepte anomenada Myia utilitza un subconjunt de Python com a interfície i admet funcions d'ordre superior, recursivitat i derivades d'ordre superior.
* Sobrecàrrega d'operadors, enfocaments basats en gràfics dinàmics com ara PyTorch i el paquet autograd de NumPy. La seva naturalesa dinàmica i interactiva permet que la majoria dels programes s'escriguin i es raonin amb més facilitat. Tanmateix, donen lloc a una sobrecàrrega de l'intèrpret (sobretot quan es redacten moltes operacions petites), una escalabilitat més pobra i un benefici reduït de l'optimització del compilador. Un paquet per al llenguatge de programació Julia – Zigot – funciona directament a la representació intermèdia de Julia, la qual cosa permet que encara sigui optimitzada pel compilador just-in-time de Julia.
Una limitació dels enfocaments anteriors és que només són capaços de diferenciar el codi escrit d'una manera adequada per al marc, limitant la seva interoperabilitat amb altres programes. Els enfocaments més nous resolen aquest problema mitjançant la construcció del gràfic a partir de la sintaxi o IR del llenguatge, permetent diferenciar codi arbitrari.

## Aplicacions

La programació diferenciable s'ha aplicat en àrees com la combinació d'aprenentatge profund amb motors físics en robòtica, resoldre problemes d'estructura electrònica amb teoria funcional de densitat diferenciable, traçat de raigs diferenciables, processament d'imatges, i programació probabilística.

## Aplicació multidisciplinària

La programació diferenciable està fent avenços significatius en diversos camps més enllà de les seves aplicacions tradicionals. En ciències de la salut i de la vida, per exemple, s'està utilitzant per a l'aprenentatge profund en el modelatge de mecanismes moleculars basat en biofísica. Això implica aprofitar la programació diferenciable en àrees com la predicció de l'estructura de proteïnes i el descobriment de fàrmacs. Aquestes aplicacions demostren el potencial de la programació diferenciable per contribuir a avenços significatius en la comprensió de sistemes biològics complexos i la millora de les solucions sanitàries.

## Referències

* ↑ Izzo, Dario. «Differentiable Genetic Programming». A: Genetic Programming (en anglès). 10196, 2017, p. 35–51 (Lecture Notes in Computer Science). DOI 10.1007/978-3-319-55696-3_3. ISBN 978-3-319-55695-6.
* ↑ Baydin, Atilim Gunes; Pearlmutter, Barak A.; Radul, Alexey Andreyevich; Siskind, Jeffrey Mark Journal of Marchine Learning Research, 18, 153, 2018, pàg. 1–43.
* ↑ Wang, Fei. «Backpropagation with Callbacks: Foundations for Efficient and Expressive Differentiable Programming». A: Bengio. NIPS'18: Proceedings of the 32nd International Conference on Neural Information Processing Systems (en anglès). Curran Associates, 2018, p. 10201–10212.
* ↑ Innes, Mike «Còpia arxivada». SysML Conference 2018, 2018. Arxivat de l'original el 2019-07-17 [Consulta: 4 juliol 2019].
* ↑ «Differential Intelligence» (en anglès), 01-10-2016. [Consulta: 19 octubre 2022].
* ↑ Breuleux, O. «Automatic Differentiation in Myia» (en anglès), 2017. Arxivat de l'original el 2019-06-24. [Consulta: 24 juny 2019].
* ↑ Li, Li; Hoyer, Stephan; Pederson, Ryan; Sun, Ruoxi; Cubuk, Ekin D. Physical Review Letters, 126, 3, 2021, pàg. 036401. arXiv: 2009.08551. Bibcode: 2021PhRvL.126c6401L. DOI: 10.1103/PhysRevLett.126.036401. PMID: 33543980 [Consulta: lliure].
* ↑ Li, Tzu-Mao; Aittala, Miika; Durand, Frédo; Lehtinen, Jaakko ACM Transactions on Graphics, 37, 6, 2018, pàg. 222:1–11. DOI: 10.1145/3272127.3275109 [Consulta: lliure].
* ↑ Li, Tzu-Mao; Gharbi, Michaël; Adams, Andrew; Durand, Frédo; Ragan-Kelley, Jonathan ACM Transactions on Graphics, 37, 4, 01-08-2018, pàg. 139:1–13. DOI: 10.1145/3197517.3201383 [Consulta: lliure].
* ↑ AlQuraishi, Mohammed; Sorger, Peter K. Nature Methods, 18, 10, 01-10-2021, pàg. 1169–1180. DOI: 10.1038/s41592-021-01283-4. PMC: 8793939. PMID: 34608321.