Дифференцируемое программирование

Дифференцируемое программирование — парадигма программирования[1], которая использует автоматическое дифференцирование для вычисления производных функций с учетом входных значений программы.[2][3][4][5][6][7]. Дифференцируемое программирование позволяет провести оптимизацию параметров программы с помощью градиентных методов, часто с использованием градиентного спуска, а также с помощью других обучающих подходов, которые основаны на производной высшего порядка. Дифференцируемое программирование нашло применение в широком кругу отраслей, в частности в научных вычислениях и искусственном интеллекте[7]. Одним из ранних предложений принятия такого подхода для систематического использования для улучшения алгоритмов обучения было сделано командой Advanced Concepts Team в Европейском космическом агентстве в начале 2016 года[8].

Дифференцируемое программирование применяется при решении таких задач, как комбинирование глубокого обучения c физическими движками в робототехнике[9], расчёт электронных структур с использованием теории функционала плотности[10], дифференцируемая трассировка лучей[11], цифровая обработка изображений[12] и вероятностное программирование[7].

Подходы

Работа большинства дифференцируемых фреймворков программирования основана на построении в программе графа, содержащего поток управления и структуры данных[13]. Выделяется две группы подходов — статические и динамические.

Подходы, основанные на статистическом, компилируемом графе используются в TensorFlow[note 1], Theano, и MXNet; их преимущества раскрываются при использовании оптимизурующего компилятора, они легче масштабируются до размера больших систем, но их статический характер ограничивает интерактивность и типы программ, которые без особенных затрат могут созданы с их помощью (например, программы, использующие циклы или рекурсию), также, стоит отметить, что подобные подходы затрудняют объяснение работы программы.[13]. Набор инструментов компилятора для проверки концепции, называемый Miya использует подмножество программного языка Python в качестве фронтенда и поддерживает функции высшего порядка, рекурсию, а также производные высшего порядка.[14][15][16]

Подходы, основанные на перегрузке операторов, динамическом графе используются в PyTorch и AutoGrad. Их динамический и интерактивный характер позволяет создавать большинство программ и аргументировать их работу с меньшими затратами. Но это приводит к большой нагрузке на интерпретатор (в частности, при использовании множества небольших операций), худшей масштабируемости, и уменьшению преимуществ использования оптимизирующего компилятора.[15][16] Одним из исключений является пакет Zygote языка программирования Julia, который работает напрямую с промежуточным представлением кода Julia, позволяя оптимизировать его с помощью JIT-компилятора языка Julia.[7][13][17]

Ограничение ранних подходов дифференцируемого программирования заключалось в том, что они позволяли дифференцировать только функции, написанные подходящим образом для соответствующего фреймворка, тем самым ограничивая взаимодействие с другими программами. Современные подходы решают данную проблему, позволяя конструировать граф с помощью синтаксиса языка программирования или кода промежуточного представления, тем самым позволяя дифференцировать произвольные функции.[13][15]

Примечания

  1. TensorFlow 1 использует подход, основанный на статическом графе, тогда как TensorFlow 2 использует по умолчанию подход, основанный на динамическом графе.

Ссылки

  1. Differentiable Programming Manifesto. GitHub. Дата обращения: 23 февраля 2023. Архивировано 23 февраля 2023 года.
  2. Quantum differentiable programming. pennylane.ai. Дата обращения: 23 февраля 2023. Архивировано 23 февраля 2023 года.
  3. Izzo, Dario; Biscani, Francesco; Mereta, Alessio (2017). "Differentiable genetic programming". European Conference on Genetic Programming (EuroGP). Lecture Notes in Computer Science. 18: 35—51. arXiv:1611.04766. doi:10.1007/978-3-319-55696-3_3. ISBN 978-3-319-55695-6. S2CID 17786263. Архивировано 22 октября 2022. Дата обращения: 9 февраля 2023.
  4. Baydin, Atilim Gunes; Pearlmutter, Barak; Radul, Alexey Andreyevich; Siskind, Jeffrey (2018). "Automatic differentiation in machine learning: a survey". Journal of Machine Learning Research. 18: 1—43. Архивировано 23 января 2022. Дата обращения: 9 февраля 2023.
  5. Wang, Fei. Backpropagation with Callbacks: Foundations for Efficient and Expressive Differentiable Programming // NIPS'18: Proceedings of the 32nd International Conference on Neural Information Processing Systems / Fei Wang, James Decker, Xilun Wu … [и др.]. — Curran Associates, 2018. — P. 10201–12. Архивная копия от 15 ноября 2022 на Wayback Machine
  6. Innes, Mike (2018). "On Machine Learning and Programming Languages" (PDF). SysML Conference 2018. Архивировано из оригинала (PDF) 17 июля 2019. Дата обращения: 9 февраля 2023.
  7. 1 2 3 4 Innes, Mike; Edelman, Alan; Fischer, Keno; Rackauckas, Chris; Saba, Elliot; Viral B Shah; Tebbutt, Will (2019), ∂P: A Differentiable Programming System to Bridge Machine Learning and Scientific Computing, arXiv:1907.07587
  8. Differential Intelligence (октябрь 2016). Дата обращения: 19 октября 2022. Архивировано 19 октября 2022 года.
  9. Degrave, Jonas; Hermans, Michiel; Dambre, Joni; wyffels, Francis (2016-11-05). "A Differentiable Physics Engine for Deep Learning in Robotics". arXiv:1611.01652 [cs.NE].
  10. Li, Li; Hoyer, Stephan; Pederson, Ryan; Sun, Ruoxi; Cubuk, Ekin D.; Riley, Patrick; Burke, Kieron (2021). "Kohn-Sham Equations as Regularizer: Building Prior Knowledge into Machine-Learned Physics". Physical Review Letters. 126 (3): 036401. arXiv:2009.08551. Bibcode:2021PhRvL.126c6401L. doi:10.1103/PhysRevLett.126.036401. PMID 33543980.
  11. Li, Tzu-Mao; Aittala, Miika; Durand, Frédo; Lehtinen, Jaakko (2018). "Differentiable Monte Carlo Ray Tracing through Edge Sampling". ACM Transactions on Graphics. 37 (6): 222:1–11. doi:10.1145/3272127.3275109. S2CID 52839714. Архивировано 12 мая 2021. Дата обращения: 9 февраля 2023.
  12. Li, Tzu-Mao; Gharbi, Michaël; Adams, Andrew; Durand, Frédo; Ragan-Kelley, Jonathan (August 2018). "Differentiable Programming for Image Processing and Deep Learning in Halide". ACM Transactions on Graphics. 37 (4): 139:1–13. doi:10.1145/3197517.3201383. S2CID 46927588. Архивировано 15 ноября 2022. Дата обращения: 9 февраля 2023.
  13. 1 2 3 4 Innes, Michael; Saba, Elliot; Fischer, Keno; Gandhi, Dhairya; Rudilosso, Marco Concetto; Joy, Neethu Mariya; Karmali, Tejan; Pal, Avik; Shah, Viral (2018-10-31). "Fashionable Modelling with Flux". arXiv:1811.01457 [cs.PL].
  14. Merriënboer, Bart van. Automatic differentiation in ML: where we are and where we should be going // NIPS'18, / Bart van Merriënboer, Olivier Breuleux, Arnaud Bergeron … [и др.]. — 3 December 2018. — Vol. 31. — P. 8771–81.
  15. 1 2 3 Breuleux, O.; van Merriënboer, B. Automatic Differentiation in Myia (2017). Дата обращения: 24 июня 2019. Архивировано из оригинала 24 июня 2019 года.
  16. 1 2 TensorFlow: Static Graphs. Tutorials: Learning PyTorch. PyTorch.org. Дата обращения: 4 марта 2019. Архивировано 2 сентября 2021 года.
  17. Innes, Michael (2018-10-18). "Don't Unroll Adjoint: Differentiating SSA-Form Programs". arXiv:1810.07951 [cs.PL].