[Али Дин] embedding_lookup учится на исходном коде статьи

глубокое обучение

0x00 сводка

Сеть Deep Interest Network (DIN) была предложена группой точного направленного поиска и базового алгоритма Alimama в июне 2017 года. Его оценка CTR для индустрии электронной коммерции сосредоточена на полном использовании/извлечении информации из исторических данных о поведении пользователей.

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

В этой статье передается исходный код DINGitHub.com/Mouna99/Вниз…Анализ, давайте подробнее рассмотрим принцип внедрения слоя и то, как используется embedding_lookup.

0x01 DIN-код

1.1 Концепция встраивания

Сначала мы кратко упомянем концепцию и функцию встраивания.

EmbeddingПереводится как «встроенный», переводится как «векторизация». Основная функция: **Преобразование разреженного вектора в плотный вектор, что удобно для обработки верхней нейронной сети. **Например, чтобы создать рекомендательную систему, которая рекомендует пользователям смотреть видео, входными данными для модели могут быть атрибуты пользователя (просмотр видео, условия поиска йогурта, возраст пользователя, пол и т. д.).Embeddingвектор, выход модели мультиклассовыйsoftmaxслой, который предсказывает, какое видео смотрел пользователь.

Определение: объект «представлен» низкоразмерным плотным вектором.Объектом может быть слово, товар, фильм и т. "представляет": означаетEmbeddingВекторы могут выражать определенные признаки соответствующих объектов, а расстояние между векторами может отражать сходство между объектами.

EmbeddingВажность рекомендательных систем глубокого обучения:

  • Используется между входным слоем и полносвязным слоемEmbeddingСлой преобразует многомерные разреженные векторы признаков в низкоразмерные плотные векторы признаков;
  • Для кодирования может быть введена любая информация, которая сама по себе содержит много ценной информации;
  • Вычисляя сходство Embedding между пользователями и элементами, Embedding можно напрямую использовать в качестве одного из уровней отзыва или методов отзыва рекомендательных систем или вычислительных рекламных систем;

1.2 Использование в DIN

Ниже приведен сокращенный вариант кода, как видите, используется DINself.mid_batch_phкак ид, вself.uid_embeddings_varНайдите переменные в .

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

class Model(object):
    def __init__(self, n_uid, n_mid, n_cat, EMBEDDING_DIM, HIDDEN_SIZE, ATTENTION_SIZE, use_negsampling = False):
        with tf.name_scope('Inputs'):
            self.mid_his_batch_ph = tf.placeholder(tf.int32, [None, None], name='mid_his_batch_ph')
            self.cat_his_batch_ph = tf.placeholder(tf.int32, [None, None], name='cat_his_batch_ph')
            self.uid_batch_ph = tf.placeholder(tf.int32, [None, ], name='uid_batch_ph')
            self.mid_batch_ph = tf.placeholder(tf.int32, [None, ], name='mid_batch_ph')
            self.cat_batch_ph = tf.placeholder(tf.int32, [None, ], name='cat_batch_ph')

        # Embedding layer
        with tf.name_scope('Embedding_layer'):
            self.uid_embeddings_var = tf.get_variable("uid_embedding_var", [n_uid, EMBEDDING_DIM])
            self.uid_batch_embedded = tf.nn.embedding_lookup(self.uid_embeddings_var, self.uid_batch_ph)

            self.mid_embeddings_var = tf.get_variable("mid_embedding_var", [n_mid, EMBEDDING_DIM])
            self.mid_batch_embedded = tf.nn.embedding_lookup(self.mid_embeddings_var, self.mid_batch_ph)
            self.mid_his_batch_embedded = tf.nn.embedding_lookup(self.mid_embeddings_var, self.mid_his_batch_ph)

            self.cat_embeddings_var = tf.get_variable("cat_embedding_var", [n_cat, EMBEDDING_DIM])
            self.cat_batch_embedded = tf.nn.embedding_lookup(self.cat_embeddings_var, self.cat_batch_ph)
            self.cat_his_batch_embedded = tf.nn.embedding_lookup(self.cat_embeddings_var, self.cat_his_batch_ph)

1.3 Вопрос

Итак, у нас есть несколько проблем:

  • Какую роль здесь играет встраивающий слой?
  • Для чего именно используется embedding_lookup?
  • Как обновить слой внедрения, такой как mid_embeddings_var?

Давайте изучим их один за другим.

0x02 Связанные концепции

2.1 горячее кодирование

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

Конкретный пример кодирования выглядит следующим образом: в корпусе каждому из Ханчжоу, Шанхая, Нинбо и Пекина соответствует вектор, только одно значение в векторе равно 1, а остальные равны 0. Получаем следующее.

杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]
上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
宁波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]
北京 [0,0,0,0,0,0,0,0,0,……,1,0,0,0,0,0,0]

Это горячее кодирование.

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

недостаток:

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

2.2 Преобразование

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

Например, используйте однократное кодирование для представления 4 героев Ляншаня.

李逵   [0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]
刘唐   [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
武松   [0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
鲁智深 [0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 

закодировано такПреимуществоДа: все герои Ляншаня могут быть представлены 0 1 в одномерном массиве. Разные герои абсолютно разные, повторения нет вообще, а способность выражать свои особенности чрезвычайно сильна.

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

Но на самом деле все эти герои неразрывно связаны.

  • 4 значения героической силы все хорошие.
  • И У Сун, и Лу Чжишен были монахами и оба были чиновниками. Лу Чжишэнь - Тиджу, и его официальный ранг выше. У Сун — глава столицы, и его официальный ранг несколько меньше.
  • И Li Kui, и Liu Tang — бывшие в употреблении.

Итак, строим следующую матрицу:

        二  出  官   武
        货  家  阶   力
李逵    [1   0   0   0.5]
刘唐    [1   0   0   0.4]
武松    [0   1   0.5 0.8]
鲁智深  [0   1   0.75 0.8] 

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

  • Ли Куй = 1,0 подержанных товаров + 0 монахов + 0 официальных званий + 0,5 силы
  • Лю Тан = 1,0 второй класс + 0 монах + 0 ранг + 0,4 сила
  • У Сун = 0 подержанных товаров + 1 монах + 0,5 официального звания + 0,8 силы
  • Лу Чжишен = 0 подержанных товаров + 1 монах + 0,75 ранга + 0,8 силы

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

2.3 Слой внедрения

2.3.1 Значение

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

Важнейшие свойства Embedding: ** Чем больше «похожих» сущностей, тем меньше расстояние между Embeddings. **В качестве примера возьмем модель word2vec, если контекст двух слов почти одинаков, это означает, что их выходные значения почти одинаковы.В соответствии с предпосылкой сходимости модели выходные значения два слова в слое Embedding должны быть очень похожи. В системе рекомендаций можно рассчитать косинусное сходство между объектами, а продукты с высоким сходством можно вызвать в качестве альтернативных рекомендуемых продуктов.Это простое применение неотъемлемых атрибутов встраивания.

Слой Embedding превращает нашу разреженную матрицу в плотную матрицу посредством некоторых линейных преобразований (таких как преобразование с полносвязным слоем, также известное как операция поиска в таблице), и эта плотная матрица использует N (N=4 в примере) характеристик для охарактеризовать всех героев. В этой плотной матрице внешний вид представляет собой взаимно-однозначное соответствие между плотной матрицей и отдельным героем, а также содержит большое количество внутренних отношений между героями и героями (например: отношения между Ли Куем и Лю Тан мы получили). Отношения между ними представлены параметрами, изученными слоем внедрения. Этот процесс от разреженной матрицы к плотной матрице называется встраиванием, и многие люди также называют его поиском по таблице, потому что между ними также существует отношение отображения один к одному.

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

Встраивание — одно из самых важных изобретений в области NPL, оно связывает сразу независимые векторы. Это эквивалентно тому, что, это равносильно тому, что вы сын своего отца, ваш отец коллега А, Б сын А, кажется, что у вас плохие отношения. В результате, когда вы смотрите на Б, это ваш сосед по комнате. Слой Embedding — это оружие, используемое для раскрытия этого секрета.

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

2.3.2 Общая роль

В дополнение к связыванию независимых векторов Embedding имеет две функции: уменьшение размерности и повышение размерности.

встраиваемый слойСнижение размерностиПринцип умножения матриц.

Например, умножение матрицы 1 x 4 на матрицу 4 x 3 дает матрицу 1 x 3. Матрица 4 х 3 на 1/4 меньше.

[0010]×[123456789101112]=[789]\left[\begin{matrix} 0 & 0 & 1 & 0 \end{matrix} \right] \times \left[ \begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ 10 & 11 & 12 \end{matrix} \right] = \left[\begin{matrix} 7 & 8 & 9 \end{matrix} \right]

Если у нас есть матрица 100 Вт X 10 Вт, умножив ее на матрицу 10 Вт X 20, мы можем уменьшить ее до 100 Вт X 20, и величина мгновенно уменьшится.

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

2.3.3 Как создать

Методы создания Embedding можно разделить на три типа, а именно:Матричная факторизация, моделирование без учителя и моделирование с учителем.

разложение матрицы

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

Неконтролируемое моделирование

Неконтролируемое моделирование является распространенным методом создания встраивания. Данные можно разделить на две категории: последовательность и график в соответствии с методом организации. Word2vec или аналогичные алгоритмы (item2vec, doc2vec и т. д.) часто используются для создания встраивания для данных последовательности Алгоритм создания встраивания для данных графа, называемый встраиванием графа, такие алгоритмы включают в себя deepwalk, node2vec, struc2vec и т. д. Большинство из них используют случайные блуждания для создания последовательностей, а нижний слой также является алгоритмом word2vec.

Моделирование под наблюдением

Моделирование с учителем также можно использовать для создания встраивания, которое в основном делится на две категории: одна — машина факторизации и ее производные алгоритмы, включая FM, FFM, DeepFM и т. д., а другая — алгоритм свертки графа, включая GCN, GraphSAGE, GAT и т. д. Все эти модели содержат слой внедрения. При моделировании контролируемых задач выходной вектор каждого объекта в слое внедрения может использоваться как вложение этого объекта.

2.4 EmbeddingСочетание с рекомендательной системой глубокого обучения

2.4.1 Важность

Почему технология внедрения так важна для глубокого обучения или даже для «основной основной операции» глубокого обучения? Основные причины следующие:

  • В качестве слоя внедрения в сети глубокого обучения он завершает преобразование из многомерных разреженных векторов признаков в низкоразмерные плотные векторы признаков (такие как Wide&Deep, DIN и другие модели).В рекомендательном сценарии однократное кодирование широко используется для кодирования признаков категорий и идентификаторов, что приводит к чрезвычайно разреженным векторам признаков, а структурные характеристики глубокого обучения делают его неблагоприятным для обработки разреженных векторов признаков, поэтому почти все Модели рекомендаций глубокого обучения будут. Уровень внедрения отвечает за преобразование многомерных разреженных векторов признаков в плотные низкоразмерные векторы признаков.
  • Как предварительно обученный вектор признаков встраивания, после соединения с другими векторами признаков он вводится в сеть глубокого обучения для обучения (например, модель FNN).Встраивание само по себе является чрезвычайно важным вектором функций. По сравнению с вектором признаков, сгенерированным традиционными методами, Embedding обладает более сильной выразительной способностью, особенно после того, как была предложена технология Graph Embedding, Embedding может вводить практически любую информацию для кодирования, так что он содержит много ценной информации. На этой основе вектор внедрения часто связывают с другими функциями рекомендательной системы, а затем передают в последующую сеть глубокого обучения для обучения.
  • Вычисляя сходство внедрения между пользователями и элементами, Embedding можно напрямую использовать в качестве уровня отзыва или одной из стратегий отзыва системы рекомендаций (например, модели рекомендаций YouTube и т. д.).Вычисление схожести элементов и пользователей с помощью встраивания является широко используемой технологией уровня отзыва для рекомендательных систем. После применения к системе рекомендаций быстрых методов поиска ближайших соседей, таких как хеширование с учетом местоположения, встраивание больше подходит для быстрого «отсеивания» большого количества элементов-кандидатов и фильтрации от сотен до тысяч элементов. выполняется сетью глубокого обучения.

2.4.2 Метод предварительной подготовки

так какEmbeddingНакладные расходы перед обучением огромны, как правило,EmbeddingПредварительное обучение часто выполняется независимо от сети глубокого обучения.

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

более тщательныйEmbeddingМетод обучения фиксированныйEmbeddingВеса слоев, обновляются только веса нейронной сети верхнего слоя.

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

0x03 embedding_lookup

Функция embedding_lookup реализует преобразование многомерных разреженных векторов признаков в низкоразмерные плотные векторы признаков в DIN. Он получает характеристики категорииone-hotвектор, цель преобразования является низкоразмернойEmbeddingвектор. По сути, это процесс решения весовой матрицы размером m × n, а ее вектор-столбец является соответствующей размерностью.one-hotхарактерныйEmbeddingвектор.

3.1 Описание функций

В области НЛП текст обычно сначала преобразуется в обычное целочисленное кодирование, а затем слой внедрения используется для обновляемого векторного кодирования. Tensorflow предоставляет функцию embedding_lookup для преобразования. Например, процесс конвертации из one_hot в матричную кодировку нужно искать во встраивании:

one_hot * embedding_weights = embedding_code

Функция embedding_lookup (параметры, идентификаторы) TensorFlowЦель состоит в том, чтобы взять вектор (строку) из матрицы параметров в соответствии с идентификаторами, поэтому ids — это индекс матрицы (номер строки), который должен иметь тип int. То есть строка идентификаторов в параметрах возвращается в порядке идентификаторов. Например, ids=[1,3,2], чтобы вернуть 1-ю, 3-ю, 2-ю строку в параметрах. Возвращаемый результат — тензор, состоящий из строк 1, 3 и 2 параметров.

 embedding_lookup(
     params,   # embedding_params 对应的转换向量
     ids,      # inputs_ids,标记着要查询的id
     partition_strategy='mod',   #分割方式 
     name=None,
     validate_indices=True, # deprecated
     max_norm=None
 )

Параметры и возвращаемые значения следующие:

  • params: список, состоящий из одного тензора или нескольких тензоров (при формировании нескольких тензоров размерности каждого тензора, кроме первого измерения, должны быть равны).
  • ids: Целочисленный тензор, каждый элемент идентификаторов представляет собой логический индекс 0-го измерения каждого элемента, который будет взят в параметрах.
  • partition_strategy: Логический индекс задается partition_strategy, который используется для установки метода сегментации идентификаторов. В настоящее время существует два метода сегментации: «div» и «mod», по умолчанию используется «mod».
  • возвращаемое значение: является плотным тензором, а возвращаемая форма — shape(ids)+shape(params)[1:].

3.2 Суть функции

3.2.1 Полносвязный слой

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

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

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

embedding_lookup — это не просто поиск в таблице. Вектор, соответствующий идентификатору, можно обучить. Количество параметров обучения должно быть равно категории num * размер встраивания, что означает, что поиск — этоСпециальный «полностью связанный слой».

3.2.2 Отображение векторов

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

Предполагая, что матрица весов встраивания представляет собой плотную матрицу W из [vocab_size, embed_size], vocab_size — это количество всех элементов, которые необходимо внедрить (например: количество всех слов, количество всех элементов), и embed_size — длина отображаемого вектора.

Так называемый embedding_lookup(W, id1) можно представить как вектор one_hot из [1, vocab_size], бит id1 которого равен 1, умноженный на матрицу W из [vocab_size, embed_size], результатом является вектор из [1, embed_size] , который является вектором вложения, соответствующим id1, который на самом деле является строкой id1 матрицы W..

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

Embedding_lookup обычно больше используется в НЛП, который отображает ввод [размер пакета, длина_последовательности] в матрицу [размер пакета, длина_последовательности, размер_встраивания]. пока вВ области рекомендации/поиска нам часто нужно сначала встроить, а затем объединить несколько векторов после встраивания в один вектор (то есть процесс объединения). Например, если пользователь использовал WeChat 3 раза и Alipay один раз на прошлой неделе, то мы выражаем привычки пользователя в использовании приложений на прошлой неделе следующим образом:Вектор привычки использования приложения пользователем = 3 * вектор WeChat + 1 * вектор Alipay

3.3 Пример функции

3.3.1 Пример

Пример кода выглядит следующим образом:

import numpy as np
import tensorflow as tf

sess = tf.InteractiveSession()

embedding = tf.Variable(np.identity(6, dtype=np.int32))
input_ids = tf.placeholder(dtype=tf.int32, shape=[None])
input_embedding = tf.nn.embedding_lookup(embedding, input_ids)

sess.run(tf.global_variables_initializer())
print("====== the embedding ====== ")
print(sess.run(embedding) )
print("====== the input_embedding ====== ")
print(sess.run(input_embedding, feed_dict={input_ids: [4, 0, 2]}))

3.3.2 Выход

Вывод выглядит следующим образом

====== the embedding ====== 
[[1 0 0 0 0 0]
 [0 1 0 0 0 0]
 [0 0 1 0 0 0]
 [0 0 0 1 0 0]
 [0 0 0 0 1 0]
 [0 0 0 0 0 1]]
====== the input_embedding ====== 
[[0 0 0 0 1 0]
 [1 0 0 0 0 0]
 [0 0 1 0 0 0]]

3.3.3 Интерпретация

Из вышеизложенного видно, что:

Встраивание выражает переменные в горячем виде, короче говоря, оно создает словарь встраивания;

====== the embedding ====== 
[[1 0 0 0 0 0]
 [0 1 0 0 0 0]
 [0 0 1 0 0 0]
 [0 0 0 1 0 0]
 [0 0 0 0 1 0]
 [0 0 0 0 0 1]]

иinput_embedding = tf.nn.embedding_lookup(embedding, input_ids)Это выражение тензора, заданного в input_ids, в виде встраивания;

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

====== the input_embedding ====== 
[[0 0 0 0 1 0]
 [1 0 0 0 0 0]
 [0 0 1 0 0 0]]

3.4 Приложение DIN

Возвращаясь к коду DIN, из комментариев видно, что DIN строит здесь таблицу поиска встраивания пользователя и элемента и преобразует входные данные в соответствующее встраивание, которое должно преобразовать разреженные функции в плотные функции. В частности, используйте различные переменные в качестве идентификаторов, чтобы найти переменные в соответствующем файле embeddings_var. например сself.mid_batch_phкак ид, вself.uid_embeddings_varНайдите переменные в .

class Model(object):
    def __init__(self, n_uid, n_mid, n_cat, EMBEDDING_DIM, HIDDEN_SIZE, ATTENTION_SIZE, use_negsampling = False):
        with tf.name_scope('Inputs'):
            self.mid_his_batch_ph = tf.placeholder(tf.int32, [None, None], name='mid_his_batch_ph')
            self.cat_his_batch_ph = tf.placeholder(tf.int32, [None, None], name='cat_his_batch_ph')
            self.uid_batch_ph = tf.placeholder(tf.int32, [None, ], name='uid_batch_ph')
            self.mid_batch_ph = tf.placeholder(tf.int32, [None, ], name='mid_batch_ph')
            self.cat_batch_ph = tf.placeholder(tf.int32, [None, ], name='cat_batch_ph')

        # Embedding layer
        with tf.name_scope('Embedding_layer'):
            # shape: [U, H/2], user_id的embedding weight. U是user_id的hash bucket size,即user count
            self.uid_embeddings_var = tf.get_variable("uid_embedding_var", [n_uid, EMBEDDING_DIM])
            # 从uid embedding weight 中取出 uid embedding vector
            self.uid_batch_embedded = tf.nn.embedding_lookup(self.uid_embeddings_var, self.uid_batch_ph)

            # shape: [I, H/2], item_id的embedding weight. I是item_id的hash bucket size,即movie count
            self.mid_embeddings_var = tf.get_variable("mid_embedding_var", [n_mid, EMBEDDING_DIM])
            # 从mid embedding weight 中取出 uid embedding vector
            self.mid_batch_embedded = tf.nn.embedding_lookup(self.mid_embeddings_var, self.mid_batch_ph)
            # 从mid embedding weight 中取出 mid history embedding vector,是正样本
            # 注意 self.mid_his_batch_ph这样的变量 保存用户的历史行为序列, 大小为 [B, T],所以在进行 embedding_lookup 时,输出大小为 [B, T, H/2]; 
            self.mid_his_batch_embedded = tf.nn.embedding_lookup(self.mid_embeddings_var, self.mid_his_batch_ph)
            # 从mid embedding weight 中取出 mid history embedding vector,是负样本
            if self.use_negsampling:
                self.noclk_mid_his_batch_embedded = tf.nn.embedding_lookup(self.mid_embeddings_var, self.noclk_mid_batch_ph)

            # shape: [C, H/2], cate_id的embedding weight. C是cat_id的hash bucket size
            self.cat_embeddings_var = tf.get_variable("cat_embedding_var", [n_cat, EMBEDDING_DIM])
            # 从 cid embedding weight 中取出 cid history embedding vector,是正样本
            # 比如cat_embeddings_var 是(1601, 18),cat_batch_ph 是(?,),则cat_batch_embedded 就是 (?, 18)
            self.cat_batch_embedded = tf.nn.embedding_lookup(self.cat_embeddings_var, self.cat_batch_ph)
            # 从 cid embedding weight 中取出 cid embedding vector,是正样本
            self.cat_his_batch_embedded = tf.nn.embedding_lookup(self.cat_embeddings_var, self.cat_his_batch_ph)
            # 从 cid embedding weight 中取出 cid history embedding vector,是负样本
            if self.use_negsampling:
                self.noclk_cat_his_batch_embedded = tf.nn.embedding_lookup(self.cat_embeddings_var, self.noclk_cat_batch_ph)

Пока мы решили первые два вопроса о встраивании:

  • Что делает встраиваемый слой?
  • Для чего именно используется embedding_lookup?

По третьему вопросу: как обновить слой встраивания типа mid_embeddings_var? Мы объясним ниже, так что следите за обновлениями.

0xEE Личная информация

★★★★★★Думая о жизни и технологиях★★★★★★

Публичный аккаунт WeChat:мысли Росси

Если вы хотите получать своевременные новости о статьях, написанных отдельными лицами, или хотите видеть технические материалы, рекомендованные отдельными лицами, обратите внимание.

ссылка 0xFF

Подробное объяснение параметра partition_strategy в tf.nn.embedding_lookup

Личное понимание двух ролей слоя Embedding в глубоком обучении

Глубокое понимание сути слоя Embedding

Принцип функции tf.nn.embedding_lookup?

Принцип встраивания и Tensorflow-tf.nn.embedding_lookup()

Ищете простое объяснение смысла интерфейса embedding_lookup tensorflow?

Учебные заметки для embedding_lookup

tf.nn.embedding_lookup

Что такое Логит? —— Третья модель дискретного выбора

Ручная работа в широком и глубоком масштабе с помощью NumPy

Объясните мотивацию структуры Wide & Deep

Видите, Вейжи, вы действительно понимаете модель Google Wide&Deep?

Применение технологии встраивания в рекомендательную систему глубокого обучения

Система рекомендаций по глубокому обучению | Встраивание, откуда взяться, куда идти

Применение технологии встраивания в рекомендательную систему глубокого обучения

Различные популярные методы встраивания в рекомендательные системы глубокого обучения (часть 1)

Различные популярные методы встраивания в рекомендательные системы глубокого обучения (ниже)