На этом шаге мы рассмотрим, в чем заключается это правило.
Обратное распространение - это способ использования производных простых операций (таких как сложение, relu или тензорное произведение) для упрощения вычисления градиента произвольно сложных комбинаций этих атомарных операций. Важно отметить, что нейронная сеть состоит из множества последовательных операций с тензорами, объединенных в одну цепочку, каждая из которых имеет простую известную производную. Например, модель в примере 2.2 можно выразить как функцию, параметризованную переменными W1, b1, W2 и b2 (принадлежащими первому и второму слоям Dense соответственно) и состоящую из атомарных операций dot, relu, softmax и +, а также функции потерь loss, которые легко дифференцируются:
loss_value = loss(y_true, softmax(dot(relu(dot(inputs, W1) + b1), W2) + b2))
Согласно правилам дифференциального и интегрального исчисления такую цепочку функций можно вывести с помощью следующего тождества, называемого правилом цепочки.
Рассмотрим две функции - f и g, а также составную функцию fg такую, что fg(x) = f(g(x)):
def fg(x): x1 = g(x) y = f(x1) return y
Согласно цепному правилу, grad(y, x) == grad(y, x1) * grad(x1, x). Зная производные f и g, мы можем вычислить производную fg. Правило цепочки названо так потому, что при добавлении дополнительных промежуточных функций вычисления начинают выглядеть как цепочка:
def fghj(x): x1 = j(x) x2 = h(x1) x3 = g(x2) y = f(x3) return y
grad(y, x) == (grad(y, x3) * grad(x3, x2) * grad(x2, x1) * grad(x1, x))
Применение цепного правила к вычислению значений градиента нейронной сети приводит к алгоритму, который называется обратным распространением ошибки (Backpropagation, обратным дифференцированием). Давайте посмотрим, как он работает.
На следующем шаге мы рассмотрим автоматическое дифференцирование с графами вычислений.