Дифференцируемое программирование
Эту статью предлагается удалить. |
Этот перевод статьи с другого языка требует улучшения (см. Рекомендации по переводу). |
Дифференцируемое программирование — парадигма программирования[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]
Примечания
[править | править код]- ↑ TensorFlow 1 использует подход, основанный на статическом графе, тогда как TensorFlow 2 использует по умолчанию подход, основанный на динамическом графе.
Ссылки
- ↑ Differentiable Programming Manifesto . GitHub. Дата обращения: 23 февраля 2023. Архивировано 23 февраля 2023 года.
- ↑ Quantum differentiable programming . pennylane.ai. Дата обращения: 23 февраля 2023. Архивировано 23 февраля 2023 года.
- ↑ 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.
- ↑ 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.
- ↑ 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
- ↑ Innes, Mike (2018). "On Machine Learning and Programming Languages" (PDF). SysML Conference 2018. Архивировано из оригинала (PDF) 17 июля 2019. Дата обращения: 9 февраля 2023.
- ↑ 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
- ↑ Differential Intelligence (октябрь 2016). Дата обращения: 19 октября 2022. Архивировано 19 октября 2022 года.
- ↑ 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].
- ↑ 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.
- ↑ 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.
- ↑ 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.
- ↑ 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].
- ↑ 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.
- ↑ 1 2 3 Breuleux, O.; van Merriënboer, B. Automatic Differentiation in Myia (2017). Дата обращения: 24 июня 2019. Архивировано из оригинала 24 июня 2019 года.
- ↑ 1 2 TensorFlow: Static Graphs . Tutorials: Learning PyTorch. PyTorch.org. Дата обращения: 4 марта 2019. Архивировано 2 сентября 2021 года.
- ↑ Innes, Michael (2018-10-18). "Don't Unroll Adjoint: Differentiating SSA-Form Programs". arXiv:1810.07951 [cs.PL].