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

Так что же даст эта статья?

Цель этой статьи — продемонстрировать простое применение градиентного спуска для соответствия некоторым реальным данным.

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

Глоссарий

Алгоритм. Шаблонный набор правил или процессов. Слово, возникшее в IX в. Это может быть функция или фрагмент кода, который выполняет определенные шаги для получения определенного результата.

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

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

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

Введение

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

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

Выполнение

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

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

Модель имеет два неизвестных: градиент и начальную точку. Первоначально они установлены на 1,0, что явно не соответствует данным. Проводится ряд итераций, в данном примере используется 20 000 итераций. На каждой итерации градиент функции стоимости оценивается относительно двух неизвестных. Затем два неизвестных корректируются соответствующим образом. Если градиент положительный, то есть соответствие ухудшается с увеличением значений, значения уменьшаются и наоборот. Величина, на которую изменяются значения, определяется параметром, называемым скоростью обучения, чем больше скорость обучения, тем больше корректировка. Значения между 0,01 и 0,001 не являются редкостью. Здесь используется значение 0,005. Это означает, что на каждом шаге параметры изменяются на 0,005-кратный градиент в рассматриваемой точке. Если этот шаг слишком мал, для сходимости требуется много итераций, если он слишком велик, процесс может выйти за пределы решения. Возвращаясь к аналогии со спуском с горы на лыжах, скорость обучения сравнима с вашей скоростью. Слишком медленно, и вам потребуется много времени, чтобы добраться до сути, если вы вообще доберетесь туда. Слишком быстро, и вы рискуете промахнуться мимо пункта назначения и столкнуться со склоном горы.

Расчет градиента

Основные математические расчеты показаны ниже. Здесь я рассмотрел возможность подгонки прямой линии, определяемой градиентом m и точкой пересечения yc, к одной точке данных, определяемой значением (наблюдение) и точку (x), где это произошло. На самом деле мы будем подгонять набор точек, но расчеты особо не меняются. Цель процесса состоит в том, чтобы определить, как функция стоимости изменяется по отношению к двум неизвестным. Это достигается с помощью частичного дифференцирования (вычисление градиента функции нескольких переменных путем сосредоточения внимания на одной переменной за раз) для вычисления градиента функции стоимости в каждой точке. Математика использует простое дифференцирование (то есть производная от x в квадрате равна 2 x) и цепное правило (правило для вычисления производной переменной, которая сама зависит от другой переменной). Для тех, у кого нет математического образования, это может показаться немного пугающим, но окончательный расчет скорости изменения функции стоимости относительно двух неизвестных относительно прост, что, надеюсь, показано ниже.

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

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

Результаты

Изменение значений двух параметров в этом случае показано ниже. Начальными значениями были 1 и 1. Градиент был увеличен примерно до 2500, а затем уменьшен примерно до -6500. Начальное значение неуклонно увеличивается до 180 000.

Ниже показано изменение функции стоимости при прогрессивных итерациях. Значения были разделены на конечное значение, поэтому начальное значение 9 указывает на то, что функция стоимости была в 9 раз больше ее конечного значения, т. е. в 9 раз хуже соответствует данным. Функция стоимости неуклонно уменьшается по мере прохождения итераций, выравниваясь примерно после 15 000 итераций, что указывает на сходимость параметров к значениям, соответствующим данным.

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

Обсуждение

Используемый набор данных состоит из уведомлений о кори в Англии и Уэльсе с 1940 года. Его можно найти здесь: https://www.gov.uk/government/publications/measles-deaths-by-age-group-from Данные с 1980 по 2013 год/уведомления о кори и смерти в Англии и Уэльсе с 1940 по 2013 год.

Данные достаточно хорошо укладываются в прямую линию, которая первоначально имеет значение, близкое к 175 000, и падает со скоростью около 6500 в год, достигая примерно нуля к 1996 г. Таким образом, может показаться, что число случаев кори начала значительно снижаться в конце 60-х, начале 70-х годов и продолжала снижаться из года в год (примерно на 6500 случаев меньше в год, каждый год). Линия не может соответствовать ускоренному падению значений в конце 80-х. Вероятно, это соответствует рекомендации использовать вторую дозу вакцины MMR. В последнее время также наблюдается увеличение числа случаев кори, которые не подходят под черту. Эти наблюдения ясно подчеркивают недостаток нашего подхода к подгонке прямой линии к данным. Тем не менее, этот пример (надеюсь) служит для демонстрации того, как градиентный спуск используется для подгонки данных и как даже подгонка прямой линии может предоставить некоторую информацию.