Допустим, у нас есть выражение и мы хотим найти производные и . В обратном режиме AD эта задача разбивается на 2 части: прямой и обратный проходы.z=x1x2+sin(x1)dzdx1dzdx2
Прямой проход
Во-первых, мы разлагаем наше сложное выражение на множество примитивных, то есть выражений, состоящих не более чем из одного вызова функции. Обратите внимание, что я также переименовываю входные и выходные переменные для согласованности, хотя это и не обязательно:
вес1= х1
вес2= х2
вес3= ш1вес2
вес4= грех( ш1)
вес5= ш3+ ш4
Z= ш5
Преимущество этого представления в том, что правила дифференцирования для каждого отдельного выражения уже известны. Например, мы знаем, что производная от есть , и поэтому . Мы будем использовать этот факт в обратном порядке ниже.грехсозdвес4dвес1= cos( ш1)
По сути, прямой проход состоит из оценки каждого из этих выражений и сохранения результатов. Скажем, наши входные данные: и . Тогда мы имеем:Икс1= 2Икс2= 3
вес1= х1= 2
вес2= х2= 3
вес3= ш1вес2= 6
вес4= грех( ш1) = 0,9
вес5= ш3+ ш4= 6,9
Z= ш5= 6,9
Обратный проход
Это волшебство начинается, и оно начинается с правила цепочки . В своей основной форме правило цепочки утверждает, что если у вас есть переменная которая зависит от которая, в свою очередь, зависит от , то:t ( u ( v ) )Uv
dTdv= дTdUdUdv
или, если зависит от через несколько путей / переменных , например:TvUя
U1= ф( v )
U2= г( v )
т = ч ( и1, у2)
тогда (см. доказательство здесь ):
dTdv= ∑яdTdUяdUяdv
В терминах графа выражений, если у нас есть конечный узел и входные узлы , а путь от до проходит через промежуточные узлы (т.е. где ), мы можем найти производную какZвесяZвесявеспZ= г( шп)весп= ф( шя)dZdвеся
dZdвеся= ∑p ∈ p a r e n t s ( i )dZdвеспdвеспdвеся
Другими словами, чтобы вычислить производную выходной переменной любой промежуточной или входной переменной , нам нужно знать только производные ее родителей и формулу для вычисления производной примитивного выражения .Zвесявесп= ф( шя)
Обратный проход начинается в конце (то есть ) и распространяется обратно на все зависимости. Здесь мы имеем (выражение для «семян»):dZdZ
dZdZ= 1
Это может быть прочитано как «изменение в приводит к точно такому же изменению в », что совершенно очевидно.ZZ
Тогда мы знаем, что и так:Z= ш5
dZdвес5= 1
вес5 линейно зависит от и , поэтому и . Используя правило цепочки, мы находим:вес3вес4dвес5dвес3= 1dвес5dвес4= 1
dZdвес3= дZdвес5dвес5dвес3= 1 × 1 = 1
dZdвес4= дZdвес5dвес5dвес4= 1 × 1 = 1
Из определения и правил частных производных мы находим, что . Таким образом:вес3= ш1вес2dвес3dвес2= ш1
dZdвес2= дZdвес3dвес3dвес2= 1 × ш1знак равнош1
Который, как мы уже знаем из прямого прохода, является:
dZdвес2= ш1= 2
Наконец, вносит вклад в через и . Еще раз, из правил частных производных мы знаем, что и . Таким образом:вес1Zвес3вес4dвес3dвес1знак равнош2dвес4dвес1знак равно cos( ш1)
dZdвес1= дZdвес3dвес3dвес1+ дZdвес4dвес4dвес1= ш2+ cos( ш1)
И снова, учитывая известные входные данные, мы можем рассчитать это:
dZdвес1= ш2+ cos( ш1) = 3 + cos( 2 ) = 2,58
Поскольку и являются просто псевдонимами для и , мы получаем наш ответ:вес1вес2Икс1Икс2
dZdИкс1= 2,58
dZdИкс2= 2
Вот и все!
Это описание касается только скалярных входных данных, то есть чисел, но на самом деле оно также может применяться к многомерным массивам, таким как векторы и матрицы. При различении выражений с такими объектами следует учитывать две вещи:
- Производные могут иметь гораздо более высокую размерность, чем входные или выходные данные, например, производная вектора от вектора является матрицей, а производная матрицы от матрицы - это 4-мерный массив (иногда его называют тензором). Во многих случаях такие производные очень редки.
- Каждый компонент в выходном массиве является независимой функцией от 1 или более компонентов входного массива (ов). Например, если и оба и являются векторами, никогда не зависит от , а только от подмножества . В частности, это означает, что поиск производной сводится к отслеживанию зависимости от .Y= ф( х )ИксYYяYJИксКdYяdИксJYяИксJ
Сила автоматического дифференцирования заключается в том, что он может работать со сложными структурами из языков программирования, такими как условия и циклы. Однако, если все, что вам нужно, это алгебраические выражения, и у вас есть достаточно хорошая структура для работы с символическими представлениями, можно построить полностью символические выражения. Фактически, в этом примере мы могли бы создать выражение и вычислить эту производную для любых входных данных, которые мы хотим.dZdвес1= ш2+ cos( ш1) = х2+ cos( х1)