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

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

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

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

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

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

Примечания 

Ссылки

  
Дифференциальное исчисление
Парадигмы программирования