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

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

Но…. мы что-то упускаем, как наша программа сама найдет наилучшую строку в любом случайном наборе данных. Что, если у нас есть два набора данных; один из них представляет собой данные о результатах тестов и часах обучения учащихся средней школы, а другой набор данных - об учащихся средней школы. Цель искусственного интеллекта — поставить перед программой задачу и заставить ее решить ее за нас. При этом нам понадобится что-то, что позволит нашей программе найти строку, наиболее подходящую для самих данных.

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

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

Пример линейной регрессии

Предположим, у нас есть следующий набор данных:

Если бы мы хотели провести линию через эти данные, мы бы использовали формулу пересечения наклона y = mx + b , где m представляет значение наклона, а b представляет собой точку пересечения по оси y. Чтобы найти лучшую линию для наших данных, нам нужно найти лучший набор значений наклона m и точки пересечения по оси y b.

Функция ошибки

Чтобы найти линию, наиболее подходящую для наших данных выше, нам нужно определить функцию ошибки (также называемую функцией стоимости). Этот тип функции ошибок более конкретно называется остаточной суммой квадратов или суммой квадратов ошибок предсказания. Функция ошибок — это мера несоответствия между набором данных и моделью оценки (наша предсказанная линия наилучшего соответствия). По сути, он измеряет, насколько «хороша» данная линия.

y — это i-е значение прогнозируемой переменной, x — это i-е значение объясняющей переменной, а mx + b — это прогнозируемое значение y. Функция возводится в квадрат, чтобы гарантировать, что значения будут положительными до суммирования. Затем сумма квадратов оценок затем делится на общее количество значений N в нашем наборе данных. В приведенном ниже коде показано, как выглядит функция ошибки в python.

Чтобы найти ошибку, функция принимает в качестве параметров наклон m и точку пересечения с осью y b. Затем он проходит через двумерный массив points и сохраняет сумму квадратов ошибок в totalError со следующими прогнозируемыми значениями m и b и значениями x и y на каждой итерации цикла for. Затем, после выхода из цикла for, он делит totalError на количество значений в массиве точек float(len(points)) и возвращает его как число с плавающей запятой. Теперь нам нужно придумать, как заставить нашу программу самостоятельно находить наилучшие значения для b и m, здесь в дело вступает градиентный спуск.

Использование градиентного спуска для минимизации функции ошибки

Представьте, что изображение ниже — это градиент для нашего набора данных. Чтобы вычислить градиент, нам нужно дифференцировать нашу функцию ошибок. Градиентный график принимает к сведению 3 значения, ошибку, вычисленную в функции ошибок, точку пересечения оси Y b и наклон m. Каждая точка на градиенте представляет собой наклон точки пересечения оси y b и наклона m для суммирования всех значений x и y в нашем наборе данных. Как мы видим, область, занимающая наименьшую ошибку, находится там, где уклоны градиента самые плоские (синяя область внизу).

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

Код для градиентного спуска размещен на изображении ниже. Здесь вы можете видеть, что функция step_gradient принимает 4 параметра: текущее значение для b b_current, текущее значение для m m_current, двумерный массив нашего набора данных points и learning_rate. learning_rate определяет, насколько быстро наша программа будет обучаться. Если learning_rate слишком велико, это сделает слишком большой шаг в градиенте, потенциально пропуская минимум. С другой стороны, если learning_rate слишком низкое, то для достижения минимума потребуется вечность, если он вообще будет достигнут.

Функция step_gradient перебирает весь набор данных и использует значения x и y на каждой итерации, чтобы найти градиент b и m соответственно. Затем значения градиента умножаются на learning_rate, вычитаются из b_current и m_current соответственно, присваиваются значениям new_b и new_m, а затем возвращаются в функцию gradient_descent_runner.

gradient_descent_runner — это то, что позволяет программе найти минимум самой функции. Функция принимает следующие параметры points, starting_b = 0, starting_m = 0, learning_rate и num_iterations = 1000. Затем цикл for будет повторно вызывать step_gradient для любого значения, установленного для num_interations.

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

Связывание всего вместе

Здесь в нашей основной функции мы объявляем следующие переменные; points, learning_rate, initial_b, initial_m, num_iterations и массив конечных значений b и m.

Он вызывает gradient_descent_runner, чтобы инициировать градиентный спуск, чтобы мы могли добиться линейной регрессии для нашего набора данных. После того, как значения будут напечатаны в консоли. Вуаля! Мы добились линейной регрессии с градиентным спуском!

Цитаты

Код для этого вводного проекта можно найти здесь:



и тут



Спасибо Мэтту и Сирадж за то, что поделились информацией с нами, новичками. Очень признателен! ;)