Рекомендательные системы с нуля, чат-боты и многое другое
Погрузившись в пучину текстовых данных, в октябре этого года мы обучили модели ruGPT-3 — модели для русского языка на основе архитектуры от OpenAI. Но на что же способны эти модели? В этой статье мы соберем первые примеры применения модели — и попробуем новые.
Мы представляем первые результаты самой большой из обученных моделей — ruGPT-3 Large, разработанной совместно с командами SberDevices, Sber.AI и SberCloud. Изучим границы ее применения вместе с вами.
В этом году на AI Journey мы подготовили соревнование применений ruGPT-3 — в трек можно сдать любое решение с использованием модели, оцениваемое по трем шкалам — инновационность, эмоциональное вовлечение и бизнес-применимость.
Как дообучить модель на новой задаче?
Модели и код к ним находятся в репозитории sberbank-ai: можно использовать библиотку transformers или Megatron-LM.
В этой статье я привожу примеры с использованием huggingface/transformers — код для кейсов приведены здесь:
- Fine-Tuning моделей Colab-ноутбук
- Просто генерация Colab-ноутбук
Карточки моделей в библиотеке transformers: Large Medium Small
При запуске скрипта генерации проще сделать Run all — и затем немного подождать, пока модель загрузится.
Скрипт в последней ячейке попросит ввести начало текста — моя любимая затравка: «Бразильские ученые открыли редкий вид карликовых единорогов, обитающих на западе Ютландии.» Получаем:
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
Few-Shot vs Fine Tuning
В случае с такими большими генеративными моделями, как GPT-like архитектуры, есть несколько способов «управиться» с ними.
- Первый способ: назовем его «традиционный» — дообучить модель на доступном количестве примеров выполнять конкретное задание. В таком случае генеративная модель выучит формат ввода и вывода (GPT-3 очень редко ошибается в формате), и будет генерировать данные согласно вашей задаче. Это может быть разметка данных (в формате «исходный текст → текст в разметке») или просто генерация по заданному началу.
- Второй способ: новый, называемый обычно «затравочное программирование» (англ. «prompt engineering» с легкой руки Гверна Бренуэна — мы даже ничего не дообучаем, а сразу пытаемся получить из модели то, что хотим.
Как работает затравочное программирование?
Дообучать большие модели бывает очень дорого, поэтому такой способ «общения» с ними позволяет избежать даже этого. Суть затравочного программирования в том, чтобы подобрать такие заготовленные примеры и начала для генерации, чтобы дальше модель выдавала ровно то, что надо.
Подбирая «затравки» и гиперпараметры генератора (температура, top_n, top_k), можно добиться вполне сносных ответов за счет только предварительного обучения модели.
Пример затравки с 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:
- сложный формат данных — если при генерации без обучения вы теряете качество за счет генерации в неправильном формате — задача NER, генерация кода, символьные вычисления и т.д.;
- явная необходимость отвечать согласно заданному набору знаний, правил — вы делаете QA по документации вашей компании, по учебникам, вики, без примеси социальных сетей и личного мнения;
- ваша задача, скорее всего, не представлена в текстах рунета достаточно, чтобы модель могла хорошо генерировать в ее рамках — например, генерация изображений по текстам.
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
Почему бы не потренироваться на чисто англоязычных данных: я взяла датасет «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 ноября!
Автор: Tatiana Shavrina