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

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

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

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

TL; DR

  • Feed Forward Simplified: как работает функция прямой связи и есть ли связь между параметрами (вес + погрешность) и стоимостью?
  • Упрощенный градиентный спуск: как мы можем использовать эту связь между параметрами и стоимостью для обновления самих параметров? Что такое градиент и как его рассчитать? Как мы можем прийти к глобальным минимумам?

Упрощенная прямая связь

Веса и смещения

Любая модель машинного обучения требует параметров — или весов и смещений — для оптимизации. Например, в простом уравнении линейной регрессии весами для оптимизации будут "m" и "b".

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

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

Давайте упакуем эти веса в вектор-столбец (тета) для более простых вычислений в будущем:

Подача вперед

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

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

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

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

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

Возьмем в качестве примера задачу классификации с метками: «предсказание сердечных заболеваний у людей». Сначала мы инициализируем весовой вектор (случайный или перенесенный из другой модели) для каждой из наших входных характеристик: «кровяное давление», «пол», «возраст» и «ИМТ». Затем мы возьмем точечный продукт и добавим наш уклон. В конце мы рассчитаем нашу активацию, которая является нашим прогнозом.

Но как мы определяем средства, с помощью которых нам нужно оптимизировать наши веса?

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

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

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

Упрощенный градиентный спуск

Уравнение градиентного спуска

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

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

Это приводит нас к концепции наискорейшего спуска, где мы итеративно спускаемся по функции по самому крутому пути.

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

Для простоты приведенный выше вектор частных производных можно переписать следующим образом:

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

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

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

Проблема скорости обучения

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

Если мы умножим константу (η) на наш градиент, мы сможем настроить — увеличить или уменьшить размер производной — скорость обучения и величину каждого шага.

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

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

Общее эмпирическое правило: снижение скорости обучения модели не работает.

Импульс и случайный случайный перезапуск

Однако как мы можем быть уверены, что наша модель находится в глобальных минимумах, а не в локальных минимумах? Алгоритм градиентного спуска выбирает самый крутой путь спуска. Следовательно, оптимизаторы могут заканчиваться локальными минимумами, а не глобальными минимумами, как показано ниже:

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

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

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

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

Более высокое значение β означает меньшее затухание импульса, а более низкое значение означает более сильное затухание импульса.

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

Хотя этот метод более сложен, его использование дало невероятные результаты в области машинного обучения.

Программирование теории градиентного спуска!

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

sgd() принимает 4 позиционных аргумента:

  • theta_vector : входной вектор случайно инициализированных весов. С помощью этой функции эти веса будут итеративно оптимизированы.
  • learning_rate : скорость, с которой будет проходить обучение. Говоря более технически, это величина тренировочного шага.
  • n_iter : количество шагов обучения или количество итераций, которыеtheta_vector будут оптимизированы.
  • gradient_momentum: вектор градиента импульса представляет собой градиент отношения тета-стоимость плюс вектор градиента предыдущего шага обучения (если он есть). Расчеты для получения градиента не показаны, поскольку они зависят от того, какой алгоритм (например, логистическая регрессия, регрессия и т. д.) используется.

Перед тем, как ты уйдешь…

Из этой статьи вы узнали основы работы градиентного спуска! 🎉🎊 Мы изучили функцию прямой связи, как оптимизируются веса и основные препятствия, мешающие успеху! Удачи в вашем путешествии по машинному обучению!

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

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

если вам понравилось читать эту статью, не стесняйтесь связаться с моими социальными сетями 🤗
LinkedIn | Информационный бюллетень | Твиттер