Автоматическая дифференциация - Automatic differentiation
В математика и компьютерная алгебра, автоматическая дифференциация (ОБЪЯВЛЕНИЕ), также называемый алгоритмическое дифференцирование, вычислительное дифференцирование,[1][2] самодифференциация, или просто автодифф, представляет собой набор методов для численной оценки производная функции, заданной компьютерной программой. AD использует тот факт, что каждая компьютерная программа, независимо от ее сложности, выполняет последовательность элементарных арифметических операций (сложение, вычитание, умножение, деление и т. Д.) И элементарных функций (exp, log, sin, cos и т. Д.). Применяя Правило цепи многократно к этим операциям производные произвольного порядка могут быть вычислены автоматически с точностью до рабочей точности и с использованием не более чем небольшого постоянного множителя больше арифметических операций, чем исходная программа.
Автоматическая дифференциация отличается от символическая дифференциация и численное дифференцирование (метод конечных разностей). Символьное дифференцирование может привести к неэффективному коду и столкнуться с трудностями преобразования компьютерной программы в одно выражение, в то время как числовое дифференцирование может ввести ошибки округления в дискретизация процесс и отмена. Оба классических метода имеют проблемы с вычислением высших производных, когда возрастает сложность и ошибки. Наконец, оба классических метода медленно вычисляют частные производные функции по много входы, необходимые для градиент -основан оптимизация алгоритмы. Автоматическое дифференцирование решает все эти проблемы.
Цепное правило, прямое и обратное накопление
В основе AD лежит разложение дифференциалов, обеспечиваемое Правило цепи. Для простой композиции
цепное правило дает
Обычно представлены два различных режима AD: форвардное накопление (или же прямой режим) и обратное накопление (или же обратный режим). Прямое накопление указывает, что каждый проходит по правилу цепочки изнутри наружу (то есть сначала вычисляет а потом и наконец ), в то время как обратное накопление имеет обход снаружи внутрь (сначала вычислить а потом и наконец ). Короче,
- форвардное накопление вычисляет рекурсивное отношение: с , и,
- обратное накопление вычисляет рекурсивное отношение: с .
Как правило, как прямое, так и обратное накопление являются конкретными проявлениями применения оператор программной композиции, фиксируя соответствующее одно из двух сопоставлений .
Накопление вперед
При прямом накоплении AD сначала фиксируется независимая переменная относительно которого выполняется дифференцирование, и вычисляет производную каждого под-выражение рекурсивно. При вычислении на бумаге это включает в себя многократную замену производной от внутренний функции в цепном правиле:
Это можно обобщить на несколько переменных в виде матричного произведения Якобианцы.
По сравнению с обратным накоплением, прямое накопление является естественным и простым в реализации, поскольку поток производной информации совпадает с порядком оценки. Каждая переменная ш дополняется производной ẇ (хранится как числовое значение, а не как символьное выражение),
как обозначено точкой. Затем производные вычисляются синхронно с этапами оценки и комбинируются с другими производными с помощью цепного правила.
В качестве примера рассмотрим функцию:
Для наглядности отдельные подвыражения помечены переменными шя.
Выбор независимой переменной, по которой выполняется дифференцирование, влияет на семя значения ẇ1 и ẇ2. Учитывая интерес к производной этой функции по Икс1, начальные значения должны быть установлены на:
Когда заданы начальные значения, значения распространяются с использованием цепного правила, как показано. На рис. 2 показано графическое изображение этого процесса в виде вычислительного графа.
Чтобы вычислить градиент функции этого примера, которая требует производных от ж в отношении не только Икс1 но также Икс2, дополнительный развертка выполняется по вычислительному графу с использованием начальных значений .
В вычислительная сложность одного цикла прямого накопления пропорционально сложности исходного кода.
Прямое накопление более эффективно, чем обратное накопление для функций ж : ℝп → ℝм с м ≫ п как только п развертки необходимы, по сравнению с м развертки для обратного накопления.
Обратное накопление
При обратном накоплении AD зависимая переменная дифференцируемая фиксируется, а производная вычисляется относительно каждый суб-выражение рекурсивно. При расчете на бумаге производная от внешний функции многократно подставляются в цепное правило:
При обратном накоплении процентная ставка равна прилегающий, обозначенный чертой (w̄); это производная выбранной зависимой переменной по части выражения ш:
Обратное накопление проходит по правилу цепочки извне внутрь или, в случае вычислительного графа на рисунке 3, сверху вниз. В примере функции используется скалярное значение, поэтому для вычисления производной используется только одно начальное значение, а для вычисления (двухкомпонентного) градиента требуется только одно сканирование вычислительного графа. Это только половина работы по сравнению с прямым накоплением, но обратное накопление требует хранения промежуточных переменных шя а также инструкции, которые создали их в структуре данных, известной как список Венгерта (или «лента»),[3][4] которые могут потреблять значительный объем памяти, если вычислительный граф большой. Это можно смягчить до некоторой степени, сохраняя только подмножество промежуточных переменных и затем восстанавливая необходимые рабочие переменные, повторяя оценки, метод, известный как рематериализация. Контрольные точки также используется для сохранения промежуточных состояний.
Операции по вычислению производной с использованием обратного накопления показаны в таблице ниже (обратите внимание на обратный порядок):
Графом потока данных вычисления можно управлять, чтобы вычислить градиент его исходного вычисления. Это делается путем добавления сопряженного узла для каждого основного узла, соединенного смежными ребрами, которые параллельны основным ребрам, но текут в противоположном направлении. Узлы сопряженного графа представляют собой умножение на производные функций, вычисленных узлами в прямом. Например, сложение в основных причинах разветвления в смежных; разветвление в первичных причинах сложение в смежных;[а] а унарный функция у = ж(Икс) в первопричинах Икс = ȳ f ′(Икс) в смежном; и Т. Д.
Обратное накопление более эффективно, чем прямое накопление для функций ж : ℝп → ℝм с м ≪ п как только м развертки необходимы, по сравнению с п развертки для прямого накопления.
AD с обратным режимом был впервые опубликован в 1976 г. Сеппо Линнаинмаа.[5][6]
Обратное распространение ошибок в многослойных перцептронах, метод, используемый в машинное обучение, является частным случаем реверсивного режима AD.[2]
Помимо прямого и обратного накопления
Прямое и обратное накопление - это всего лишь два (крайних) способа обойти правило цепочки. Проблема вычисления полного якобиана ж : ℝп → ℝм с минимальным количеством арифметических операций известен как оптимальное накопление якобиана (OJA) проблема, которая НП-полный.[7] Центральным в этом доказательстве является идея о том, что между локальными частичными элементами, которые маркируют ребра графа, могут существовать алгебраические зависимости. В частности, две или более метки края могут быть признаны равными. Сложность проблемы остается открытой, если предположить, что все метки ребер уникальны и алгебраически независимы.
Автоматическое дифференцирование с использованием двойных чисел
Автоматическая дифференциация в прямом режиме достигается за счет увеличения алгебра из действительные числа и получение нового арифметика. К каждому числу добавляется дополнительный компонент, чтобы представить производную функции по этому числу, и все арифметические операторы расширяются для расширенной алгебры. Расширенная алгебра - это алгебра двойные числа.
Заменить каждое число с номером , куда это реальное число, но является абстрактный номер с собственностью (ан бесконечно малый; видеть Гладкий анализ бесконечно малых ). Используя только это, обычная арифметика дает
а также для вычитания и деления.
Сейчас же, многочлены можно рассчитать в этой расширенной арифметике. Если , тогда
куда обозначает производную от относительно своего первого аргумента, и , называется семя, можно выбрать произвольно.
Новая арифметика состоит из заказанные пары, элементы написаны , с обычной арифметикой для первого компонента и арифметикой дифференцирования первого порядка для второго компонента, как описано выше. Распространение приведенных выше результатов о полиномах на аналитические функции дает список базовой арифметики и некоторых стандартных функций для новой арифметики:
и вообще для примитивной функции ,
куда и производные от относительно его первого и второго аргументов соответственно.
Когда бинарная базовая арифметическая операция применяется к смешанным аргументам - пара и реальное число - действительное число сначала поднимается до . Производная функции в момент теперь находится путем вычисления используя приведенную выше арифметику, которая дает в результате.
Векторные аргументы и функции
С многомерными функциями можно работать с той же эффективностью и механизмами, что и с одномерными функциями, за счет принятия оператора производной по направлению. То есть, если достаточно вычислить , производная по направлению из в в направлении , это можно рассчитать как используя ту же арифметику, что и выше. Если все элементы желательны, тогда требуется оценка функций. Обратите внимание, что во многих оптимизационных приложениях действительно достаточно производной по направлению.
Высокий порядок и множество переменных
Вышеупомянутая арифметика может быть обобщена для вычисления производных второго и более высокого порядка функций многих переменных. Однако арифметические правила быстро усложняются: сложность квадратична в высшей производной степени. Вместо этого усеченный Полином Тейлора алгебру можно использовать. Результирующая арифметика, определенная для обобщенных двойных чисел, позволяет эффективно выполнять вычисления с использованием функций, как если бы они были типом данных. Как только полином Тейлора функции известен, производные легко извлекаются.
Выполнение
AD прямого режима реализуется нестандартная интерпретация программы, в которой действительные числа заменяются двойными числами, константы повышаются до двойных чисел с нулевым эпсилон-коэффициентом, а числовые примитивы повышаются для работы с двойными числами. Эта нестандартная интерпретация обычно реализуется с использованием одной из двух стратегий: преобразование исходного кода или же перегрузка оператора.
Преобразование исходного кода (SCT)
Исходный код функции заменяется автоматически сгенерированным исходным кодом, который включает инструкции для вычисления производных, чередующиеся с исходными инструкциями.
Преобразование исходного кода может быть реализован для всех языков программирования, а также компилятору проще выполнять оптимизацию времени компиляции. Однако реализация самого инструмента AD сложнее.
Перегрузка оператора (OO)
Перегрузка оператора это возможность для исходного кода, написанного на поддерживающем его языке. Объекты для действительных чисел и элементарных математических операций должны быть перегружены для обслуживания расширенной арифметики, изображенной выше. Это не требует изменения формы или последовательности операций в исходном исходном коде для дифференциации функции, но часто требует изменений в базовых типах данных для чисел и векторов для поддержки перегрузки, а также часто включает в себя вставку специальных операций маркировки.
Перегрузка оператора для прямого накопления легко реализуется, а также возможна для обратного накопления. Однако современные компиляторы отстают в оптимизации кода по сравнению с прямым накоплением.
Перегрузка операторов как для прямого, так и для обратного накопления может хорошо подходить для приложений, в которых объекты являются векторами действительных чисел, а не скалярами. Это потому, что лента содержит векторные операции; это может облегчить вычислительно эффективные реализации, в которых каждая векторная операция выполняет множество скалярных операций. Методы векторного сопряженного алгоритмического дифференцирования (векторного AAD) могут использоваться, например, для дифференцирования значений, вычисленных с помощью моделирования Монте-Карло.
Примеры реализаций автоматического дифференцирования с перегрузкой оператора в C ++: Адепт и Стэн библиотеки.
Примечания
- ^ В терминах весовых матриц сопряженным является транспонировать. Дополнение - это ковектор , поскольку а разветвление - это вектор поскольку
Рекомендации
- ^ Нейдингер, Ричард Д. (2010). «Введение в автоматическое дифференцирование и объектно-ориентированное программирование MATLAB» (PDF). SIAM Обзор. 52 (3): 545–563. CiteSeerX 10.1.1.362.6580. Дои:10.1137/080743627.
- ^ а б Байдин, Атилим Гюнеш; Перлмуттер, Барак; Радул Алексей Андреевич; Сискинд, Джеффри (2018). «Автоматическая дифференциация в машинном обучении: обзор». Журнал исследований в области машинного обучения. 18: 1–43.
- ^ R.E. Венгерта (1964). «Простая автоматическая программа оценки производных финансовых инструментов». Comm. ACM. 7 (8): 463–464. Дои:10.1145/355586.364791.
- ^ Бартоломью-Биггс, Майкл; Браун, Стивен; Кристиансон, Брюс; Диксон, Лоуренс (2000). «Автоматическое дифференцирование алгоритмов». Журнал вычислительной и прикладной математики. 124 (1–2): 171–190. Bibcode:2000JCoAM.124..171B. Дои:10.1016 / S0377-0427 (00) 00422-2. HDL:2299/3010.
- ^ Линнаинмаа, Сеппо (1976). «Расширение Тейлора накопленной ошибки округления». BIT вычислительная математика. 16 (2): 146–160. Дои:10.1007 / BF01931367.
- ^ Гриванк, Андреас (2012). «Кто изобрел обратный способ дифференциации?» (PDF). Истории оптимизации, Documenta Matematica. Дополнительный том ISMP: 389–400.
- ^ Науманн, Уве (апрель 2008 г.). «Оптимальное накопление якобианов является NP-полным». Математическое программирование. 112 (2): 427–441. CiteSeerX 10.1.1.320.5665. Дои:10.1007 / s10107-006-0042-z.
дальнейшее чтение
- Ралл, Луис Б. (1981). Автоматическое дифференцирование: методы и приложения. Конспект лекций по информатике. 120. Springer. ISBN 978-3-540-10861-0.
- Гриванк, Андреас; Вальтер, Андреа (2008). Оценка производных: принципы и методы алгоритмической дифференциации. Другие названия по прикладной математике. 105 (2-е изд.). СИАМ. ISBN 978-0-89871-659-7. Архивировано из оригинал на 2010-03-23. Получено 2009-10-21.
- Нейдингер, Ричард (2010). «Введение в автоматическое дифференцирование и объектно-ориентированное программирование MATLAB» (PDF). SIAM Обзор. 52 (3): 545–563. CiteSeerX 10.1.1.362.6580. Дои:10.1137/080743627. Получено 2013-03-15.
- Науманн, Уве (2012). Искусство дифференциации компьютерных программ. Программное обеспечение-среды-инструменты. СИАМ. ISBN 978-1-611972-06-1.
- Хенрард, Марк (2017). Объяснение алгоритмической дифференциации в финансах. Объяснение финансового инжиниринга. Пэлгрейв Макмиллан. ISBN 978-3-319-53978-2.
внешняя ссылка
- www.autodiff.org, «Сайт для ознакомления со всем, что вы хотите знать об автоматической дифференциации»
- Автоматическое различение параллельных программ OpenMP
- Автоматическая дифференциация, шаблоны C ++ и фотограмметрия
- Автоматическая дифференциация, подход с перегрузкой оператора
- Вычисление аналитических производных любой программы на Fortran77, Fortran95 или C через веб-интерфейс Автоматическая дифференциация программ на Фортране
- Описание и пример кода для прямого автоматического дифференцирования в Scala
- Finmath-lib расширения автоматического дифференцирования, Автоматическое дифференцирование случайных величин (Java-реализация стохастического автоматического дифференцирования).
- Сопряженное алгоритмическое дифференцирование: калибровка и теорема о неявной функции
- Статья об автоматическом различении на основе шаблонов C ++ и выполнение
- Касательная Отлаживаемые производные от исходного кода к исходному
- [1], Точные греки первого и второго порядка с помощью алгоритмического дифференцирования
- [2], Сопутствующая алгоритмическая дифференциация приложений с ускорением на GPU
- [3], Сопутствующие методы в программном обеспечении вычислительных финансов. Поддержка программных средств для алгоритмической дифференциации.