Эта статья о том, как мы подходим к проблеме построения моделей машинного обучения для функций в Lifion от ADP. При построении моделей машинного обучения на практике по разным причинам теоретические основы иногда могут быть упущены из виду. Несоответствие между теорией и практикой в ​​машинном обучении является горячо обсуждаемой темой. Мы обсудим, как мы создаем передовые модели машинного обучения на практике, не забывая при этом о теоретических аспектах нашей работы.

Вот первая строка предисловия к Книге Тома Митчелла по машинному обучению 1997 года.

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

Это утверждение о машинном обучении по-прежнему имеет смысл и по сей день, и оно находит отклик в нашей работе над различными сервисами и функциями на базе машинного обучения. Мы начнем с того, что уточним это утверждение, рассмотрев конкретную проблему, над которой мы работали, для конкретной функции, которая требовала прогнозирования элементов в последовательности, которую мы будем называть здесь предсказание следующего слова. Мы хотели использовать машинное обучение, чтобы помочь нашим разработчикам приложений, которые используют нашу платформу разработки Lifion с низким кодом, быть более продуктивными при создании решения HCM следующего поколения, которое мы предоставляем нашим клиентам. Подобно функциям «Умный ответ» и «Автозаполнение» при написании электронных писем и поиске в Интернете, наша функция здесь помогает предоставлять предложения в наших инструментах разработки, чтобы помочь им создавать с большей скоростью и с учетом лучших практик.

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

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

Постановка задачи

Проблема предсказания следующего слова в последовательности встречается во многих сценариях. При наборе текста наши телефоны и ноутбуки способны предсказать, какое следующее слово мы собираемся ввести. Эти функции стали более распространенными в последнее время, поскольку модели прошли долгий путь в изучении моделей человеческого языка. Существует множество стандартных библиотек, которые можно использовать для разработки этих моделей, и эти языковые модели обычно обучаются на большом корпусе, таком как Википедия. Здесь — пример красивого визуального представления некоторых паттернов, которым может научиться языковая модель. В приведенном ниже блокноте Jupyter показано, как загрузить ранее обученную модель, передать Погода становится лучше в качестве входных данных для модели и увидеть, что она предсказываетлучше. Все это занимает менее 10 строк кода. Прохладный! Пример кода для этапа обучения более сложный и его можно найти здесь.

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

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

Если формально сложить все это воедино, то наша задача выглядела следующим образом:

1. На этапе обучения мы наблюдали набор последовательностей m.

2. Каждое Sᵢ представляло собой упорядоченную последовательность алфавитов длины f(i), сгенерированную некоторым базовым вероятностным процессом из словаря V.

3. Мы использовали последовательности m для построения модели. На этапе вывода нам дали частичную последовательность алфавитов, и модель предсказала следующий алфавит следующим образом:

где последовательность aᵢ, сгенерированная на этапе вывода, была сгенерирована тем же базовым вероятностным процессом, который сгенерировал данные на этапе обучения. Это называется i.i.d. предположение (независимый и одинаково распределенный) и необходим для того, чтобы убедиться, что одни и те же шаблоны присутствуют на этапах обучения и вывода.

Особенность

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

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

Метрика

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

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

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

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

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

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

Наконец, мы обозначаем ожидаемое значение этих показателей на этапе вывода как

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

Затем мы переходим к этапу обучения, где обсуждаем процедуру построения модели путем оптимизации метрики данных.

Стадия обучения

Существует множество библиотек (таких как scikit-learn, TensorFlow и другие), которые дают нам возможность создавать модели. Мы должны принять решение о том, какую библиотеку или набор библиотек мы хотим попробовать для решения нашей проблемы. Чтобы принять взвешенное решение, мы должны сначала понять проблему, которую пытаемся решить, и методы, которые эти библиотеки используют под капотом.

Подробное описание всех библиотек и лежащих в их основе методов было бы слишком много для этой статьи. Если вы хотите более подробно остановиться на этих методах, см. здесь [1] и здесь [3] для теоретического и практического рассмотрения соответственно. Здесь много тонкостей, но в то же время есть некоторые общие принципы, общие для всех этих методов. Они абстрагируют задачу обучения модели в некоторой математической структуре, такой как машины опорных векторов, байесовские модели и т. д. В математической структуре проблема переводится в задачу оптимизации математической функции (называемой потери), которая, в свою очередь, зависит от метрики, которую мы хотим оптимизировать. Затем мы используем соответствующие методы оптимизации, такие как линейное программирование, градиентный спуск и т. д., чтобы оптимизировать потери, используя данные для построения модели. Для фиксированной математической структуры набор всех потенциальных моделей, которые он может представлять, обозначается , а конечным результатом оптимизации является одна из моделей в этом наборе и обозначается Mₒ .

Выбор модели

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

Упражняться

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

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

Это очень хорошо работает на практике, но как это работает в теории?

Теория

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

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

Пройдемся по терминам слева направо:

  1. Первый член — это ожидаемое значение µ во время логического вывода. [Вывод µ]
  2. Второй член — это точное значение µ, оцененное в наборе поездов. [Обучение µ]
  3. Третий член — это сложность Радамахера. Это мера репрезентативной способности базовой математической структуры. Это зависит от набора всех потенциальных моделей, которые он может представлять ∏. Это также зависит от процесса генерации данных и количества выборок в наборе поездов. [термин сложности]
  4. Последний член содержит ∆, который количественно определяет высокую вероятность, относительно которой выполняется граница, и n, который представляет собой количество выборок поезда. Обычно мы думаем, что n достаточно велико, чтобы мы могли просто полностью игнорировать этот термин. [то, что мы можем игнорировать при разумных предположениях]

Некоторые вещи, которые следует отметить:

  1. Граница верна для любой модели Mи, в частности, для оптимизированной модели Mₒ.
  2. Мы не приводим оценку в полной общности. Например, мы можем заменить µ другими метриками, набор, который мы оцениваем, не обязательно должен быть набором поездов и т. д.

Эта граница побуждает нас оптимизировать всю правую часть (RHS), а не только тренировочный член µ. Для некоторых математических схем это может быть включено в функцию потерь во время обучения. Это дает нам возможность построить принципиальные алгоритмы, обобщающие новые данные, и дает теоретическое обоснование концепции регуляризации. Библиотеки, такие как sklearn, содержат множество алгоритмов (например, классификацию линейных опорных векторов), которые делают это в функции потерь и, следовательно, используют набор поездов для оптимизации всей RHS. При сравнении моделей, созданных на разных платформах, выбор модели, дающей наилучшее значение µ в проверочном наборе, также может быть мотивирован как оптимизация всей RHS границы. В общем, эти границы дают нам способ мотивировать решения о выборе модели, принимаемые на практике.

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

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

Наш опыт

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

При повторении моделей в течение более длительных периодов времени данные собираются, а модели постоянно обновляются. Каждый раз, когда мы обновляем модель, мы заботимся о том, как модель будет работать на этапе вывода. Все наши эксперименты должны быть направлены на оптимизацию и оценку этой производительности. Однако обновления модели влияют на то, как пользователи взаимодействуют с системой, что, в свою очередь, влияет на генерируемые данные (т. е. распределение данных эволюционировало, и оно больше не является iid), и все это происходит неоднократно. Как в этом случае мы разделяем данные и вычисляем метрики? Решение не так просто, как создание нового разделения данных на все доступные данные, поскольку распределение данных может меняться с течением времени, и это связано с другими затратами. Например, проведение всех предыдущих экспериментов с новым разбиением данных может потребовать больших усилий (времени, вычислительной мощности и т. д.). Такие ситуации приводят к сложным компромиссам между затратами и выгодами, когда специалисты-практики могут быть вынуждены принимать решения, что приводит к более тонким формам утечки информации. Даже в этих ситуациях эмпирическое вычисление некоторых условий границы в предыдущем разделе с течением времени помогает нам лучше понять, что меняется, и, следовательно, направляет нас к усовершенствованию модели.

Вывод

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

Дополнительное чтение

Если вам интересно узнать больше об этих темах, я рекомендую следующие ресурсы. Глава об основах машинного обучения в [1] дает краткое введение и отлично справляется с интуитивными объяснениями, устанавливая теоретически прочную основу. [2] дает подробное введение в теорию ML, а [3] дает краткое практическое руководство по ML. Наслаждаться!

[1] Глубокое обучение Яна Гудфеллоу, Йошуа Бенджио и Аарона Курвилля.

[2] Основы машинного обучения Мехриара Мори, Афшина Ростамизаде и Амита Талвалкара.

[3] Ускоренный курс машинного обучения от Google.