Отличная классическая бумага! Рекомендательная система классическая модель Wide & Deep

алгоритм

Сегодня мы также анализируем классическую статью в области рекомендаций под названием «Широкое и глубокое обучение для рекомендательных систем». Она была опубликована в 2016 году, авторКоманда рефералов для Google App Store. Этот год совпадает с подъемом глубокого обучения. В этой статье обсуждается, как использовать модель глубокого обучения для прогнозирования CTR рекомендательной системы, что можно назвать успешной попыткой глубокого обучения в области рекомендательных систем.

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

Резюме

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

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

Суть проблемы в том,embedding, embedding буквально переводится как встраивание, но понять это непросто. Вообще говоря, мы можем понимать это как векторное представление некоторых признаков. Например, в Word2Vec мы представляем слово вектором. Эти векторы называются вложениями слов. Особенность встраивания в том, чтодлина фиксированная, но значение обычно изучается через нейронную сеть.

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

Введение

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

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

Основным источником способности к обобщению являетсяКорреляция и транзитивность между функциями. Возможно, что признаки A и B напрямую связаны с меткой, или что характеристика A связана с характеристикой B, а характеристика B связана с меткой.Это называется транзитивностью. Используя транзитивность между признаками, мы можем исследовать некоторые комбинации признаков, которые редко появляются в исторических данных, чтобы получить сильную способность к обобщению.

В крупномасштабных онлайн-системах рекомендаций и ранжирования широко используются линейные модели, такие как LR, потому что эти модели очень просты, масштабируемы, производительны и интерпретируемы. Эти модели часто обучаются с бинарными данными, такими как one-hot.Например, если пользователь установил netflix, то свойство user_installed_app=netflix равно 1, в противном случае — 0. Следовательно, некоторые признаки второго порядка легко интерпретируются.

Например, если пользователь также просматривал Pandora, то общая характеристика user_installed_app=netflix,impression_app=pandora равна 1,Вес совместного признака на самом деле является корреляцией между двумя. Однако такие признаки требуют большого количества ручных операций, а из-за разреженности выборок модель не может узнать их веса для некоторых комбинаций, не вошедших в обучающие данные.

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

В этой статье мы представим модель Wide & Deep, котораяСовместимость с памятью и обобщением в одной модели. Он может одновременно обучать обе части линейной модели и нейронной сети, чтобы достичь лучших результатов.

Основное содержание статьи следующее:

  1. Широкая и глубокая модель, включая встраивание нейронной сети с прямой связью и преобразование признаков линейной модели, применение в обобщенной системе рекомендаций
  2. Внедрение и оценка модели Wide & Deep в сценарии Google Play, Google Play — это магазин мобильных приложений с более чем 1 миллиардом ежедневных действий и 1 миллионом приложений.

Обзор рекомендательных систем

Это схема архитектуры классической рекомендательной системы:

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

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

После скрининга и поиска модель Wide & Deep, наконец, вызывается для оценки CTR, и приложения сортируются в соответствии с прогнозируемым CTR. В этой статье мы также игнорируем другие технические детали и фокусируемся только на реализации модели Wide & Deep.

Широкий и глубокий принцип

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

Это изображение взято из бумаги и показывает модель Wide, модель Wide & Deep и модель Deep слева направо. Из рисунка также видно, что так называемаяШирокая модель на самом деле является линейной моделью, а глубокая модель — моделью глубокой нейронной сети.. Эти две части более подробно описаны ниже.

Широкая часть

Широкая часть на самом деле является обобщенной формой, такой какy=wTx+by = w^Tx + bЛинейная модель , как показано в левой части рисунка выше. y — результат, который мы хотим предсказать, x — функция, это d-мерный вектор.x=[x1,x2,,xd]x=[x_1,x_2,\cdots,x_d]. Здесь d — количество признаков. Точно так же w также является d-мерным весовым вектором.w=[w1,w2,,wd]w=[w_1,w_2,\cdots,w_d], а b — смещение. Они были представлены в предыдущих моделях линейной регрессии, и все должны быть с ними знакомы.

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

фk(x)=Πi=1dxickickiе{0,1}\phi_k(x)=\Pi_{i=1}^dx_i^{c_{ki}}\quad c_{ki}\in\{0, 1\}

здесьckic_{ki}— логическая переменная, представляющая k-ю функцию преобразования i-го признакафk\phi_kрезультат. Поскольку используется форма продукта, конечный результат равен 1, только если все термины верны, и 0 в противном случае. Например, "И(gender=female,language=en)" является перекрестной функцией. Только если пол пользователя женский и используется английский язык, результатом этой функции будет 1. Таким образом, мы можем фиксировать взаимодействия между функциями и добавлять нелинейные функции в линейные модели.

Глубокая часть

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

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

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

Широкое и глубокое слияние

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

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

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

Реализация системы

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

производство данных

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

На этом этапе система будет искать таблицу,Преобразование некоторых функций категории строк в идентификатор типа int. Например, категория развлечения соответствует 1, категория фотографии соответствует 2, например, плата соответствует 0, бесплатность соответствует 1 и так далее. В то же время функции цифрового типа будут стандартизированы и масштабированы до диапазона [0, 1].

обучение модели

В работе представлена ​​структурная схема модели:

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

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

модельный сервис

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

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

Результаты модели

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

Приобретение приложений

Трехнедельный A/B-тест проводился в онлайн-среде с 1 сегментом в качестве контрольного сегмента с использованием предыдущей версии линейной модели. Одно ведро использует модель Wide & Deep, а другое ведро использует только модель Deep, удаляя линейную часть. Каждое из этих трех сегментов занимает по 1% трафика, и конечный результат выглядит следующим образом:

Модель Wide & Deep не только имеет более высокую AUC, но и увеличивает количество приобретений онлайн-приложений на 3,9%.

Производительность службы

Для рекомендательных систем производительность на стороне сервера всегда была большой проблемой, потому чтоОн должен нести большой объем трафика, а также должен гарантировать, что задержка будет очень низкой.. Сложность использования моделей машинного обучения или глубокого обучения для прогнозирования CTR очень высока. Согласно газете, в пиковые периоды их серверы будут выполнять 10 миллионов запросов в секунду.

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

Код

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

import torch 
from torch import nn

class WideAndDeep(nn.Module):
    def __init__(self, dense_dim=13, site_category_dim=24, app_category_dim=32):
        super(WideAndDeep, self).__init__()
        # 线性部分
        self.logistic = nn.Linear(19, 1, bias=True)
        # embedding部分
        self.site_emb = nn.Embedding(site_category_dim, 6)
        self.app_emb = nn.Embedding(app_category_dim, 6)
        # 融合部分
        self.fusion_layer = nn.Linear(12, 6)
    
    def forward(self, x):
        site = self.site_emb(x[:, -2].long())
        app = self.app_emb(x[:, -1].long())
        emb = self.fusion_layer(torch.cat((site, app), dim=1))
        return torch.sigmoid(self.logistic(torch.cat((emb, x[:, :-2]), dim=1)))

Поскольку сценарий моего приложения в то время был относительно простым, сетевая структура состояла всего из трех слоев, но принцип был тот же: если его нужно применять в сложных сценариях, нужно добавить только функции и сетевые слои.

Вот и все, что касается сегодняшней статьи, и я искренне желаю вам удачи каждый день. Если вам все еще нравится сегодняшний контент, пожалуйста, зайдите на одинТройная поддержкабар~(Нравится, подписывайтесь, делайте репост)

Оригинальная ссылка, обратите внимание