Рекомендательные системы с нуля, чат-боты и многое другое
Погрузившись в пучину текстовых данных, в октябре этого года мы обучили модели 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 с легкой руки [Гверна Бренуэна] (http://personeltest.ru/aways/www.gwern.net/GPT-3#prompts-as-programming) мы даже ничего не дообучаем, а сразу пытаемся получить из модели то, что хотим.
Как работает затравочное программирование?
Дообучать большие модели бывает очень дорого, поэтому такой способ общения с ними позволяет избежать даже этого. Суть затравочного программирования в том, чтобы подобрать такие заготовленные примеры и начала для генерации, чтобы дальше модель выдавала ровно то, что надо.
Подбирая затравки и гиперпараметры генератора (температура, 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](http://personeltest.ru/aways/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 #Microsofts 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: Договор оформлен на Уральского, телефон 7661669, у меня к
вам следующий вопрос: а вот скажите мне пожалуйста, что, когда
теперь заканчивается сессия, что, теперь, это теперь будут разрывы
при моём тарифе, да?
User1: Данная тарификация установлена с 1 сентября. Как только
будут разрывы в телефонной связи, оператор будет сразу обращаться к
вашему оператору, чтобы узнать с вами ли вы.
User2: Я так понимаю, что, да, то есть я что-то потерял в связи с
этим?
User1: Да, поскольку с 1 сентября меняется тарифная сетка. То есть,
до этого были какие-то перебои с доступом в интернет, на некоторых
серверах было около месяца, что это было связано с перебоями в
телекоме, вот это всё. Но не более того.
User2: Я специально проверял, там было просто кратковременные
задержки, были, я бы сказал, какие-то незначительные.
User1: Да.
User2: То есть, ничего не потеряли?
User1: Ну как, надо немножко потерпеть, потерпеть.
User2: Спасибо, Дмитрий, до встречи.
В общем, надо потерпеть. Модель даже запомнила, что User1 зовут Дмитрий, и User2 соответствующе с ним попрощался.
Вместо заключения
Чтобы продолжать развивать направление генеративных моделей и улучшать архитектуры в задачах NLP, всегда необходимо понимать границы применимости той или иной технологии и ее востребованность.
Сейчас с каждым выходом подобных архитектур Reformer, Longformer, BigBird и т.д. мы смотрим на большие предобученные модели немного по-новому, ставя перед ними новые задачи.
Помимо вышеупомянутых кейсов, ruGPT-3 точно может применяться и приносить пользу в таких практиках, как:
- аугментация текстовых данных для задач ML
- диалоговые модели для автоматизации
- задачи генеративной суммаризации
- рерайтинг, генерация новостей, спортивных заметок по структурированной информации.
Надеемся, что демо и модели принесут сообществу пользу и фан!
И, конечно, ждем ваших решений на треке ruGPT-3 до конца 22 ноября!