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

СОДЕРЖАНИЕ

1) Однозначная дифференциация

2. Минимумы и максимумы

3. Алгоритм градиентного спуска.

4. Шаги для алгоритма градиентного спуска.

5. Типы алгоритмов градиентного спуска.

6. Реализация стохастического градиентного спуска.

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

Однозначная дифференциация

Дифференциация позволяет нам определить скорость изменения. Интуитивно dy / dx означает, насколько изменяется y при изменении x.

Геометрически производная [f '(x) или dy / dx] функции y = f (x) в точке P (x, y) (если существует) равна наклону (или градиент) касательной к кривой y = f (x) в точке P (x, y).

Касательная: в геометрии касательная линия к плоской кривой в данной точке - это прямая линия, которая «только касается» кривой в этой точке. Математически касательная дается формулой

dy / dx - наклон касательной к f (x).

Минима и Максима

Максимум - это высокая точка, а минимум - это низкая точка.

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

Где он выравнивается? Где наклон равен нулю.

Где нулевой наклон? Производная говорит нам!

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

Стационарная точка на кривой определяется как точка, в которой производная обращается в нуль, т.е. точка (x0, f (x0)) является стационарной точкой f (x), если [dx / df] = 0.

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

Можно видеть, что наклон касательной, проведенной в любой точке кривой, то есть dy / dx, изменяется от отрицательного значения до 0 до положительного значения вблизи точки локальных минимумов.

Сначала мы находим точки максимума и минимума, выполнив следующие действия.

  1. Найдите производную функции.
  2. Установите производную равной 0 и решите относительно x.
  3. Вставьте значение вы нашли для x в функцию, чтобы найти соответствующее значение y. Это ваш максимальный или минимальный балл.

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

Алгоритм градиентного спуска

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

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

Подумайте о долине, по которой вы хотели бы спуститься, когда у вас завязаны глаза. Любой здравомыслящий человек сделает шаг и поищет склон долины, идет ли он вверх или вниз. Как только вы будете уверены в спуске, вы будете следовать ему и повторять этот шаг снова и снова, пока не спуститесь полностью (или не достигнете минимумов).

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

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

Рассмотрим целевую функцию f: Rd → Rf, которая принимает на вход любой многомерный вектор x = [x1, x2,…, xd]. Градиент f (x) относительно xx определяется вектором частных производных.

каждый элемент ∂f (x) / ∂xi градиента указывает скорость изменения для f в точке x только по отношению к входу xi.

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

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

Шаги для алгоритма градиентного спуска

  1. Сначала мы берем функцию, которую хотим минимизировать, и очень часто с учетом градиента вычисляем изменение параметров со скоростью обучения.
  2. Пересчитайте новый градиент с новым значением параметра.
  3. Повторяйте шаг 1 до схождения.

Вот формула алгоритма градиентного спуска:

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

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

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

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

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

Как правило, значение скорости обучения выбирается вручную, начиная с 0,1, 0,01 или 0,001 в качестве общих значений, а затем адаптируется, независимо от того, занимает ли градиентный спуск слишком много времени для расчета (вам необходимо увеличить скорость обучения) или взрывается или неустойчиво (вам нужно уменьшить скорость обучения).

Типы алгоритмов градиентного спуска

Существует три варианта градиентного спуска в зависимости от количества данных, используемых для расчета градиента:

  • Пакетный градиентный спуск
  • Стохастический градиентный спуск
  • Мини-пакетный градиентный спуск

Пакетный градиентный спуск:

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

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

Стохастический градиентный спуск:

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

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

Это комбинация градиентного спуска ванны и стохастического градиентного спуска. Мини-пакетный градиентный спуск выполняет обновление пакета наблюдений. Это предпочтительный алгоритм для нейронных сетей, а размер пакета обычно составляет от 50 до 256.

Реализация стохастического градиентного спуска для линейной регрессии

Цель :

  1. Возьмите набор данных Boston из sklearn.
  2. Напишите SGDRegressor с нуля.
  3. Вам не нужно разделять данные на обучение и тестирование, вы рассматриваете данные целиком для этой реализации.
  4. Получите веса (coefs_ и перехват) из вашей модели и значение MSE.
  5. Не забудьте стандартизировать данные и выбрать подходящую скорость обучения.
  6. Обучите свою модель с помощью SGDRegressor с теми же параметрами и найдите MSE на тех же данных.
  7. Сравните эти два результата.
  8. Вы можете выбрать любую другую метрику, кроме MSE, чтобы сравнить их. Они оба должны быть одинаковыми.

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

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

Во-первых, мы хотим импортировать все необходимые библиотеки.

Импорт набора данных Boston из sklearn.

Стандартизация данных

SGDRegressor для линейной регрессии с использованием библиотеки sklearn

Оптимальные веса и перехват с использованием sklearn SGD

Визуализация результатов

График ошибок для sklearn SGD

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

сравнение графика ошибок для Sklearn SGD и самореализуемого SGD

Вывод

Как видно из вышеизложенного, мы можем видеть, что среднее значение различий в предсказании двух моделей равно 0. Как мы видим выше, перехват и вес (coef) почти одинаковы для sklearn SGD и самореализуемого SGD.

Чтобы понять полный код, перейдите по моей ссылке GitHub.

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

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

использованная литература

  • Прикладной ИИ
  • Википедия
  • Coursera
  • Data Camp

Спасибо за чтение и за ваше терпение. Надеюсь, вам понравился пост, дайте мне знать, если в моем посте есть ошибки. Обсудим в комментариях, если что-то не так в посте или есть что добавить…

Удачного обучения !!