̶с̶а̶м̶̶о̶изолента мёбиуса
2.44K subscribers
13 photos
2 videos
1 file
191 links
Костыли и технологии для обработки естественных языков. Обзоры статей и личный опыт. by @cointegrated
Download Telegram
Я в этом канале регулярно что-то пишу про свои pet projects, но мало пишу про основную работу в Сколтехе. Оправдываю это тем, что мы пока что мало публикуемся.
Но вот таки одну статью по моей теме (перенос стиля) опубликовали и на Диалоге представили. Там основной вклад Дарины (кстати, рекомендую ее канал @towards_nlp), но я тоже чутка поучаствовал.
Итак, Methods for Detoxification of Texts for the Russian Language, первый заход: https://arxiv.org/abs/2105.09052
Вчера СберДевайсы выпустили русскую версию модели CLIP (пост, веса).
CLIP - это пара энкодеров, которые переводят картинки и тексты в одно и то же векторное пространство. Довольно удобная штука для zero-shot классификации картинок и для поиска по ним.
А ещё в паре с картиночным GAN'ом из неё можно сделать генератор картинок по подписям, а в паре с годным генератором текстов - генератор подписей к картинкам.
В общем, полезная в хозяйстве штука, забирайте.
Помните, недавно я постил код для перефразирования предложений переводом на английский и обратно?
Так вот, оказалось, что этот бейзлайн пока что не может обойти ни одна нейросетка, специально обученная на задачу перефразирования.
Про то, как я собирал корпус парафраз, обучал модель и придумывал метрики для её оценки - читайте на Хабре.
Привет! Я сделал обзор существующих корпусов и моделей для генерации парафраз на русском языке.
А ещё сгенерировал свой корпус на миллион парафраз (он весьма неплох) и обучил свой парафразер на основе T5 (SOTA пока не получилась).
https://habr.com/ru/post/564916
Сегодня в 17:00 по Мск буду рассказывать на созвоне DeepPavlov про свой маленький русский BERT.
Вот ссылка на запись мероприятия.
Есть не до конца решённая задача: "сгенерировать предложение, похожее на заданное". Её можно решить с помощью авторегрессионной языковой модели, попросив её продолжить текст. Но можно сделать то же самое и с помощью MLM. Для этого надо просто несколько раз пропустить предложение через BERT, заменяя некоторые токены на [mask] и генерируя новое предложение из условного распределения, выданного моделью. Получается иногда бред, иногда удачно, примерно 50/50.

def replace_with_mlm(text, model, tokenizer, n_iter=5, temperature=0.5, max_span=2, change_size=True, mask=True, verbose=False):
enc = tokenizer(text)
n = len(enc.input_ids)

for i in range(n_iter):
if mask:
left = random.randint(1, n - 2)
right = random.randint(left + 1, min(left + max_span, n-1))
if change_size:
new_size = random.randint(1, max_span)
else:
new_size = right - left
enc.input_ids[left:right] = [tokenizer.mask_token_id] * new_size
with torch.no_grad():
out = model(torch.tensor(enc.input_ids).to(model.device).unsqueeze(0))
proba = torch.softmax(out.logits / temperature, -1)[0]
enc.input_ids[1:-1] = torch.multinomial(proba, 1)[1:-1, 0]
out_text = tokenizer.decode(enc.input_ids, skip_special_tokens=True)
if verbose:
print(out_text)
return out_text

Подставим сюда bert_ru_conversational_cased от DeepPavlov и какой-то текст, и посмотрим, как он мутирует:
replace_with_mlm('Путин утвердил новую Стратегию национальной безопасности России', model, tokenizer, verbose=True)
Национа Путин утвердил новую стратегию национальнои безопасности.
Владимирльный утвердил новую стратегию национально ориентированных.
Владимир Жириновский показал новую стратегию национально ориентированных.
Владимир Жириновский показал новую стратегию национального политики.
Владимир Жириновский показал нам российского национального политика.
По-моему, забавно.

Впрочем, иногда BERT скатывается в какой-то бред, типа такого
путин утвердил новую стратегию национальнои национальноной россии
путин утвердил новую стратегию национально - воскресной россии
путин утвердил новую партию для национально - воскресной россии
путин утвердил новую партию воскрес коммунистов - воскресной россии
путин утвердил новую партию воскресной - воскресной россии
путин утвердил новую партию воскресной - воскресной россии
путин утвердил новую партию воскресной воскресной россии
путин утвердил новую партию воскресной и воскресной россии
путин утвердил символы воскресной и воскресной россии
путин утвердил два - воскресной и воскресной россии
путин утвердил кресты - воскресной и воскресной россии
путин - - воскресной и воскресной россии
путин - - воскресной воскресной россии
путин - - воскресник воскресной россии
путин путин воскресник воскресной россии
путин путин воскресник воскрес!
путин путин путин воскрес!
путин путин путин!
путин путин путин путин!
путин путин путин путин!!
Видимо, это происходит потому, что хоть BERT был обучен заменять бредовые части предложения на нормальные, в обучении бредовых токенов было 15%, и если текст состоит из бреда наполовину или полностью, модель теряется.
Всем привет!
Те, кто уже общались со мной в этом канале или вне его, могут знать, что я, помимо работы в Сколтехе, занимаюсь образовательными, разработческими и исследовательскими пет-прожектами и халтурками. В последнее время количество этих проектов существенно превышает временны́е ресурсы одного человека, так что я ищу себе подмастерье.

Сделка простая: с меня – доступ к интересным и оплачиваемым проектам и менторство, с вас – наличие свободного времени и готовность вовремя выполнять поставленные задачи.
От вас я ожидаю навыков Python и базового NLP и интереса к NLP, чатботам и голосовым приложениям. По оплате базово предлагаю долю в выполненных проектах, и, если надо, могу закрепить наши отношения договором ГПХ.

Со всеми вопросами пишите в ЛС @cointegrated)
Раньше модели для понимания или генерации текстов составляли свой словарь из отдельно взятых слов. Это было похоже на то, как язык обычно изучают лингвисты и простые смертные, но приводило, с одной стороны, к раздуванию словарей, с другой - с неустранимой проблемой out-of-vocabulary слов.

В 2010-х стали популярными словари, собранные из отдельных слов, кусочков слов и букв, такие, как BPE (часто используется в GPT и моделях для перевода) и sentencepiece (используется, например, в BERT и T5). Это решило проблему и с раздуванием словаря, и с OOV-токенами. Но модели, использующие подобные словари, всё ещё сильно зависят от того, как такой словарь был собран, и при переходе на новый домен или другой язык большая часть собранного словаря оказывается бесполезна и лежит в модели мёртвым грузом.

Исследователи из Google решили пойти дальше и создали модель byT5: мультиязычный T5 (энкодер-декодер, обученный на MLM задаче), использующий в качестве словаря тупо байты. То есть всего 256 разных символов. Маленькость словаря компенсировали увеличенным энкодером. В результате получилась модель, которая применяется и обучается медленнее, чем mT5 (т.к. последовательности токенов стали длиннее: для русского в 6 раз, для английского - в 4), зато обходит её по качеству на генеративных задачах, мультиязычных задачах, и задачах с кучей шума.

Кажется, основная фишка таких моделей в том, что теперь дообучать модели на новых доменах и языках стало проще: не надо пересобирать словарь, надо просто сразу взять и запустить дообучение. В обозримом будущем хочу попробовать и для русского)
Напомню про недавнюю работа моего коллеги Коли про фильтрацию неуместных высказываний на русском языке.
Читайте описание простыми словами: https://www.skoltech.ru/2021/07/nejroseti-otfiltruyut-neumestnye-vyskazyvaniya-chat-botov
Скачивайте модель: https://huggingface.co/Skoltech/russian-inappropriate-messages
Привет всем матёрым NLPшникам!
Наша группа обработки естественного языка в Сколтехе ищет инженера-исследователя. Получается, моего прямого коллегу ☺️
Полное описание вакансии с требованиями и условиями есть на сайте. Если вкратце, нужно будет разрабатывать новые алгоритмы NLP, тщательно оценивать их, и писать про это научные статьи.
Темы могут быть самые разные (примеры статей есть опять-таки на сайте), например, в последнее время мы много занимаемся переносом стиля на текстах и оценкой его качества, активным обучением (применительно к классификации текстов и NER), и вопросно-ответными системами.
Придётся и писать код, и размечать данные, и описывать всё это связными текстами. Будет много свободы и довольно приличная зарплата. В общем, приходите к нам)
Вопросы можно задавать мне в личку.
У меня была серия постов про SuperGLUE (0 1 2 3 4 5 6 7 8), и её стоит завершить последним постом - про диагностические датасеты.
Их два. Первый содержит примеры задачи NLI (определения логической связи между парами предложений), размеченные по языковым явлениям, с которыми модель должна хорошо работать для решения задачи, в частности:
- Lexical Semantics: понимания смысла слов, как самих по себе, так и в контексте всего предложения
- Knowledge: модель должна знать и конкретные факты о мире, и то, что называется "здравым смыслом".
- Logic: умение применять к текстам логические операции (отрицание, "и", "или", "либо" и т.п.), понимание квантификаторов (все/некоторые) и т.п.
- Predicate-Argument Structure: понимание, как смысл фразы складывается из отдельных её частей, например, разрешение кореференции.
Никаких обучающих данных эта задача не содержит, только тестовые: предполагается, что модель будет учиться решать обычное NLI. Любопытно, что качество SOTA моделей на этой задаче довольно невысокое: Matthews correlation 69% на сегодняшний день против 76% у людей. Видимо, обучающие датасеты для NLI в среднем сильно проще, чем этот диагностический.

Второй диагностический датасет называется Winogender. Он содержит фразы типа "The technician told the customer that [he/she] could pay with cash.", и модель должна определить, к кому из двух лиц относится местоимение. Модель оценивается по двум характеристикам: точности угадывания, и, дополнительно, по точности в разрезе гендера. Все предложения гендерно-нейтральные, а потому модель, лишённая gender bias, должна выдавать одинаковые (и одинаково хорошие) ответы и для he, и для she. И в принципе, у большинства топовых моделей скор здесь достаточно высокий, за 90%. Но доля ошибок всё-таки на порядок больше, чем у людей.

В общем, с одной стороны, кажется, что SuperGLUE уже "решён": у трёх моделей уже средние скоры на задачах с обучающей выборкой выше, чем у людей. Но как только нужно обобщиться на диагностические задачи, их качество пошатывается. Так что от General NLU мы до сих пор далековато.
Возможно, вы знаете, что на Huggingface hub появилась возможность ставить лайки ❤️
Если вам нравятся мои модели, вы можете тоже полайкать, например, вот эти T5:
- rut5-base-multitask: первая и пока единственная русскоязычная модель T5, предобученная сразу на десяток разных полезных seq2seq задач
- rut5-base-paraphraser: русскоязычный парафразер, который довольно неплохо сохраняет смысл предложений, но может заметно изменить их форму
- rut5-small-chitchat: маленькая и не очень умная, но быстрая русскоязычная болталка
- rut5-small-normalizer: модель для восстановления связного предложения из мешка слов

А ещё можно полайкать берты:
- rubert-tiny: маленький и быстрый русско- и англоязычный BERT с неплохими представлениями предложений на CLS токене
- rubert-tiny-toxicity: русский классификатор токсичности и неполиткорректности
- rubert-tiny-sentiment-balanced: русский классификатор тональности
- LaBSE-en-ru: модель LaBSE, где я выкинул эмбеддинги всех языков, кроме ru и en; модель уменьшилась х4 без потери качества.
Посмотрел запись недавнего митапа Тинькофф по NLP.
В программе:
- Популярные рецепты создания болталки
- Задача классификации интентов, на которой tf-idf+логрег работает лучше, чем BERT
- Как Реплика пересаживалась с GPT-3 на собственную языковую модель.
В общем, рекомендую.
https://youtu.be/SwfzebRc1ZU
Статья Sentence-T5: Scalable Sentence Encoders from Pre-trained Text-to-Text Models
Оказывается, если просто усреднить эмбеддинги энкодера T5, на очень многих задачах NLU (в частности, STS) это оказывается лучше, чем эмбеддинги из BERT. А если ещё пофайнтюнить такую штуку на корпусе Stanford NLI, то качество получается сильно лучше, чем у ряда альтернативных sentence encoders. Как файнтюним: оптимизируем log loss софтмакса (температура 0.01), где позитивный пример - предложение с меткой entailment, а негативный пример - предложение с меткой contradiction и все другие предложения в батче. Ну и, естественно, чем больше размер модели T5, тем лучше оно работает.
Забавно, что на задачах STS лучше выходит, если не усреднять эмбеддинги энкодера, а взять первый эмбеддинг декодера - видимо, помогает дополнительный проход по всем атеншнам. И да, примечательно, что авторы все эксперименты проводили на бенчмарке SentEval, вообще не апеллируя к другим.

И да, надо бы для русского языка тоже попробовать сравнить эмбеддинги русских T5 и BERTов.
Недавно я уверовал в 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 это уже не так актуально, но всё равно, пусть будет.