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

Дифференцируемое программирование — парадигма программирования[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.[13][17][7]

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

Примечания

  1. TensorFlow 1 использует подход основанный на статическом графе, тогда как TensorFlow 2 использует по умолчанию подход основанный на динамическом графе.
Ссылки
  1. Differentiable Programming Manifesto. GitHub.
  2. Quantum differentiable programming. pennylane.ai.
  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.
  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.
  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.
  6. Innes, Mike (2018). “On Machine Learning and Programming Languages” (PDF). SysML Conference 2018.
  7. 1 2 3 4 Innes, Mike; Edelman, Alan; Fischer, Keno & Rackauckas, Chris (2019), ∂P: A Differentiable Programming System to Bridge Machine Learning and Scientific Computing 
  8. Differential Intelligence (октябрь 2016). Дата обращения: 19 октября 2022.
  9. Degrave, Jonas; Hermans, Michiel; Dambre, Joni & wyffels, Francis (2016-11-05), A Differentiable Physics Engine for Deep Learning in Robotics, arΧiv: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. 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.
  13. 1 2 3 4 Innes, Michael; Saba, Elliot; Fischer, Keno; Gandhi, Dhairya; Rudilosso, Marco Concetto; Joy, Neethu Mariya; Karmali, Tejan; Pal, Avik; et al. (2018-10-31), Fashionable Modelling with Flux, arΧiv: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.
  16. 1 2 TensorFlow: Static Graphs. Tutorials: Learning PyTorch. PyTorch.org. Дата обращения: 4 марта 2019.
  17. Innes, Michael (2018-10-18), Don't Unroll Adjoint: Differentiating SSA-Form Programs, arΧiv:1810.07951 [cs.PL].