Найти в Дзене
Программист о Data Science

День 17: Всё что нужно знать о функциях, чтобы погрузиться в ML

Оглавление
fake
fake

Мы уже рассматривали разные виды матриц в качестве неких функций. Функция в общем смысле может рассматриваться как отображение неких входных параметров на выходные значения, то есть некий алгоритм который при получении на вход x всегда в качестве результата вернёт y. Стоит понимать, что не все функции такие "правильные", но сейчас нас интересуют только такие чистые функции.

Все допустимые значения параметров функции объеденяются множеством определения функции.

Все выходные значения функции объединяются множеством значений функции.

Геометрический смысл функции

В простейшем случае функции от одной или двух переменных удобно визуализируются ввиде графиков двумерных или трёхмерных графиков соответственно. Где по каждой оси откладывается множество определений функции и по одной "дополнительной" откладывается множество значений функции. На входе мы задаём точки по осям множества определений функции, функция определяет точку на оси множества значений функции. на пересечении линий мы можем определить точку на графике. Если возьмём несколько допустимых входных параметров, то получим несколько точек на графике, которые можно объединить линией (2d) или плоскостью (3d).

График линейной функции f(x) = 2x + 10
График линейной функции f(x) = 2x + 10

Базовые свойства функции

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

Пример прерывающейся функции
Пример прерывающейся функции
Пример негладкой функции
Пример негладкой функции

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

Предел функции

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

Например, функция f(x) = 1/x не определена при x = 0. Посмотрим на предел этой функции при x стремящемся к нулю. Для начала примем x = 1, тогда f(1) = 1. Затем начнём приближать x к нулю и будем смотреть как ведёт себя функция.

f(0.1) = 10

f(0.01) = 100

f(0.001) = 1000

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

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

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

Скорость изменения графика функции

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

Приращение значения функции равно произведению приращения аргумента на скорость изменения функции.
Приращение значения функции равно произведению приращения аргумента на скорость изменения функции.
По-другому приращение значения функции можно выразить через саму функцию.
По-другому приращение значения функции можно выразить через саму функцию.
Другими словами скорость изменения функции выражается так.
Другими словами скорость изменения функции выражается так.

В случае линейной функции, у которой график - прямая, k является константой, то есть не меняется. Прямая либо постоянно растёт с одинаковой скоростью (k > 0), либо убывает (k < 0), либо не меняется (k = 0).

Производная функции

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

Функция определения скорости в конкретной точке функции.
Функция определения скорости в конкретной точке функции.

Такой предел функции называется производной этой функции f(x). То есть функция определения коэффициента изменения функции и есть производная этой функции.

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

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

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

При этом количество вложенных функций может быть сколь угодно большим.
При этом количество вложенных функций может быть сколь угодно большим.

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

Для этого придумали такую абстракцию как деффиринциал функции:

Дифференциал функции f(x)
Дифференциал функции f(x)

При этом математики используют в формулах дифференциал от x вместо приращения аргумента:

Я так и не понял почему математикам так проще. Напишите в комментариях, если поняли.
Я так и не понял почему математикам так проще. Напишите в комментариях, если поняли.

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

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

Таким образом производную от сложной функции f(x) = g(h(x)) можно выразить через дифференциал:

Начинаем декомпозировать вложенные функции.
Начинаем декомпозировать вложенные функции.

Умножим и разделим на дифференциал внутренней функции h(x):

Арифметически уравнение не поменялось.
Арифметически уравнение не поменялось.
Представляем вложенную функцию в виде переменной h - множество значений функции h(x).
Представляем вложенную функцию в виде переменной h - множество значений функции h(x).

Соответсвенно получаем:

Вот и декомпозировали, теперь осталось правильно интерпретировать результат.
Вот и декомпозировали, теперь осталось правильно интерпретировать результат.

Теперь, зная что такое дифференциал можем ещё упростить выражение:

Вот и полностью декомпозированная производная сложной функции.
Вот и полностью декомпозированная производная сложной функции.

То есть производная сложной функции равна произведению производных простых функций, из которых состоит сложная функция.

Это было сложно, но на самом деле вроде бы и нет. Ставь лайк, если разобрался и пиши коммент, если что-то нужно объяснить подробнее и проще.

Заключение

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