Вы могли бы это понять, но видели ли вы это?

I) Зачем беспокоиться

Во-первых, давайте разберемся, что может быть слоном в комнате для некоторых. Зачем вам читать этот блог? Во-первых, потому что у него потрясающая анимация, как на рисунке 1 ниже. Разве вы не хотите знать, что происходит на этой картинке?

Во-вторых, потому что оптимизация действительно очень важна. Меня не волнует, кто вы, это должно быть правдой. Я имею в виду, это наука поиска лучшего. Он позволяет вам выбрать свое определение «лучшего», а затем, каким бы оно ни было, подскажет, что вы можете сделать для его достижения. Это просто.
Кроме того, хотя оптимизация - это целая наука и все такое - имеет большую глубину, в ней есть базовая техника первого порядка, называемая «градиентный спуск», которая действительно проста для понимания. Оказывается, этот прием на самом деле наиболее широко используется на практике. По крайней мере, в машинном обучении, поскольку модели становятся все более сложными, использование сложных алгоритмов оптимизации становится все труднее и труднее. Поэтому люди просто используют градиентный спуск. Другими словами, изучите градиентный спуск, и вы узнаете самый простой, но также наиболее широко используемый метод оптимизации. Итак, давайте разберемся с этой техникой очень интуитивно.

II) Оптимизация латунных гвоздей

Как я уже упоминал в последнем разделе, оптимизация - это здорово. Для этого нужно взять одно число - например, сумму денег на вашем банковском счете или количество клопов в вашей постели - и показать вам, как сделать это как можно лучше (если вы похожи на большинство людей, высокий в первом случае и низкий во втором). Назовем это то, что мы пытаемся оптимизировать по z.
И здесь, конечно же, подразумевается, что мы можем каким-то образом контролировать то, что хотим оптимизировать. Скажем, это зависит от некоторой переменной (скажем, x, которая находится под нашим контролем. Итак, при каждом значении x есть какое-то значение z (и мы хотим найти x, который делает z лучшим).
Вероятно, существует какое-то уравнение, описывающее этот график. Скажем, f (x, z) = 0. Но в контексте оптимизации нам нужно выразить его в форме: z = f (x) (при условии, что исходное уравнение способствует отделяя z от x таким образом). Затем мы можем спросить: «Какое значение x соответствует наилучшему z?». Если у нас есть хорошая непрерывная функция, то мы можем точно сказать, что при этом особом x , производная z = f (x) (обычно обозначаемая f '(x)) будет равна нулю.

III) Что такое градиент

Когда то, что мы оптимизируем, зависит от нескольких переменных, понятие производной распространяется на градиент. Итак, если z сверху зависит от x и y, мы можем собрать их в один вектор u = [x, y]. Итак, при z = f (x, y) = f (u) градиент z становится:

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

Как видите, первые два члена правой части включают только u, без квадратов, кубов или более высоких степеней (они появляются в последующих членах). Эти первые два члена также являются наилучшим линейным приближением функции около u = a. Ниже мы покажем, как выглядит это линейное приближение для простого параболоида (z = x² + y²).

IV) Линейные функции

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

Если у нас есть два измерения (ось x и ось y) и линия пересекает ось x в точке x = a и ось y в точке y = b, уравнение принимает вид

Когда y = 0, мы получаем x / a = 1, что совпадает с уравнением выше.
Что, если у нас есть три измерения? Я думаю, ты знаешь, к чему это идет

и так далее (это, кстати, красная плоскость, которую вы видели на рисунке 1 выше).
Теперь мы видим, что все приведенные выше уравнения симметричны по x, y, z и так далее. Однако в контексте оптимизации один из них имеет особый статус. И это переменная, которую мы стремимся оптимизировать. Скажем, это специальная переменная z. Если мы хотим выразить это как проблему оптимизации, нам нужно выразить уравнение как z = f (x). Если мы сделаем это с уравнением (4), мы получим

V) Я хочу увеличить свою линейную функцию. Куда мне пойти?

Это центральный вопрос для этого блога. У вас есть линейная функция, описанная приведенным выше уравнением, причем x и y находятся под вашим контролем. Вы попадаете в определенное значение (x, y). Скажем для простоты, что в текущей точке z = 0. Вы можете сделать шаг в 1 единицу в любом направлении. Возникает вопрос, в каком направлении вам следует сделать этот шаг? Эта загадка представлена ​​на рисунке 3 ниже, где показаны бесконечные направления, по которым вы можете пройти. Каждое направление меняет целевую функцию z на разную величину. Таким образом, один из них будет увеличивать z больше всего, а другой уменьшит z больше всего (в зависимости от погоды мы хотим максимизировать или минимизировать его).
Обратите внимание, что если бы у нас была только одна переменная в нашем элементе управления (скажем, x), это было бы намного проще. На выбор было бы только два направления (увеличить x или уменьшить x). Однако, как только мы переходим к двум или более свободным переменным, количество вариантов увеличивается с двух до бесконечности.

Теперь мы хотим найти направления, в которых z изменяется больше всего. Так что давайте поступим наоборот (скажем, потому что мы немного сумасшедшие?). Давайте посмотрим, в каком направлении z вообще не меняется. Если вы внимательно посмотрите на рисунок выше, то увидите, что это происходит, когда зеленая стрелка совпадает с оранжевой линией (линия, где пересекаются зеленая сетка и красная плоскость). А затем, если вы продолжите смотреть, вы можете заметить, что z больше всего меняется, когда зеленая стрелка перпендикулярна оранжевой линии.
Итак, похоже, что эта оранжевая линия может дать некоторое представление об этой проблеме. Что же тогда за оранжевая линия? Хорошо, это ясно, где наша плоскость пересекает зеленую сетку, представляющую плоскость x-y (сетку, по которой мы можем двигаться). И каким было бы уравнение плоскости x-y? Было бы z = 0. Другими словами, z на нем не меняется. Итак, поскольку оранжевая линия полностью лежит на сетке, на ней также должно быть z = 0. Неудивительно, что z отказывается изменяться, когда наша зеленая стрелка заставляет нас просто перемещаться по оранжевой линии.

Что касается уравнения оранжевой линии, это то место, где уравнения плоскости -

и x-y сетка; z = 0 выполняются одновременно. Это дает нам

Теперь из уравнения оранжевой линии выше ясно, что когда y = 0, x = a. Итак, вектор положения точки, в которой он пересекает ось x, равен o_x: [a, 0] (o для оранжевого). Точно так же точка пересечения оси Y - o_y: [0, b]. Теперь, когда у нас есть векторы положения двух точек на линии, мы вычитаем их, чтобы получить вектор вдоль линии (o).

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

VI) Градиент плоскости

Применяя определение градиента из раздела III к уравнению плоскости сверху (x / a + y / b + z / c = 1), получаем -

Это делает градиент:

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

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

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