Рекомендательные системы с нуля, чат-боты и многое другое
Погрузившись в пучину текстовых данных, в октябре этого года мы обучили модели ruGPT-3 — модели для русского языка на основе архитектуры от OpenAI. Но на что же способны эти модели? В этой статье мы соберем первые примеры применения модели — и попробуем новые.
Мы представляем первые результаты самой большой из обученных моделей — ruGPT-3 Large, разработанной совместно с командами SberDevices, Sber.AI и SberCloud. Изучим границы ее применения вместе с вами.
В этом году на AI Journey мы подготовили соревнование применений ruGPT-3 — в трек можно сдать любое решение с использованием модели, оцениваемое по трем шкалам — инновационность, эмоциональное вовлечение и бизнес-применимость.
Спойлер:
1 млн рублей за первое место
Как дообучить модель на новой задаче?
Модели и код к ним находятся в репозитории 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 ноября!