8.6. Оптимальное вычисление матрицы Якоби#
Напоследок, мы без подробностей затронем задачу оптимального вычисления матрицы Якоби (optimal Jacobian accumulation).
Пусть дана функция \(f: \real^n \to \real^m\) и стоит задача вычисления её матрицы Якоби
за минимальное число операций. Как нам уже известно, при \(n \gg m\) эффективней по быстродействию использовать автоматическое дифференцирование назад, а в обратном случае \(n \ll m\) — дифференцирование вперёд.
В общем случае можно учитывать структуру (топологию) графа вычислений и уменьшить количество вычислительной нагрузки. Например, можно разделить весь граф вычислений на подграфы, каждый из которых определяет «часть» функции \(f\). Затем на каждом из участков графа использовать тот вид дифференцирования, который на нём эффективен. В конце же остаётся «сшить» результаты вычислений, используя правило дифференцирования сложной функции.
Мы продемонстрируем эту идею на функции с (очень) специфическим графом вычислений, показанном на Рисунке 8.11.
В этом случае разумно использовать оба вида дифференцирования. Для этого представим исходную функцию \(\mathbf{f}\) в виде
где промежуточное значение \(g\) является функцией \(\real^n \to \real\). Тогда производные (элементы матрицы Якоби) имеют вид
Производные \(\partial g / \partial x_j\) эффективно вычисляются дифференцированием назад, поскольку \(n \gg 1\). В свою очередь, производные \(\partial f_i / \partial g\) эффективно вычисляются дифференцированием вперёд (\(1 \ll m\)).
Так, автоматические способы дифференцирования вперёд и назад являются лишь крайними вариантами обхода графа вычислений в соответствии с правилом дифференцирования сложной функции.