Некоторые проблемы, которые мы решаем с помощью машинного обучения, связаны с категориальными функциями, которые представляют объекты реального мира, такие как слова, элементы и категории. Так что же происходит, когда во время логического вывода мы получаем новые значения объекта, которых раньше никогда не видели? Как мы можем подготовиться заранее, чтобы все еще иметь смысл во входных данных?
Невидимые значения, также называемые значениями OOV (Out of Vocabulary), должны обрабатываться должным образом. Разные алгоритмы имеют разные методы работы со значениями OOV. Различные предположения о категориальных признаках также следует трактовать по-разному.
В этом посте я сосредоточусь на случае применения глубокого обучения к динамическим данным, где постоянно появляются новые значения. В качестве примера я буду использовать рекомендательную систему Taboola. Некоторые входные данные, которые модель получает во время вывода, содержат невидимые значения — это обычное дело в рекомендательных системах. Примеры включают:
- Идентификатор товара: каждый рекомендуемый товар получает уникальный идентификатор. Ежедневно в систему попадают тысячи новых элементов.
- Идентификатор рекламодателя: спонсируемый контент создается рекламодателями. Количество новых ежедневных рекламодателей намного меньше по сравнению с количеством новинок. Тем не менее важно правильно с ними обращаться, тем более что мы хотим поддерживать новых рекламодателей.
Так в чем проблема с ценностями OOV?
Значение OOV связано со значениями, которые модель не видела во время обучения. Следовательно, если мы получим значение OOV во время вывода, модель не будет знать, что с ним делать.
Одним из простых решений является замена всех редких значений специальным токеном OOV перед обучением. Поскольку все значения OOV одинаковы с точки зрения модели, мы заменим их токеном OOV во время вывода. Это решение имеет два положительных результата:
- Модель будет подвергаться воздействию токена OOV во время обучения. В глубоком обучении мы обычно встраиваем категориальные признаки. После обучения модель выучит значимое вложение для всех значений OOV.
- Риск переобучения для редких значений будет снижен. Эти значения появляются в небольшом числе примеров. Если мы изучим вложения для этих значений, модель может научиться использовать их для объяснения особенностей или случайного шума, обнаруженного в этих конкретных примерах.
Еще одна катастрофа, которая может возникнуть при изучении этих встраиваний, заключается в том, что им не передается достаточно обновлений градиента. Как следствие, случайная инициализация будет доминировать над встраиванием результатов над сигналом, полученным в результате обучения.
Проблема решена… Или нет?
Модель использует функцию идентификатора элемента для запоминания различной информации для каждого элемента, как и в чистом виде. совместная фильтрация подход. Редкие предметы, которые внедряются с токеном OOV, не могут извлечь из этого выгоду, поэтому модель работает с ними хуже.
Интересно то, что даже если мы вообще не используем идентификатор предмета во время обучения, модель все равно хуже работает на редких предметах! Это потому, что они происходят из распределения, отличного от распределения населения в целом. У них есть определенные характеристики — возможно, они плохо работали в Интернете, из-за чего рекомендательная система Taboola рекомендовала их меньше, и, в свою очередь, они стали редкостью в наборе данных. Итак, почему эта разница в распределении имеет значение?
Если мы изучим вложение OOV, используя это специальное распределение, оно не будет распространяться на общую популяцию. Подумайте об этом так: каждый предмет в какой-то момент был новым. В этот момент ему был введен токен OOV. Таким образом, встраивание OOV должно работать хорошо для всех возможных элементов.
Чтобы изучить встраивание OOV с использованием общей совокупности, мы можем внедрить токен OOV в случайный набор примеров из набора данных, прежде чем мы начнем процесс обучения. Но сколько примеров будет достаточно?
Чем больше мы сэмплируем, тем лучше будет встраивание OOV. Но в то же время модель будет подвержена меньшему количеству значений, отличных от OOV, поэтому производительность ухудшится.
Как мы можем использовать множество примеров для обучения внедрению OOV и в то же время использовать те же примеры для обучения внедрению не-OOV? Вместо того, чтобы случайным образом вводить токен OOV перед началом обучения, мы выбрали следующий подход: в каждую эпоху модель обучается, используя все доступные значения (токен OOV не внедряется). В конце эпохи мы выбираем случайный набор примеров, вводим токен OOV и снова обучаем модель. Таким образом, мы наслаждаемся обоими мирами!
Как и в предыдущем подходе, мы также внедряем токен OOV в редкие значения — чтобы избежать переобучения.
Чтобы оценить новый подход, мы внедрили токен OOV во все примеры и оценили нашу автономную метрику (MSE). Это улучшилось на 15% по сравнению со случайным введением токена OOV до того, как модель начнет обучаться.
Наша модель долгое время использовалась в производстве, прежде чем мы придумали новый подход. Можно было легко упустить этот потенциальный прирост производительности, поскольку в целом модель работала хорошо. Это только подчеркивает тот факт, что вы всегда должны искать неожиданное!
Первоначально опубликовано мной на
Engineering.taboola.com.