Математика для ИИ: Дифференциал, производная и правила дифференцирования

от автора

Всем привет. Меня зовут Алмаз Хуснутдинов. В этой статье я показал, что такое дифференциал, как выводится понятие производной и рассказал про правила дифференцирования, которые используются в системах автоматического дифференцирования для глубокого обучения.

Содержание: Предел функции, дифференциал, дифференциал аргумента и функции, понятие производной, вывод производной функции, правила дифференцирования, пример использования цепного правила.

Предел

Предел функции одной переменной — значение, к которому приближается значение функции, когда её аргумент (независимая переменная) приближается к определённой точке. Формально, для функции y = f(x), предел в точке x_0 определяется как число a, к которому f(x) приближается, когда x приближается к x_0:

\lim\limits_{x \to x_0} f(x) = a

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

\lim\limits_{(x_1,…,x_n) \to (x_{0,1},…,x_{0,n})} f(x_1,…,x_n) = a

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

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

При нахождении пределов часто встречаются неопределённости — когда по правилам математики не получается вычислить значение, такие как 0/0 или ∞/∞. Для устранения этих неопределённостей могут использоваться методы упрощения выражения и правило Лопиталя.

Свойства предела:

Скрытый текст

Предел константы: \lim \limits_{ x \to a} C = C

Предел суммы: \lim \limits_{x \to a} (u(x) + v(x)) = \lim \limits_{x \to a} u(x) + \lim \limits_{x \to a} v(x)

Предел произведения константы на функцию: \lim \limits_{x \to a} C \cdot u(x) = C \cdot \lim \limits_{x \to a} u(x)

Предел произведения двух функций: \lim \limits_{x \to a} u(x) \cdot v(x) = \lim \limits_{x \to a} u(x) \cdot \lim \limits_{x \to a} v(x)

Предел частного: \lim \limits_{x \to a} \frac{u(x)}{v(x)} = \frac{\lim \limits_{x \to a} u(x)}{\lim \limits_{x \to a} v(x)}

Для вычисления пределов необходимо понимать их свойства, чтобы понимать, как именно получается то или иное преобразование.

Дифференциал

Приращение значения — прибавление к значению какой-либо переменной x_0 какого-то небольшого числа Δx, в результате получается новое значение x_1.

Приращение значения

Приращение значения x_0

Рассмотрим график функции y=f(x) (см. рисунок ниже). В точке x_0 получается значение функции y_0. Делаем приращение Δx значения x_0 и получаем значение x_1. В результате получается новое значение функции y_1 и изменение значения функции Δy_1.

График функции y=f(x) и приращение аргумента x

График функции y=f(x) и приращение аргумента x

Наша задача состоит в том, чтобы вычислить значение угла, который образует линия графика к горизонтальной оси. Рассмотрим прямоугольный треугольник ABC. Мы можем посчитать значение угла BAC, оно будет равно тангенсу частного Δy_1/Δx. Но, как видно из рисунка, это не будет истинным значением угла, более того, оно будет сильно неточным. Рассмотрим другой способ.

Для чего нам нужно знать значение этого угла? — Значение угла показывает значение скорости изменения функции в данной точке. Мы можем использовать это значение для того, чтобы двигаться в сторону локального минимума или максимума — это основа градиентного обучения в машинном обучении.

Рассмотрим касательную прямую l. Мы рассматриваем угол в треугольнике ABD, который образует касательная к линии графика в точке x_0. Угол касательной и угол линии графика совпадают. Для того, чтобы вычислить значение этого угла, нужно вычислить значение тангенса частного BD/AB.

Мы видим, что фактическое значение функции y_1 в точке x_1 отличается от значения y_2, которое образуется в точке D, более того, мы не знаем значения Δy_2, поэтому вычисление угла таким способом становится невозможным.

Так как это невозможно, то рассмотрим предыдущий способ, но с небольшим изменением. Так как погрешность измерения угла через тангенс BC/BA или же Δy_1/Δx велика, то это не очень подходит, но вместо этого можно изменять величину приращения Δx. Чем меньше смещение x, тем меньше расстояние между y_1 и y_2. Так как y_1 не может быть меньше, чем y_2, то в предельном значении y_1 будет равен y_2. Чем меньше приращение, тем точнее значение угла и тем ближе значение Δy_1 к значению Δy_2. Мы можем делать это приращение бесконечно малым, если будем использовать понятие предела (так как оно математически позволяет это сделать).

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

Дифференциал (от лат. differentia «разность, различие») — бесконечно малое приращение значения:

d(a) = \lim \limits_{(a_1 - a) \to 0} (a_1 - a)

d — оператор, который представляет собой предел бесконечно малого приращения аргумента a (числа), a — переменная (аргумент оператора d), a_1 — приращенное значение аргумента (переменной) a.

Дифференциал аргумента — бесконечно малое приращение аргумента функции:

d(x) = \lim \limits_{\triangle x \to 0} \triangle x

Дифференциал функции — бесконечно малое приращение значения функции:

d(f) = \lim \limits_{\triangle x \to 0}(f(x + \triangle x) - f(x))

Если у функции много переменных, то дифференциал функции для каждой переменной будет разным, и будет называться частным дифференциалом функции. Для нахождения частного дифференциала, нужно зафиксировать (не изменять) значения всех переменных кроме рассматриваемой.

Мы можем вычислить значение тангенса угла BAC, которое при использовании понятия дифференциала, будет равно значению тангенса угла BAD.

Производная

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

f'_x(x) = \frac{dy}{dx} = \frac{\lim \limits_{\triangle x \to 0} \triangle y}{\lim \limits_{\triangle x \to 0} \triangle x} = \lim \limits_{\triangle x \to 0} \frac{\triangle y}{\triangle x} = \lim \limits_{\triangle x \to 0} \frac{f(x + \triangle x) - f(x)}{\triangle x}

Δx — приращение значения аргумента функции, Δy — приращение значения функции. В этой формуле использовано свойство предела «предел частного», так запись более удобна.

Производная — частное от дифференциала значения функции в точке х и дифференциала значения переменной x. Это отношение можно интерпретировать как значение угла линии графика в точке x для функции f(x) или значение скорости изменения графика функции f(x).

Частная производная — отношение частного дифференциала функции по рассматриваемой переменной к дифференциалу рассматриваемой переменной функции.

Формально, если функция f(x) дифференцируема в точке x, то дифференциал df(x) или dy определяется как: df(x)=f′(x) \cdot Δx или, используя обозначение dx для бесконечно малого приращения x, df(x)=f′(x) \cdot dx. Это означает, что дифференциал функции можно рассматривать как линейное приближение приращения функции в окрестности данной точки.

Обозначения производной:

t = u(x), f(x) = v(t), u'_x = \frac{du}{dx}f'(x) =f'_x(x) = f'_x = \frac{\partial f}{\partial x} = \frac{\partial f}{\partial v} \cdot \frac{\partial v}{\partial t} \cdot \frac{\partial t}{\partial u} \cdot \frac{\partial u}{\partial x}

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

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

y = f(Х), X = (x_1,...,x_n)\frac{\partial y}{\partial X} = \frac{\partial y}{\partial f(X)} \cdot \frac{\partial f(X)}{\partial X} = \left(\frac{\partial y}{\partial x_1},...,\frac{\partial y}{\partial x_n}\right)

это вектор-градиент или просто градиент функции y=f(X).

Дифференцирование — процесс определения производной (или скорости изменения) какой-либо функции.

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

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

Здесь приведен пример того, как находить аналитическое значение производной.

Найдем производную функции f(x) = \sqrt x через понятие предела, y=f(x).

Скрытый текст
f'_x(x) = \lim \limits_{\triangle x \to 0} \frac{\triangle y}{\triangle x} = \lim \limits_{\triangle x \to 0} \frac{f(x + \triangle x) - f(x)}{\triangle x} = =\lim \limits_{\triangle x \to 0} \frac{\sqrt{x + \triangle x} - \sqrt x}{\triangle x} = \frac{0}{0}

Уберем неопределенность домножив числитель и знаменатель на сопряженное выражение и используем свойство предела «предел частного».

\lim \limits_{\triangle x \to 0} \frac{(\sqrt{x + \triangle x} - \sqrt x) \cdot (\sqrt{x + \triangle x} + \sqrt x)}{\triangle x \cdot (\sqrt{x + \triangle x} + \sqrt x)} == \lim \limits_{\triangle x \to 0} \frac{x + \triangle x - x}{\triangle x \cdot (\sqrt{x + (\triangle x)^{\to 0}} + \sqrt x)} = \lim \limits_{\triangle x \to 0} \frac{\triangle x}{\triangle x \cdot 2 \sqrt x} == \lim \limits_{\triangle x \to 0} \frac{1}{2 \sqrt x} = \frac{\lim \limits_{\triangle x \to 0} 1}{\lim \limits_{\triangle x \to 0} 2 \sqrt x} = \frac{1}{2 \sqrt x}

Найдем производную функции f(x) = ln(x), y = f(x).

Скрытый текст
f'_x(x) = \lim \limits_{\triangle x \to 0} \frac{\triangle y}{\triangle x} = \lim \limits_{\triangle x \to 0} \frac{f(x + \triangle x) - f(x)}{\triangle x} ==\lim \limits{\triangle x \to 0} \frac{ln(x + \triangle x) - ln(x)}{\triangle x} = \frac{0}{0}\lim \limits_{\triangle x \to 0} \frac{ln(x + \triangle x) - ln(x)}{\triangle x} = \lim \limits_{\triangle x \to 0} \frac{ln \left(\frac{x + \triangle x}{x} \right)}{\triangle x} =\lim \limits_{\triangle x \to 0} \frac{ln \left(1 + \frac{\triangle x}{x} \right)}{{\triangle x} \cdot {\frac{x}{x}}} = \frac{1}{x} \lim \limits_{\triangle x \to 0} \frac{ln \left(1 + \frac{\triangle x}{x} \right)}{\frac{\triangle x}{x}} = \frac{1}{x}

Используем свойство логарифма «разница логарифмов равна логарифму частного», ln(a) - ln(b) = ln(a/b). Затем домножаем знаменатель на x/x. По свойству предела выносим константу x из знаменателя. Затем используем замечательный предел:

\lim \limits_{a \to 0} \frac{ln(1 + a)}{a} = 1

Подобным образом выводится аналитическое значение производной для любой элементарной функции — такая функция, которая не разлагается на более простые, например, степенная, логарифмическая или косинус. Для вывода производных более сложных функций используются выражения производных элементарных функций (таблица производных), так как выводить их через предел не имеет смысла — получится вывод тех же самых выражений для элементарных функций.

Источник двух приведенных примеров.

Правила дифференцирования

Дифференциал функции обладает несколькими свойствами, которые можно использовать при дифференцировании функций.

Форма записи дифференциала dy=f′(x)dx не зависит от того, является ли x независимой переменной или функцией другой переменной. Это делает ее инвариантной формой записи дифференциала — то есть не зависящей от того, является переменная значением функции или она изначально просто число — это позволяет использовать правила дифференцирования.

Дифференцирование сложной функции. Сложная функция — функция, которая состоит из нескольких функций. Производная такой функции вычисляется через «раскрытие» внутреннего выражения:  (u(v))’ = u’(v)v’

Если y=f(x), то

y'_x = \frac{\partial y}{\partial f} \cdot \frac{\partial f}{\partial x} = y'_f \cdot f'_x

Рассмотрим 2 примера.

Скрытый текст

Пусть y=f(x), f(x) = x^2. Для того, чтобы вычислить производную значения y по x, нужно сначала раскрыть это выражение. При раскрытии выражения появляется множитель, который равен единице, его обычно не пишут, но он существует и играет определенную роль — например, при дифференцировании матрицы через матричное произведение или при вычислении производной сложной функции.

y'_x = y'_f \cdot (f(x))'_x = y'_f \cdot (x^2)'_x = 1 \cdot 2x = 2x

Здесь представлено значение y элементарной функции x^2, мы дифференцируем это значение по переменной элементарной функции. У нас появляется множитель y’_f, который представляет собой производную функции x^2 саму по себе, этот множитель появляется из-за того, что мы берем производную не по функции x^2, а по значению y.

Скрытый текст

Пусть y=f(x)=(ln(x))^3.

y'_x = y'_f \cdot (ln^3(x))'_x = 1 \cdot (3 ln^2(x) \cdot (ln(x))'_x) = 3ln^2(x) \cdot \frac{1}{x}

Здесь аналогично. Сначала раскрываем значение у, потом раскрываем степенную функцию (ln(x))^3 и затем вычисляем производную конечной, логарифмической функции ln(x). Мы просто обозначили степенную функцию (ln(x))^3 через f(x), чтобы запись была более удобной.

По сути, раскрытие выражения является цепным правилом дифференцирования (о котором рассказано ниже). Я просто хотел акцентировать внимание на том, что мы его используем постоянно, но при этом даже об этом не подозреваем.

Дифференцирование для арифметических операций. Для функций u=f(x) и v=g(x), дифференцируемых в точке x, имеем:

Скрытый текст

 (u±v)’=u’±v’

 (uv)’=u’v+uv’

 (Cu)’=Cu’

 \left(\frac{u}{v} \right)’ = \frac{(u’v+uv’)}{v^2}

где C — константа, u и v могут быть функциями либо переменными.

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

Допустим, что у нас есть функция F, которая состоит из других функций f_i. Каждая последующая функция f_i принимает на вход значение предыдущей функции f_{i-1}.

Изображение некой вложенной функции

Изображение некой вложенной функции F

Результатом функции на рисунке будет число x_4. Для получения числа x_4 нужно использовать число x_3 и как-то его преобразовать. Аналогично для других значений.

Цепное правило заключается в том, что вычислять значение производной для каждой переменной x_i можно на основе значения производной последующей функции f_i и значения производной параметра относительно этой последующей функции f_i.

Скрытый текст

(x_4)'_{x4} = 1 — производная функции от самой себя всегда равна 1.

(x_4)'_{x3} = (x_4)'_{x4} \cdot (x_4)'_{x3} — здесь вместо x_4 во втором множителе нужно подставить выражение (формулу), по которому получается результат x_4.

(x_4)'_{x2} = (x_4)'_{x3} \cdot (x_3)'_{x2} — здесь вместо x_3 во втором множителе нужно подставить выражение, по которому получается результат x_3.

(x_4)'_{x1} = (x_4)'_{x2} \cdot (x_2)'_{x1} — здесь аналогично.

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

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

(x_4)'_{x1} = (x_4)'_{x4} \cdot (x_4)'_{x3} \cdot (x_3)'_{x2} \cdot (x_2)'_{x1}

Правило суммы. Если какая-то переменная участвует в нескольких преобразованиях, то есть в получении нескольких переменных, то для вычисления ее частной производной нужно сложить все частные производные этих переменных (в которых участвует данная переменная) по данной переменной. Правило суммы. Если какая-то переменная участвует в нескольких преобразованиях, то есть в получении нескольких переменных, то для вычисления ее частной производной нужно сложить все частные производные этих переменных (в которых участвует данная переменная) по данной переменной.

Правило суммы. Если какая-то переменная участвует в нескольких преобразованиях, то есть в получении нескольких переменных, то для вычисления ее частной производной нужно сложить все частные производные этих переменных (в которых участвует данная переменная) по данной переменной.

Изображение некой вложенной функции y=f(x)

Изображение некой вложенной функции y=f(x)
Скрытый текст

z_1=u(x), z_2=v(x), y=g(z_1,z_2)

y'_{z2} = y'_g \cdot g'_{z1}, y'_{z1} = y'_g \cdot g'_{z2}

(z_1)'_x = (z_1)'_u \cdot u'_x, (z_2)'_x = (z_2)'_v \cdot v'_x

y'_x = y'_{z1} \cdot (z_1)'_x + y'_{z2} \cdot (z_2)'_x

Для того, чтобы вычислить производную y’_x, нужно суммировать значения производных переменных, в получении которых участвовала переменная x, по переменной x, в данном примере это производные (z_1)’_x и (z_2)’_x.

Пример использования цепного правила

На вход подаются две переменные x_1 и x_2. Здесь присутствую 3 функции:

x_3 = x_1+x_2, x_4 = x_2^2 e^4, x_5 = x_3+x_4 + e

Схема функции

Схема функции F(x_1, x_2)
Скрытый текст

Вычисляем все значения.

x_1 = 3, x_2 = 4

х_3 = 3 + 4 = 7, х_4 = 16e^4, x_5 = 7 \cdot 16 \cdot e^4 + e

Вычисляем производные для каждого x_i относительно x_5 по цепному правилу.

(x_5)'_{x5} = 1

(x_5)'_{x4} = (x_3 x_4 + e)'_{x4} = x_3 = 7

(x_5)'_{x3} = (x_3 x_4 + e)'_{x3} = x_4 = 16 e^4

(x_5)'_{x2} = (x_5)'_{x3} \cdot (x_3)'_{x2} + (x_5)'_{x4} \cdot (x_4)'_{x2} = 16e^4 \cdot (x_1 + x_2)'_{x2} + 7 \cdot (x^2_2 \cdot e^4)'_{x2} = 16e^4 \cdot 1 + 7 \cdot 2x_2 \cdot e^4 = 72e^4

Для x_2 нужно суммировать все производные, в которых участвует значение x_2 — правило суммы.

(x_5)'_{x1} = (x_5)'_{x3} \cdot (x_3)'_{x1} = 16e^4 \cdot (x_1 + x_2)'_{x1} = 16e^4 \cdot 1 = 16e^4

Проверим значения производных, не используя цепное правило:

(x_5)'_{x1} = (x_3 x_4 + e)'_{x1} = (x_3 x_4)'_{x1} = (x_3)'_{x1} x_4 + x_3 (x_4)'_{x1} = (x_1 + x_2)'_{x1} x_4 + x_3(x_2^2 e^4)'_{x1} = 1 \cdot x_4 + x_3 \cdot 0 = 16e^4

(x_5)'_{x2} = (x_3 x_4 + e)'_{x2} = (x_3 x_4)'_{x2} = (x_3)'_{x2} x_4 + x_3 (x_4)'_{x2} = (x_1 + x_2)'_{x2} x_4 + x_3(x_2^2 e^4)'_{x2} = 1 \cdot x_4 + x_3 2x_2 e^4 = 16e^4 + 7 \cdot 2 \cdot 4 e^4 = 72e^4

Выглядит точно так же, но это не одни и те же формулы. В первом случае используется цепное правило, во втором — правило умножения (арифметическая операция).

Заключение

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

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

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


ссылка на оригинал статьи https://habr.com/ru/articles/873024/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *