Как найти градиент сложной функции

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

Открытие метода обратного распространения ошибки стало одним из наиболее значимых событий в области искусственного интеллекта. В актуальном виде он был предложен в 1986 году Дэвидом Э. Румельхартом, Джеффри Э. Хинтоном и Рональдом Дж. Вильямсом и независимо и одновременно красноярскими математиками С. И. Барцевым и В. А. Охониным. С тех пор для нахождения градиентов параметров нейронной сети используется метод вычисления производной сложной функции, и оценка градиентов параметров сети стала хоть сложной инженерной задачей, но уже не искусством. Несмотря на простоту используемого математического аппарата, появление этого метода привело к значительному скачку в развитии искусственных нейронных сетей.

Суть метода можно записать одной формулой, тривиально следующей из формулы производной сложной функции: если $f(x) = g_m(g_{m-1}(ldots (g_1(x)) ldots))$, то $frac{partial f}{partial x} = frac{partial g_m}{partial g_{m-1}}frac{partial g_{m-1}}{partial g_{m-2}}ldots frac{partial g_2}{partial g_1}frac{partial g_1}{partial x}$. Уже сейчас мы видим, что градиенты можно вычислять последовательно, в ходе одного обратного прохода, начиная с $frac{partial g_m}{partial g_{m-1}}$ и умножая каждый раз на частные производные предыдущего слоя.

Backpropagation в одномерном случае

В одномерном случае всё выглядит особенно просто. Пусть $w_0$ — переменная, по которой мы хотим продифференцировать, причём сложная функция имеет вид

$$f(w_0) = g_m(g_{m-1}(ldots g_1(w_0)ldots)),$$

где все $g_i$ скалярные. Тогда

$$f'(w_0) = g_m'(g_{m-1}(ldots g_1(w_0)ldots))cdot g’_{m-1}(g_{m-2}(ldots g_1(w_0)ldots))cdotldots cdot g’_1(w_0)$$

Суть этой формулы такова. Если мы уже совершили forward pass, то есть уже знаем

$$g_1(w_0), g_2(g_1(w_0)),ldots,g_{m-1}(ldots g_1(w_0)ldots),$$

то мы действуем следующим образом:

  • берём производную $g_m$ в точке $g_{m-1}(ldots g_1(w_0)ldots)$;

  • умножаем на производную $g_{m-1}$ в точке $g_{m-2}(ldots g_1(w_0)ldots)$;

  • и так далее, пока не дойдём до производной $g_1$ в точке $w_0$.

Проиллюстрируем это на картинке, расписав по шагам дифференцирование по весам $w_i$ функции потерь логистической регрессии на одном объекте (то есть для батча размера 1):

17_1.png

Собирая все множители вместе, получаем:

$$frac{partial f}{partial w_0} = (-y)cdot e^{-y(w_0 + w_1x_1 + w_2x_2)}cdotfrac{-1}{1 + e^{-y(w_0 + w_1x_1 + w_2x_2)}}$$

$$frac{partial f}{partial w_1} = x_1cdot(-y)cdot e^{-y(w_0 + w_1x_1 + w_2x_2)}cdotfrac{-1}{1 + e^{-y(w_0 + w_1x_1 + w_2x_2)}}$$

$$frac{partial f}{partial w_2} = x_2cdot(-y)cdot e^{-y(w_0 + w_1x_1 + w_2x_2)}cdotfrac{-1}{1 + e^{-y(w_0 + w_1x_1 + w_2x_2)}}$$

Таким образом, мы видим, что сперва совершается forward pass для вычисления всех промежуточных значений (и да, все промежуточные представления нужно будет хранить в памяти), а потом запускается backward pass, на котором в один проход вычисляются все градиенты.

Почему же нельзя просто пойти и начать везде вычислять производные?

В главе, посвящённой матричным дифференцированиям, мы поднимаем вопрос о том, что вычислять частные производные по отдельности — это зло, лучше пользоваться матричными вычислениями. Но есть и ещё одна причина: даже и с матричной производной в принципе не всегда хочется иметь дело. Рассмотрим простой пример. Допустим, что $X^r$ и $X^{r+1}$ — два последовательных промежуточных представления $Ntimes M$ и $Ntimes K$, связанных функцией $X^{r+1} = f^{r+1}(X^r)$. Предположим, что мы как-то посчитали производную $frac{partialmathcal{L}}{partial X^{r+1}_{ij}}$ функции потерь $mathcal{L}$, тогда

$$frac{partialmathcal{L}}{partial X^{r}_{st}} = sum_{i,j}frac{partial f^{r+1}_{ij}}{partial X^{r}_{st}}frac{partialmathcal{L}}{partial X^{r+1}_{ij}}$$

И мы видим, что, хотя оба градиента $frac{partialmathcal{L}}{partial X_{ij}^{r+1}}$ и $frac{partialmathcal{L}}{partial X_{st}^{r}}$ являются просто матрицами, в ходе вычислений возникает «четырёхмерный кубик» $frac{partial f_{ij}^{r+1}}{partial X_{st}^{r}}$, даже хранить который весьма болезненно: уж больно много памяти он требует ($N^2MK$ по сравнению с безобидными $NM + NK$, требуемыми для хранения градиентов). Поэтому хочется промежуточные производные $frac{partial f^{r+1}}{partial X^{r}}$ рассматривать не как вычисляемые объекты $frac{partial f_{ij}^{r+1}}{partial X_{st}^{r}}$, а как преобразования, которые превращают $frac{partialmathcal{L}}{partial X_{ij}^{r+1}}$ в $frac{partialmathcal{L}}{partial X_{st}^{r}}$. Целью следующих глав будет именно это: понять, как преобразуется градиент в ходе error backpropagation при переходе через тот или иной слой.

  Вы спросите себя: надо ли мне сейчас пойти и прочитать главу учебника про матричное дифференцирование?

Встречный вопрос. Найдите производную функции по вектору $x$:

$$f(x) = x^TAx, Ain Mat_{n}{mathbb{R}}text{ — матрица размера }ntimes n$$

А как всё поменяется, если $A$ тоже зависит от $x$? Чему равен градиент функции, если $A$ является скаляром? Если вы готовы прямо сейчас взять ручку и бумагу и посчитать всё, то вам, вероятно, не надо читать про матричные дифференцирования. Но мы советуем всё-таки заглянуть в эту главу, если обозначения, которые мы будем дальше использовать, покажутся вам непонятными: единой нотации для матричных дифференцирований человечество пока, увы, не изобрело, и переводить с одной на другую не всегда легко.

Мы же сразу перейдём к интересующей нас вещи: к вычислению градиентов сложных функций.

Градиент сложной функции

Напомним, что формула производной сложной функции выглядит следующим образом:

$$left[D_{x_0} (color{#5002A7}{u} circ color{#4CB9C0}{v}) right](h) = color{#5002A7}{left[D_{v(x_0)} u right]} left( color{#4CB9C0}{left[D_{x_0} vright]} (h)right)$$

Теперь разберёмся с градиентами. Пусть $f(x) = g(h(x))$ – скалярная функция. Тогда

$$left[D_{x_0} f right] (x-x_0) = langlenabla_{x_0} f, x-x_0rangle.$$

С другой стороны,

$$left[D_{h(x_0)} g right] left(left[D_{x_0}h right] (x-x_0)right) = langlenabla_{h_{x_0}} g, left[D_{x_0} hright] (x-x_0)rangle = langleleft[D_{x_0} hright]^* nabla_{h(x_0)} g, x-x_0rangle.$$

То есть $color{#FFC100}{nabla_{x_0} f} = color{#348FEA}{left[D_{x_0} h right]}^* color{#FFC100}{nabla_{h(x_0)}}g$ — применение сопряжённого к $D_{x_0} h$ линейного отображения к вектору $nabla_{h(x_0)} g$.

Эта формула — сердце механизма обратного распространения ошибки. Она говорит следующее: если мы каким-то образом получили градиент функции потерь по переменным из некоторого промежуточного представления $X^k$ нейронной сети и при этом знаем, как преобразуется градиент при проходе через слой $f^k$ между $X^{k-1}$ и $X^k$ (то есть как выглядит сопряжённое к дифференциалу слоя между ними отображение), то мы сразу же находим градиент и по переменным из $X^{k-1}$:

17_2.png

Таким образом слой за слоем мы посчитаем градиенты по всем $X^i$ вплоть до самых первых слоёв.

Далее мы разберёмся, как именно преобразуются градиенты при переходе через некоторые распространённые слои.

Градиенты для типичных слоёв

Рассмотрим несколько важных примеров.

Примеры

  1. $f(x) = u(v(x))$, где $x$ — вектор, а $v(x)$ – поэлементное применение $v$:

    $$vbegin{pmatrix}
    x_1 \
    vdots\
    x_N
    end{pmatrix}
    = begin{pmatrix}
    v(x_1)\
    vdots\
    v(x_N)
    end{pmatrix}$$

    Тогда, как мы знаем,

    $$left[D_{x_0} fright] (h) = langlenabla_{x_0} f, hrangle = left[nabla_{x_0} fright]^T h.$$

    Следовательно,

    $$
    left[D_{v(x_0)} uright] left( left[ D_{x_0} vright] (h)right) = left[nabla_{v(x_0)} uright]^T left(v'(x_0) odot hright) =\
    $$

    $$
    = sumlimits_i left[nabla_{v(x_0)} uright]_i v'(x_{0i})h_i
    = langleleft[nabla_{v(x_0)} uright] odot v'(x_0), hrangle.
    ,$$

    где $odot$ означает поэлементное перемножение. Окончательно получаем

    $$color{#348FEA}{nabla_{x_0} f = left[nabla_{v(x_0)}uright] odot v'(x_0) = v'(x_0) odot left[nabla_{v(x_0)} uright]}$$

    Отметим, что если $x$ и $h(x)$ — это просто векторы, то мы могли бы вычислять всё и по формуле $frac{partial f}{partial x_i} = sum_jbig(frac{partial z_j}{partial x_i}big)cdotbig(frac{partial h}{partial z_j}big)$. В этом случае матрица $big(frac{partial z_j}{partial x_i}big)$ была бы диагональной (так как $z_j$ зависит только от $x_j$: ведь $h$ берётся поэлементно), и матричное умножение приводило бы к тому же результату. Однако если $x$ и $h(x)$ — матрицы, то $big(frac{partial z_j}{partial x_i}big)$ представлялась бы уже «четырёхмерным кубиком», и работать с ним было бы ужасно неудобно.

  2. $f(X) = g(XW)$, где $X$ и $W$ — матрицы. Как мы знаем,

    $$left[D_{X_0} f right] (X-X_0) = text{tr}, left(left[nabla_{X_0} fright]^T (X-X_0)right).$$

    Тогда

    $$
    left[ D_{X_0W} g right] left(left[D_{X_0} left( ast Wright)right] (H)right) =
    left[ D_{X_0W} g right] left(HWright)=\
    $$ $$
    = text{tr}, left( left[nabla_{X_0W} g right]^T cdot (H) W right) =\
    $$ $$
    =
    text{tr} , left(W left[nabla_{X_0W} (g) right]^T cdot (H)right) = text{tr} , left( left[left[nabla_{X_0W} gright] W^Tright]^T (H)right)
    $$

    Здесь через $ast W$ мы обозначили отображение $Y hookrightarrow YW$, а в предпоследнем переходе использовалось следующее свойство следа:

    $$
    text{tr} , (A B C) = text{tr} , (C A B),
    $$

    где $A, B, C$ — произвольные матрицы подходящих размеров (то есть допускающие перемножение в обоих приведённых порядках). Следовательно, получаем

    $$color{#348FEA}{nabla_{X_0} f = left[nabla_{X_0W} (g) right] cdot W^T}$$

  3. $f(W) = g(XW)$, где $W$ и $X$ — матрицы. Для приращения $H = W — W_0$ имеем

    $$
    left[D_{W_0} f right] (H) = text{tr} , left( left[nabla_{W_0} f right]^T (H)right)
    $$

    Тогда

    $$
    left[D_{XW_0} g right] left( left[D_{W_0} left(X astright) right] (H)right) = left[D_{XW_0} g right] left( XH right) =
    $$ $$
    = text{tr} , left( left[nabla_{XW_0} g right]^T cdot X (H)right) =
    text{tr}, left(left[X^T left[nabla_{XW_0} g right] right]^T (H)right)
    $$

    Здесь через $X ast$ обозначено отображение $Y hookrightarrow XY$. Значит,

    $$color{#348FEA}{nabla_{X_0} f = X^T cdot left[nabla_{XW_0} (g)right]}$$

  4. $f(X) = g(softmax(X))$, где $X$ — матрица $Ntimes K$, а $softmax$ — функция, которая вычисляется построчно, причём для каждой строки $x$

    $$softmax(x) = left(frac{e^{x_1}}{sum_te^{x_t}},ldots,frac{e^{x_K}}{sum_te^{x_t}}right)$$

    В этом примере нам будет удобно воспользоваться формализмом с частными производными. Сначала вычислим $frac{partial s_l}{partial x_j}$ для одной строки $x$, где через $s_l$ мы для краткости обозначим $softmax(x)_l = frac{e^{x_l}} {sum_te^{x_t}}$. Нетрудно проверить, что

    $$frac{partial s_l}{partial x_j} = begin{cases}
    s_j(1 — s_j), & j = l,
    -s_ls_j, & jne l
    end{cases}$$

    Так как softmax вычисляется независимо от каждой строчки, то

    $$frac{partial s_{rl}}{partial x_{ij}} = begin{cases}
    s_{ij}(1 — s_{ij}), & r=i, j = l,
    -s_{il}s_{ij}, & r = i, jne l,
    0, & rne i
    end{cases},$$

    где через $s_{rl}$ мы обозначили для краткости $softmax(X)_{rl}$.

    Теперь пусть $nabla_{rl} = nabla g = frac{partialmathcal{L}}{partial s_{rl}}$ (пришедший со следующего слоя, уже известный градиент). Тогда

    $$frac{partialmathcal{L}}{partial x_{ij}} = sum_{r,l}frac{partial s_{rl}}{partial x_{ij}} nabla_{rl}$$

    Так как $frac{partial s_{rl}}{partial x_{ij}} = 0$ при $rne i$, мы можем убрать суммирование по $r$:

    $$ldots = sum_{l}frac{partial s_{il}}{partial x_{ij}} nabla_{il} = -s_{i1}s_{ij}nabla_{i1} — ldots + s_{ij}(1 — s_{ij})nabla_{ij}-ldots — s_{iK}s_{ij}nabla_{iK} =$$

    $$= -s_{ij}sum_t s_{it}nabla_{it} + s_{ij}nabla_{ij}$$

    Таким образом, если мы хотим продифференцировать $f$ в какой-то конкретной точке $X_0$, то, смешивая математические обозначения с нотацией Python, мы можем записать:

    $$begin{multline*}
    color{#348FEA}{nabla_{X_0}f =}\
    color{#348FEA}{= -softmax(X_0) odot text{sum}left(
    softmax(X_0)odotnabla_{softmax(X_0)}g, text{ axis = 1}
    right) +}\
    color{#348FEA}{softmax(X_0)odot nabla_{softmax(X_0)}g}
    end{multline*}
    $$

Backpropagation в общем виде

Подытожим предыдущее обсуждение, описав алгоритм error backpropagation (алгоритм обратного распространения ошибки). Допустим, у нас есть текущие значения весов $W^i_0$ и мы хотим совершить шаг SGD по мини-батчу $X$. Мы должны сделать следующее:

  1. Совершить forward pass, вычислив и запомнив все промежуточные представления $X = X^0, X^1, ldots, X^m = widehat{y}$.
  2. Вычислить все градиенты с помощью backward pass.
  3. С помощью полученных градиентов совершить шаг SGD.

Проиллюстрируем алгоритм на примере двуслойной нейронной сети со скалярным output’ом. Для простоты опустим свободные члены в линейных слоях.

17_3.png Обучаемые параметры – матрицы $U$ и $W$. Как найти градиенты по ним в точке $U_0, W_0$?

$$nabla_{W_0}mathcal{L} = nabla_{W_0}{left({vphantom{frac12}mathcal{L}circ hcircleft[Wmapsto g(XU_0)Wright]}right)}=$$

$$=g(XU_0)^Tnabla_{g(XU_0)W_0}(mathcal{L}circ h) = underbrace{g(XU_0)^T}_{ktimes N}cdot
left[vphantom{frac12}underbrace{h’left(vphantom{int_0^1}g(XU_0)W_0right)}_{Ntimes 1}odot
underbrace{nabla_{hleft(vphantom{int_0^1}g(XU_0)W_0right)}mathcal{L}}_{Ntimes 1}right]$$

Итого матрица $ktimes 1$, как и $W_0$

$$nabla_{U_0}mathcal{L} = nabla_{U_0}left(vphantom{frac12}
mathcal{L}circ hcircleft[Ymapsto YW_0right]circ gcircleft[ Umapsto XUright]
right)=$$

$$=X^Tcdotnabla_{XU^0}left(vphantom{frac12}mathcal{L}circ hcirc [Ymapsto YW_0]circ gright) =$$

$$=X^Tcdotleft(vphantom{frac12}g'(XU_0)odot
nabla_{g(XU_0)}left[vphantom{in_0^1}mathcal{L}circ hcirc[Ymapsto YW_0right]
right)$$

$$=ldots = underset{Dtimes N}{X^T}cdotleft(vphantom{frac12}
underbrace{g'(XU_0)}_{Ntimes K}odot
underbrace{left[vphantom{int_0^1}left(
underbrace{h’left(vphantom{int_0^1}g(XU_0)W_0right)}_{Ntimes1}odotunderbrace{nabla_{h(vphantom{int_0^1}gleft(XU_0right)W_0)}mathcal{L}}_{Ntimes 1}
right)cdot underbrace{W^T}_{1times K}right]}_{Ntimes K}
right)$$

Итого $Dtimes K$, как и $U_0$

Схематически это можно представить следующим образом:

17_4.gif

Backpropagation для двуслойной нейронной сети

Подробнее о предыдущих вычисленияхЕсли вы не уследили за вычислениями в предыдущем примере, давайте более подробно разберём его чуть более конкретную версию (для $g = h = sigma$).

Рассмотрим двуслойную нейронную сеть для классификации. Мы уже встречали ее ранее при рассмотрении линейно неразделимой выборки. Предсказания получаются следующим образом:

$$
widehat{y} = sigma(X^1 W^2) = sigmaBig(big(sigma(X^0 W^1 )big) W^2 Big).
$$

Пусть $W^1_0$ и $W^2_0$ — текущее приближение матриц весов. Мы хотим совершить шаг по градиенту функции потерь, и для этого мы должны вычислить её градиенты по $W^1$ и $W^2$ в точке $(W^1_0, W^2_0)$.

Прежде всего мы совершаем forward pass, в ходе которого мы должны запомнить все промежуточные представления: $X^1 = X^0 W^1_0$, $X^2 = sigma(X^0 W^1_0)$, $X^3 = sigma(X^0 W^1_0) W^2_0$, $X^4 = sigma(sigma(X^0 W^1_0) W^2_0) = widehat{y}$. Они понадобятся нам дальше.

Для полученных предсказаний вычисляется значение функции потерь:

$$
l = mathcal{L}(y, widehat{y}) = y log(widehat{y}) + (1-y) log(1-widehat{y}).
$$

Дальше мы шаг за шагом будем находить производные по переменным из всё более глубоких слоёв.

  1. Градиент $mathcal{L}$ по предсказаниям имеет вид

    $$
    nabla_{widehat{y}}l = frac{y}{widehat{y}} — frac{1 — y}{1 — widehat{y}} = frac{y — widehat{y}}{widehat{y} (1 — widehat{y})},
    $$

    где, напомним, $ widehat{y} = sigma(X^3) = sigmaBig(big(sigma(X^0 W^1_0 )big) W^2_0 Big)$ (обратите внимание на то, что $W^1_0$ и $W^2_0$ тут именно те, из которых мы делаем градиентный шаг).

  2. Следующий слой — поэлементное взятие $sigma$. Как мы помним, при переходе через него градиент поэлементно умножается на производную $sigma$, в которую подставлено предыдущее промежуточное представление:

    $$
    nabla_{X^3}l = sigma'(X^3)odotnabla_{widehat{y}}l = sigma(X^3)left( 1 — sigma(X^3) right) odot frac{y — widehat{y}}{widehat{y} (1 — widehat{y})} =
    $$

    $$
    = sigma(X^3)left( 1 — sigma(X^3) right) odot frac{y — sigma(X^3)}{sigma(X^3) (1 — sigma(X^3))} =
    y — sigma(X^3)
    $$

  3. Следующий слой — умножение на $W^2_0$. В этот момент мы найдём градиент как по $W^2$, так и по $X^2$. При переходе через умножение на матрицу градиент, как мы помним, умножается с той же стороны на транспонированную матрицу, а значит:

    $$
    color{blue}{nabla_{W^2_0}l} = (X^2)^Tcdot nabla_{X^3}l = (X^2)^Tcdot(y — sigma(X^3)) =
    $$

    $$
    = color{blue}{left( sigma(X^0W^1_0) right)^T cdot (y — sigma(sigma(X^0W^1_0)W^2_0))}
    $$

    Аналогичным образом

    $$
    nabla_{X^2}l = nabla_{X^3}lcdot (W^2_0)^T = (y — sigma(X^3))cdot (W^2_0)^T =
    $$

    $$
    = (y — sigma(X^2W_0^2))cdot (W^2_0)^T
    $$

  4. Следующий слой — снова взятие $sigma$.

    $$
    nabla_{X^1}l = sigma'(X^1)odotnabla_{X^2}l = sigma(X^1)left( 1 — sigma(X^1) right) odot left( (y — sigma(X^2W_0^2))cdot (W^2_0)^T right) =
    $$

    $$
    = sigma(X^1)left( 1 — sigma(X^1) right) odotleft( (y — sigma(sigma(X^1)W_0^2))cdot (W^2_0)^T right)
    $$

  5. Наконец, последний слой — это умножение $X^0$ на $W^1_0$. Тут мы дифференцируем только по $W^1$:

    $$
    color{blue}{nabla_{W^1_0}l} = (X^0)^Tcdot nabla_{X^1}l = (X^0)^Tcdot big( sigma(X^1) left( 1 — sigma(X^1) right) odot (y — sigma(sigma(X^1)W_0^2))cdot (W^2_0)^Tbig) =
    $$

    $$
    = color{blue}{(X^0)^Tcdotbig(sigma(X^0W^1_0)left( 1 — sigma(X^0W^1_0) right) odot (y — sigma(sigma(X^0W^1_0)W_0^2))cdot (W^2_0)^Tbig) }
    $$

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

Автоматизация и autograd

Итак, чтобы нейросеть обучалась, достаточно для любого слоя $f^k: X^{k-1}mapsto X^k$ с параметрами $W^k$ уметь:

  • превращать $nabla_{X^k_0}mathcal{L}$ в $nabla_{X^{k-1}_0}mathcal{L}$ (градиент по выходу в градиент по входу);
  • считать градиент по его параметрам $nabla_{W^k_0}mathcal{L}$.

При этом слою совершенно не надо знать, что происходит вокруг. То есть слой действительно может быть запрограммирован как отдельная сущность, умеющая внутри себя делать forward pass и backward pass, после чего слои механически, как кубики в конструкторе, собираются в большую сеть, которая сможет работать как одно целое.

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

Но это лишь начало

Метод обратного распространения ошибки позволяет удобно посчитать градиенты, но дальше с ними что-то надо делать, и старый добрый SGD едва ли справится с обучением современной сетки. Так что же делать? О некоторых приёмах мы расскажем в следующей главе.

Содержание:

  1. Градиент функции многих переменных
  2. Производная сложной функции
  3. Производная функции по направлению
  4. Градиент функции
  5. Градиент функции нескольких переменных
  6. Основное свойство градиента

Градиент функции многих переменных

Определение 5. Градиент функции z = f (x, y) называется вектор
Градиент функции⋅                                                                         (5.5)

Аналогично для функции u = f (x, y, z)
Градиент функции⋅                                                      (5.6)

Соответственно вводим градиент функцииu = f (x1, x2, …, xn)
Градиент функции                                                         (5.7)
Сокращенно градиент функции обозначим через  Градиент функции .

Производная сложной функции

Известно, что для производной сложной функции одной переменной y = f (u), где u = u (x), имеет место формула
Градиент функции

Обобщим эту формулу на случай функции двух переменных z = f (x, y). Пусть задана дифференцируемая функция z = f (x, y), которая имеет непрерывные частные производные Градиент функции  и  y Градиент функции. Допустим, что аргументы x и y являются в свою очередь дифференцируемыми функциями от третьей переменной t:   x = φ (t) ;  y = ψ (t). Ясно, что функция z = f (x, y) является сложной функцией от переменной t:   z = f (φ (t)ψ (t)) = F (t).

Найдем производную этой функции по переменной t. Для этого дадим приращение Δt аргументу t и найдем полное приращение функции Δz, если аргументы x и y приобретают соответственно приращения Δx и Δ:
Δz = f (x + Δx, y + Δy) – f (x, y).

Перепишем это приращение в другом виде:
Δz = [f (x + Δx, y + Δy) – f (x, y + Δy)] + [f (x, y + Δy) – f (x, y)].

Применим теперь теорему Лагранжа о конечных приращениях соответственно к первой и второй квадратным скобкам. Тогда получим:
Градиент функции

Допустим теперь, что частные производные непрерывные по совокупности переменных x и y, тогда:
Градиент функции

Градиент функции

Таким образом,
Градиент функции

Теперь согласно определения производной находим:
Градиент функции

Перейдя к пределу при Δt → 0 и учитывая, что Градиент функции получим формулу:
Градиент функции

Эта производная называется полной производной функции z = f (x, y) по аргументу t. Аналогично вводится формула полной производной для функции u = u (x, y, z)
Градиент функции 

где Градиент функции

Понятие производной функции z = f (x, y) можно обобщить, если ввести производную функции по направлению.

Производная функции по направлению

Пусть функция z = f (x, y) задана в некоторой замкнутой области D плоскости Оxy.

Пусть в этой области задана точка M0 (x0, y0). Дадим приращение аргументам соответственно Δx и Δy, тогда получим точку M (x0 + Δx, y0 + Δy). Рассмотрим вектор Градиент функции.

Обозначим через φ угол, который образует вектор Градиент функции с осью Оx, а через l — длину этого вектора. Тогда можно записать: Δx = l cos φ, Δy = l sin φ или dx = l cos φ, dy = l sin φ.
Таким образом: Градиент функции  Значение функции z = f (x, y) в точках Mо и M соответственно будут такие:  Градиент функции  и   Градиент функции.

Отсюда следует, что если зафиксировать точку Mо и направление вектора Градиент функции   и менять только l, то функцию z = f (x, y) можно записать в виде z = F (l), а ее значение в точках Mо и M  соответственно F (0) и F (l).   Таким образом
Градиент функции

Согласно определению производной функции одной переменной, производная функции z = F (l) по переменной l равна
Градиент функции

Этот предел назовем производной функции z = f (x, y) по данному направлению. Исходя из вышеизложенного, функцию z = f (x, y) можно считать сложной функцией по l. Ее полная производная по l равна
Градиент функции

Но dx = l cos φ, dy = l sin φ, поэтому Градиент функции

Эту формулу можно обобщить на случай функции трех переменных u = f (x, y, t). В этом случае направление задается вектором  Градиент функции и формула дифференцирования по направлению соответственно будет иметь вид
Градиент функции

Установим связь между производной функции z = f (x, y) по направлению и градиентом этой функции. Для этого рассмотрим векторы
Градиент функции     и   Градиент функции

Умножим скалярно вектор Градиент функции на вектор Градиент функции , получим:
Градиент функции Таким образом,   Градиент функции.

Согласно определению скалярного произведения: Градиент функции

Из этой формулы следует, что в случае, когда направление вектора Градиент функции совпадает с направлением вектора Градиент функции

Градиент функции

Вывод. Производная функции z = f (x, y) имеет наибольшее значение по направлению градиента  Градиент функции  и равна модулю градиента Градиент функции .

Пример 3. Вычислить градиент функции   Градиент функции  в точке M0 (3; 4).

Решение. Находим частные производные функции
Градиент функции

Вычислим их значения в данной точке:
Градиент функции

Таким образом,
Градиент функции

Градиент функции

Пусть в некоторой области трехмерного пространства Q определена функция Градиент функции

Определение. Градиентом функции Градиент функции в точке Градиент функции называется вектор Градиент функции с координатами Градиент функции Градиент функции

Градиент функции указывает направление наискорейшего возрастания функции.

По этой ссылке вы найдёте полный курс лекций по высшей математике:

Примеры с решением

Пример 1.

Пусть дана функция Градиент функции . Найдем градиент этой функции в точке М0(1,2, 3).

Решение:

Определим частные производные функции в этой точке:

Градиент функции Таким образом, градиент данной функции в точке Градиент функции равен Градиент функции

Возьмем некоторую точку Градиент функции и проведем через нее прямую, совпадающую по направлению с вектором Градиент функции. Рассмотрим значение функции Градиент функции в точке Градиент функции и в точке близкой к ней Градиент функции

Определение. Производной функции Градиент функции в точке Градиент функции по направлению а называется предел Градиент функции если этот предел существует.

Если функция Градиент функции дифференцируема в точке Градиент функции, то в этой точке существует ее производная по любому направлению, равная

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

Возможно вам будут полезны данные страницы:

Пример 2.

Найти производную по направлению Градиент функции функции Градиент функции в точке Градиент функции

Решение:

Вычислим частные производные функции в точке Градиент функции

Градиент функции Найдем единичный вектор, совпадающий по направлению с вектором Градиент функции

Градиент функции тогда Градиент функции Окончательно будем иметь

Градиент функции

Градиент функции нескольких переменных

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

Градиент функции Например, если Градиент функции, то Градиент функции Градиент функции — градиент функции Градиент функции в произвольной точке Градиент функции. Если же Градиент функции то Градиент функции

Основное свойство градиента

Пусть функция Градиент функции дифференцируема в точке Градиент функции Градиент функции — некоторый Градиент функциимерный вектор. Рассмотрим точку Градиент функции Тогда:

1) если скалярное произведение Градиент функции, то существует число Градиент функции такое, что Градиент функции для всех Градиент функции;

2) если скалярное произведение Градиент функции, то существует число Градиент функции при всех Градиент функции.

Чтобы найти точку, в которой данная функция принимает значение,большее, чем в точке Градиент функции, можно поступить

следующим образом:

1) выбрать направление перемещения, т. е. найти вектор

Градиент функции такой, что Градиент функции (если нет дополнительных ограничений, можно положить Градиент функции

2) рассмотреть точку Градиент функции и подобрать параметрГрадиент функции так, чтобы Градиент функции

Найдем точку, в которой значение функцииГрадиент функции Градиент функции больше ее значения в точке Градиент функции

Так как Градиент функции, то Градиент функцииГрадиент функции

Рассмотрим точку Градиент функции. Тогда Градиент функции Градиент функции и при Градиент функции Значит, при Градиент функции функция Градиент функцииимеет наибольшее значение. Если Градиент функции, в то время какГрадиент функции

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

Рассмотрим точку Градиент функции. Эта точка должна принадлежать данной плоскости, т. е. Градиент функцииГрадиент функции или Градиент функции Кроме того, вектор Градиент функции должен удовлетворять условию Градиент функции Так как Градиент функции то имеем систему

Градиент функции

Вектор Градиент функции является решением системы (*).

Таким образом, Градиент функции Функция Градиент функции имеет наибольшее значение при Градиент функции Если Градиент функции, то

Градиент функции в то время как Градиент функции

Основное свойство градиента используют для отыскания экстремумов функций нескольких переменных.

Градиент функции

Градиент функции

Лекции:

  • Интеграл натурального логарифма
  • Критические точки и экстремумы функции
  • Экстремумы функции двух переменных. Производная по направлению
  • Доказательство неравенств
  • Системы уравнений
  • Непрерывность функции
  • Уравнение плоскости
  • Отрицательное биномиальное распределение
  • Длина дуги кривой
  • Вычислить несобственный интеграл

Производные сложных функций.

Напомним,
что различают элементарные и сложные
функции. Отметим, что аргументом
элементарных функций является некоторая
переменная величина (координата, время,
сила и так далее). Аргументом сложных
функций, которые рассматриваются ниже,
является функция.

Пусть
y
=
f(u),
где u
= φ(
x),
причем f(u)
и φ(x)
– элементарные функции, первая из них
имеет производную по u,
а вторая – по x.
Рассмотрим зависимость y
от x:
для этого в значении y
заменим u
на φ(x)
и получим y
=
f
[φ(
x)].
Теперь y
будет сложной функцией от x,
т.е. функцией от функции, зависящей от
x.

В
этом случае производная y
по x
вычисляется по следующей формуле:


(6)

Примеры:

  1. y
    =
    sin
    3
    x.
    Здесь
    u
    = φ(
    x)
    = 3
    x,
    тогда y
    =
    sin
    u
    и по формуле (6)
    получаем:

.

  1. y
    = (1+
    x2)6;
    u
    = 1 +
    x2,
    y
    =
    u6,
    далее по формуле (6)
    .

При
достаточном навыке вычисления производных
сложных функций промежуточную переменную
«u»
не пишут, вводя ее лишь мысленно;

  1. y
    =
    ln2x,
    .

4. Физический смысл производной. Градиент функции.

Физический
смысл производной состоит в том, что
она определяет быстроту (темп)
изменения функции.

Начнем
с понятного примера. При равномерном
движении скорость тела равна отношению
пути ΔS,
пройденного телом за время Δt,
к этому промежутку времени v
=
.
Если движение неравномерное, то отношение

является
средней скоростью на
этом участке пути, а скорость,
соответствующая каждому данному моменту
времени, называется мгновенной
скоростью движения

и определяется как
предел отношения
при
Δ
t→0,
т.е.

Обобщая
полученный результат, можно утверждать,
что производная функции f(x)
по времени t
является
мгновенной скоростью изменения функции.
Понятие
мгновенной скорости относится не только
к механическим движениям, но и к любым
процессам, развивающимся во времени.
Можно найти скорость сокращения или
расслабления мышцы, скорость кристаллизации
раствора, скорость отвердевания
пломбировочного материала, скорость
распространения эпидемического
заболевания и др.

Значение
мгновенного ускорения во всех этих
процессах равно производной функции
скорости по времени:

.
(8)

В механике
—вторая
производная пути по времени.

Понятие
производной, как величины, характеризующей
быстроту изменения функции, применяется
для разных зависимостей. Например, надо
узнать,
как быстро изменяется температура вдоль
металлического стержня, если нагревать
один
из его концов. В данном случае температура
— функция координаты x,
т.е. T
=
f(x)
и


характеризует
темп изменения температуры в пространстве.

Производную
некоторой функции
f(x)
по координате
x
называют
градиентом

этой
функции
(часто
используется сокращение grad
от лат. gradient).
Градиенты
различных переменных – это векторные
величины, всегда направленные в сторону
увеличения значения переменных.

Отметим,
что градиенты многих величин являются
одной
из первопричин обменных процессов,
происходящих в биологических системах.
Это, например,
градиент концентрации
,
градиент электрохимического потенциала

– греческая буква «мю»), градиент
электрического потенциала.При
малых Δx
можно
записать
(см. раздел 7 данного семинара).

Соседние файлы в предмете Физика

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Градиент функции

Градиент — вектор, своим направлением указывающий направление наискорейшего возрастания некоторой величины u. Другими словами, направление градиента есть направление наибыстрейшего возрастания функции.

Градиент функции

Назначение сервиса. Онлайн калькулятор используется для нахождения градиента функции нескольких переменных. (см. пример) При этом решаются следующие задачи:

  • нахождение частных производных функции, запись формулы градиента, вычисление наибольшой скорости возрастания функции в указанной точке;
  • вычисление градиента в точке A, нахождение производной в точке A по направлению вектора a;
  • нахождение полного дифференциала функции.
  • Шаг №1
  • Шаг №2
  • Видеоинструкция
  • Оформление Word

Решение со всеми исходными формулами сохраняется в формате Word.

Полный дифференциал для функции двух переменных:

Полный дифференциал для функции трех переменных равен сумме частных дифференциалов: d f(x,y,z)=dxf(x,y,z)dx+dyf(x,y,z)dy+dzf(x,y,z)dz

Алгоритм нахождения градиента

  1. Вычисление частных производных по формуле:

    Градиент функции

  2. Вычисление частных производных в точке A.
  3. Нахождение направляющих углов вектора a.
  4. Вычисление производной в точке A по направлению вектора a по формуле;

    Производная в точке по направлению вектора

  5. Наибольшая скорость возрастания функции в указанной точке равна модулю градиента функции в этой точке.

Задать свои вопросы или оставить замечания можно внизу страницы в разделе Disqus.
Можно также оставить заявку на помощь в решении своих задач у наших проверенных партнеров (здесь или здесь).

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти свою цифровую подпись
  • Как найти архив в инстаграме с историями
  • Как найти место бывшей ярмарки
  • Как найти кур несушек
  • Как найти своего друга в бравл старс

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии