Рекомендательные системы с нуля, чат-боты и многое другое


Погрузившись в пучину текстовых данных, в октябре этого года мы обучили модели ruGPT-3 — модели для русского языка на основе архитектуры от OpenAI. Но на что же способны эти модели? В этой статье мы соберем первые примеры применения модели — и попробуем новые.

Мы представляем первые результаты самой большой из обученных моделей — ruGPT-3 Large, разработанной совместно с командами SberDevices, Sber.AI и SberCloud. Изучим границы ее применения вместе с вами.

image

В этом году на AI Journey мы подготовили соревнование применений ruGPT-3 — в трек можно сдать любое решение с использованием модели, оцениваемое по трем шкалам — инновационность, эмоциональное вовлечение и бизнес-применимость.

Спойлер:
1 млн рублей за первое место


Как дообучить модель на новой задаче?


Модели и код к ним находятся в репозитории sberbank-ai: можно использовать библиотку transformers или Megatron-LM.

В этой статье я привожу примеры с использованием huggingface/transformers — код для кейсов приведены здесь:


Карточки моделей в библиотеке transformers: Large Medium Small

При запуске скрипта генерации проще сделать Run all — и затем немного подождать, пока модель загрузится.

image

Скрипт в последней ячейке попросит ввести начало текста — моя любимая затравка: «Бразильские ученые открыли редкий вид карликовых единорогов, обитающих на западе Ютландии.» Получаем:

ruGPT-3 Small: Бразильские ученые открыли редкий вид карликовых единорогов, обитающих на западе Ютландии. Об этом сообщает Agence France-Presse. Единорог, получивший название Pygmaliona (лат. Pygmaliona pygmalioni), был обнаружен исследователями в ходе работ в области биологии. Его длина составляет менее 30 сантиметров, а масса — около 1 килограмма. Животное относится к семейству единороговых. В его рационе преобладают растения, в том числе и карликовые деревья.

В Colab-ноутбук помещается только ruGPT-3 Small, поэтому лучше используйте карточки с памятью больше 14Gb.

Кстати, на время соревнования мы даем участникам дорожки доступ к мощностям Christofari!
Для участников трека ruGPT-3 мы выделили 100 аккаунтов — в каждом аккаунте 1 GPU Tesla V100-SXM3 32 Gb бесплатно на время соревнования.

Как получить аккаунт?

1) Зарегистрируйтесь на трек ruGPT-3 (AI 4 Humanities) ods.ai/tracks/aij2020
2) Напишите короткое письмо с названием вашей команды и задачей на AIJ_ruGPT-3@sberbank.ru

image

Few-Shot vs Fine Tuning


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

  • Первый способ: назовем его «традиционный» — дообучить модель на доступном количестве примеров выполнять конкретное задание. В таком случае генеративная модель выучит формат ввода и вывода (GPT-3 очень редко ошибается в формате), и будет генерировать данные согласно вашей задаче. Это может быть разметка данных (в формате «исходный текст > текст в разметке») или просто генерация по заданному началу.
  • Второй способ: новый, называемый обычно «затравочное программирование» (англ. «prompt engineering» с легкой руки Гверна Бренуэна — мы даже ничего не дообучаем, а сразу пытаемся получить из модели то, что хотим.

Как работает затравочное программирование?


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

Подбирая «затравки» и гиперпараметры генератора (температура, top_n, top_k), можно добиться вполне сносных ответов за счет только предварительного обучения модели.

image

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

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

Рекомендательные системы


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

Рекомендации фильмов:

Затравка: Мои любимые фильмы — “Матрица”, “Олдбой”, “
ruGPT-3 Large: Мои любимые фильмы — “Матрица”, “Олдбой”, “Крёстный отец”, “Игра в имитацию”, “Остин Пауэрс”.
ruGPT-3 Large: Мои любимые фильмы — “Матрица”, “Олдбой”, “Спасение рядового Райана”, “Нечто”, “Затура” (последняя, кстати, стоит того, чтобы ее посмотреть).
ruGPT-3 Large: Мои любимые фильмы — “Матрица”, “Олдбой”, “Эквилибриум” и др.”

Затравка: Я люблю советские комедии: “Приключения Шурика”, “
ruGPT-3 Large: Я люблю советские комедии: “Приключения Шурика”, “Собака на сене” и “Веселые ребята”.
ruGPT-3 Large: Я люблю советские комедии: “Приключения Шурика”, “Любовь и голуби”.
ruGPT-3 Large: Я люблю советские комедии: “Приключения Шурика”, “Три плюс два”, “Служебный роман” и другие.

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

Рекомендации музыки:

Затравка: “Тем людям, кому нравится “Гражданская оборона”, также понравятся группы “ #(как обычно, специально оставляем незакрытую кавычку)
ruGPT-3 Large: Тем людям, кому нравится “Гражданская оборона”, также понравятся группы “Ленинград” и “Пикник”.
ruGPT-3 Large: Тем людям, кому нравится “Гражданская оборона”, также понравятся группы “ДДТ” и “Король и Шут”.
ruGPT-3 Large: Тем людям, кому нравится “Гражданская оборона”, также понравятся группы “Алиса”, “Доктор Пеппер”, “Машина времени”, “ДДТ” и “Крематорий”.

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

Генерация отзывов


Возьмем более сложную задачу — заставим модель мимикрировать под человека в обсуждениях или магазинах:

Затравка: “Напиши комментарий под видео.
Опять какой-то челлендж”
ruGPT-3 Large: “Напиши комментарий под видео.
Опять какой-то челлендж решили провести. Это даже не флешмоб, это уже идиотизм.”

Затравка: “Напиши отзыв о стиральной машине.
Данная модель стиральной машины”
ruGPT-3 Large: “Напиши отзыв о стиральной машине.
Данная модель стиральной машины оснащена встроенной функцией самоочистки.
В конструктивном решении стиральной машины предусмотрено устройство автоматического затирания воды, которая способна удалять накипь и прочие загрязнения даже в труднодоступных местах.
Стоит отметить, что после процедуры чистки, во время отжима появляется специфический запах. У некоторых моделей, в результате эксплуатации, он сохраняется в течение всего срока службы стиральной машины.”

Завтравка: Напиши отзыв о фильме.
Фильм "1+1"
ruGPT-3 Large: Напиши отзыв о фильме.
Фильм "1+1" — очень нравится, хотя и смотреть его стоит не каждому. Актёрский состав в нём великолепен. Смотрится без особого напряжения и с интересом. В фильме очень много смешных моментов. Так же советую посмотреть фильм "Зелёная книга", также фильм с Дженнифер Лопес и Крисом де Бургом.

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

Таких случая можно выделить 3:

  1. сложный формат данных — если при генерации без обучения вы теряете качество за счет генерации в неправильном формате — задача NER, генерация кода, символьные вычисления и т.д.;
  2. явная необходимость отвечать согласно заданному набору знаний, правил — вы делаете QA по документации вашей компании, по учебникам, вики, без примеси социальных сетей и личного мнения;
  3. ваша задача, скорее всего, не представлена в текстах рунета достаточно, чтобы модель могла хорошо генерировать в ее рамках — например, генерация изображений по текстам.

StackOverflow


Поднимем планку сложности: скачаем русский [stack overflow](https://ru.stackoverflow.com/) и попробуем сделать вопросно-ответную систему. Сможем ли мы сразу выучить и стиль ответов, и знания, и несколько языков программирования? Сразу получить хороший результат в таокй задаче нелегко, но мы можем развлечься — за 5 эпох модель научилась воспроизводить стилистику, сильно путаясь в содержании. Зато хорошо выучила ссылки на документацию — вполне неплохой итог для 5 эпох обучения.

Формат обучения: подаем тексты вопросов и лучших ответов в формате Q:”blabla” A:”blabla”.

Q: Как мне вывести список в обратном порядке в python? Я новичок
A: Простейший способ получить необходимый список: push.log("Shalom").
Установка значения означает угрозу попыткой нажатий на какую-нибудь цифру справа, поэтому я действую наоборот. Изменение размера и числа означает перегрузку времени активации
set.log()**)
rGet = puts.random(extents) log.findIndex(puts.current) void join($window, command='unsetMainServer onManager') }
Нет ничего хуже, чем полный дебаггинг

Q: Как мне вывести список в обратном порядке в python? Я новичок
A: import pycode as pyc;
// в этой статье я рассказал о месте показа списка в моей программе (подробно в статье href=https://docs.python.org/3/library/pycode.html )

(такой библиотеки на самом деле нет, модель сгенерировала ссылку на документацию)

Для таких задач можно вводить дополнительные аргументы — например, название раздела/тематики/языка программирования, про который нужно ответить, и обучать модель на данных вида {“параметр”: ”значение”, “вопрос”: ”текст_вопроса”, “ответ”: ”текст_ответа”}.

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

Пробуем другие языки! Twitter и не только


Основной язык обучения модели — русский, но можно ли применять модель в мультиязычных задачах? Чуть-чуть других языков всегда попадает в обучающую выборку из веба, поэтому надежда есть. Прямолинейный подход с затравками показывает, что про английский модель немного знает:
ruGPT-3 Large:
кошка —> cat
собака —> dog
груша —> pear
программист —> coder

Ну, почти:
кошка —> cat
собака —> dog
груша —> pear
питонист —> Python

Иногда и совсем не получается:
кошка —> cat
собака —> dog
груша —> pear
яблоко —> bunch # пошел продолжать дальше
Кошка —> dog
Хомяк —> cat
Зверёк —> dog

image

Почему бы не потренироваться на чисто англоязычных данных: я взяла датасет «twitter-text-classification» из Kaggle-соревнования.

После 5 эпох на 5 тысячах первых комментариев (20 минут в Colab) получаем вполне сносную генерацию очень даже токсичных комментариев на английском:

Context >>> Is it
ruGPT-3 Small: Is it's the case that #Microsoft is using #SAP to manage #Microsoft’s business?

Context >>> It is
ruGPT-3 Small: It is the only one that I've been trying to do. Siri is on the verge of death, and I'm not aware of why she has to be on the verge.

Context >>> Why
ruGPT-3 Small: Why do I go here? I'm wondering if I can use the #Microsoft Windows 8 Pro for the #WindowsPhone phone? Thanks!

Диалоговые системы


Уже сейчас, без предобучения, довольно хорошо работает применения модели к диалоговым системам: модель может выполнять функцию chit-chat (разговор ни о чем), свободно болтая на различные темы. С дообучением на конкретных сценариях и доменах можно реализовать и бизнес-приложения.
Пример ниже — пример диалога без обучения, на узконаправленную тему — саппорт интернет-провайдера.
Затравка: первые 2 строчки — дальше генерация.
User1: Привет, я Маша! Чем могу помочь?
User2: У меня не работает интернет.
User1: Какой у вас тариф?
User2: У меня тариф 500мбит
User1: Что случилось?
User2: Проблемы с интернетом. Т.е. с телефоном. Я сейчас отключу сеть и подключу телефон
User1: Почему Вы звоните сейчас?
User2: Потому что я зашел на оф. сайт, а там скорость какая-то маленькая...
User1: Вы говорите, что скорость маленькая, но, может быть, она и должна быть маленькой?
User2: Но я до этой скорости не дотерпел
User1: Извините, мы тут не при чем. Мы позвонили в службу поддержки и сказали, что Вы звоните на этот номер.
User2: Мы звонили, но никто не отвечал. Я попробовал еще раз.
User1: У меня не получается подключиться к интернету. У меня кабель, значит, пропадает.
User2: Прошу Вас, скажите, что у вас происходит?
User1: Почему такая скорость?
User2: Мы приносим свои извинения. Но Вы в любом случае должны внести плату за интернет и все подключить.
User1: Все оплатить?
User2: Да
User1: У меня нет сейчас такой возможности. Я предлагаю Вам прийти на нашу бесплатную горячую линию и проверить оборудование.
User1: Извините, но я сейчас не могу. Надо кое-что оплатить.
User2: Пожалуйста, я свяжусь с вами в течение дня.
User1: Да
User2: Спасибо

Конечно, без предобучения у модели нет явного представления о сценариях и скриптах специалистов поддержки, однако, даже такой холодный старт уже показывает стандартный путь «выяснить, что произошло — отболтаться — перенаправить звонок». Можно вспомнить классику:
User1: Техническая поддержка «Стрима», инженер 656, Дмитрий, здравствуйте.
User2: Договор оформлен на Уральского, телефон 766—1669, у меня к вам следующий вопрос: а вот скажите мне пожалуйста, что, когда теперь заканчивается сессия, что, теперь, это теперь будут разрывы при моём тарифе, да?
User1: Данная тарификация установлена с 1 сентября. Как только будут разрывы в телефонной связи, оператор будет сразу обращаться к вашему оператору, чтобы узнать с вами ли вы.
User2: Я так понимаю, что, да, то есть я что-то потерял в связи с этим?
User1: Да, поскольку с 1 сентября меняется тарифная сетка. То есть, до этого были какие-то перебои с доступом в интернет, на некоторых серверах было около месяца, что это было связано с перебоями в телекоме, вот это всё. Но не более того.
User2: Я специально проверял, там было просто кратковременные задержки, были, я бы сказал, какие-то незначительные.
User1: Да.
User2: То есть, ничего не потеряли?
User1: Ну как, надо немножко потерпеть, потерпеть.
User2: Спасибо, Дмитрий, до встречи.

В общем, «надо потерпеть». Модель даже запомнила, что User1 зовут Дмитрий, и User2 соответствующе с ним попрощался.

Вместо заключения


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

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

Помимо вышеупомянутых кейсов, ruGPT-3 точно может применяться и приносить пользу в таких практиках, как:

  • аугментация текстовых данных для задач ML
  • диалоговые модели для автоматизации
  • задачи генеративной суммаризации
  • рерайтинг, генерация новостей, спортивных заметок по структурированной информации.

Надеемся, что демо и модели принесут сообществу пользу — и фан!

И, конечно, ждем ваших решений на треке ruGPT-3 до конца 22 ноября!