Оглавление:

  1. "Введение"
  2. "Основная идея"
  3. Метод
  4. "Заключение"

Введение

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

Эта задача может быть непосредственно переведена для решения следующей задачи. Например, предположим, что вы хотите посмотреть определенное аниме на средневековую тему и сюжет о мести. Лучшее, что вы можете сейчас сделать, это расспросить об этом разных людей. Если они смотрели такое аниме, то порекомендуют. Поэтому были созданы такие сабреддиты, как r/AnimeSuggest. Но это очень неэффективно.

Моя гипотеза была

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

или по-другому: «если человек прочитает все обзоры аниме, ему будет достаточно решить, есть ли у этого аниме какие-то определенные свойства, которые он ищет, или нет».

Рассмотрим следующую часть обзора аниме Моя подростковая романтическая комедия:

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

прочитав только эту часть, мы можем сделать вывод, что в этом аниме есть:

  • антисоциальный герой
  • реалистический роман и комедия

Если мы прочитаем все отзывы об этом аниме, то сможем найти больше свойств, которыми может обладать это аниме.

Имея в виду эту гипотезу, я создал Юно. Юно может сравнивать несколько обзоров аниме на основе запроса и соответствующим образом ранжировать их. Теперь вы можете просто ввести, какое аниме вы ищете. Например, аниме с одиноким и умным ведущим, романтическое аниме с ведущим женского пола цундэрэ и т. д. Yuno может проанализировать все обзоры и всего за 2–3 секунды найти похожие аниме и похожие части разных обзоров, соответствующие вашему запросу. В настоящее время Юно индексирует более 0,5 миллиона обзоров аниме и другую информацию об аниме.

Yuno можно легко расширить до любого домена, например: r/Booksuggestions/, r/MovieSuggestions/ и т. д. Без необходимости создавать вручную и маркировать набор данных для обучения. В этой статье я поделюсь, как можно решить эту проблему и как можно создать Юно.

Исходный код: https://github.com/IAmPara0x/yuno

Вы можете использовать Yuno на (оба ноутбука имеют пользовательский интерфейс):

  1. Kaggle Notebook (рекомендуемый блокнот)
  2. Блокнот Colab

Основная идея

Идею можно описать так:

Пусть x и y — два разных аниме, у которых нет общих жанров/тегов, тогда достаточно большие обзоры аниме x и y будут иметь совершенно разное содержание.

Формально говоря,

Сейчас,

  • два объектаoᵢиoⱼ не похожи, если и только если sᵢ s =∅.
  • два объекта oᵢиoⱼ похожи, если и только еслиi = j.

Пример:

  • Йона рассвета имеет следующие жанры: боевик, приключения, комедия, драма, фэнтези, романтика.
  • takt op Destiny имеет следующие жанры: боевик, музыка, фэнтези.
  • Моя подростковая романтическая комедия (Орегаиру)есть следующие жанры:комедия, драма, мелодрама, повседневность.

По определению takt op Destiny не будет похож на My Teen Romantic Comedy. Но это не означает, что Йона зари похожа на takt op Destiny, между объектами не определена связь oᵢиoⱼгде sᵢ s и ij. Единственное аниме, на которое похоже takt op Destiny, — это само аниме. Причина такого решения будет упомянута в следующем подразделе.

С приведенными выше определениями теперь мы можем использовать тройную потерю для этих объектов, чтобы убедиться, что все свойства объекта oᵢ ближе к друг друга, чем свойства объекта oⱼ . Здесь oᵢ и oⱼ являются не похожими объектами, а свойства в данном случае рецензии на аниме. Триплетные потери для этой задачи можно определить следующим образом:

Я бы сказал, что с таким большим количеством определений достаточно классифицировать все аниме на основе их свойств. В подтверждение этого утверждения я попрошу вас взглянуть на рис. 2 и рис. 3. Рис. 2 состоит из более чем 10 000 предложений обзоров аниме, составленных из 1280 измерений (метод обучения модели описан в следующем разделе) до 2 измерений с использованием T-SNE. Вы сможете увидеть, что есть несколько кластеров аниме. А рис. 3 состоит из увеличенной версии рис. 2. Если вы посмотрите на рис. 3, вы увидите, что обзоры аниме с розовым цветом очень близки к обзорам аниме с оранжевым цветом. Аниме в розовом цвете называется Призрак в доспехах, а аниме в оранжевом цвете — Призрак в доспехах: Самостоятельный комплекс. Последнее является продолжением предыдущего аниме. Но в нашем определении мы никогда не упоминали, что аниме и его продолжение должны быть близки друг к другу. И это не единственный случай, посмотрите на рис. 4, он состоит из аниме Re:zero и его сиквела Re:zero Season 2. Каждое аниме и его сиквелы гораздо ближе друг к другу, чем разные аниме с одинаковыми свойствами. Если подумать, так и должно быть, потому что аниме и его сиквелы будут иметь почти все схожие свойства, а это означает, что если в аниме есть средневековый сеттинг, то его сиквел, скорее всего, будет иметь тот же сеттинг. Вот ссылка на каггловскую записную книжку с этой интерактивной визуализацией, чтобы вы поигрались с ней и убедились, что аниме со схожими свойствами ближе друг к другу. В этом блокноте более 100 тысяч предложений различных отзывов.

Теперь я попытаюсь объяснить, почему этого определения достаточно, чтобы сблизить аниме с одинаковыми свойствами и отдалить аниме с разными свойствами. В наборе данных более 7000 аниме. И в каждом аниме есть много разных аниме, на которые они не похожи. Например: Призрак в доспехах (GITS) содержит более 4000 различных аниме, на которые он не похож. По сути, то, что делает тройная потеря, это то, что она отталкивает все обзоры GITS от обзоров этих 4000 аниме, и, поскольку продолжение GITS также имеет те же теги / жанры, в нем также есть те же 4000 аниме, на которые он не похож. Так что опять потеря тройки оттолкнет все обзоры сиквела ГИТС от этих самых 4000 аниме. Поскольку оба аниме отталкиваются от одного и того же набора аниме, они в конечном итоге сблизятся. Подумайте об этом с точки зрения Враг моего врага — мой друг, если в двух аниме один и тот же набор врагов (не похожие аниме), то они, скорее всего, будут друзьями (имеют схожие свойства). Но, как показано на рис. 3, GITS и его продолжение по-прежнему образуют два разных кластера. Причина здесь в том, что потеря триплета сближает обзоры GITS, но не сближает обзор GITS и его продолжения. Вот почему существуют два разных кластера. Если вы подумаете об этом, это должно быть так, потому что аниме и его продолжение не обязательно должны иметь все сходные свойства (не путать с тегами / жанрами). один из лучших примеров, которые я могу привести для этого случая, это clannad и его продолжение clannad:ASоба имеют жанры романтика, сверхъестественное, но последний очень трагичен, а первый очень полезен . Это одна из причин, по которой не было определено отношение между объектами oᵢиoⱼгде sᵢ s∅ и i j.

Чтобы уточнить это дальше, рассмотрим три аниме со следующими свойствами:

  • X: аниме-боевик на тему оружия. (жанр: Боевик)
  • Y: аниме-боевик на тему мечей. (жанр: Боевик)
  • Z: аниме-боевик на тему мечей. (жанр: Боевик)

Аниме X, Y и Z будут иметь одинаковый набор аниме, на которое они не похожи. Но это не значит, что X и Y похожи. Если считать оба аниме похожими, то потеря триплета сблизит обзоры X и обзоры Y, Z, что не приведет к образованию двух отдельных кластеров. Таким образом, в основном модель будет рассматривать аниме X , Y и Z как похожие, и если вы хотите посмотреть аниме-боевик с оружием, она будет рекомендовать аниме X , Y и Z, что нам не нужно. Следовательно, мы не можем сделать вывод, что объекты oᵢ и oⱼ похожи только потому, что принадлежат к одному жанру. Но наше определение никогда не рассматривает аниме X, Y и Z как не похожие; это означает, что аниме Y и Z не должны формировать разные кластеры. (Помните, что у нас нет доступа к свойствам аниме, что означает, что наш набор данных состоит только из аниме и его жанров, а также обзоров.)

Метод

В этом разделе я опишу метод обучения модели.

Предварительная обработка:

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

«Yahari Ore — не первое аниме, в котором рассказывается об антиобщественном главном герое, но оно, безусловно, идеально передает его благодаря своим персонажам и невозмутимому письму. Как уже говорили другие, вы можете начать это, ожидая типичной романтической комедии, но вместо этого вы выйдете из нее с резкими взглядами наших персонажей. Тем не менее, именно поэтому это аниме выделяется среди многих в этом жанре. Это очаровательно, смешно и в то же время абсолютно реалистично».

После использования сумматора на этом,

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

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

После процесса суммирования имена аниме и персонажей были заменены следующими токенами. [ANIME_NAME],[MAIN_CHAR],[FEMALE_CHAR],[MALE_CHAR].

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

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

Обучение

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

пусть oᵢ будет объектом, жесткие триплеты которого отбираются.

здесь 𝔯это набор всех обзоров объектаoᵢ , 𝔸иявляются анкорами и положительными отзывами, которые случайным образом выбираются из𝔯ᵢ,𝔫набор обзоров всех объектов, не похожих на oᵢ,набор негативов, случайно выбранных из 𝔫ᵢ . Обычно |𝔫ᵢ| ›› |𝔯ᵢ|,поэтомуKдолжен быть больше, чемS, обаK,Sявляются размерами выборки.

Здесь θ — параметр модели, D — показатель расстояния, а 𝔸ₐaᵗʰ элемент анкоров 𝔸и так далее.

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

Индексаторы

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

  • K-NN поиск
  • Индексатор узлов
  • Индексатор контекста (самый удивительный индексатор для меня).

K-NN поиск

Прежде чем мы сможем использовать K-NN, нам сначала нужно преобразовать все обзоры в векторы встраивания. Так как обзоры бывают разной длины (некоторые даже на 2048 слов). Использование косинусного сходства между такими длинными обзорами и короткими запросами приведет к очень плохим результатам. Поэтому необходимо разбивать отзывы на короткие предложения. При создании указателя я разделил обзоры на предложения разной длины, один на короткие предложения (максимум 96 слов), а другой на длинные предложения (максимум 256 слов). Длинные предложения гарантируют, что в контекст будет включено больше слов, что может быть необходимо в некоторых случаях, а более короткие предложения обеспечат соответствие точным словам, если запрос очень короткий. После создания индекса мы можем использовать поиск K-NN, чтобы получить K лучших предложений, соответствующих запросу, а затем присвоить им оценку, используя косинусное сходство, а затем линейно масштабировать их. Этот метод оценки можно описать следующим образом:

здесь q — это вектор вложения запроса, а 𝔼 — набор лучших k векторов вложения, который находится рядом на q.

Индексатор узлов

Индексатор узлов используется для векторов встраивания, возвращаемых поиском KNN. Этот индексатор можно определить следующим образом:

Здесь eʲᵢозначаетiᵗʰэлемент 𝔼 и встраивание вектора из объекта oⱼ . Xʲявляется набором всех векторов встраивания из объекта oⱼ.

Мы используем этот индексатор, чтобы гарантировать, что выбранный вектор встраивания eʲᵢне является выбросом из набора всех векторов встраивания, соответствующих объекту oⱼ . Это в основном проверяет, насколько похож этот вектор внедрения со всеми другими векторами внедрения, соответствующими этому объекту oⱼ(в данном случае аниме). Это гарантирует, что если конкретный обзор является исключением, он получит очень низкую оценку, поскольку он не похож на все другие обзоры этого аниме.

Индексатор контекста

Обозначения:

если s — это предложение, то e будет его вектором встраивания.

qбудетбытьпредложением запроса и qₑбудет вектором внедрения запроса.

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

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

Чтобы наглядно проиллюстрировать проблему, рассмотрим следующий пример (первые два предложения — разные рецензии, взятые из аниме Орегаиру):

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

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

Прежде чем описывать математику, стоящую за этим, я хотел бы сначала построить интуицию, стоящую за этой идеей. Напомним, что с помощью метода, описанного выше, мы смогли разделить разные свойства аниме на основе содержания обзоров. Следовательно, векторы e₁ и e₂ должны быть направлены в разные стороны, поскольку соответствующие предложения имеют разные свойства. Угол между e₁ и e₂ равен 44°ᵒ посмотрите на рис. 5, поскольку qсодержит свойства обоих этих предложений , если qₑнаходится в пространстве столбцов матрицы [e₁ , e₂], то он должен быть в направлении обоих этих векторов. qₑ не может быть вектором Y, так как этот вектор похож на e₁ но не похоже на e₂, аналогично qₑне может быть Z, потому что наоборот. Следовательно, мы можем сказать, что

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

Теперь мы можем использовать метод наименьших квадратов, чтобы найти наилучший способ объединения векторов вложения e₁ и e₂, который может аппроксимировать вектор запроса qₑ.

Вектор x содержит коэффициенты для линейных комбинаций всех векторов вложений, необходимых для наилучшей аппроксимации qₑ . По сути, это говорит нам о направлении, в котором должен двигаться каждый вектор встраивания, чтобы аппроксимировать qₑ. Продолжая пример выше, новый вектор Axсодержит части из e₁ и e, теперь при вычислении косинусного сходства между Ax и qₑ будут учитываться оба вектора встраивания, в отличие от ранее, когда мы были вынуждены вычислять сходство между независимыми векторами. И действительно, показатель сходства меняется от 0,72 до 0,80. Теперь, что произойдет, если мы аппроксимируем qₑвсеми тремя векторами вложения, которые являются e₁,e,e₃ ?

Используя, e₃ вместе с e₁ и e не меняет сходства между новыми Ax и qₑ, оно просто изменилось с 0,80 на 0,81. И это имеет смысл, поскольку предложение s₃ содержит совершенно другое свойство, чем запрос q. Рассмотрим аналогию с двумерным декартовым пространством, если мы хотим перейти в точку с координатами (2,0) . Единичный вектор Y ничего не может сделать, чтобы привести нас к этой точке, потому что они оба находятся в совершенно разных направлениях. В этом случае e₃ и qₑне совсем перпендикулярны, угол между ними равен 72 поэтому коэффициент e₃, равный -0,133, говорит нам, что мы должны двигаться в направлении, противоположном вектору встраивания e₃ для наилучшего приближения к qₑ .

Суть, которую я пытаюсь здесь подчеркнуть, заключается в том, что вместо использования косинусного подобия для отдельных векторов встраивания мы должны найти наилучшую комбинацию различных векторов, которая лучше всего аппроксимирует qₑ. В настоящее время эта поисковая система не может обрабатывать длинные запросы типа «аниме с очень умными главными героями и милыми женскими персонажами и в средневековом сеттинге». Решение этой проблемы имеет решающее значение, потому что обычно разные обзоры говорят о разных вещах об аниме, мы должны как-то «запоминать», что говорится в каждом обзоре об этом аниме. Описанный выше метод способен на это, но у него есть собственный набор проблем, которые нам нужно решить в первую очередь, над которыми я сейчас работаю. Если вам интересно узнать больше об этом, вы можете прочитать это здесь.



Заключение

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

Спасибо за чтение.

Контакты: