Русская Википедия:Дифференцируемое программирование
Шаблон:К удалениюШаблон:Грубый перевод Дифференцируемое программирование — парадигма программирования[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]
Примечания
- Ссылки
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite journal
- ↑ Шаблон:Cite journal
- ↑ Шаблон:Cite book
- ↑ Шаблон:Cite journal
- ↑ 7,0 7,1 7,2 7,3 Шаблон:Citation
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite arXiv
- ↑ Шаблон:Cite journal
- ↑ Шаблон:Cite journal
- ↑ Шаблон:Cite journal
- ↑ 13,0 13,1 13,2 13,3 Шаблон:Cite arXiv
- ↑ Шаблон:Cite book
- ↑ 15,0 15,1 15,2 Шаблон:Cite web
- ↑ 16,0 16,1 Шаблон:Cite web
- ↑ Шаблон:Cite arXiv
Ошибка цитирования Для существующих тегов <ref>
группы «note» не найдено соответствующего тега <references group="note"/>