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

здесь я буду говорить о

  • как найти градиент по 2 точкам
  • как найти градиент линейной функции
  • как найти градиент нелинейной функции
  • как найти градиент с 2 или более переменными (частная производная)
  • как интерпретировать градиент (преобразование градиента в градус)

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

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

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

import numpy as np
import matplotlib.pyplot as plt
import sympy as sy

градиент от 2 точек

x = [1,3,5,7,9,11]
y = [2,4,6,8,10,12]
plt.plot(x,y)
plt.xlabel('X')
plt.ylabel('Y');

мы собираемся найти градиент этой линии по двум точкам

plt.plot(x,y)
plt.plot(x[2],y[2],label = 'point 1',marker = 'o')
plt.plot(x[4],y[4],label = 'point 2',marker = 'o')
plt.plot([x[2],x[4]],[y[2],y[2]],linewidth = 2,label = 'change in x (dx)')
plt.plot([x[4],x[4]],[y[2],y[4]],linewidth = 2,label = 'change in y (dy)')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend();

точка 1 = (5,6)
точка 2 = (9,10)

изменение y (dy) = 10 - 6
изменение x (dx) = 9 - 5

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

предположим, что уравнение y=0.5x+3 в качестве дороги.

x = np.linspace(0,10,100)
y = 0.5*x+3
plt.plot(x,y)
plt.xlabel('length (km)')
plt.ylabel('height (m)');

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

здесь мы имеем y=0,5x+3 как уравнение. мы собираемся найти производную/градиент, используя библиотеку sympy.

#specify only the symbols in the equation
X = sy.symbols('x')
#find the gradient by using diff method
gradient = sy.diff(0.5*X+3)
print(gradient)
0.500000000000000

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

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

давайте сделаем еще один пример с нелинейным уравнением.

y = 0.5x²+3x-1

#generate 100 random numbers ranging from -30 to 20
x = np.linspace(-30,20,100) 
y = 0.5*x**2+3*x-1.

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

plt.plot(x,y)
plt.plot(x[20],y[20],marker = 'o',markersize = 10, color = 'black');

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

X = sy.symbols('x')
func = 0.5*X**2+3*X-1
sy.diff(func)

1.0 x + 3

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

предположим, х = -19,9

наклон = 1,0x+3
наклон = 1,0(-19,9)+3

slope = 1.0*-19.9 + 3
print(slope)
-16.9

когда x равно -19,9, кривая нисходит со скоростью -16,9.

градиент 2 или более переменных

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

мы найдем 2 градиента этой функции.

  • градиент относительно m
  • градиент относительно b

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

x,y,m,b = sy.symbols('x y m b')
func = (y-(m*x+b))**2

теперь найдем градиент функции ошибок по m

sy.diff(func,b)

подключите переменные, вы получите градиент функции ошибок относительно b.

во-вторых, найти градиент функции ошибок по m

sy.diff(func,m)

снова подставьте переменные, вы получите градиент функции ошибок по отношению к m.

как интерпретировать градиент

во второй части получаем градиент 0,5. это означает, что когда вы продвинетесь на 1 метр, произойдет увеличение высоты на 0,5 метра.

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

мы также можем интерпретировать наклон по-другому. мы обычно используем угол для описания крутизны, потому что он более интуитивно понятен. мы можем сделать это в numpy. все, что нам нужно, это радианы наклона и конвертировать их в градусы.

Угол 0 градусов - плоская горизонтальная поверхность, без крутизны. у вас не будет проблем с ходьбой по этому.

Угол 90 градусов - это вертикальная поверхность, крайняя крутизна, очень крутая. нужно быть ниндзя из деревни листьев, чтобы ходить по такой поверхности.

теперь давайте посмотрим, насколько крут наклон 0,5 с точки зрения угла

сначала мы используем np.arctan(slope), чтобы найти радианы наклона
во-вторых мы используем np.rad2deg(radian), чтобы преобразовать радианы в градусы

radian = np.arctan(0.5)
angle = np.rad2deg(radian)
print(f'the slope of 0.5 has a {round(angle)} degree angle')

наклон 0,5 имеет угол 27 градусов

заключение

это почти все, что я знаю о том, как найти градиент функции в python.

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

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