̶с̶а̶м̶̶о̶изолента мёбиуса
2.42K subscribers
13 photos
2 videos
1 file
190 links
Костыли и технологии для обработки естественных языков. Обзоры статей и личный опыт. by @cointegrated
Download Telegram
Forwarded from Матчасть
8. Авторы статьи умнички и самостоятельно находят косяки в своём чатботе. Самый неприятный из них - это, кажется, забывчивость, например, когда бот снова и снова задаёт один и тот же вопрос. Другая особенность бота - что он уворачивается от углубления в любой разговор, предлагая сменить тему. Что предлагает тему - это хорошо, но что уклоняется от ответов - не очень. И ещё одно слегка бесящее свойство этого и других ботов - когда у них нет фактического ответа, они не сознаются в этом, а выдумывают его.
9. Авторы статьи справедливо замечают, что качество человеческой оценки бота не определяется его перплексией на тестовых диалогах, ибо и тестовые диалоги могут быть разные, и для одной и той же модели разные алгоритмы декодирования дают разное качество.

Итак, Гугл свой чатботный ход сделал зимой, Фейсбук - весной. Ждём, кто выступит следующий (:
#ботоводство
Продолжаю работать над @the_watchman_bot - поправил в нём приветственное сообщение и пунктуацию в болталке.
Ещё провёл эксперимент: разослал сегодня всем-всем злободневный вопрос про карантин. Надеялся, что отклик будет повышенный, но по факту нет.
Посмотрел, сколько лайков-дизлайков поставили за месяц с их внедрения, и оказалось, что уже почти тысячу. Это вполне можно использовать для настройки рекомендательной системы.
Впилил пока что примитивного "бандита": вопросы с высоким профицитом лайков над дизлайками показываются чаще, но не слишком, чтобы всех не заспамить.
Посмотрим, отразится ли это как-нибудь на метриках.
#ботоводство
Сегодня внезапно мой костыльный навык "Искатель навыков" репостнули как "навык среды" в канале "Около Яндекс.Станции" @yandexdb
Пришлось срочно лезть читать его логи и закрывать самые большие косяки, пока пользователей не набежало.
Чуть улучшил регулярками NLU, добавил перелистывание страниц поиска.
В ближайшие дни буду ещё собирать логи и улучшать.
̶с̶а̶м̶̶о̶изолента мёбиуса
#ботоводство По ботам: научился сохранять аватарки юзеров из телеграма. Должно помочь автоматически составлять пиплбуки из приветствий.
#Ботоводство
Вернулся к пиплботу и за последние два дня добавил туда базовую функциональность бота-вахтёра: если его настроить, бот может требовать от вступающих в чатик хуизы, и заносит их тексты в пиплбук.
̶с̶а̶м̶̶о̶изолента мёбиуса
#sotanlu Пришла очередь статьи про SuperGLUE. Этот бенчмарк выкатили спустя год после GLUE, который уже дорешали до сверх-человеческого уровня. В нём 8 задач: - BoolQ: Дан абзац текста и бинарный вопрос про этот абзац (ответ "да" или "нет"), на который надо…
SuperGLUE вообще-то достоин того, чтобы разобрать его поподробнее. Пойдём прямо по порядочку.

Первая задача взята из статьи The CommitmentBank: Investigating projection in naturally occurring discourse.
Я не до конца уверен, как её правильно объяснить по-русски, но буду пытаться. В датасете даны составные высказывания, типа "Джейн не знает, что идёт снег". Конкретно это высказывание - про Джейн, но, возможно, оно и про снег тоже. Так вот надо понять, уверен ли сам автор высказывания, что снег идёт. И в общем случае: уверен ли автор в истинности определённого подчинённого предложения в рамках своего сложноподчинённого высказывания? Особенно, если это подчинённое предложение "спрятано" под оператором, не означающим логического следования - вопроса, отрицания, "может быть" или "если".

Подобными вопросами занимается довольно мутная часть лингвистики - прагматика, которая изучает контекст и цели высказываний. Рандомный факт: статья опубликована в журнале Sinn und Bedeutung, что переводится как Смысл и Значение. Мутная она, потому что плохо формализуется, но таки именно таких умений хочется от настоящего ИИ, с которым можно не просто разговаривать, а разговаривать по делу. Так что, когда/если подобные задачи алгоритмизировать всё-таки удастся, это будет означать заметный прорыв в NLP.

Датасет CommitmentBank надёрган из новостей, художественной литературы и диалогов автоматически (с помощью синтаксического парсера), почищен вручную, и отдан на разметку механическим тёркерам, которые оценивали уверенность автора в высказывании по шкале от -3 до 3. Авторы заморочились, и для каждого подчинённого предложения подготовили его парафразу, чтобы спрашивать тёркера именно про неё - и удалили вообще нафиг те высказывания, которые не удалось нормально перефразировать. Дополнительно разметили кучу информации - например, смысл кучи модальных глаголов (might, could, allowed to и т.п.), и оценка правдоподобности подчинённого предложения при условии контекста.

Дальше авторы исследуют, от чего зависит степень уверенности автора. Классическое представление - что это определяется "фактивностью" применённого оператора (примеры фактивных - "знать", "забывать", "узнавать", "помнить", и т.п., а вот "полагать", "говорить" или "решить" - не фактивные совсем). Авторы показывают (и в этом во многом цель статьи), что одной только фактивностью всё не решается. Примерно такую же роль играет, например, то, от какого лица высказывание, и в каком оно времени.

В целом, авторы надеются, что дальнейший анализ поможет разобраться, как же всё-таки выявлять степень уверенности спикеров. Я не знаю, какие в итоге explainable фичи вылезли, но вот непрозрачный T5 справляется с задачей весьма неплохо.

Что я думаю: похоже, что основная информация о степени коммитмента автора сосредоточена где-то близко на синтаксическом дереве к корню подчинённого предложения. А значит, если у нас есть хороший парсер и по уму извлечённые из него фичи, то натаскаться определять степень комитмента наверняка можно даже слабенькую модельку.
Впрочем, в истинности последнего высказывания я пока не слишком уверен 🤷‍♂️
#sotanlu
Продолжаем расковыривать SuperGLUE. Вторая задача - COPA по статье Choice of Plausible Alternatives: An Evaluation of Commonsense Causal Reasoning.
Смысл задачи - понимание причинно-следственной связи. Это опять-таки довольно зыбкое понятие, поэтому вместо типичной задачи natural language inference "следует ли второе утверждение из первого?" вопрос формулируется как "какое из двух предложений - наиболее правдоподобная причина (либо следствие) данного утверждения?". Например:
- Гости вечеринки прятались за диваном. Что больше похоже на причину этого?
- Вариант 1: это была вечеринка-сюрприз
- Вариант 2: это был день рождения
Для правильного ответа на такие вопросы нужно уметь строить "логические" цепочки, основанные на здравом смысле, типа cюрприз->секрет->прятаться.

Оригинальный датасет состоит из 1000 вопросов, которые авторы сгенерировали самостоятельно и очень заморочившись. Сначала они составили собственную карту различных предметных областей и тем, чтобы сделать датасет максимально разнообразным, потом вручную нагенерировали пары причина-следствие для каждой предметной области, стараясь основывать их на каком-то прозрачном рассуждении. Дальше самое творческое - сгенерировать негативные примеры; они должны быть структурно и тематически похожи на позитивные примеры, и возможно даже иметь какую-то связь с утверждениями - но не прямую причинно-следственную. Отдельно авторы проконтролировали язык: максимально краткие и содержательные высказывания, без сленга, зато с анафорами.

Собранный датасет прогнали на волонтёрах, и после некоторой фильтрации получили 100% точность человеков. А бейзланы (из 2011 года, основанные даже не на эмбеддингах, а на попарной совстречаемости слов) дали точность меньше 60%. Впрочем, уже BERT дал все 70%, а T5 сейчас даёт почти 95%.

Что мне кажется. Задача определения причинно-следственной связи - действительно дофига сложная, и если машины научились её решать честным образом, это очень круто. Но проверять это, наверное, нужно на adversarial примерах, потому что даже очень творческие и умные авторы, генерируя датасет, могут дать много нечаянных подсказок. История про BERT и коня по имени Умный Ганс - тому пример, и вроде как поэтому и собрали суперклей.
Возможно, имеет смысл собрать датасет с причинами и следствиями автоматически, ориентируясь на ключевики типа "потому что", и посмотреть, как справляются модели на нём. Но майнинг негативных примеров, кажется, всё равно остается черной магией.
#sotanlu
Третья задача SuperGLUE - MultiRC из статьи Looking Beyond the Surface:A Challenge Set for Reading Comprehension over Multiple Sentences.

Авторы задачи недовольны тем, что классические вопросно-ответные датасеты типа SQuAD - довольно простые, и решаются лексическим матчингом, но решения плохо обобщаются. Задача MulitRC похожа на SQuAD - в ней дан параграф и вопрос к нему с предложенными вариантами ответов. Но она специально создавалась как сложная:
- Для ответа на каждый вопрос необходимо скомбинировать информацию минимум из двух предложений входного текста;
- Вместе с вопросом есть предложенные ответы, но сколько из них верные - заранее неизвестно. То есть решение надо принимать для каждого варианта ответа по-отдельности;
- Верный ответ не обязательно является подстрокой текста, а может содержать различные его фрагменты или даже их парафразы;
- Тексты взяты из 7 разных доменов, так что узкоспециализированная модель такую задачу не решит.

Авторы набрали тыщу абзацев из разных корпусов, отфильтровав их по разным количественным статистикам, и посадили тёркеров сначала генерировать вопросы, потом проверять, что вопросы требуют несколько предложений для ответа, потом генерировать сами варианты ответов (включая неправильные!), потом валидировать и ответы тоже. В итоге набралось 6К "чистых" вопросов и ещё несколько тысяч отбракованных. Оказалось, что и тип вопросов достаточно разнообразен, и ответы на них требуют разных типов мышления: разрешения анафор, понимания парафраз, здравого смысла, и даже немножко разной математики.

В статье люди в итоге набрали F-скор 86% на этом датасете; простые бейзлайны - существенно меньше, но авторы презентовали их как-то неуверенно. А в рамках SuperGLUE люди набрали только 82%, а RoBERTa - уже 84%. T5 все 88%. Так что похоже, что эта задача тоже уже решена. То ли она с самого начала не была такой уж сложной, то ли для ответа на многопредложЕнные вопросы идеально подходят трансформеры с их многоголовым селф-атеншном, если их правильно готовить.
В этом смысле, кстати, прикольно было бы попробовать запустить модельку попроще, но где при этом каждое слово так же "видит" каждое. Я не удивлюсь, если секрет успеха именно в этом.
#sotanlu
#ботоводство добавил в пиплбота команду /all, по которой он может тегнуть всех известных ему участников чата
#sotanlu разбираем SuperGLUE дальше, с задачей WiC: the Word-in-Context Dataset for Evaluating Context-Sensitive Meaning Representations.
Это первый датасет в подобном формате: дана пара предложений с общим словом, и надо определить, употреблено ли это слово в одном смысле, или в разных. Все предложения и смыслы были надёрганы из WordNet (там это примеры словоупотреблений) и пары других подобных тезаурусов. Пары предложений были пофильтрованы так, чтобы негативные смыслы не были слишком похожи друг на друга (не было соседями в wordNetовской таксономии), и ещё немножко пофильтрованы вручную.

Тёркеры показали согласованность 80% с получившейся разметкой и друг с другом. Классификатор, разделяющий пары слов по косинусному расстоянию между контекстными эмбеддингами из BERT, дал точность 65%. Ни один другой бейзлайн не дотянул даже до 60%. Поэтому задачу признали сложной и взяли в SuperGLUE, но T5 уже сейчас даёт 77% на ней.

В целом, кажется, что файн-тюнинг T5 для такой задачи - овершут, а вот self-supervised контекстные словные эмбеддинги типа BERT на таком датасете мерять очень клёво. Интересно, что нужно сделать с BERT'ом, чтобы он научился воссоздавать WordNet - и возможно ли это вообще?
#ботоводство
После нескольких дней простоя закодил вчера и выкатил сегодня в пиплбота обновлённый поиск людей по профайлам - теперь он доступен для всех сообществ.
#sotanlu
Ещё одна задача из SuperGLUE зовётся BoolQ: Exploring the Surprising Difficulty of Natural Yes/No Questions.

Основная её клёвость в том, что вопросы действительно "естественные": это реальные запросы реальных людей в гугл. А значит, задача супер прикладная. Авторы датасета пофильтровали запросы тёркерами по "да-нетности" и по хорошести (вопрос понятен и на него можно дать ответ, основанный на фактах), подтянули к вопросам релевантные абзацы из Википедии, и оставили только те вопросы, для ответа на которые достаточно такого абзаца. Оказалось, что вопросы в целом сложненькие, в них куча именованных сущностей и неочевидных логических ходов.

Авторы попробовали сделать transfer learning, дообучая на своём датасете модельки, натасканные на reading comprehension или natural language inference. Удивительно, но RC-подобные задачи типа SQuAD оказались не особо релевантными, а вот задачи на определение entailment - вполне. Моделька, предобученная только на MultiNLI, после файн-тюнинга дала точность 75.5%, тогда как BERT - 77%. А если уменьшить обучающую выборку для файн-тюнинга, то модель, предобученная на MultiNLI, справляется даже заметно лучше берта. Возможно, говорят авторы, это потому, что в MultiNLI есть примеры противоречий.

Для справки, люди справились с этой задачей на 89%, а бейзлайн "всегда говори да" дал точность 62%. T5 сейчас решает её на 91.5%, так что уже и эту задачу можно считать "хакнутой". Но из множества других задач SuperGLUE мне она как-то особенно симпатично - видимо, как раз в силу своей простоты и "натуральности".
#sotanlu послушал умных людей, почитал прошлогоднюю статью про mixout.
Это такая специальная регуляризация для файн-тюнинга моделей, когда в каждом батче некоторые случайно выбранные нейроны дообучаемой модели заменяются на старые. По аналогии с дропаутом, где они бы просто занулялись.
Авторы математически доказывают, что обе эти регуляризации, как и weight decay, примерно эквивалентны L2-штрафу за отдаление новых параметров от старых, и экспериментально показывают, что для файн-тюнинга BERT на GLUE mixout работает лучше аналогичного dropoutа. В принципе, очень понятно, почему так.
Простенький код для pytorch к статье прилагается)
#sotanlu ещё один датасет из SuperGLUE - ReCoRD, то бишь Reading Comprehension with Commonsense Reasoning Dataset
Этот датасет придумывался как сложная задача на понимание текстов. Решаемая боль была в том, что многие подобные задачи, типа SQuAD - довольно простые, и для их решения достаточно не очень сложных когнитивных навыков, типа детекции парафраз.

Выглядит задача так: дан новостной текст и одно предложение после него, и в этом предложении одна именованная сущность пропущена. Нужно понять, какой из сущностей, упомянутых в тексте, этот пропуск уместнее всего заполнить.

Тройки (текст, фраза, правильный ответ) были намайнены автоматически из новостных корпусов и отфильтрованы простыми правилами. То, что осталось, авторы пофильтровали моделькой типа Stochastic Answer Networks (текст и вопрос к нему энкодятся, вопрос с помощью атеншна подтягивается к тексту, и дальше для каждого токена текста предсказывается вероятность того, что на нем начинается или заканчивается верный ответ, и всё это с кучей дропаута). Оставили только треть троек, с которыми нейросетка не справилась, и из них отобрали ту половину, с которой справился хотя бы один адекватный тёркер. В результате осталось 100 тысяч обучающих троек, и 20 тысяч дополнительно провалидированных тестовых.

Авторы разметили часть заданий по тому, какой тип мышления нужен для получения ответа - в 3/4 случаев это "здравый смысл", который в свою очередь в основном сводится к работе с понятиями, пониманию причинно-следственных связей, и базовой психологии.

Люди корректно решили 91% задач, случайный выбор и простые языковые модели - 19%, а модель DocQA с ELMO-векторами (BERT'а тогда ещё не было), наилучшая из попробованных - 45%. После чего датасет рекомендовали как сложный. BERT впоследствии решил эту задачу на 72%, RoBERTa - на 84%, а T5 уже на 94%, обогнав кожаных мешков.

Чё, клёво.
Довольно прикольную модель для редактирования текстов, LaserTagger предложили зимой ребята из Гугла.
Чего хочется: быстро и дёшево и на маленьких выборках обучать модели для решения несложных seq2seq-задач.

В чём идея: во многих seq2seq задачках выход очень похож на вход: суммаризация (даже абстрактивная), разрезание и склейка предложений, исправление грамматических ошибок. А раз так, имеет смысл не генерировать выход с нуля, а получить его из входа путём вставок и удалений токенов. Решения можно принимать отдельно для каждого токена входа: оставлять его или удалять, вставлять ли перед ним текст, и если да, то какой. То есть архитектурно получается задачка, эквивалентная NER или POS-теггингу, для которых языковые модели хорошо файн-тюнятся даже на маленьких выборках. И хотя теоретически вставка может быть какой угодно, на практике словарём из 500 слов или коротких фраз можно покрыть 80-90% необходимых вставок.

То есть рецепт такой:
- берёшь seq2seq задачу
- строишь выравнивание input'а c output'ом, определяя необходимые вставки или удаления
- выкидываешь все редкие вставки, оставляя небольшой словарь
- при желании, можно ввести собственные операции редактирования, например, замену сущностей на подходящие местоимения
- файн-тюнишь BERT на по-токенное предсказание всех этих операций
- при желании, поверх BERT можно прилепить рекуррентный декодер, чтобы последующие правки явно зависели от предыдущих

В чём профит: в силу своей простоты по сравнению с полноценным seq2seq, такая моделька заводится даже на небольшой обучающей выборке (сотни и тысячи примеров), и, например, на 6К примерах для суммаризации уделывает бейзлайны с большим отрывом. А ещё, такая моделька, в отличие от seq2seq, не склонна выдумывать несуществующие слова или по многу раз повторять имеющиеся, и менее склонна галлюцинировать несуществующие факты. Ну и ещё такая моделька очень быстрая.

Мораль: большие и сложные модели - это хорошо, но маленькие и экономные модели - это ещё лучше. Ну и вообще, кажется, лень - это полезное для компьютерного лингвиста качество.
Рассказал на Диалоге про своё участие в дорожке по обогащению таксономии.
С одной стороны, стыдненько, что моё решение такое примитивное, по сравнению с некоторыми другими докладами.
С другой стороны, очень рад, что в эту тусовку вообще ворвался. К следующей конфе подготовлю что-нибудь уже действительно вкусное)
В последние два месяца я как-то выпал из айтишно-nlpшно-диалоговой жизни. Возвращаюсь.
Посмотрел воркшоп Витальца по разрабоке навыков Алисы с нуля на Node. Видос. Код.
Мне понравилось, насколько он чётко разложил всё по полочкам:
- работаем в докере, ничего не меняя на самой машине. Сначала ничего не деплоим, тестируемся через ngrok. Удобно.
- используются только две внешних зависимости, micro и nodemon - запуск и перезапуск http сервера
- выход на минимально работающий навык максимально быстро
- на втором этапе - обзор вау-эффектов
- вся разработка оооочень маленькими шагами
- по архитектуре: вся бизнес-логика в центре, оттуда вызываются функции для отдельных вью. Кажется, это довольно гибко.
- теория - в начале и в конце. Сложное посерединочке. Слушателям комфортно.
Ставлю Виталию большой лайк. Если/когда буду делать свой воркшоп по Алисе, обязательно возьму его на заметку.
Как посмотреть, кто забил все gpu на коммунтальном сервере и не использует: watch -c gpustat -cp --color
(предварительно pip install gpustat)
Недавно понадобился корпус plain text русского языка.
Мне хвалили Тайгу, но она по умолчанию лежит в conllu формате, т.е. с кучей синтаксической разметки. Я переупаковал архив, оставив только текст; можно пользоваться.
Сейчас, впрочем, это уже не так актуально, т.к. rusvectores выложили в открытый доступ НКРЯ, который раньше был закрытым. Впрочем, Тайга всё равно больше и прикольнее)
Одна из особенностей естественного языка, важная для разработки чатботов, это эллипсис, то есть пропуск слов, понятных из контекста. В частности, люди любят отвечать на вопросы "эхом": там, где ожидается ответ "да/нет", человек повторяет слово из вопроса. Например, так:

Бот: Нашла в каталоге торт "Маракуйя", добавить его в корзину?
Юзер: Добавь.

Очевидно, что тут интент пользователя - подтверждение. Забавно, что этот интент может выражаться какими угодно словами, но только если они соответствуют контексту.
Если вы разрабатываете нечто диалоговое, вам полезно заранее добавить такой интент или диалоговый акт. Конечно, разработчик может и сам правило написать. Но удобно, когда это сделано один раз и придумывать больше не надо)
Клёвая статья Reformulating Unsupervised Style Transfer as Paraphrase Generation (https://arxiv.org/abs/2010.05700)
Решаемая задача: научиться менять стиль предложения на заранее заданный, не меняя при этом его смысл.
Решение: обучить этому seq2seq-модель. В самой идее нет ничего нового, вопрос только, откуда брать пары предложений для обучения с одинаковым смыслом и нужным стилем.

Авторы предлагают идею, аналогичную back-translation в переводе:
0) Обучить seq2seq модель для перефразирования, не ориентируясь на стиль, но стараясь максимизировать разнообразие парафраз. Для этого датасеты найти не особо сложно.
1) Взять корпус А в нужном стиле, прогнать его через этот парафразер и получить корпус А', в котором фразы будут (предположительно) совпадать со фразами из А по смыслу, но не обязательно по стилю.
2) Обучить ещё одну seq2seq модель восстанавливать фразы из A по фразам из A', приводя их, таким образом, к нужному стилю.

В результате авторы обогнали SOTA на задачах имитирования Шекспира и изменения формальности текста. Что приятно, модель довольно простая и при этом выразительная. И если файн-тюнить уже имеющийся хороший парафразер, то и качество переноса стиля можно получить весьма пристойное.

А ещё они собрали большой датасет, на котором потенциально можно бенчмаркать свои собственные модельки для переноса стиля.