На этом шаге мы рассмотрим производную тензоров.
Функция, которую мы рассматривали на предыдущих шагах, превращает скалярное значение x в другое скалярное значение у: ее можно изобразить в виде кривой на двумерной плоскости. Теперь представьте функцию, которая превращает кортеж скаляров (x, у) в скалярное значение z: это уже будет векторная операция. Ее можно изобразить как двумерную поверхность в трехмерном пространстве (с осями координат x, y, z). Точно так же можно представить функции, принимающие на входе матрицы, трехмерные тензоры и т. д.
Понятие производной применимо к любой такой функции, если поверхности, которые они описывают, являются непрерывными и гладкими. Производная тензорной операции (или тензорной функции) называется градиентом. Градиенты - это просто обобщение понятия производной на функции, принимающие многомерные входные данные - тензоры. Надеемся, вы помните, что производная скалярной функции выражает локальный наклон кривой функции? Таким же образом градиент тензорной функции выражает кривизну многомерной поверхности, описываемой функцией. Он характеризует изменение результата функции при изменении входных параметров.
Рассмотрим пример, базирующийся на машинном обучении. Дано:
С помощью W вычисляем приближение к цели y_pred и определяем потери или несоответствие между кандидатом y_pred и целью y_true:
y_pred = dot(W, x) # С использованием весов W модели # вычислить прогноз для x loss_value = loss(y_pred, y_true) # Оценить, насколько далеко предсказание # отклонилось от истины
Теперь, используя градиенты, можно выяснить, как обновить W, чтобы уменьшить значение loss_value. Если входные данные x и y_true зафиксированы, то предыдущие операции можно интерпретировать как функцию, отображающую значения W в значения потерь:
loss_value = f(W) # f описывает кривую (или многомерную поверхность),
# образованную значениями потерь при изменении W
Допустим, что W0 - текущее значение W. Тогда производной функции f в точке W0 будет тензор grad(loss_value, W0) с той же формой, что и W, в котором каждый элемент grad(loss_value, W0)[i, j] определяет направление и величину изменения в loss_value, наблюдаемого при изменении W0[i, j]. Тензор grad(loss_value, W0) - это градиент функции f(W) = loss_value в точке W0, его также называют градиентом loss_value для W в окрестностях W0.
Но что конкретно представляет собой grad(loss_value, W0)? Выше вы видели, что производную функции f(x) единственного аргумента можно интерпретировать как наклон кривой f. Аналогично grad(loss_value, W0) можно представить как тензор, описывающий направление наискорейшего подъема loss_value = f(W) в окрестностях W0 и наклон этого подъема. Каждая частная производная показывает наклон f в конкретном направлении.
Соответственно, как и в случае с функцией f(x), значение которой можно уменьшить, немного сместив x в направлении, противоположном производной, значение loss_value = f(W) функции f(W) тензора также можно уменьшить, сместив W в направлении, противоположном градиенту: например, W1 = W0 - step * grad(f(W0), W0) (где step - небольшой по величине множитель). Это означает, что для снижения нужно идти против направления наискорейшего подъема. Обратите внимание: множитель step необходим, потому что grad(loss_value, W0) лишь аппроксимирует кривизну в окрестностях W0, поэтому очень нежелательно уходить слишком далеко от W0.
На следующем шаге мы рассмотрим стохастический градиентный спуск.