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

История

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

В этом посте я попытаюсь удовлетворить любопытство тех любопытных существ, которые сталкиваются с той же загадкой. Давайте сначала разберемся с одним фактом; Суть машинного обучения по своей сути заключается в поиске функции f(x), которую можно смоделировать для самых сложных и странно звучащих данных в таблице. Например, мы пытаемся спрогнозировать цену помидоров на следующий месяц на уровне дня с учетом таких факторов, как прошлые цены, текущие цены, инфляция, спрос, предложение, погодные условия, случаи заражения коронавирусом и т. д. Прогноз будет лучше, если мы способны зафиксировать большинство движущих факторов в уравнении нашей функции (на жаргоне ML, известном как модель). Достижение этого уравнения является наиболее сложной и важной задачей. Это вращается вокруг хита и испытания, но мы просто хотим, чтобы это было немного лучше, чем это.

Данные и концепция

1-е погружение

Для простоты и релевантности давайте возьмем академический пример, где мы пытаемся найти функцию для полученных оценок(зависимая переменная), когда ответственный за нее фактор ограничен количество часов обучения (независимая переменная). Предполагая, что для обеих переменных существует линейная зависимость, это означает, что связь может быть представлена ​​одной линией, и если нам были предоставлены данные о количестве часов обучения, мы можем использовать эту линию для прогнозирования оценок (в диапазоне до максимального Метки). График будет выглядеть как на графике ниже:

Теперь наша задача — выяснить, как вписать линию в этот точечный график. На самом деле, мы можем разместить множество строк в наборе данных. Только одна из этих многочисленных строк будет иметь наименьшую ошибку (фактические оценки-[минус]прогнозированные оценки), мы назовем эту строку строкой «Наилучшее соответствие». Ошибка будет рассчитываться для каждой точки и суммироваться для каждой строки.

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

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

m и c - параметры, которые мы должны найти для наилучшей подходящей линии

2-е погружение

Теперь у нас есть 2 параметра, которые мы должны оптимизировать. Для простоты давайте начнем оптимизировать 1 параметр intercept-c и будем считать наклон-m постоянным.

Нам понадобится еще один график, который будет представлять собой сумму квадратов ошибок, в 2D это будет парабола, в 3D (если оба параметра решаются симуляционно) это будет гористая местность. Мы получим одну точку этой кривой, соответствующую каждой линии, которую мы рисуем, после многочисленных линий (изменив значение точки пересечения) мы получим эту параболу. Наилучшей линией соответствия будет точка, которая находится в минимумах этой параболы.

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

Как исчисление поможет нам найти оптимальное значение перехвата?

Давайте начнем рисовать первую строку с любого случайного числа intercept-c. Мы можем рассчитать квадрат ошибки этой линии, это будет точка параболы, и она может быть внизу, в середине или где-то вверху параболы.

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

Размер шага — это производная (градиент, если переменная более 1) квадрата функции ошибки, умноженная на статическое значение (на жаргоне ML, известное как скорость обучения), скажем, 0,1.

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

Рекомендации

[1] https://iamtrask.github.io/2015/07/27/python-network-part2/

[2] https://www.youtube.com/watch?v=sDv4f4s2SB8&t=653

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

Это моя первая статья по науке о данных. Моя цель состоит в том, чтобы сделать концепции доступными для студентов +2, чтобы они могли вызвать больший интерес к применению математики. Новички в науке о данных также являются целевой аудиторией.

Я готов к любым отзывам и предложениям!