ВНУТРИ ИИ

Линейная регрессия: функция гипотезы, функция стоимости и градиентный спуск. (Часть 2)

Математика и теория, лежащие в основе самой известной техники контролируемого обучения

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



Резюме: -

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

Минимизация стоимости: -

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

Обратите внимание, что график линейной регрессии с одной переменной, использующий прямую линию, всегда будет генерировать форму чаши. Теперь снова мы должны воспользоваться помощью исчисления, чтобы минимизировать стоимость. Слышали ли вы о концепции градиента и минимизации функции. Если нет, вы всегда можете найти его в своем браузере.
Глядя на график, можно сказать, что минимальное значение функции стоимости находится на дне чаши. И на самом деле, самая нижняя точка чаши дает нам оптимальное решение. Мы будем использовать концепцию минимизации функции, чтобы найти эту точку. То есть в глобальном минимуме, если найти наклон кривой, он будет равен нулю. И наоборот, точка минимума находится там, где наклон равен нулю. Итак, мы должны найти производную от стоимости как по отношению к thata0, так и к theta1.

Проблема в том, что мы не можем одновременно найти производную от стоимости как по тета0, так и по тета1. Потому что производная - это скорость изменения одной переменной по отношению к другой переменной, а не по отношению к нескольким переменным. Итак, опять же из исчисления, для такого рода случаев используются частные производные. Мы находим производные стоимости относительно тета0 и тета1 отдельно.

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

Градиентный спуск: -

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

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

Какова будет ваша стратегия? Вот решение. Вы оглядитесь во всех направлениях и решите, какой путь приведет вас на несколько метров вниз с меньшим количеством шагов, чем другие. После этого, когда вы достигнете этой точки, вы снова будете смотреть во все стороны и решать, какой путь ведет вниз по склону, не делая лишних шагов. И таким образом вы бы достигли подножия этой горы в короткий период времени. Помните, я не упомянул о том, чтобы смотреть вниз у подножия холма, чтобы выбрать путь. Вместо этого я упомянул о выборе промежуточных точек. Потому что во многих случаях это не всегда так, как кажется. Теоретически это будет выглядеть так:

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

У нас есть «W» на оси x и J (w) на оси y. Возьмем произвольную точку, обозначенную на графике «начальный вес». Находим наклон в этой точке, взяв производную. Это говорит нам о том, что наклон равен +ve. [Наклон = подъем/уклон, и если мы пойдем в положительном направлении по оси x, мы увидим, что он растет. Вы можете погуглить.] Что это значит, это означает, что функция увеличивается в этой точке, если мы создаем точку, которая больше, чем w:-

Что вы можете сделать из этого? Если наклон положителен в точке, и мы берем другую точку, которая больше этой точки. Потом пойдет в гору. И что мы хотим сделать, так это добраться до основания/дна, поэтому мы возьмем точку на кривой, которая меньше, чем w, и таким образом мы будем двигаться в направлении стрелок.
Так что же? как выглядит наша функция затрат?

Возможно, вам знакома эта формула. Позвольте мне объяснить вам математику, стоящую за этой формулой. J (тета) — это вы знаете нашу функцию стоимости. И, как я уже упоминал, мы должны взять частную производную от J по обеим тетам отдельно. Что такое альфа? Он контролирует, насколько большие шаги мы должны предпринять. Вспомним концепцию из предыдущего абзаца. Сначала мы находим наклон, а затем решаем, в каком направлении мы должны сделать шаг, но насколько больший шаг мы должны стремиться достичь промежуточной точки. Он используется для контроля расстояния от того места, где мы стоим, и до того места, где мы хотим достичь этого конкретного момента. Эта альфа важна, потому что, если мы будем делать большие шаги, мы можем пропустить точку минимума, а если мы будем делать маленькие шаги, то для достижения точки минимума потребуется много времени.

Выше приведен пример хорошего значения альфа.

альфа также известна как скорость обучения. Теперь перейдем к знаку минус и тета. Знак минус используется, чтобы решить, в каком направлении мы хотим двигаться. Если наклон положительный, мы хотим выбрать значение, которое меньше нашего текущего значения. Поэтому мы вычитаем наше текущее значение из альфа-скорости обучения (чтобы решить, насколько меньшее значение мы хотим) и делаем его нашим новым значением для тета. И таким образом, делая это в каждой точке, мы достигаем минимального значения. Что произойдет, когда мы достигнем минимального значения? Будет ли он продолжать предпринимать произвольные шаги? Нет, вспомним нашу концепцию со склона. В точке минимума наш наклон равен нулю. Поэтому, когда наклон равен нулю, и мы умножаем его на альфу, получается ноль. Так что никаких дальнейших действий мы не предпринимаем.

Итак, наш алгоритм: -

Одна вещь, которую мы хотим учитывать, это то, что мы обновляем значения как тета0, так и тета1. Итак, мы должны сделать это одновременно, например: -

Теперь мы хотим реализовать этот алгоритм на языке программирования, и в этом случае я бы использовал Octave, потому что он прост. Этот язык программирования буквально очень легко адаптировать, чем другие языки программирования. Более того, Octave имеет тот же синтаксис, что и Matlab. Вы можете скопировать код и запустить его в Matlab.

Код для функции стоимости.

Обратите внимание, что в коде я представил функцию гипотезы как =X*theta.

Это сделано для сокращения объема вычислений функции гипотезы.

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

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

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

Код для Градиентный спуск.

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

И если вам интересно: -

Поскольку ноль (обратитесь к первому столбцу матрицы, который равен 1) всегда равен единице, поэтому мы им пренебрегаем.

Спасибо за чтение!

Я надеюсь, что эта статья помогла вам понять градиентный спуск. Хлопки!

С уважением,

Махьяр Али,