Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

В математике и компьютерная алгебре , автоматическое дифференцирование ( AD ), называемой также алгоритмическая дифференциацией , вычислительная дифференциацией , [1] [2] автоматическое дифференцирование , или просто 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  : ℝ n → ℝ m с mn, поскольку необходимо только n разверток по сравнению с m развертками для обратного накопления.

Обратное накопление [ править ]

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

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

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

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

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

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

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

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

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

Помимо прямого и обратного накопления [ править ]

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

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

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

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

а также для вычитания и деления.

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

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

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

и в целом для примитивной функции ,

где и - производные по первому и второму аргументам соответственно.

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

Векторные аргументы и функции [ править ]

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

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

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

Реализация [ править ]

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

Преобразование исходного кода (SCT) [ править ]

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

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

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

Перегрузка оператора (OO) [ править ]

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

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

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

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

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

Примечания [ править ]

  1. ^ В терминах весовых матриц сопряженный - транспонированный . Сложение - это ковектор , посколькуи разветвление - это вектор,поскольку

Ссылки [ править ]

  1. ^ Нейдингер, Ричард Д. (2010). «Введение в автоматическое дифференцирование и объектно-ориентированное программирование MATLAB» (PDF) . SIAM Обзор . 52 (3): 545–563. CiteSeerX  10.1.1.362.6580 . DOI : 10.1137 / 080743627 .
  2. ^ a b Байдин, Атилим Гунеш; Перлмуттер, Барак; Радул Алексей Андреевич; Сискинд, Джеффри (2018). «Автоматическая дифференциация в машинном обучении: обзор» . Журнал исследований в области машинного обучения . 18 : 1–43.
  3. ^ RE Wengert (1964). «Простая автоматическая программа оценки производных финансовых инструментов». Comm. ACM . 7 (8): 463–464. DOI : 10.1145 / 355586.364791 .
  4. Бартоломью-Биггс, Майкл; Браун, Стивен; Кристиансон, Брюс; Диксон, Лоуренс (2000). «Автоматическое дифференцирование алгоритмов». Журнал вычислительной и прикладной математики . 124 (1–2): 171–190. Bibcode : 2000JCoAM.124..171B . DOI : 10.1016 / S0377-0427 (00) 00422-2 . hdl : 2299/3010 .
  5. ^ Linnainmaa, Сеппо (1976). «Расширение Тейлора накопленной ошибки округления». BIT Численная математика . 16 (2): 146–160. DOI : 10.1007 / BF01931367 .
  6. ^ Griewank, Andreas (2012). «Кто изобрел обратный способ дифференциации?» (PDF) . Истории оптимизации, Documenta Matematica . Дополнительный объем ISMP: 389–400.
  7. ^ Науманн, Уве (апрель 2008 г.). «Оптимальное накопление якобианов является NP-полным». Математическое программирование . 112 (2): 427–441. CiteSeerX 10.1.1.320.5665 . DOI : 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 . Проверено 21 октября 2009 .
  • Нейдингер, Ричард (2010). «Введение в автоматическое дифференцирование и объектно-ориентированное программирование MATLAB» (PDF) . SIAM Обзор . 52 (3): 545–563. CiteSeerX  10.1.1.362.6580 . DOI : 10.1137 / 080743627 . Проверено 15 марта 2013 .
  • Науманн, Уве (2012). Искусство дифференциации компьютерных программ . Программное обеспечение-среды-инструменты. СИАМ . ISBN 978-1-611972-06-1.
  • Хенрард, Марк (2017). Объяснение алгоритмической дифференциации в финансах . Объяснение финансового инжиниринга. Пэлгрейв Макмиллан . ISBN 978-3-319-53978-2.

Внешние ссылки [ править ]

  • www.autodiff.org , «сайт для ознакомления со всем, что вы хотите знать об автоматической дифференциации»
  • Автоматическое различение параллельных программ OpenMP
  • Автоматическая дифференциация, шаблоны C ++ и фотограмметрия
  • Автоматическая дифференциация, подход с перегрузкой оператора
  • Вычисление аналитических производных любой программы на Fortran77, Fortran95 или C через веб-интерфейс. Автоматическая дифференциация программ на Fortran.
  • Описание и пример кода для прямого автоматического дифференцирования в Scala
  • finmath-lib расширения автоматического дифференцирования , Автоматическое дифференцирование случайных величин (Java-реализация стохастического автоматического дифференцирования).
  • Сопряженное алгоритмическое дифференцирование: калибровка и теорема о неявной функции
  • Статья и реализация автоматической дифференциации на основе шаблонов C ++
  • Касательная Источник-исток отладочных производные
  • [1] , Точные греки первого и второго порядка алгоритмическим дифференцированием.
  • [2] , Сопутствующая алгоритмическая дифференциация приложений, ускоренных на GPU.
  • [3] , Сопутствующие методы в программных средствах вычислительной финансовой поддержки для алгоритмической дифференциации.