Системы рекомендаций на основе тематических моделей

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

Посетите мой GitHub, где есть простая рабочая система рекомендаций, основанная на тематическом моделировании.

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

Так как же на самом деле работают рекомендательные системы? В этой статье я собираюсь объяснить один подход, основанный на тематическом моделировании с использованием скрытого распределения Дирихле (LDA).

Тематическое моделирование

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

Это не интуитивно понятная идея, поэтому мы опишем ее в терминах набора слов.

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

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

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

Затем вы можете задать вопрос, как мы можем заставить компьютер систематизировать эти документы по темам и как мы узнаем, какие темы он выберет? Чтобы ответить на этот вопрос, мы подумаем на более глубоком уровне ...

Менее общая идея

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

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

Скажем, у нас есть 1000 различных уникальных слов в 4 документах, и мы хотим охарактеризовать каждый документ тем, какие слова в них содержатся (и сколько в каждом слове).

Итак, теперь мы можем представить, что для каждого документа у нас есть вектор с размерностью 1000 (одно измерение для каждого уникального слова). И в каждой позиции в каждом векторе есть счетчик того, сколько раз слово, которому эта позиция соответствует, появляется в документе.

Например, первая позиция в векторе соответствует первому слову в словаре, которое мы скажем «Робот». Первый документ - это обзор фильма о Терминаторе 23 (или о каком номере мы сейчас говорим…), поэтому слово «Робот» упоминается 19 раз. Следовательно, в первой позиции вектора, соответствующего первому документу, мы имеем (19,…).

Вторая позиция соответствует слову «Спорт» и не упоминается ноль раз в обзоре Терминатора, который дает нам (19, 0,…) и так далее…

Второй документ представляет собой обзор документального фильма о теннисе, поэтому для этого документа у нас есть вектор (0, 10,…), поскольку «Робот» упоминается 0 раз.

Слишком много тем?

Да, слишком много. Я согласен, как и ваш компьютер.

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

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

Скрытое размещение Дирихле

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

Это именно то, для чего мы собираемся использовать скрытое распределение Дирихле (LDA).

LDA требует, чтобы мы определили необходимое количество тем, которые мы хотим иметь. Это то, что мы называем гиперпараметром (параметр, который определяется перед запуском алгоритма).

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

Допустим, мы ищем 10 тем. Это означает, что мы хотим добавить скрытый слой с 10 узлами между предыдущими подключениями, которые у нас были. Которые связывали документы со словами, запоминая наши большие векторы (19, 0,…) и (0, 10,…).

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

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

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

Однако некоторая информация слишком мелкозернистая. Например, нам не нужна отдельная тема для «Робот» и «Android». Их можно просто объединить в более грубую тему «Научная фантастика» или как угодно назовите ее.

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

Это то, что делают матрицы M и N. Скрытое измерение K - это наш скрытый слой тем (то есть 10 тем). И учитывая это измерение K, LDA изучает матрицы M и N в попытке наилучшим образом воссоздать матрицу S.

Необязательно, чтобы вы разбирались в математике, чтобы знать, что происходит, основные моменты:

  • LDA создает более грубые темы на основе предоставленных ему документов.
  • Поскольку модель LDA делает это, мы теряем конкретную информацию об отдельных документах.

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

Почему мы хотим потерять информацию?

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

Уловка состоит в том, чтобы не потерять полезную информацию, которую в некоторых случаях можно узнать с помощью алгоритма или ее нужно контролировать с помощью гиперпараметра (как в случае LDA с количеством тем).

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

На графике B мы попытались сохранить всю информацию, которая у нас есть для описания точек данных, но выглядит ли это правильно? Наверное, нет, наша модель слишком специфична и не совсем уловила общую тенденцию.

На графике C мы потеряли слишком много информации. Модель слишком проста для данных.

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

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

Назад к темам…

Надеюсь, эта короткая пауза была полезной. Если нет, извините, но теперь мы вернулись на правильный путь!

Итак, у нас есть наша модель LDA, которая отсортировала все эти документы по темам. Обратите внимание, что это не жестко сгруппированные темы, это распределения. Итак, если бы 3 из 10 тем были «Научная фантастика», «Документальное кино» и «Технологии», мы могли бы получить обзор документального фильма об астронавтах с распределением (0,2, 0,4, 0,3,…).

На схеме выше это соответствует верхнему уровню связей между документами и темами.

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

Возьмите наше предыдущее вложение, a = (0,2, 0,4, 0,3,…). Теперь, если у нас есть еще два документа с вложениями b = (0,1, 0,5, 0,2,…) и c = (0,8, 0, 0,1,…). B или c больше похоже на встраивание a?

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

В этом случае a и b больше похожи, чем a и c. Итак, если бы мы спросили компьютер, какой из b и c он рекомендовал бы с учетом a. Мы ожидаем, что он может порекомендовать нам документ b.

Вот как мы можем использовать тематическое моделирование для создания рекомендаций.

Округлять

Итак, мы рассмотрели, что это за темы, затем, что дает нам алгоритм LDA, и, наконец, как мы можем использовать эти математические объекты для выработки рекомендаций.

Ключевым моментом для рекомендаций в тематическом моделировании, основанном на сходстве, является то, что мы оцениваем, насколько похожа закодированная информация каждого документа. Как мы уже обсуждали, эти рекомендации могут быть совершенно ужасными в зависимости от того, как обнаруживаются и распространяются наши темы (график B или график C из грубого объяснения ранее). Или они могут быть фантастическими и попасть в золотую середину (сюжет D).

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

Еще одна причина, почему все дело в ДАННЫХ ...

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

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

использованная литература

[1] - D. Blei, et. др., Скрытое размещение Дирихле (2003)