Большинство советов в этом блоге основаны на книге «Тоска по машинному обучению»* Эндрю Нг и его специализации по глубокому обучению на Coursera.

Наборы данных

Разделение доступных данных на 70/30, т.е. 70% данных для обучения и 30% данных для проверки/тестирования, недопустимо, когда у вас есть миллионы образцов. Вместо этого рекомендуется разделить данные на обучающий набор (миллионы образцов), набор для разработки (~ 10 000) и тестовый набор (~ 10 000).

«Что это за набор разработчиков, о котором вы говорите?» Я слышал. Видите ли, часть данных, которые мы резервируем для объективной оценки производительности нашей модели, — это тестовый набор. Чтобы избежать какой-либо предвзятости, мы не должны использовать набор тестов для принятия каких-либо решений относительно модели. Затем, какие данные вы бы использовали для настройки ваших гиперпараметров или для оценки различных вариантов при создании модели? Да, ваша догадка верна, для таких целей мы используем набор для разработки (иногда называемый набором для проверки).

«Откуда взялось волшебное число 10k для наборов для разработки и тестирования?». Ну, это не высечено в камне. Набор разработчиков должен быть достаточно большим, чтобы обнаруживать различия между алгоритмами, которые вы испытываете. С 10 000 примеров у вас есть хорошие шансы обнаружить улучшение на 0,1%. Вот откуда 10к. Если вы хотите обнаружить улучшение на 0,01%, вам потребуется 100 000 образцов.

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

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

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

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

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

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

Помните, что всех отклонений можно избежать.

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

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

Метрика оценки

Точность, полнота, точность, оценка F1, AUC (площадь под кривой ROC), NDCG — вот некоторые из распространенных показателей, используемых для оценки моделей машинного обучения.

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

Например, вместо Precision и Recall вы можете использовать F1 Score, который является гармоническим средним значением этих двух показателей.

Если у вас есть N различных критериев, которые важны для вас (например, размер модели, время выполнения и точность), вы можете рассмотреть возможность установки N-1 из них (размер модели и время выполнения) в качестве «удовлетворяющих» показателей, т.е. вы примете модель, если она удовлетворяет определенным пороговым значениям для этих показателей. Оставшаяся (точность) будет однозначной «оптимизирующей» метрикой.

Если вы хорошо справляетесь со своей метрикой, но не видите улучшений в других тестах (например, A/B-тестировании в prod), это может означать, что либо ваш выбор метрики является неправильным, либо распределение dev/test set отклоняется от распределения продукции. Получите свежий образец наборов данных для разработки/тестирования из производственных данных, и если модель по-прежнему работает на них хорошо, пришло время переосмыслить вашу метрику.

Анализ ошибок

Как вы определяете возможности для улучшения вашей модели? И как вы расставите их по приоритетам?

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

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

Рекомендуется просмотреть 100 неправильно помеченных примеров из набора разработчиков. Если уровень ошибок вашего классификатора составляет 5%, вам нужно просмотреть 2000 примеров, чтобы определить сотню, на которой вы собираетесь сосредоточиться. Это называется набором для разработки глазного яблока. Остальной набор разработчиков, называемый набором черного ящика, можно использовать для принятия решений о модели и выбора гиперпараметров.

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

Глубокое обучение E2E

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

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

Гипер параметры

Вот гиперпараметры в порядке их важности согласно Эндрю.

  • Начальная скорость обучения
  • Параметры оптимизации (пример: для оптимизации Адама гиперпараметрами являются β1, β2 и ε)
  • Размер мини-партии
  • # скрытых юнитов
  • количество слоев
  • Снижение скорости обучения

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

Используйте соответствующий масштаб для выборки случайных значений, чтобы попробовать (равномерно случайным образом не обязательно хороший подход)

  • Если вы используете равномерную случайную выборку, чтобы проверить значения скорости обучения от 0,0001 до 1, большинство из них будут между 0,1 и 1, а очень немногие — между 0,0001 и 0,1.
  • Вместо того, чтобы выбирать случайные значения в линейной шкале между диапазонами, было бы лучше выбирать случайные значения в логарифмической шкале.
  • Поскольку диапазон составляет 10 ^ -4 и 10 ^ 0, выберите случайное значение r между -4 и 0 и используйте 10 ^ r.

Используйте подход с увеличением: если диапазон составляет от 0,0001 до 0,1, вы можете определить 0,01 как оптимальное значение в первом раунде и найти 0,011 как еще лучший вариант во втором раунде, а затем рассмотреть 0,01098 и так далее.

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

Разное

  • Начните с реализации существующих архитектур нейронных сетей с открытым исходным кодом. Еще лучше использовать предварительно обученные сети и использовать трансферное обучение, чтобы модифицировать их для решения вашей проблемы.
  • Рассмотрите возможность увеличения обучающих данных, когда их недостаточно.
  • Объединение используется для победы в соревнованиях, но обычно не используется в производстве, несмотря на улучшение на ~ 2%, потому что это требует больших вычислительных ресурсов (использование от 3 до 15 моделей для одной задачи).

* Стремление к машинному обучению

Эта книга еще не вышла, и вы можете запросить черновик здесь.

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