Сегодня в 17:00 по Мск буду рассказывать на созвоне DeepPavlov про свой маленький русский BERT.
Вот ссылка на запись мероприятия.
Вот ссылка на запись мероприятия.
Сегодня я запостил свою старую работу - анализ каталога навыков Алисы и опрос разработчиков лучших навыков.
Добро пожаловать на Хабр)
Напомню, что, этот канал - не только про NLP, но и про диалоговые интерфейсы (1 2 3 например).
Добро пожаловать на Хабр)
Напомню, что, этот канал - не только про NLP, но и про диалоговые интерфейсы (1 2 3 например).
Хабр
Лучшие навыки Алисы и советы от их разработчиков
Я уже довольно давно разрабатываю навыки для Яндекс.Алисы, но пока не создал ни одного популярного. Недавно мне стало интересно: а какие навыки становятся самыми популярными, и кто те люди, которые их...
Есть не до конца решённая задача: "сгенерировать предложение, похожее на заданное". Её можно решить с помощью авторегрессионной языковой модели, попросив её продолжить текст. Но можно сделать то же самое и с помощью MLM. Для этого надо просто несколько раз пропустить предложение через BERT, заменяя некоторые токены на [mask] и генерируя новое предложение из условного распределения, выданного моделью. Получается иногда бред, иногда удачно, примерно 50/50.
Впрочем, иногда BERT скатывается в какой-то бред, типа такого
def replace_with_mlm(text, model, tokenizer, n_iter=5, temperature=0.5, max_span=2, change_size=True, mask=True, verbose=False):Подставим сюда bert_ru_conversational_cased от DeepPavlov и какой-то текст, и посмотрим, как он мутирует:
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
replace_with_mlm('Путин утвердил новую Стратегию национальной безопасности России', model, tokenizer, verbose=True)По-моему, забавно.
Национа Путин утвердил новую стратегию национальнои безопасности.
Владимирльный утвердил новую стратегию национально ориентированных.
Владимир Жириновский показал новую стратегию национально ориентированных.
Владимир Жириновский показал новую стратегию национального политики.
Владимир Жириновский показал нам российского национального политика.
Впрочем, иногда BERT скатывается в какой-то бред, типа такого
путин утвердил новую стратегию национальнои национальноной россииВидимо, это происходит потому, что хоть BERT был обучен заменять бредовые части предложения на нормальные, в обучении бредовых токенов было 15%, и если текст состоит из бреда наполовину или полностью, модель теряется.
путин утвердил новую стратегию национально - воскресной россии
путин утвердил новую партию для национально - воскресной россии
путин утвердил новую партию воскрес коммунистов - воскресной россии
путин утвердил новую партию воскресной - воскресной россии
путин утвердил новую партию воскресной - воскресной россии
путин утвердил новую партию воскресной воскресной россии
путин утвердил новую партию воскресной и воскресной россии
путин утвердил символы воскресной и воскресной россии
путин утвердил два - воскресной и воскресной россии
путин утвердил кресты - воскресной и воскресной россии
путин - - воскресной и воскресной россии
путин - - воскресной воскресной россии
путин - - воскресник воскресной россии
путин путин воскресник воскресной россии
путин путин воскресник воскрес!
путин путин путин воскрес!
путин путин путин!
путин путин путин путин!
путин путин путин путин!!
Всем привет!
Те, кто уже общались со мной в этом канале или вне его, могут знать, что я, помимо работы в Сколтехе, занимаюсь образовательными, разработческими и исследовательскими пет-прожектами и халтурками. В последнее время количество этих проектов существенно превышает временны́е ресурсы одного человека, так что я ищу себе подмастерье.
Сделка простая: с меня – доступ к интересным и оплачиваемым проектам и менторство, с вас – наличие свободного времени и готовность вовремя выполнять поставленные задачи.
От вас я ожидаю навыков Python и базового NLP и интереса к NLP, чатботам и голосовым приложениям. По оплате базово предлагаю долю в выполненных проектах, и, если надо, могу закрепить наши отношения договором ГПХ.
Со всеми вопросами пишите в ЛС @cointegrated)
Те, кто уже общались со мной в этом канале или вне его, могут знать, что я, помимо работы в Сколтехе, занимаюсь образовательными, разработческими и исследовательскими пет-прожектами и халтурками. В последнее время количество этих проектов существенно превышает временны́е ресурсы одного человека, так что я ищу себе подмастерье.
Сделка простая: с меня – доступ к интересным и оплачиваемым проектам и менторство, с вас – наличие свободного времени и готовность вовремя выполнять поставленные задачи.
От вас я ожидаю навыков Python и базового NLP и интереса к NLP, чатботам и голосовым приложениям. По оплате базово предлагаю долю в выполненных проектах, и, если надо, могу закрепить наши отношения договором ГПХ.
Со всеми вопросами пишите в ЛС @cointegrated)
Раньше модели для понимания или генерации текстов составляли свой словарь из отдельно взятых слов. Это было похоже на то, как язык обычно изучают лингвисты и простые смертные, но приводило, с одной стороны, к раздуванию словарей, с другой - с неустранимой проблемой out-of-vocabulary слов.
В 2010-х стали популярными словари, собранные из отдельных слов, кусочков слов и букв, такие, как BPE (часто используется в GPT и моделях для перевода) и sentencepiece (используется, например, в BERT и T5). Это решило проблему и с раздуванием словаря, и с OOV-токенами. Но модели, использующие подобные словари, всё ещё сильно зависят от того, как такой словарь был собран, и при переходе на новый домен или другой язык большая часть собранного словаря оказывается бесполезна и лежит в модели мёртвым грузом.
Исследователи из Google решили пойти дальше и создали модель byT5: мультиязычный T5 (энкодер-декодер, обученный на MLM задаче), использующий в качестве словаря тупо байты. То есть всего 256 разных символов. Маленькость словаря компенсировали увеличенным энкодером. В результате получилась модель, которая применяется и обучается медленнее, чем mT5 (т.к. последовательности токенов стали длиннее: для русского в 6 раз, для английского - в 4), зато обходит её по качеству на генеративных задачах, мультиязычных задачах, и задачах с кучей шума.
Кажется, основная фишка таких моделей в том, что теперь дообучать модели на новых доменах и языках стало проще: не надо пересобирать словарь, надо просто сразу взять и запустить дообучение. В обозримом будущем хочу попробовать и для русского)
В 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
Читайте описание простыми словами: https://www.skoltech.ru/2021/07/nejroseti-otfiltruyut-neumestnye-vyskazyvaniya-chat-botov
Скачивайте модель: https://huggingface.co/Skoltech/russian-inappropriate-messages
Привет всем матёрым NLPшникам!
Наша группа обработки естественного языка в Сколтехе ищет инженера-исследователя. Получается, моего прямого коллегу ☺️
Полное описание вакансии с требованиями и условиями есть на сайте. Если вкратце, нужно будет разрабатывать новые алгоритмы NLP, тщательно оценивать их, и писать про это научные статьи.
Темы могут быть самые разные (примеры статей есть опять-таки на сайте), например, в последнее время мы много занимаемся переносом стиля на текстах и оценкой его качества, активным обучением (применительно к классификации текстов и NER), и вопросно-ответными системами.
Придётся и писать код, и размечать данные, и описывать всё это связными текстами. Будет много свободы и довольно приличная зарплата. В общем, приходите к нам)
Вопросы можно задавать мне в личку.
Наша группа обработки естественного языка в Сколтехе ищет инженера-исследователя. Получается, моего прямого коллегу ☺️
Полное описание вакансии с требованиями и условиями есть на сайте. Если вкратце, нужно будет разрабатывать новые алгоритмы 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 мы до сих пор далековато.
Их два. Первый содержит примеры задачи 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 без потери качества.
Если вам нравятся мои модели, вы можете тоже полайкать, например, вот эти 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
В программе:
- Популярные рецепты создания болталки
- Задача классификации интентов, на которой tf-idf+логрег работает лучше, чем BERT
- Как Реплика пересаживалась с GPT-3 на собственную языковую модель.
В общем, рекомендую.
https://youtu.be/SwfzebRc1ZU
YouTube
Tinkoff AI. NLP — Трансляция митапа
Митап с ведущими разработчиками машинного обучения в Тинькофф, на котором обсудим обработку естественных языков. В этой трансляции:
00:00 — Начало трансляции
01:53 — Генеративные модели для conversational AI, Иван Фурсов, Тинькофф
37:44 — Transformer is…
00:00 — Начало трансляции
01:53 — Генеративные модели для conversational AI, Иван Фурсов, Тинькофф
37:44 — Transformer is…
Статья 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ов.
Оказывается, если просто усреднить эмбеддинги энкодера 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), вот она. Я, наверное, ещё дообучу её, увеличив обучающий корпус (в основном - переводами с английского). Но с ней уже можно играться 🙃
Убедила меня в этом статья 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.
Мультиязычные модели для 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): генерировать всё более сложные парафразы, обучая на них всё более изощрённые детекторы. И, кажется, это довольно правильный путь к прогрессу.
Или не надо? Проблема многих текущих датасетов с парафразами в том, что они лёгкие: для успешной идентификации парафраз в них достаточно едва ли не посчитать количество общих слов в двух текстах, ну или сходство мешка эмбеддингов. Поэтому успех модели на таком датасете вовсе не означает, что она понимает смысл текстов, и такую модель может быть несложно обмануть. Отсюда спрос на более сложные парафразы.
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шное резюме на всеобщее оборзение.
Нужно ли?
Какие вы порекомендуете имеющиеся каналы?
Возникла идея создания ещё одного канала+чата, где любой может вывесить вакансию или проект для кожаного мешка, специализирующегося где-то около NLP, или, наоборот, выложить своё NLPшное резюме на всеобщее оборзение.
Нужно ли?
Какие вы порекомендуете имеющиеся каналы?
Я ещё в мае чисто по приколу обучил многозадачную модель T5 для русского языка.
А сейчас у меня наконец-то дошли руки написать про неё пост на Хабре.
После выхода Сберовской T5 это уже не так актуально, но всё равно, пусть будет.
А сейчас у меня наконец-то дошли руки написать про неё пост на Хабре.
После выхода Сберовской T5 это уже не так актуально, но всё равно, пусть будет.
Выкладываю обещанный пост про русскоязычные модели для NLI и zero-shot классификации: https://habr.com/ru/post/582620/
Читайте и лайкайте!
А вот сами модели: twoway, threeway и tiny. Для большинства задач рекомендую twoway.
Читайте и лайкайте!
А вот сами модели: twoway, threeway и tiny. Для большинства задач рекомендую twoway.
Хабр
Нейросети для Natural Language Inference (NLI): логические умозаключения на русском языке
NLI (natural language inference) – это задача автоматического определения логической связи между текстами. Обычно она формулируется так: для двух утверждений A и B надо выяснить, следует ли B из A....
Пока мы тут развлекаемся маленькими моделями, Гугл выпустил статью A Recipe For Arbitrary Text Style Transfer with Large Language Models.
Собственно, рецепт таков: написать для языковой модели (гугловский аналог GPT-3) промпт с текстами, перефразированными в разных стилях, и тогда она перефразирует ваш собственный короткий текст в вашем собственном произвольном стиле легко и свободно.
Авторы при этом безбожно путают контент и стиль, но сам факт, что они пытаются делать style transfer на произвольные стили, а не только на долбаный сентимент, который и стилем-то не является - это хорошо.
Собственно, рецепт таков: написать для языковой модели (гугловский аналог GPT-3) промпт с текстами, перефразированными в разных стилях, и тогда она перефразирует ваш собственный короткий текст в вашем собственном произвольном стиле легко и свободно.
Авторы при этом безбожно путают контент и стиль, но сам факт, что они пытаются делать style transfer на произвольные стили, а не только на долбаный сентимент, который и стилем-то не является - это хорошо.
Некоторое время назад я заинтересовался семантическими графами – дискретными представлениями текстов, отражающими их смысл, и удобными для восприятия как человеком, так и алгоритмами. Наиболее живым и перспективным мне показался формат AMR (Abstract Meaning Representation) для английского языка. В итоге для моей задачи это представление особо пользы не принесло, но таки оно достаточно любопытное, чтобы здесь о нём поведать.
Формат был предложен в статье Abstract Meaning Representation for Sembanking, и во многом основан на формате PropBank. PropBank - это коллекция семантических фреймов, где для глаголов помечены смысловые роли их аргументов. Формат AMR превращает текст в направленный граф, где рёбра помечены типами аргументов или другими отношениями между словами. Это представление абстрактное, т.к. многие особенности синтаксиса, не обязательные для понимания смысла, AMR не сохраняет, зато достраивает смысловые связи в тексте, которые в нём подразумеваются, но напрямую в синтаксическом дереве не отражены.
Пример: текст "the boy wants to go" в AMR можно записать как граф
Другой пример: текст "Try a museum called Pittock Mansion." превращается в
За счёт такой конструкции AMR кажется привлекательным для сравнения смысла предложений, т.к. он учитывает важное в тексте, и отбрасывает поверхностное. Например, тексты "I follow Mary" и "Mary is followed by me" получат одинаковые графы, а "I follow Mary" и "Mary follows me" - разные. И при сравнении семантических графов (в отличие от сравнения, например, эмбеддингов), мы точно понимаем, в чём именно между ними разница и общее, то есть уровень интерпретируемости очень высокий.
Как же сравнить два семантических графа между собой? Обычно пользуются метрикой Smatch, которая приблизительно выравнивает два графа друг с другом (лишь приблизительно, т.к. это NP-полная задача с экспоненциальной сложостью), а потом вычисляет f-score по тем тройкам
Как превратить текст в семантический граф? Для этого есть ряд парсеров, можно сравнить их на paperswithcode. Есть питонячья библиотека AMRLib, где имплементированы два подхода: парсеры и генераторы на основе T5 (воспринимающие граф просто как текст), и Graph-Sequence Iterative Inference, специальная архитектура, которая постепенно достраивает граф, каждый раз выбирая, какой кусок текста нужно ещё дополнительно распарсить. На моих замерах, T5 работает чуть качественнее, но GSII - сильно быстрее. Есть и другие SOTA подходы, например, Transition-based parser, но к ним не выложено готовых моделей. А AMRLib ещё умеет генерировать из графов текст и рисовать графы в графическом интерфейсе.
Формат был предложен в статье 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Здесь отдельное слово "try" обрастает связями, присутствующими в тексте неявно: субъектом
:ARG0 (y / you)
:ARG1 (m / museum
:name (n / name
:op1 "Pittock"
:op2 "Mansion")))
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, и, когда такая штука появится, мне будет любопытно его попробовать)
Ну и да, если вы что-то знаете про семантические парсеры для русского языка - делитесь в комментах!
Годится ли 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). Но в соревновании ещё была онлайн-задача: залить свой код на платформу так, чтобы он работал на новых данных быстро и в условиях ограниченных ресурсов. Там уже, понятное дело, было не до перебора, но по заменам, созданным в офлайн-задаче, я сделал словарь наиболее удачных замен, и применил его в онлайне с какой-то головокружительной скоростью.
История №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). Но в соревновании ещё была онлайн-задача: залить свой код на платформу так, чтобы он работал на новых данных быстро и в условиях ограниченных ресурсов. Там уже, понятное дело, было не до перебора, но по заменам, созданным в офлайн-задаче, я сделал словарь наиболее удачных замен, и применил его в онлайне с какой-то головокружительной скоростью.