̶с̶а̶м̶̶о̶изолента мёбиуса
2.31K subscribers
13 photos
2 videos
1 file
175 links
Костыли и технологии для обработки естественных языков. Обзоры статей и личный опыт. by @cointegrated
Download Telegram
Недавно я уверовал в NLI.
Убедила меня в этом статья Entailment as Few-Shot Learner от FAIR. Помните, я писал про задачу RTE в составе SuperGLUE, в которой надо определять, следует ли второй короткий текст из первого?
Эта задача крута тем, что для её решения нужно прям серьёзно понимать смысл текстов, поэтому, если есть довольно большой и интересный датасет, то и модель можно обучить очень умную, а потом переиспользовать для других непростых задач. Например, определять, что из текста "Хочу поехать в Австралию" следует "Это текст про путешествия". Таким образом можно классифицировать тексты с очень небольшим числом обучающих примеров, или даже вообще без них. Собственно, авторы показали, что так можно выбить SOTA на ряде задач zero-shot и few-shot классификации.

Для русского я не нашёл предобученных моделей для NLI, и поэтому дообучил свою (BERT от DeepPavlov), вот она. Я, наверное, ещё дообучу её, увеличив обучающий корпус (в основном - переводами с английского). Но с ней уже можно играться 🙃
Мой вчерашний пост про NLI получил большой отклик. В частности, в комментах указали на кучу пропущенных мною ресурсов.

Мультиязычные модели для NLI, которые могут и в русский:
- https://huggingface.co/vicgalle/xlm-roberta-large-xnli-anli
- https://huggingface.co/facebook/bart-large-mnli

Интересные датасеты по NLI (пока что все англоязычные):
- https://github.com/felipessalvatore/NLI_datasets
- https://github.com/facebookresearch/anli
- https://github.com/easonnie/combine-FEVER-NSMN/blob/master/other_resources/nli_fever.md
- https://github.com/atticusg/MoNLI
- https://github.com/verypluming/HELP
- https://github.com/facebookresearch/XNLI (тут dev и test данные для 15 языков, включая русский)

Может быть, вы какие-то ещё модели и датасеты можете порекомендовать? :)
Задача - собрать датасет побольше и поразнообразнее, перевести на русский, и обучить что-то хорошее для русского NLI.
Время от времени я возвращаюсь к теме перефразирования, потому что, как мне кажется, она центральная для всего NLP. Генерация парафраз = генерация текстов с заданным смыслом, детекция парафраз = сравнение смысла текстов, а для этого надо полностью понимать каждый из них.

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

PAWS: Paraphrase Adversaries from Word Scrambling, 2019. Авторы сгенерировали положительные примеры парафраз обратным переводом (как и я для русских предложений), а отрицательные - перестановкой слов в предложении, меняющей смысл. Оказалось, что у имевшихся на тот момент детекторов парафраз точность на таком датасете составила меньше 40%. Но при обучении на подобных примерах точность возрастала до 85%. Выводы: в 2019 году детекторы парафраз не умели корректно работать с перестановкой слов, а теперь - умеют; авторы молодцы.

Improving Paraphrase Detection with the Adversarial Paraphrasing Task, 2021. Авторы считают парафразами такую пару предложений, в которой каждое логически следует из другого (вот оно, прикладное применение NLI!), и пытаются создать датасет парафраз, которые были бы друг на друга непохожи. В качестве сходства они используют метрику BLEURT, это BERT, дообученный на человеческих оценках сходства предложений. Вооружившись этими метриками, авторы создают пары предложений с высокой степенью mutual implication и низким скором BLEURT. У толокеров это получается хорошо, у алгоритма, основанного на T5 парафразере - похуже, но небесполезно. Результат получился как в PAWS: имеющиеся детекторы парафраз плохо справлялись с детекцией парафраз на такой выборке, но после обучения на аналогичных данных - заметно лучше.
Авторы предлагают сделать такой бенчмарк динамичным (подобно бенчмарку Adversarial NLI): генерировать всё более сложные парафразы, обучая на них всё более изощрённые детекторы. И, кажется, это довольно правильный путь к прогрессу.
Вы рабов продоёте? Нет, только показываем.
Возникла идея создания ещё одного канала+чата, где любой может вывесить вакансию или проект для кожаного мешка, специализирующегося где-то около NLP, или, наоборот, выложить своё NLPшное резюме на всеобщее оборзение.
Нужно ли?
Какие вы порекомендуете имеющиеся каналы?
Я ещё в мае чисто по приколу обучил многозадачную модель T5 для русского языка.
А сейчас у меня наконец-то дошли руки написать про неё пост на Хабре.
После выхода Сберовской T5 это уже не так актуально, но всё равно, пусть будет.
Пока мы тут развлекаемся маленькими моделями, Гугл выпустил статью A Recipe For Arbitrary Text Style Transfer with Large Language Models.
Собственно, рецепт таков: написать для языковой модели (гугловский аналог GPT-3) промпт с текстами, перефразированными в разных стилях, и тогда она перефразирует ваш собственный короткий текст в вашем собственном произвольном стиле легко и свободно.
Авторы при этом безбожно путают контент и стиль, но сам факт, что они пытаются делать style transfer на произвольные стили, а не только на долбаный сентимент, который и стилем-то не является - это хорошо.
Некоторое время назад я заинтересовался семантическими графами – дискретными представлениями текстов, отражающими их смысл, и удобными для восприятия как человеком, так и алгоритмами. Наиболее живым и перспективным мне показался формат AMR (Abstract Meaning Representation) для английского языка. В итоге для моей задачи это представление особо пользы не принесло, но таки оно достаточно любопытное, чтобы здесь о нём поведать.

Формат был предложен в статье Abstract Meaning Representation for Sembanking, и во многом основан на формате PropBank. PropBank - это коллекция семантических фреймов, где для глаголов помечены смысловые роли их аргументов. Формат AMR превращает текст в направленный граф, где рёбра помечены типами аргументов или другими отношениями между словами. Это представление абстрактное, т.к. многие особенности синтаксиса, не обязательные для понимания смысла, AMR не сохраняет, зато достраивает смысловые связи в тексте, которые в нём подразумеваются, но напрямую в синтаксическом дереве не отражены.

Пример: текст "the boy wants to go" в AMR можно записать как граф
(w / want-01 
:arg0 (b / boy)
:arg1 (g / go-01
:arg0 b))
w, g и b - узлы этого графа, причём w слинкован с пропбанком. arg0 (субъект желания и ходьбы) и arg1 (объект желания) - это рёбра графа, причём boy является субъектом want, так и go. От слов "the" и "to" и от формы слова "want" в этом графе мы абстрагировались.

Другой пример: текст "Try a museum called Pittock Mansion." превращается в
(t / try-01 :mode imperative
:ARG0 (y / you)
:ARG1 (m / museum
:name (n / name
:op1 "Pittock"
:op2 "Mansion")))
Здесь отдельное слово "try" обрастает связями, присутствующими в тексте неявно: субъектом you и повелительной модальностью.

За счёт такой конструкции AMR кажется привлекательным для сравнения смысла предложений, т.к. он учитывает важное в тексте, и отбрасывает поверхностное. Например, тексты "I follow Mary" и "Mary is followed by me" получат одинаковые графы, а "I follow Mary" и "Mary follows me" - разные. И при сравнении семантических графов (в отличие от сравнения, например, эмбеддингов), мы точно понимаем, в чём именно между ними разница и общее, то есть уровень интерпретируемости очень высокий.

Как же сравнить два семантических графа между собой? Обычно пользуются метрикой Smatch, которая приблизительно выравнивает два графа друг с другом (лишь приблизительно, т.к. это NP-полная задача с экспоненциальной сложостью), а потом вычисляет f-score по тем тройкам (вершина, ребро, вершина), для которых удалось найти полный аналог в другом графе. Метрика S2match делает то же самое, но для троек с неточным совпадением вычисляет ненулевой скор на основе сходства словных эмбеддингов. Эти метрики позволяют разбивать скор по отдельным сегментам графа: насколько хорошо заматчились именованные сущности, по-разному ли в графах разрешена кореференция, и т.п. В общем, они информативны.

Как превратить текст в семантический граф? Для этого есть ряд парсеров, можно сравнить их на paperswithcode. Есть питонячья библиотека AMRLib, где имплементированы два подхода: парсеры и генераторы на основе T5 (воспринимающие граф просто как текст), и Graph-Sequence Iterative Inference, специальная архитектура, которая постепенно достраивает граф, каждый раз выбирая, какой кусок текста нужно ещё дополнительно распарсить. На моих замерах, T5 работает чуть качественнее, но GSII - сильно быстрее. Есть и другие SOTA подходы, например, Transition-based parser, но к ним не выложено готовых моделей. А AMRLib ещё умеет генерировать из графов текст и рисовать графы в графическом интерфейсе.
Всё это можно использовать, например, для генерации парафраз: распарсил текст в граф, а потом из графа сгенерировал несколько разных вариаций одного и того же текста. Или парафразы можно детектировать, распарсив два предложения и сравнив их графы с помощью S2match. Позже я узнал, что такую метрику уже недавно предлагали в одной статье. Я, собственно, это и пытался делать, но получилось хуже, чем более традиционные подходы, ибо и сами парсеры неидеальны, и метрика s2match наследует все недостатки словных эмбеддингов. Но попытаться было любопытно.

Годится ли AMR для других языков, кроме английского? Создатели этого формата говорили, что нет, но люди всё равно пытаются. В свежей статье Multilingual AMR Parsing with Noisy Knowledge Distillation авторы дообучили mBART парсить китайские, итальянские, испанские и французские тексты в английский AMR, и говорят, что получается хорошо. В статье Cross-lingual Abstract Meaning Representation Parsing обосновали, что так вообще можно делать, потому что парсеры AMR в целом довольно успешно справляются с расхождением между разными языками. В статье Not an Interlingua, But Close чуть ранее показали, что китайские и чешские AMR графы для предложений на этих языках (на основе соответствующих китайского и чешского пропбанков) в половине случаев существенно не совпадают по структуре с английскими AMR графами для эквивалентных по смыслу предложений.

Стоит ли делать русский AMR? В целом, кажется что да, потому что, кроме ЭТАПа (с которым я пока не разобрался), абстрактных семантических представлений для русского не очень много. Но чтобы сделать русский AMR, сначала нужен русский PropBank, и такой уже даже в прошлом году начали делать (статья, репо), но там пока только порядка сотни глаголов, и до построения AMR далековато. Поэтому сейчас, кажется, работающий вариант только переводить русские предложения на английский, и потом парсить. Но можно и сделать парсер русских текстов в английский AMR, и, когда такая штука появится, мне будет любопытно его попробовать)

Ну и да, если вы что-то знаете про семантические парсеры для русского языка - делитесь в комментах!
Пост про метрики seq2seq задач и про соревнования по переписыванию текстов.

История №1: симплификация. По ней весной было соревнование RuSimpleSentEval на Диалоге, в которое я было вписался, но забил из-за дефицита времени. Задача - переписать предложение из Википедии в более простую форму, пользуясь автоматически собранным параллельным датасетом. Датасет собрали любопытно: выровняли друг с другом предложения из Википедии на обычном английском и на Simple English, а потом перевели всё это нейронками на русский.
Победил в этом состязации Даня Анастатьев, обучив mBART упрощать предложения, опираясь на контрольные токены, в явном виде показывающие маленькость целевого предложения и его сходство с оригинальным. Модель получилась весьма качественной, и уже пару раз хорошо себя показывала на новых датасетах без дообучения. Но рассказать я хотел даже не об этом.

Недавно я наткнулся на решение Михаила Орженовского (2 место), и оно мне тоже очень понравилось. Логика простая: раз обучающий датасет огромный, но не очень качественный, то его надо профильтровать, оставив только "хорошие" пары. Критерии хорошести: сходство смыслов предложений (косинус эмбеддингов LASER), доля сохранённых именованных сущностей, использование простых слов (вычисляется через средний логарифм их частот), использование простых конструкций (вычисляется через глубину синтаксического дерева), сокращение длины предложения, и индекс удобочитаемости. Все эти метрики, аккуратно приведенные к интервалу [0, 1], можно агрегировать в одно средневзвешенное геометрическое, и по этой метрике выбирать наиболее классный вариант предложения, перефразированного GPTшкой. И этими же метриками Михаил отфильтровал датасет, на котором пофайнтюнил эту самую GPTшку. По-моему, изящно и хорошо.

История №2: детоксификация, то есть переписывание токсичных текстов в менее токсичном стиле. Этой задачей я занимаюсь последний год, как для английского, так и для русского. Но в соревновании по этой теме, которое проводил недавно Яндекс (вот репо), я занял позорное 12 место. В чём-то это соревнование было необычным: для текстов, которые надо детоксифицировать, там не было целевых примеров, а была только автоматическая метрика качества. Сначала эта метрика была довольно глупой: средний word mover distance для текстов с токсичностью меньше порога, константа - для более токсичных, где токсичность оценивалась BERTовым классификатором. Эту метрику участники соревнования дружно взломали, догадавшись рандомно менять порядок слов в предложении, пока классификатор не сочтёт его нетоксичным.

Вторую метрику Яндекс разработал уже, видимо, оперевшись на существующие best practices: произведение скоров за токсичность, за сходство текстов (как edit distance поверх word2vec эмбеддингов), и за естественность текста (измеренную языковой моделью kenlm). И такую метрику взломать вроде бы уже было сложнее. Но все всё равно взламывали, включая меня. Я применил очень тупой брутфорс: перебирать в цикле все слова в предложении, для каждого слова перебирать 100 ближайших соседей по эмбеддингам, и делать замену слова, если это улучшает общую метрику текста. И в принципе на офлайн-задаче это уже дало скор 0.6 (при максимальном 0.65). Но в соревновании ещё была онлайн-задача: залить свой код на платформу так, чтобы он работал на новых данных быстро и в условиях ограниченных ресурсов. Там уже, понятное дело, было не до перебора, но по заменам, созданным в офлайн-задаче, я сделал словарь наиболее удачных замен, и применил его в онлайне с какой-то головокружительной скоростью.
Но до последнего, довольно очевидного трюка, я почему-то не додумался: найти слова, которые классификатор считает сильными признаками нетоксичного стиля, и пробовать вставлять в тексты их тоже. То ли у меня отключилась соображалка от недосыпа, то ли просто в голове слишком крепко засело понимание токсичного стиля как *наличия* определённых маркеров, но не *отсутствия анти-маркеров*, и я даже не догадался подумать, что BERT, вечно норовящий эксплуатировать поверхностные признаки, может рассужать как-то иначе. Например, если ко всем текстам дописать в конец "спасибо", их средний скор токсичности уменьшится на 10 процентных пунктов. В общем, до этого подхода я не додумался, а также, может быть, и до других - посмотрим, что расскажут победители. Зато я попробовал применить к этой задаче RL, и он хоть и медленно, но учился генерировать подходящие тексты с одной попытки. Как доведу до ума, расскажу (или даже напишу статью).

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

Кстати, какие неочевидные метрики качества текстов знаете вы?
Сегодня в канал пришло довольно много новых подписчиков. Откуда вы сюда попали?)
Коллеги из GraphGrail ищут NLP-разработчиков под чатботные проекты.
Возможно, кому-то из вас будет интересно.
#izolenta_jobs
Forwarded from Vic
Всем привет, нам нужны ИИ разработчики на наши проекты.
Работа интересная: обучать языковые модели разных видов, в том числе трансформеры(ruGPT3, GPT-neo, BERT, BART), модели попроще tf-idf, делать кастомные NER. Также нужны люди кто хочет и любить парсить датасеты.

Задачи разноплановые: делать чатбота и к нему различные надстройки(скиллы).

Наш стек чаще всего такой: Huggingface transformers, Pytorch, pymorphy2, Google Colab (другие либы на ваше усмотрение), scrapy, selenium.
В среднем один скилл в разработке занимает 1-2 недели, бывает больше, платим нормально в зависимости от сложности: скилл может стоить от 40тр и более, медиана от 80тр. Скиллов много, их можно выбирать.
Возможно долгосрочное сотрудничество, у нас большие планы по развитию ИИ, есть стратегия развития AGI, уже делаем свой научный рисеч. Вот пример рисеча в статье(как улучшали генерацию чатбота): https://habr.com/ru/post/583516/

Напишите мне @Vic_Ai_Blockchain в лс кому интересно, обсудим в созвоне детали, сразу можете прислать свой опыт, какие проекты на чем делали.
Сегодня познакомился с пакетом edlib. Всё, что он умеет - это посимвольно выравнивать два текста, зато делает это охрененно быстро.
Если вам нужно выровнять, например, длинный текст после ASR или OCR с его ground truth версией, рекомендую.
Text Detoxification using Large Pre-trained Neural Models – статья нашей Сколтеховской команды, с которой я буду выступать на EMNLP. Для любителей ютуба есть 12-минутный ролик по ней.

Там примерно та же детоксификация, про которую был чемпионат от Яндекса, только мы попытались действительно сохранять смысл исходных текстов, даже если их перефразированная форма выглядит непохоже на первоначальную. Ну и язык пока что только английский (но часть методов мы адаптировали для русского в другой статье).

Код для инференса – в https://github.com/skoltech-nlp/detox, можете попробовать поиграться.
Наткнулся на статью этого года "Data-Driven Model for Emotion Detection in Russian Texts", в которой разметили почти 10К предложений из разных интернет-источников на 5 базовых эмоций: joy, sadness, surprise, fear, anger (эмоции, ясное дело, не взаимоисключающие).
Я обучил на ней свой маленький BERT, получилась вот такая моделька: https://huggingface.co/cointegrated/rubert-tiny2-cedr-emotion-detection.
Скор на тестовой выборке вышел чуть выше, чем у авторов статьи. Могу теперь хвастаться, что обновил SOTA по детектированию эмоций 🙃

P.S. приложенный скриншот работает не совсем правильно, т.к. веб-демка считает softmax, а нужно просто sigmoid, выходы-то у модели не взаимоисключающие. Но суть модели он таки отражает.
Пока все пишут про очередной GPT от Гугла, я напишу про старую книжулю, которую прочитал недавно: Introduction to Semantics: An Essential Guide to the Composition of Meaning. Ссылку прикладывать не буду, но найти её не очень сложно.

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

Что вообще такое смысл текста? Или хотя бы отдельно взятого предложения? Да что уж там предложения, как можно определить смысл хотя бы одного слова? Как смыслы фраз складываются из более коротких фраз, их составляющих, и верно ли, что эти смыслы можно вычислить рекурсивно? Сводится ли значение фразы к объектам реального мира, которые она обозначает, и что делать, если таких объектов (например, котопсов) не существует и не может существовать? Насколько для понимания текста важны вещи, не сказанные в нём, и где граница между знанием языка и знаниями о мире? На подобные вопросы Циммерман и Штернфельд дают по-возможности подробные ответы, с кучей милых занудных оговорок, что эта книга – вводного уровня, и на самом деле всё значительно сложнее. Это самый немецкий учебник, который я когда-либо читал, и самая насыщенная формулами книга по "гуманитарному" предмету, которая мне попадалась.

Что мне дало прочтение этой книги? Одна из моих текущих задач – сделать хороший детектор парафраз, то есть машину, в которую можно засунуть два текста, а на выходе получить диагноз: обладают ли они одинаковым или разным смыслом? Казалось бы, типичнейшая задача для машинного обучения, но так получается (как показывают статьи типа PAWS и более свежая APT), машиннообученные детекторы парафраз легко сломать, показав им тексты чуть-чуть иные, чем были в обучающей выборке. Так вот, собственно, чтение книг по формальной семантике помогает понять, почему именно идентификация смысла текста – это пипец как сложно. И это понимание, с одной стороны, удручает, но с другой, подсказывает, какого рода данные стоило бы подсунуть моему детектору парафраз при обучении, чтобы в диких условиях он вёл себя хоть немножко стабильнее. И вот это уже прям полезно.
Задача, о которой часто спрашивают в чятиках: "как заставить мой трансформер сгенерировать текст, который бы обязательно содержал определённые слова или их сочетания?"

Задача называется lexically constrained decoding, и у неё есть несколько неплохих решений, основанных на модификациях beam search'а.
Держите ссылку на статьи и их имплементацию коллегами из FAIR: https://github.com/pytorch/fairseq/tree/main/examples/constrained_decoding