Порой люди обращаются к искусственному интеллекту не для того, чтобы заказать еду, найти подходящий фильм или решить какую-то ещё свою задачу, а для того, чтобы просто поболтать. Например, потому что грустно, а рядом нет тех, с кем было бы удобно про это поговорить. И пусть виртуальные помощники пока не заменяют настоящих друзей или близких людей (они и не должны), но всё же они могут поднять настроение, помочь снизить уровень напряжения. Чтобы такое общение было живым и действительно интересным, мы разработали и применяем мощные разговорные модели на русском языке для виртуальных ассистентов Салют в режиме «Собеседник». Так, за Сбера с пользователем общается SBERT (retrieval-модель), за Джой — ruGPT-3 (генеративная модель), а за Афину — обе сразу! Поговорим сегодня о генеративной части.
Передаю слово моему коллеге, руководителю RnD NLP SberDevices Валерию Терновскому.
Модели «болтовни» могут быть устроены по-разному. Например, самые первые чат-боты (их история ведётся примерно с 60-х годов прошлого века) работали на сценарных движках: если пользователь говорил одно, бот должен был ответить соответствующим образом, если что-то другое — другим.
На следующем шаге пользователь перемещался на другую сценарную развилку, и так далее. Сценарные движки (в том числе для одношаговых сценариев, когда ассистент просто выдаёт заготовленный ответ) используются в диалоговых ассистентах и сейчас. В нашем Салюте такой движок помимо традиционных ответов на частые вопросы типа «привет», «как дела», «сколько тебе лет» умеет, например, рекомендовать кино. Достаточно сказать «Салют, посоветуй мне фильм» — ассистент задаст вам ряд вопросов и, учтя ответы на них, порекомендует кино.
Тем не менее, невозможно предусмотреть все развилки в диалоге. Поэтому помимо заранее отлаженных и проверенных сценариев, в дело часто вступают диалоговые модели. Они, в свою очередь, бывают двух типов:
retrieval-модель ищет подходящий по контексту ответ среди миллионов фраз, заранее подготовленных или отобранных редакторами. Ответ всегда будет какой-либо фразой из этого огромного банка;
-
генеративная модель самостоятельно генерирует ответы, а не выдаёт готовые. Она берет на вход контекст, дальше совершается определённая магия (которую мы, на правах волшебников, детально расписываем ниже), и генерируется ответная фраза. Какая именно — предсказать заранее практически невозможно.
Вот об этом давайте и поговорим.
Генеративная «болталка»
Мы хотим, чтобы ассистенты Салют стали действительно эмпатичными собеседниками, а диалог с ними был по-настоящему живым и в хорошем смысле неожиданным — как это бывает при общении людей друг с другом. Поэтому мы не могли ограничиться базой заготовленных редакторских ответов (хотя без них, конечно, тоже никуда, ведь они определяют характер того или иного персонажа). Начать решили с Джой и Афины (для этого персонажа прямо сейчас эксперимент с генеративной моделью раскатан на 50% пользователей). Запустить режим «болталки» можно фразой «Давай поболтаем». На время работы этого режима другие навыки отключаются, а чтобы из него выйти, достаточно сказать «Хватит».
Как обучали
В основе диалоговой модели лежит известная в мировом и русскоязычном NLP-сообществе архитектура ruGPT-3, про обучение которой мы уже писали тут.
Идейно диалоговая модель не особенно отличается от стандартной языковой — всё так же это авторегрессионная модель, в которой используются только decoder-блоки трансформера, генерируется токен за токеном слева направо.
За основу диалоговой модели, таким образом, мы взяли собственную ruGPT-3, предобученную на большом корпусе преимущественно русскоязычных текстов. Для доведения этой языковой модели до состояния диалоговой нам пришлось провести модификации в архитектуре модели, создать специальные датасеты и применить некоторые трюки при её обучении.
Архитектурные изменения, которые мы внесли в ruGPT-3, довольно хорошо описываются картинкой от авторов Hugging Face — мы добавили дополнительную «голову» модели, заточенную под классификацию истинной диалоговой реплики от «отвлекающей», не связанной с предыдущим контекстом, просто неудачной, нерелевантной или даже оскорбительной.
Диалоговый датасет разбивается на последовательность наборов «контекст-истинная реплика-отвлекающая реплика (N штук)» с кумулятивно нарастающим контекстом в течение каждого диалога. В ходе экспериментов мы выяснили, что качество диалоговой модели напрямую зависит от качества этого диалогового датасета, на котором мы обучаем её ведению беседы с пользователем. Можно сказать, что очень быстро (что, вообще говоря, нетипично для больших трансформерных моделей) качество данных становится важнее количества.
Процесс создания диалогового набора данных контролируется командой редакции. С их помощью мы управляем коммуникативными приёмами, конкретными фразами и стилем ответов генеративной модели, а также добавляем различные коммуникативные ситуации в датасет для дообучения. Это позволяет в некотором смысле управлять поведением модели в таких же или семантически схожих ситуациях.
Интересный трюк мы используем для формирования «отвлекающих» реплик. Наивный вариант здесь — использование случайных реплик из случайно взятого диалога, но эксперименты показали, что генерация таких реплик самой моделью с выкрученными параметрами генерации (сдвинутыми в сторону более неожиданных ответов за счёт Nucleus Sampling) позволяет ИИ-собеседнику лучше отделять качественные редакторские реплики от зачастую нерелевантных модельных ответов.
Суммируя полученные нами знания об эффективности различных режимов дообучения, можно сказать, что мы по сути переобучаем нашу модель на целевой набор данных с точки зрения перплексии. Это позволяет добиться хорошего соответствия стиля ответов в практически любом контексте. К примеру, модель чрезвычайно трудно заставить ругаться или генерировать токсичные ответы.
Также очень важным оказывается эмпирический подбор параметров обучения — это сильно влияет на учитываемый моделью контекст, способность переключаться с темы на тему и в целом следить за нитью текущего диалога. Мы подбирали параметры путём многократных запусков и отслеживания динамики значений функции потерь и целевых метрик.
Ниже — некоторые из таких параметров со значениями:
Parent LM:
только LM голова нейросети
180 Гб RU данных (книги, вики, новости)
Adam, lr = 0,00015, linear decay
≈ 5 epochs
≈ 200k steps
perplexity ≈ 12 (validation set)
Dialogue LM:
2 головы: LM + NSP
0,5 Гб диалогов (вместе с кандидатами для NSP)
NovoGrad, lr = 0,015, linear decay
20 epochs
≈ 10k steps
perplexity ≈ 5 (dialogues set)
lm_loss vs. mc_loss (2 к 1)
Число кандидатов для NSP (4)
Generative Negative Sampling
Длина контекста — глобальное ограничение в 1024 токена (как у родительской модели), но не более 128 токенов на реплику у диалоговой, смотрим на последние 8 реплик.
Ещё пара важных моментов, связанных с тонкой настройкой параметров генерации для диалоговой модели. Во-первых, генеративные модели известны проблемой зацикливания и повторения токенов — важно использовать один из методов коррекции такого поведения, мы применяем подход от авторов статьи CTRL (penalize repetitions). Во-вторых, нужно найти баланс между относительно скучным, но, скорее, корректным ответом и более весёлым и смешным, но с большей вероятностью фантастическим ответом:
Nucleus Sampling
top_p = 0,8—0,95 (отбор наиболее вероятных токенов);
temperature = 0,8—1,2 (чем выше температура, тем более «агрессивны» ответы модели).
Либо стоит использовать жадную генерацию каждого токена (top-1).
Нельзя не сказать про ещё один интересный трюк — ранжирование реплик-ответов модели при генерации ответа на запрос.
В ходе экспериментов у нас появилась гипотеза, что использование Nucleus Sampling, с одной стороны, добавляет модели вариативности и некоторой неожиданности ответов, что хорошо с развлекательной точки зрения, но в то же время отдельно взятый ответ, сгенерированный таким образом, вполне может оказаться не совсем удачным, или совсем не удачным. Тогда логично было бы генерировать не одну реплику-ответ, а сразу несколько, скажем, 10, после чего ранжировать их отдельной небольшой нейросетью, выбирая наиболее удачную реплику из 10. Разумеется, для обучения такой ранжирующей нейросети нужен отдельный размеченный датасет, в котором «плохие» и «хорошие» реплики были бы разделимы.
Собрав такой датасет и обучив модель-ранжировщик, мы повысили нашу метрику SSA примерно на 10 процентных пунктов. Кстати, в качестве ранжировщика можно и не обучать отдельную модель, а взять ту самую NSP-голову, которая является частью нашей общей архитектуры генеративной модели. Влияние любого ранжировщика на целевые метрики очень значительное — рекомендуем :)
Ещё про метрики
Очень важный процесс при работе с диалоговыми моделями — процесс валидации таких моделей. Очевидно, что метрика, которую можно посчитать автоматически, например, перплексия, необязательно скоррелирована с реальным качеством ведения диалога, так как она отражает просто вероятность некоторого набора данных, пусть даже и диалоговых, с точки зрения модели. Поэтому, в своём процессе мы используем двойную систему метрик: одна половина связана с сугубо модельным качеством, а вторая – с конкретными продуктовыми результатами.
-
SSA (Sensibility Specificity Average) [Google Meena]
Оценка абсолютная, без проблем могут сравниваться модели разных поколений между собой.
Оценка относительно трудная для разметчиков.
Интерпретация результатов не всегда очевидная.
-
ACUTE-eval [Facebook BlenderBot]
Оценка относительная, попарные сравнения.
Простая разметка.
Можно использовать Bot-Bot диалоги для прокси-оценки.
К примеру, в статье о Google’s Meena авторы показывают абсолютные числа SSA в 72% для «базовой» системы Meena и в 79% для оптимизированной версии. В этом же контексте интересно посмотреть на попарное сравнение ACUTE-eval первой продакшн-версии генеративной модели и текущей лучшей версии — показатель 25:75 явно демонстрирует позитивные улучшения в качестве диалоговой системы.
В нашем случае начальная продакшен-версия генеративной модели имела SSA ~ 45%, текущая лучшая модель показывает 65%. Важно отметить, что методология замеров у коллег из Google и у нас несколько отличается, несмотря на общий подход, но отслеживать динамику всегда очень важно.
Модельные метрики, безусловно, важны, но они не всегда могут напрямую коррелировать с итоговыми результатами в бизнес-среде, поэтому важным этапом для нас явилась возможность тестировать разные версии моделей в боевых условиях, проводя A/B-тесты на продакшн-среде и вычисляя непосредственно продуктовые метрики по разным поколениям моделей или даже по небольшим вариациям параметров генерации.
Продуктовые метрики, на которые мы смотрим, традиционны: retention, средняя длина диалоговой сессии, MAU и т. д. За последние полгода количество пользователей, общающихся с генеративной моделью, выросло в четыре раза, а количество сессий общения — в три. Рекордные непрерывные сессии беседы с генеративной моделью на данный момент состоят из 110—130 сообщений и длятся от 14 до 24 минут.
Несколько полезных советов
В качестве выводов приводим небольшой сборник советов по обучению генеративных разговорных моделей:
с определённого момента единый стиль и качество ответов важнее, чем количество диалогов;
сухие фактоидные «диалоги» не всегда улучшают е2е-качество;
экспериментируйте с архитектурой модели и с режимами тренировки — способы работы с контекстом и конкретные параметры обучения сильно влияют на итоговое качество;
внимательно подбирайте целевые метрики и анализируйте диалоги;
тщательно выбирайте параметры генерации — topp, topk, temp, rep_penalty, {beam search};
используйте ранжировщик над несколькими репликами-ответами для повышения качества.
Что дальше
Сейчас, после того, как концептуальная архитектура обучения модели и методы генерации отобраны, а многие параметры оптимизированы, «низко висящих фруктов» для существенного повышения метрик остаётся не так много, поэтому мы фокусируемся на поиске дополнительных возможностей улучшения качества диалоговых моделей.
Некоторые из наиболее важных направлений, в которых ведём исследования:
Offline Reinforcement Learning — логов общения с реальными пользователями становится всё больше и, очевидно, их эффективное использование может стать настоящей золотой жилой для диалоговой модели. У нас есть первые успехи в использовании подхода, описанного в этой статье. Мы продолжаем эксперименты, в том числе по мотивам этого свежего материала: https://sites.google.com/view/mend-editing.
Анализ альтернативных архитектур, в частности, ruT5, которая уже показывает себя лучше, чем ruGPT-3 по некоторым метрикам.
Поиск оптимальной комбинации аугментаций фраз-запросов в диалоговом датасете — важно приближать текстовый домен к целевому домену использования, в нашем случае — голосовому вводу. Мы активно экспериментируем с TTS-ASR-режимом аугментации данных и разными другими техниками.
Узнать ещё больше о технических деталях тренировки генеративных диалоговых моделей и о собранных нами шишках можно тут. Или же смотрите записи наших выступлений на недавней Artificial Intelligence Journey 2021 (когда они появятся на сайте) — там мы тоже рассказывали много всего интересного, в том числе и про нашу генеративную болталку.
P.S. Благодарю за помощь в подготовке поста @Andriljo.
***
Приглашаем вас поболтать с нашими виртуальными ассистентами, запустив Собеседника фразой «Давай поболтаем». Джой будет общаться с вами на основе генеративной модели, Сбер — на основе retrieval, а Афина — как повезёт. Попробуйте сравнить и пишите в комментариях, что понравилось, а чего, возможно, не хватило.
А мы пока поработаем над историями про retrieval-часть нашего Собеседника и другие решения в этом продукте.
P. S. Семейство виртуальных ассистентов Салют живёт в умных устройствах Sber, в телевизорах с Салют ТВ, а также в мобильных приложениях Салют и СберБанк Онлайн.
GospodinKolhoznik
В упор не вижу жилетку на Ричарде Гире.
Christina29 Автор
И правда – в том примере Гир был в костюме-двойке! Спасибо за внимательность. Заменили иллюстрацию, чтобы никого не смущало. С виртуальным ассистентом тоже поговорим)