Модели, созданные из и для первой страницы Интернета

Над этим проектом работали Ришаб Рай, Джаянт Шеной, Дэвид Чен, Вэй Ван и Шрути Криш

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

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

Задача

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

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

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

Создание чистого регрессора Upvote:

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

Набор данных

Полный набор данных комментариев содержит все комментарии к Reddit с 2005 года. Поскольку работа с таким огромным объемом данных (сотни гигабайт текста) выходит за рамки наших ресурсов, мы ограничили наборы для обучения и тестирования комментариями с 1 февраля. и 2nd, 2018 соответственно. Ежедневный набор содержит данные о более чем 3 миллионах комментариев, и после удаления недействительных данных у нас остается 2,8 и 2,4 миллиона обучающих и тестовых примеров соответственно. Хотя мы предпочли бы иметь больше данных, разбросанных в течение определенного периода времени, достаточный объем данных для каждого набора позволил нам быть достаточно уверенными в наших

Разработка функций

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

Автор

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

Автор Cakeday

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

CSS-класс Author Flair и CSS-текст Author Flair

У автора чутье CSS-класс и текст относятся к тегам, относящимся к сабреддиту. Эти навыки предоставляют информацию редакторам со знанием предметной области, и для создания им часто требуется знание предметной области. Проще говоря, на субреддите NBA чутье может отметить пользователя как поклонника определенной команды. В примерах из r / TheLastAirbender ниже, хотя для всех сразу очевидно, что первый пользователь является поклонником кого-то по имени Асами, только пользователь со знанием предметной области поймет, что второй пользователь является поклонником учений гигантского льва. черепаха.

Имеет чутье

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

Тело

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

Мнения

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

Количество упоминаний пользователей и упоминаний в субреддите

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

Количество ссылок Reddit и количество внешних ссылок

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

Читаемость

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

Соотношение прописных букв

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

Длина

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

Токсичность

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

Количество вопросов

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

Встраивания Doc2Vec

Отображение семантического пространства имеет решающее значение для определения успеха комментария. Это можно сделать с помощью Doc2Vec, который представляет семантику документа как вектор внедрения. Doc2Vec сопоставляет документы с семантическим пространством, добавляя теги документов во время изучения встраивания слов, а затем создавая встраивание документа указанного измерения. Мы начали с обучения модели dm, которая создает векторы вложения размером 300, обученные за 125 эпох. Хотя эта модель была точной, огромный размер векторных данных для всех комментариев оказался слишком большим для наших ресурсов. В результате мы обучили новую 50-мерную модель встраивания за 50 эпох. Эта модель была достаточно маленькой, чтобы мы могли ее использовать для прогнозов, и после качественного изучения ряда примеров казалось, что общая точность вложений не сильно пострадала. Глядя на вложения Doc2Vec в двух измерениях, мы можем увидеть кластеризацию популярных комментариев. Это может быть связано с общей семантикой, но вполне может быть просто результатом большей активности в определенных субреддитах.

Позолоченный

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

Джан Гилд

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

Противоречивость

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

Создано в формате UTC

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

Прикреплено

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

Выдающийся

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

Отредактировано

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

Отправитель

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

Постоянная ссылка

Постоянная ссылка - это ссылка на комментарий. Он содержит заголовок сообщения.

Заголовок сообщения

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

Заголовок - вопрос

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

Оценка

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

Субреддит

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

Получено

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

Идентификатор, идентификатор ссылки, родительский идентификатор и идентификатор субреддита

Идентификаторы комментария определенно не имеют никакого отношения к его успеху.

Построение и оценка регрессора чистого числа положительных голосов

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

Настройка гиперпараметров

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

Байесовская оптимизация с использованием HyperOpt

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

RandomizedSearchCV

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

Деревья решений с градиентным усилением с использованием XGBoost

Мотивация

Деревья решений с градиентным усилением обычно хорошо работают на практике для табличных данных (о чем свидетельствует их успех во многих соревнованиях Kaggle, включающих регрессию), поэтому мы решили построить несколько различных моделей из деревьев с градиентным усилением. Мы начали с настройки XGBoostRegressor в качестве модели по умолчанию. Перед обучением модели все категориальные признаки были быстро закодированы.

Функции ввода

  • Can_gild
  • Отредактировано
  • Is_submitter
  • Положительный настрой
  • Neutral_sentiment
  • Negative_sentiment
  • Compound_sentiment
  • Num_user_mentions
  • Num_subreddit_mentions
  • Has_flair
  • Num_outside_links
  • Num_reddit_links
  • Title_is_question
  • Читаемость
  • Uppercase_ratio
  • Длина
  • Все векторы Doc2Vec

Результаты

Хотя в целом XGBoost может работать хорошо, наша модель XGBRegressor оказалась худшей моделью в этом сценарии. Расчетные потери модели составили 12,34 CV MAE и 10,33 для тестирования MAE. График разброса предсказаний теста показан ниже. Прогнозируемые значения «за» находятся в диапазоне от -200 до 2000. Судя по диаграмме рассеяния, модель кажется, что многие оценки за комментарии с низкими оценками в действительности превышают многие.

Деревья решений с градиентным усилением с использованием CatBoost

Мотивация

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

Функции ввода

  • Can_gild
  • Отредактировано
  • Is_submitter
  • Положительный настрой
  • Neutral_sentiment
  • Negative_sentiment
  • Compound_sentiment
  • Num_user_mentions
  • Num_subreddit_mentions
  • Has_flair
  • Num_outside_links
  • Num_reddit_links
  • Title_is_question
  • Читаемость
  • Uppercase_ratio
  • Длина
  • Все векторы Doc2Vec

Результаты

Результаты были значительно лучше по сравнению с моделью XGBoost. В отличие от прогнозов XGBoost, диапазон значений прогнозов CatBoost был намного меньше. В результате модель не смогла предсказать ни один из выпадающих комментариев с очень высокими баллами. Несмотря на это, потери модели составили 8,32 CV MAE и 8,21 для тестирования MAE, показывая, что специализированное кодирование категориальных функций было шагом в правильном направлении. Судя по оценкам важности характеристик модели, категориальный признак has_flair, похоже, оказал наибольшее влияние на модель, в то время как can_guilded и edited даже не рассматривались. Теперь, когда у нас было два интересных графика важности функций, пора было приступить к удалению зашумленных функций, которые потенциально могут увеличить MAE.

Нейронная сеть

Мотивация

Имея доступ к облачным экземплярам и желая диверсифицироваться от деревьев с градиентным усилением, мы решили попробовать несколько моделей, основанных на нейронных сетях. Наш лучший вариант включал в себя архитектуру ниже: плотную последовательную сеть с входом 67 единиц, два скрытых уровня по 50 единиц каждый, которые используют функцию активации ReLU, и последний выходной слой с линейной активацией. Для обучения мы использовали оптимизатор Adam и метрику оценки MAE.

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

Функции ввода

  • Положительный настрой
  • Neutral_sentiment
  • Negative_sentiment
  • Compound_sentiment
  • Num_user_mentions
  • Num_subreddit_mentions
  • Has_flair (закодировано)
  • Num_outside_links
  • Num_reddit_links
  • Title_is_question
  • Читаемость
  • Uppercase_ratio
  • Длина
  • Все векторы Doc2Vec

Результаты

Как ни странно, нейронная сеть показала гораздо лучшие результаты, чем ожидалось. Мы смогли обучить его всего несколько эпох, что хорошо видно по приведенным ниже кривым обучения и проверки. Модель все еще не сошлась полностью с несколькими итерациями, для которых мы ее обучили, но ей все же удалось получить CV MAE 7,27 и тестовую MAE 7,17, поскольку общий тренд кривой остался прежним. Что необычно, так это то, что диапазон прогнозируемых значений становится еще меньше в зависимости от диаграммы разброса. Кажется, что эта модель смещена в сторону комментариев с высокими значениями, несмотря на то, что мы изначально выбрали MAE в качестве метрики оценки. Однако кажется, что удаление некоторых из созданных нами функций помогло уменьшить шум в модели.

4. Гибридные ансамбли

Мотивация

Для нашей окончательной модели мы хотели попробовать что-то с большой прогностической силой в надежде еще больше снизить наш результат теста MAE. По сути, модель, которую мы разработали, представляла собой 4-кратную комбинацию деревьев с градиентным усилением и 4-кратную комбинацию последовательных нейронных сетей. Прогнозы этих первичных моделей будут суммироваться и предсказываться супервизорной моделью XGBoost Regressor, которая вернет окончательный набор предсказаний оценок. Наш мыслительный процесс при разработке этой модели супервизора заключался в объединении хорошего и плохого из наших предыдущих настроенных моделей, чтобы увидеть, как в конечном итоге будут результаты.

Функции ввода

  • Положительный настрой
  • Neutral_sentiment
  • Negative_sentiment
  • Compound_sentiment
  • Num_user_mentions
  • Num_subreddit_mentions
  • Has_flair (закодировано)
  • Num_outside_links
  • Num_reddit_links
  • Title_is_question
  • Читаемость
  • Uppercase_ratio
  • Длина
  • Все векторы Doc2Vec

Результаты

К сожалению, хотя мы смогли полностью закодировать нашу ансамблевую модель, наши вычислительные возможности не позволили нам фактически обучить модель. Во время k-кратных этапов обучения для моделей нейронной сети и CatBoost у графического процессора нашего облачного экземпляра Google постоянно не хватало памяти. Мы пробовали эксперимент несколько раз, но результаты неудачного обучения на облачном сервере были стабильными.

Окончательные результаты прогнозирования

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

Создание предиктивной клавиатуры для разных субреддитов

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

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

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

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

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

Модели цепей Маркова

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

После обучения модели Маркова нашим данным мы обнаружили, что она очень хорошо генерирует большие объемы читаемого текста. Эта модель работала особенно быстро, потому что для запоминания всех вероятностей требуется всего один проход через все данные. Эта модель была способна воспринимать очень короткие начальные фразы и многое из них экстраполировать. Например, когда модель обучается в сабреддите r / Fitness и мы заставляем модель продолжать генерировать слова до тех пор, пока она не подумает, что комментарий должен заканчиваться, начиная со слов «Я» генерируется следующее сообщение: «Я склонен думать, что вы нельзя быть увлеченным каждый день, чтобы не было мышечных травм ».

На первый взгляд это может показаться идеальным, но при ближайшем рассмотрении этот автоматически сгенерированный комментарий раскрывает некоторые основные преимущества и недостатки нашей модели. С одной стороны, комментарий очень удобочитаем и, что более важно, вписывается в контекст сабреддита пригодности, поэтому наша цепочка Маркова, похоже, может достаточно эффективно генерировать комментарии, специфичные для сабреддита. Однако наш идеальный вариант использования будет больше сосредоточен на предложении более коротких фраз или отдельных слов с высокой степенью точности в соответствии с ожиданиями пользователя. Так что, если бы мы снова запустили модель, но остановили ее после одного слова, мы получили бы фразу «Я склонен». Эта фраза может быть идеальной грамматически, но на самом деле она может быть не слишком точной для предсказания, потому что слово «склонен» может не слишком часто следовать за фразой «я». Конечно, было бы в принципе невозможно точно предсказать следующее слово, особенно с учетом того, что у нас есть только два слова, из которых нужно выйти из контекста. Одно из решений этой проблемы - использовать модель, которая лучше учитывает контекст (позже мы будем использовать для этого LSTM), другое более быстрое решение - добавить больше данных в нашу текущую модель. Мы решили попробовать этот второй подход для повышения точности, пытаясь предугадывать слова только на полпути к их вводу, поэтому, используя тот же пример, что и раньше, мы могли бы предсказывать «Я склонен», только если пользователь уже набрал «Я вкл». . Чтобы получить желаемый эффект, нам нужно было модифицировать нашу марковскую модель, чтобы она была основана на персонажах.

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

Как мы можем улучшить марковские модели - моделирование нейронного языка

Давайте подумаем о том, как люди обрабатывают и интерпретируют предложения. Люди обычно просматривают текст слева направо и после каждого слова получают некоторый контекст того, о чем идет речь, до тех пор, пока не будет достигнут конец; таким образом, мы в совокупности понимаем весь текст. Учитывая то, как люди читают и понимают предложения таким образом, мы можем получить некоторое представление о том, как люди могут предсказать следующие слова или символы в предложении с учетом заданных слов: мы читаем и получаем информацию в совокупности из слов в начале предложения до тех пор, пока мы достигаем конца, а затем, учитывая контекст этих слов, мы можем определить, что имело бы смысл двигаться дальше. Идея рекуррентных нейронных сетей (RNN) очень похожа.

В других нейронных сетях предполагается, что входы в сеть независимы друг от друга. Например, ваш стандартный многослойный перцептрон (MLP) или нейронные сети прямого распространения передают входные данные через нейроны, которые выполняют некоторые математические функции на входных данных модели. Обучая эти модели, вы выполняете математическую операцию с этими входными данными, видя, насколько вы оторвались, а затем повторно масштабируете веса нейронов в сети с помощью процесса, известного как обратное распространение. Это отлично подходит для некоторых случаев использования, однако при обработке естественного языка наши входные данные обычно не независимы друг от друга. Входные данные из прошлого могут помочь нам распознать лучший выход для текущего входа, и это именно то, что RNN пытаются делать: использовать последовательную информацию.

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

Модель на основе символов LSTM

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

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

Изображение взято из блога Кола

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

Затем нам нужно сопоставить наши комментарии с некоторым представлением, которое примет LSTM. Мы можем сделать это, создав последовательности символов длиной 40 для всего нашего текста. При создании этих последовательностей для каждого символа в нашей последовательности мы создаем один вектор горячего кодирования для представления каждого символа. Это полезно, поскольку нейронные сети обычно хорошо подходят для мультиклассовой классификации с категориальными функциями. После того, как мы закончим создание этих последовательностей, у нас останется трехмерная матрица (наш X): первое измерение представляет порядковый номер, второе измерение представляет символы в последовательности, а третье измерение представляет собой горячий вектор, представляющий конкретный персонаж. В то же время, когда мы создаем нашу последовательность, мы создаем нашу следующую матрицу букв (нашу Y). Для последовательности N нам даются символы от 1 до 30, и мы пытаемся предсказать Y, который будет символом 31. Наш массив Y должен быть двумерным массивом: первое измерение представляет порядковый номер, второе измерение - одно- горячий вектор, представляющий конкретный персонаж, который пытается предсказать наша модель.

Затем мы создаем нашу модель, используемую для прогнозирования следующего символа для входных последовательностей. Мы использовали последовательную модель Keras со слоем LSTM размером 128 в полностью связанный плотный слой размера нашего размера набора символов, и, наконец, мы поместили эти результаты в слой активации softmax, чтобы вывести один горячий вектор, сингулярный индекс True которого представляет собой персонаж, который мы пытаемся предсказать. Мы компилируем эту модель с помощью оптимизатора RMSprop (оптимизатор, который обычно подходит для рекуррентных нейронных сетей) со скоростью обучения 0,01 и функцией потерь category_crossentropy (хорошо подходит для нейронных сетей в мультиклассовой классификации). Мы подгоняем эту модель к нашим матрицам X и Y, описанным выше, для 20 эпох и видим приведенную ниже точность и потери.

Мы видим, что наша модель может достичь точности около 0,55 для наших данных проверки с потерей около 1,9. Это означает, что для последовательности символов длиной 30 существует вероятность 55%, что модель правильно угадывает следующий символ в последовательности. Для нашей модели, обученной на / r / 2007scape, она работает довольно хорошо, поскольку может выучить некоторые слова, используемые только в этих конкретных подреддитах. Например, учитывая входную последовательность «Old School Runesc», наша модель может предсказать [«мыс», «hools», «ores», «Scene», «and»], которые сделают прогноз «Old School Runescape». Это подчеркивает некоторые преимущества и недостатки нашей модели по сравнению с моделью Маркова: наша модель теперь может предсказывать неполные слова с приличной точностью с учетом прошлого контекста. Однако, учитывая очень расплывчатый контекст, такой как «O», наша модель предсказывает [«One», «Other», «Ore», «Oin», «Oent»], показывая нам, что наша модель не гарантированно даст нам слова, которые действительны. Также наша модель не будет работать, если мы дадим ей последовательности с уже полными словами, например, «Я хочу поесть» дает нам результат [«ция», «h», «the», «er», «o» ], поэтому наша модель на самом деле не знает полных слов и не понимает концепцию грамматики. Ниже приводится краткий обзор веб-приложения, которое мы создали для демонстрации нашей модели.

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

Модель встраивания LSTM word2vec (Демо здесь)

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

Прежде чем мы перейдем к тому, что мы пробовали, важно рассмотреть, какие преимущества встраивание слов принесет модели. Встраивание слов - это процесс преобразования строк в векторы. Процесс включает математическое вложение одного измерения на слово в непрерывное векторное пространство гораздо более низкой размерности. Это позволяет нам уменьшить «проклятие размерности», поскольку одно горячее кодирование словарного набора слов может привести к словарным наборам длиной более ста тысяч. В частности, мы исследовали использование Word2Vec, модели, которая создает уникальные векторы встраивания слов для каждого уникального слова. Особенностью Word2Vec является то, что создаваемые им векторы слов располагаются таким образом, чтобы слова, имеющие общий контекст в корпусе, располагались близко друг к другу в векторном пространстве. Мы пытаемся использовать это свойство для нашей модели, так как мы думаем, что контекст, захваченный вектором Word2Vec, придаст модели больше контекста и, как следствие, улучшит вывод модели. Ниже представлена ​​визуализация вложений слов, созданных моделью Word2Vec.

Наш ввод - это тот же самый набор слов, поэтому нам нужно преобразовать эти данные во что-то, что наша модель будет принимать. Мы начинаем с токенизации нашего корпуса в массив строк, затем создаем и обучаем модель gensim Word2Vec. После обучения нашей модели мы создаем последовательность скользящих окон длиной 30 слов для всего набора данных, создав аналогичный трехмерный массив (нашу матрицу X): первое измерение по-прежнему представляет порядковый номер, второе измерение представляет последовательность слов, а третье измерение представляет слово (поиск слова в модели Word2Vec и использование слова "встраивание"). Мы также создаем двумерный массив, который представляет нашу матрицу Y: первое измерение представляет порядковый номер, а второе измерение представляет слово, которое мы пытаемся предсказать (как вектор слов).

Модель, которую мы используем, очень похожа на нашу символьную нейронную языковую модель. Мы используем последовательную модель Keras, которая использует слой нейронной сети LSTM размером 128 в полностью связанный плотный слой с размером наших выходных измерений Word2Vec, и, наконец, мы выводим результаты. Мы скомпилировали эту модель с помощью AdamOptimizer со скоростью обучения 0,01 с функцией потерь mean_absolute_error. Мы подгоняем эту модель к X и Y для 150 эпох и смотрим, какие результаты мы получим.

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

Заключение

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

Следующие шаги

Улучшения Subreddit Predictive Keyboard

Чтобы создать лучшую модель, мы должны закончить обучение нашей нейронной языковой модели встраивания слов, потратив больше ресурсов и времени. Затем мы объединим нашу модель языка символов и модель встраивания слов, чтобы создать клавиатуру с автозаполнением, которая может предугадывать текущее слово, которое вы вводите, и давать точные подсказки для слов, которые должны быть следующими, с учетом контекста слов, которые вы только что набрали. Эта модель будет больше похожа на новую функцию умного письма Gmail. Еще одно соображение для создания более точной модели - это попробовать модель seq2seq, которая использует два LSTM, один LSTM для кодирования текущего контекста и второй LSTM для декодирования этой последовательности и генерации прогнозов с учетом весов кодировщика. В блоге Google по искусственному интеллекту мы обнаружили, что Google рассматривает возможность использования модели seq2seq, но ее производительность была слишком низкой. Однако они обнаружили, что модель seq2seq имеет лучшую точность, поэтому мы также можем рассмотреть возможность использования этой модели, если наша точность для модели нейронного языка встраивания слов недостаточна. Вычислительная сложность обучения этой модели seq2seq выше, чем обучение модели нейронного языка со встраиванием слов, поэтому на практике это, вероятно, невозможно.

Предиктор голосов за

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

Комбинирование моделей

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