Как Мы Анализируем Предпочтения Пользователей Виртуальных Помощников Салют

Поздравления всем! Меня зовут Ибрагим, я работаю в SberDevices и занимаюсь машинным обучением.

Сегодня я расскажу о том, как мы находим и анализируем интересы и предпочтения пользователей наших виртуальных помощников Салют. Также поделюсь видео с моего недавнего выступления на онлайн-конференции «Использование ML в цифровых продуктах», которую провели коллеги из AGIMA и Epoch8. В этом посте мы рассмотрим следующее:

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


Введение

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

Такие задачи имеют несколько особенностей:

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

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

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



Как мы используем BERT для решения задач NLU

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

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

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

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

По доброй традиции, языковые модели, основанные на трансформаторы иногда называемые Маппетами, персонажами «Улицы Сезам».

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



Как мы анализируем предпочтения пользователей виртуальных помощников Салют

BERT можно использовать для решения различных задач.

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

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

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

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

То есть это модель, которая переводит слова и предложения в их векторы.

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

Мы называем их аннотаторы , их более двух десятков.



Как мы анализируем предпочтения пользователей виртуальных помощников Салют

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

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

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

В предложении «Я люблю слушать Меладзе».

Меладзе будет именной личностью – это фамилия исполнителя.

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

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



Находим первичные данные для нашей задачи

Перейдем непосредственно к нашей задаче.

Определение интересов и предпочтений пользователя на основе диалогов с виртуальным помощником — стандартная задача.

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

В разговорной сфере подобные задачи часто таят в себе определенные подводные камни.

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

В этом случае 99% всех журналов общения будут отнесены к классу, который можно назвать «Другое» или «Нейтральное» — это все, что не имеет отношения к вашей задаче.

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

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

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

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



Как мы анализируем предпочтения пользователей виртуальных помощников Салют

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

Мы тоже использовали этот метод. Помните, когда вы были ребенком, в журналах были разделы, где люди искали друзей по переписке? Они написали: «Привет, меня зовут Ибрагим, я слушаю Blink-182, катаюсь на скейтборде.

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

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



Обогащение набора данных пересказами

Отлично, у нас есть первичный набор данных.

Теперь нам нужно его как-то обогатить.

Когда, с одной стороны, у вас есть размеченный, но небольшой набор данных, а с другой — неразмеченный, но очень большой, вы можете использовать следующий метод:

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



Как мы анализируем предпочтения пользователей виртуальных помощников Салют

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

Что это значит? Это означает, что предложения, схожие по смыслу или по какому-либо другому признаку, скорее всего, будут расположены рядом.

Например, предложения «Мне нравится группа Metallica».

и «Я люблю слушать тяжелую музыку».

будут расположены где-то рядом друг с другом.

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

Такие предложения называются перефразирует .

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

Для этого вы можете использовать библиотеки ФАИСС из Фейсбука, СканНН от Google или других и находите парафразы с определенным порогом расстояния.

Таким образом, вы можете обогатить исходный набор данных.

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



Получаем полезную часть большого набора данных

Отлично, мы получили набор данных из пары тысяч предложений.

Что мы можем теперь сделать? Для начала обучите простой бинарный классификатор — модель, которая будет делить предлагаемые ей выборки на два класса.

Первый содержит фразы о каких-то предпочтениях.

Второе — любые другие классы.

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

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



Как мы анализируем предпочтения пользователей виртуальных помощников Салют

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

Теперь нам нужно создать задачу разметки.

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

Но сначала хорошо бы заняться кластеризацией.

Что это?

Кластеризация данных для определения возможных будущих классов

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

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

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

А затем сгруппировать полученные векторы с помощью алгоритма уменьшенной размерности.

HDBSCAN .

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

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



Как мы анализируем предпочтения пользователей виртуальных помощников Салют

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



Немного о разметке данных

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

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

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

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

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

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

Что можно сделать в этом случае? Самое простое — попытаться перемаркировать набор данных по складкам.

Часто специалисты по обработке данных, чтобы оценить метрики конкретной модели на конкретном наборе данных, проводят тестирование на k-кратный .

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

Эта процедура повторяется k раз, метрики усредняются и получается некий средневзвешенный балл метрики.

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

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

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

Условно дайте задание: «Выберите один из двух классов: либо представленный моделью, либо маркером».

Переразбив всего 5% исходного набора данных, можно значительно улучшить его чистоту, а значит и качество работы будущей модели.

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

Google недавно анонсировал алгоритм ТракИн .

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

Таким образом, вы сможете оценить, как каждая выборка влияет на точность модели в своем классе.

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

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

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



Внедрение модели и оценка метрик

Теперь нам нужно реализовать саму модель.

Здесь мы активно используем практики МЛОпс .

Во-первых, мы активно версионируем все наши модели не только с набором данных и кодом, но и друг с другом.

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

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

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

Чем меньше вам нужно что-то делать самостоятельно, тем меньше шансов, что вы допустите ошибку на одном из этапов.

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

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

Все это необходимо измерить и оценить.



Полученные результаты

Подведем итоги.

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

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



Как мы анализируем предпочтения пользователей виртуальных помощников Салют

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

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

*** Ссылки по теме оставлю здесь:

  • быстрый о том, как мы обучали BERT и как сделали его устойчивым к перефразированию;
  • лекция мой коллега из Сберлоги о том, какие хитрости мы использовали, чтобы сделать нашу модель лучше;
  • одна из итераций Берт-большой модели для русского языка , который мы используем, имеет открытый исходный код и доступен каждому;
  • история о том, как мы с коллегами из Сбербанка обучили и выложили в открытый доступ русскоязычную модель GPT-3.
Теги: #Машинное обучение #искусственный интеллект #Обработка естественного языка #Интеллектуальный анализ данных #nlp (обработка естественного языка) #нейронные сети #глубокое обучение #виртуальные помощники фейерверки #виртуальные помощники #nlu #трансформеры #берт
Вместе с данным постом часто просматривают: