Автоматическая дифференциация - Automatic differentiation

В математике и компьютерная алгебре , автоматическое дифференцирование ( AD ), которая также называется алгоритмической дифференциацией , вычислительной дифференциация , автоматическое дифференцирование , или просто autodiff , представляет собой набор методов для оценки производной от функции , указанной с помощью компьютерной программы. AD использует тот факт, что каждая компьютерная программа, независимо от ее сложности, выполняет последовательность элементарных арифметических операций (сложение, вычитание, умножение, деление и т. Д.) И элементарных функций (exp, log, sin, cos и т. Д.). Путем многократного применения цепного правила к этим операциям производные произвольного порядка могут быть вычислены автоматически с точностью до рабочей точности и с использованием не более небольшого постоянного множителя для большего числа арифметических операций, чем в исходной программе.

Рисунок 1: Как автоматическая дифференциация соотносится с символической дифференциацией

Автоматическое дифференцирование отличается от символического дифференцирования и числового дифференцирования (метод конечных разностей). Символьное дифференцирование может привести к неэффективному коду и столкнуться с трудностями преобразования компьютерной программы в одно выражение, в то время как числовое дифференцирование может привести к ошибкам округления в процессе дискретизации и отмене. Оба классических метода имеют проблемы с вычислением высших производных, когда возрастает сложность и ошибки. Наконец, оба классических метода медленно вычисляют частные производные функции по многим входным параметрам, что необходимо для алгоритмов оптимизации на основе градиента . Автоматическое дифференцирование решает все эти проблемы.

Цепное правило, прямое и обратное накопление

В основе AD лежит разложение дифференциалов, обеспечиваемое правилом цепочки . Для простой композиции

цепное правило дает

Обычно представлены два различных режима AD: прямое накопление (или прямой режим ) и обратное накопление (или обратный режим ). Прямое накопление указывает, что правило цепочки проходит изнутри наружу (то есть сначала вычисляется, а затем и наконец ), в то время как обратное накопление имеет обход снаружи внутрь (сначала вычисляется, а затем и наконец ). Лаконичнее,

  1. прямое накопление вычисляет рекурсивное отношение: с , и,
  2. обратное накопление вычисляет рекурсивное отношение: с .

Накопление вперед

Рисунок 2: Пример прямого накопления с вычислительным графом

В передней накопления AD, один первый фиксирует независимой переменной , в отношении которого выполняется дифференцирование и вычисляет производную от каждого суб - выражения рекурсивно. При вычислении на бумаге это включает в себя многократную замену производной внутренних функций в цепном правиле:

Это можно обобщить на несколько переменных как матричное произведение якобианов .

По сравнению с обратным накоплением, прямое накопление является естественным и простым в реализации, поскольку поток производной информации совпадает с порядком оценки. Каждая переменная w дополняется своей производной (сохраняется как числовое значение, а не символическое выражение),

как обозначено точкой. Затем производные вычисляются синхронно с этапами оценки и комбинируются с другими производными с помощью цепного правила.

В качестве примера рассмотрим функцию:

Для ясности отдельные подвыражения были помечены переменными w i .

Выбор независимой переменной, по которой выполняется дифференцирование, влияет на начальные значения 1 и 2 . Учитывая интерес к производной этой функции по x 1 , начальные значения должны быть установлены на:

Когда заданы начальные значения, значения распространяются с использованием цепного правила, как показано. На рисунке 2 показано графическое изображение этого процесса в виде вычислительного графа.

Операции по вычислению стоимости Операции по вычислению производной
(семя)
(семя)

Чтобы вычислить градиент этой примерной функции, для которой требуются производные от f не только по x 1, но и по x 2 , выполняется дополнительная развертка по вычислительному графу с использованием начальных значений .

Вычислительная сложность одной развертки вперед накопления пропорциональна сложности исходного кода.

Прямое накопление более эффективно, чем обратное накопление для функций f  : R nR m с mn, поскольку необходимы только n разверток по сравнению с m развертками для обратного накопления.

Обратное накопление

Рисунок 3: Пример обратного накопления с вычислительным графом

В обратном накопления эры, зависимой переменной , чтобы быть дифференцированы является фиксированной и производная вычисляется по отношению к каждому суб- выражения рекурсивно. При вычислении на бумаге производная внешних функций многократно подставляется в цепное правило:

При обратном накоплении интересующая величина - это сопряженная величина , обозначенная чертой ( w ); это производная выбранной зависимой переменной по части выражения w :

Обратное накопление пересекает правило цепочки извне внутрь или, в случае вычислительного графа на рисунке 3, сверху вниз. Функция примера имеет скалярное значение, поэтому для вычисления производной имеется только одно начальное значение, и для вычисления (двухкомпонентного) градиента требуется только один проход вычислительного графа. Это только половина работы по сравнению с прямым накоплением, но обратное накопление требует хранения промежуточных переменных w i, а также инструкций, которые их создали, в структуре данных, известной как список Венгерта (или «лента»), что может потребляют значительный объем памяти, если вычислительный граф большой. Это можно смягчить до некоторой степени, сохраняя только подмножество промежуточных переменных, а затем восстанавливая необходимые рабочие переменные, повторяя оценки, метод, известный как рематериализация . Контрольные точки также используются для сохранения промежуточных состояний.

Операции по вычислению производной с использованием обратного накопления показаны в таблице ниже (обратите внимание на обратный порядок):

Операции по вычислению производной

Графом потока данных вычисления можно управлять, чтобы вычислить градиент его исходного вычисления. Это делается путем добавления сопряженного узла для каждого первичного узла, соединенного смежными ребрами, которые параллельны первичным ребрам, но текут в противоположном направлении. Узлы в присоединенном графе представляют собой умножение на производные функций, вычисленных узлами в прямом. Например, сложение в основных причинах разветвления в смежных; разветвление в основных причинах сложение в смежных; Унарная функция у = F  ( х ) в первичных причинах х = ȳ F  '( х ) в присоединенном; и т.п.

Обратное накопление более эффективно, чем прямое накопление для функций f  : R nR m с mn, поскольку необходимы только m разверток по сравнению с n развертками для прямого накопления.

AD с обратным режимом был впервые опубликован в 1976 году Сеппо Линнаинмаа .

Обратное распространение ошибок в многослойных персептронах, метод, используемый в машинном обучении , является частным случаем AD в обратном режиме.

Помимо прямого и обратного накопления

Прямое и обратное накопление - это всего лишь два (крайних) способа обойти правило цепочки. Проблема вычисления полного якобиана f  : R nR m с минимальным числом арифметических операций известна как проблема оптимального якобиана накопления (OJA), которая является NP-полной . Центральным в этом доказательстве является идея о том, что между локальными частичными элементами, которые маркируют ребра графа, могут существовать алгебраические зависимости. В частности, две или более граничных меток могут быть признаны равными. Сложность проблемы остается открытой, если предположить, что все метки ребер уникальны и алгебраически независимы.

Автоматическое дифференцирование с использованием двойных чисел

Форвард режим автоматическое дифференцирование осуществляется путем расширения алгебры из действительных чисел и получить новую арифметику . К каждому числу добавляется дополнительный компонент, представляющий производную функции по этому числу, и все арифметические операторы расширяются для расширенной алгебры. Расширенная алгебра - это алгебра двойственных чисел .

Замените каждое число числом , где - действительное число, но является абстрактным числом со свойством ( бесконечно малое ; см. Гладкий бесконечно малый анализ ). Используя только это, обычная арифметика дает

то же самое для вычитания и деления.

Теперь полиномы можно вычислять в этой расширенной арифметике. Если , то

где обозначает производную от по первому аргументу и , называемое начальным числом , может быть выбрано произвольно.

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

аналитические функции дает список базовой арифметики и некоторых стандартных функций для новой арифметики:
и в целом для примитивной функции ,
где и - производные по первому и второму аргументам соответственно.

Когда базовая двоичная арифметическая операция применяется к смешанным аргументам - паре и действительному числу, - действительное число сначала поднимается до . Производная функции в точке теперь находится путем вычисления с использованием вышеуказанной арифметики, которая дает в качестве результата.

Векторные аргументы и функции

С многомерными функциями можно работать с той же эффективностью и механизмами, что и с одномерными функциями, путем принятия оператора производной по направлению. То есть, если достаточно вычислить производную по направлению at в направлении , это можно вычислить, используя ту же арифметику, что и выше. Если требуются все элементы , то требуются оценки функций. Обратите внимание, что во многих оптимизационных приложениях действительно достаточно производной по направлению.

Высокий порядок и множество переменных

Вышеупомянутая арифметика может быть обобщена для вычисления производных второго порядка и более высоких функций многих переменных. Однако арифметические правила быстро усложняются: сложность квадратична в высшей производной степени. Вместо этого можно использовать усеченную алгебру многочленов Тейлора . Результирующая арифметика, определенная для обобщенных двойных чисел, позволяет эффективно выполнять вычисления с использованием функций, как если бы они были типом данных. Как только полином Тейлора функции известен, производные легко извлекаются.

Выполнение

AD прямого режима реализуется путем нестандартной интерпретации программы, в которой действительные числа заменяются двойными числами, константы повышаются до двойных чисел с нулевым эпсилон-коэффициентом, а числовые примитивы повышаются для работы с двойными числами. Эта нестандартная интерпретация обычно реализуется с использованием одной из двух стратегий: преобразование исходного кода или перегрузка оператора .

Преобразование исходного кода (SCT)

Рисунок 4: Пример того, как может работать преобразование исходного кода

Исходный код функции заменяется автоматически сгенерированным исходным кодом, который включает операторы для вычисления производных, чередующиеся с исходными инструкциями.

Преобразование исходного кода может быть реализовано для всех языков программирования, и компилятору также проще выполнять оптимизацию времени компиляции. Однако реализация самого инструмента AD сложнее.

Перегрузка оператора (OO)

Рисунок 5: Пример того, как может работать перегрузка оператора

Перегрузка оператора - это возможность исходного кода, написанного на поддерживающем его языке. Объекты для действительных чисел и элементарных математических операций должны быть перегружены для обслуживания расширенной арифметики, описанной выше. Это не требует изменения формы или последовательности операций в исходном исходном коде для дифференциации функции, но часто требует изменений в базовых типах данных для чисел и векторов для поддержки перегрузки, а также часто включает в себя вставку специальных операций пометки.

Перегрузка оператора для прямого накопления легко реализуется, а также возможна для обратного накопления. Однако современные компиляторы отстают в оптимизации кода по сравнению с прямым накоплением.

Перегрузка операторов как для прямого, так и для обратного накопления может хорошо подходить для приложений, где объекты являются векторами действительных чисел, а не скалярами. Это потому, что лента содержит векторные операции; это может облегчить вычислительно эффективные реализации, в которых каждая векторная операция выполняет множество скалярных операций. Методы векторного сопряженного алгоритмического дифференцирования (векторного AAD) могут использоваться, например, для дифференцирования значений, вычисленных с помощью моделирования Монте-Карло.

Примерами реализаций автоматического дифференцирования с перегрузкой операторов в C ++ являются библиотеки Adept и Stan .

Смотрите также

Заметки

Рекомендации

дальнейшее чтение

Внешние ссылки

реализация автоматической дифференциации на основе шаблонов C ++
  • Касательная Источник-исток отладочных производные
  • [1] , Точные греки первого и второго порядка с помощью алгоритмического дифференцирования.
  • [2] , Сопутствующая алгоритмическая дифференциация приложений, ускоренных на GPU.
  • [3] , Сопутствующие методы в программных средствах вычислительной финансовой поддержки для алгоритмической дифференциации.