̶с̶а̶м̶̶о̶изолента мёбиуса
2.49K subscribers
14 photos
2 videos
1 file
194 links
Костыли и технологии для обработки естественных языков. Обзоры статей и личный опыт. by @cointegrated
Download Telegram
Сегодня сам ничего не закодил, но зато до кучи познакомился с чужими хорошими NERами.

С утра смотрел видос Мэтью Хонибала про то, как сделан NER в Spacy. Вкратце - красиво и довольно неочевидно. Посмотрите)

А вечером читал статью Александра Кукушкина про обновлённую Наташу. С недавнего времени там нейросетевые NER, морфологический теггер и парсер зависимостей - прямо как в spacy, только кукушкинские и, на первый взгляд, довольно пиздатые.
Очень круто, что есть такой чувак, который уже несколько лет до кучи тащит на себе большой кусок прикладного русского NLP.
̶с̶а̶м̶̶о̶изолента мёбиуса
Для кучи задач машинного обучения полезно аугментировать обучающие данные - то есть как-нибудь генерировать новые обучающие примеры из имеющихся. Обычно это очень легко с картинками (повернул, изменил масштаб, отрезал кусочек, наложил фильтр - смысл картинки…
Месяц назад я писал про парафразер для аугментации текстов.
Сегодня я всё-таки релизнул либу для этого: https://github.com/avidale/dependency-paraphraser

Синтаксический парсер я взял из недавнего релиза Наташи, на его основе обучил простенькую модельку для перестановки веточек дерева зависимостей.
Получилось такое:

text = 'каждый охотник желает знать где сидит фазан'
for i in range(3):
print(dependency_paraphraser.natasha.paraphrase(text, w2v=small_model, p_rep=0.8, min_sim=0.55))

надеется каждый рыболов разузнать окунь где-нибудь сидит
каждый охотник хочет познать где-нибудь фазан сидит
каждый лось хочет узнать фазан где-нибудь подсаживается
каждый охота хочет знавать куропатка где-нибудь обивает
каждый охотник хочет знать тюлень где-нибудь рассаживается
каждый охота стремится расспросить лепёшка где просиживает
каждый рыболов желает знать просиживает печёнка где-нибудь
каждый рыболов предпочитает знать где-нибудь печёнка рассаживается
каждый рыболов желает признаться тюлень где-нибудь восседает
стремится каждый рыболов расспросить где-нибудь фазан усаживает
Вы можете спросить, а зачем ещё нужны в 2к20 синтаксические парсеры, кроме генерации этих ваших дурацких парафраз?

Ну например для того, чтобы высказывание "я люблю кошек и собак" легко было превратить в "я люблю кошек" и "я люблю собак".

Если эта фраза уже превращена в дерево зависимостей, то обойти это дерево и расклеить конъюнкцию на отдельные подфразы можно очень простым кодом. Типа такого поверх spacy.
#sotanlu
Решил в ближайший месяц сделать обзор бенчмарков основных NLU задач: датасетов, на которых меряются, и моделек, которые на них лидируют.
Начал с русского бенчмарка sentence embeddings на четырёх задачках от DeepPavlov: https://github.com/deepmipt/deepPavlovEval
1) Paraphraser - определить, являются ли пара предложений одинаковыми по смыслу
2) MSRVid - определить, на сколько шакалов два предложения похожи друг на друга
3) XNLI - правильно классифицировать логическую связь между двумя предложениями
4) Rusentiment (уже закрытый датасет, но его можно найти) - классификация тональности комментов из VK
Код из этой репы вполне запускается.
Завтра попробую прогнать через него современные эмбеддеры. Должно получиться ощутимо лучше, чем модельки из самого репозитория.
#ботоводство
Ещё один челендж, который я себе тоже уготовил на ближайший месяц - ежедневно выкатывать какую-нибудь полезную фичу в пространстве моих ботиков.
Сегодня катнул первую: научился расклеивать пиплбук для КВ на множество сообществ.
Это значит, что теперь я могу штамповать примерно такие странички в больших количествах.
#ботоводство
Продолжение первой ботной фичи: расклеил уже и пипл-кофе-бота на множество ботиков.
Казалось бы, чего проще: был один объект, стало много.
Но чтобы сделать это нормально и масштабируемо, ушёл целый день рефакторинга, вылившийся в +706 −352 строк кода.
Ещё чуть-чуть наведения красоты - и пиплботов можно будет клонировать как захочется.
#sotanlu
Вернулся к теме NLU-бенчмарков, продолжаю расковыривать русскоязычные sentence embeddings.
На четырёх задачках от DeepPavlov Laser ожидаемо отработал лучше, чем все берты и элмы, которые DP пробовал (ну, кроме парочки подогнанных под домен).
Маленький, свёрточный USE обогнал Laser на MSRVid (какой-то странный этот датасет, конечно). Большой USE обогнал Laser на всех задачах, кроме XNLI.

И да, я нашёл ещё один набор задач для бенчмарка, на этот раз от Вышки, и у них даже есть пейпер. Жаришка!
Удивительно, правда, что и вышкинские ребята не включили в свои бенчмарки ни Laser, ни USE. Чё-то падазрительна.
̶с̶а̶м̶̶о̶изолента мёбиуса
#ботоводство По ботам продолжил распиливание: сделал выдаваемые пиплботом реплики кастомизируемыми под конкретное сообщество.
#ботоводство
Следующий шаг: сделал страничку с формой, позволяющей админу сообщества непосредственно настраивать эти реплики и кое-что ещё.
̶с̶а̶м̶̶о̶изолента мёбиуса
#ботоводство Следующий шаг: сделал страничку с формой, позволяющей админу сообщества непосредственно настраивать эти реплики и кое-что ещё.
#ботоводство
Следующий шаг: сделал ботика, который позволяет регистрировать новые сообщества и авторизовывает на той самой админской страничке с формой.
#sotanlu
По NLP начал разбирать статью про GPT-3. Она чё-то здоровая, и до конца пока не дошёл. Но смысл в том, что новый GPT ещё пизже, чем предыдущие, решает новые задачи чисто по тестовому описанию, без дообучения на них.

Upd. Дочитал. Архитектура нейронки та же самая, что и в GPT-2, но размер ещё больше. Обучались на common crawl и нескольких датасетах почище. И попробовали больше разных применений.

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

Понятно, зачем это нужно: хочется не создавать зафайнтюненную модель под каждую новую задачу (это сложненько, и легко переобучиться), а иметь one model to rule them all. И демонстрация, что так можно, конечно, впечатляет. Но для индустрии этот результат примерно бесполезный: одна огроменная модель, которая перформит неидеально, всё-таки менее привлекательно, чем набор маленьких и наилучших на своей задаче моделек. Конечно, то, что сейчас SOTA, маленьким и так в основном не назовёшь, но это уже отдельная проблема.
#sotanlu
В своём путешествии по SOTA NLU решил заглянуть на бенчмарк GLUE от 2018 года, который уже успели сильно (и за дело) закритиковать, но который таки породил кучу всего полезного. В частности, BERT стал известен во многом благодаря прорыву именно на этом бенчмарке.

Итак, из чего сделан GLUE? Это 9 задачек, в каждой из которых надо классифицировать или одно предложение, или их пару. То есть в принципе, казалось бы, бенчмарк можно решить, имея очень крутой sentence encoder. Но на самом деле история пошла другим путём, путём кросс-атеншна, который по понятным причинам заводится на парах предложений сильно проще.

Итак, задачки:
- CoLA: является ли предложение грамматически корректным;
- SST-2: двухклассовый анализ тональности (позитивно/негативно окрашенные предложения);
- MRPC, QQP: классификация пар предложений - являются ли они семантически эквивалентными;
- STS-B: то же самое, только предложения разделены на 5 классов похожести.
- MNLI, RTE: классификация отношения между парой предложений: второе следует из первого, или противоречит ему, или ни то ни другое.
- QNLI: содержит ли первое предложение ответ на вопрос, заданный во втором
- WNLI: тоже классификация, следует ли второе предложение из первого, но особого вида: второе предложение - это первое, в котором местоимение заменили объектом, который оно обозначает, либо неподходящим объектом. То есть это попытка загнать winograd schema challenge в формат классификации предложений.

На момент публикации бенчмарка наилучший средний скор по всем моделькам был 0.7 - у BiLSTM поверх ELMO-эмбеддингов. BERT поднял его до 0.8, а сейчас он уже 0.9. Так что можно действительно считать, что GLUE практически решён. Тем более что кожаные мешки, и не просто мешки, а лингвисты, решили его всего лишь на 0.87.

Именно поэтому в прошлом году выкатили новый бенчмарк - SuperGLUE. Хотя и на нём модель T5 от Google уже почти догнала своих белковых создателей. Но пока только "почти".
̶с̶а̶м̶̶о̶изолента мёбиуса
#sotanlu В своём путешествии по SOTA NLU решил заглянуть на бенчмарк GLUE от 2018 года, который уже успели сильно (и за дело) закритиковать, но который таки породил кучу всего полезного. В частности, BERT стал известен во многом благодаря прорыву именно на…
#sotanlu
Пришла очередь статьи про SuperGLUE. Этот бенчмарк выкатили спустя год после GLUE, который уже дорешали до сверх-человеческого уровня. В нём 8 задач:
- BoolQ: Дан абзац текста и бинарный вопрос про этот абзац (ответ "да" или "нет"), на который надо ответить;
- CB: Дан абзац текста и отдельное утверждение из текста, и надо определить, считает ли автор текста это утверждение истинным или ложным;
- COPA: Дано предложение и ещё два, и надо определить, какое из этих двух является причиной либо следствием данного;
- MultiRC: Дан абзац, вопрос по нему, и список ответов, которые надо разметить как истинные или ложные;
- ReCoRD: Дан абзац и вопрос по нему с пропущенным словом, которое надо восстановить из предложенных вариантов;
- RTE - как и в GLUE, надо определить, следует ли второе предложение из первого;
- WiC - даны два предложения, в которых используется одно и то же слово, и надо предсказать, в одном и том же смысле ли оно использовано;
- WSC - надо выбрать, относится ли местоимение в тексте к предложенной сущности из этого же текста.

Прокачанны BERTовый бейзлайн набрал на этих задачах в среднем 71.5 балл из 100, а живые люди - 89.8. Из чего авторы статьи сделали заключение, что задачи в целом сложные, и нужно ещё много ботать, прежде чем человечество научит машины их решать.
А потом ребята из Фейсбука обучили свой BERT c парой улучшений, RoBERTa, и набрали 84.6 балла тупо за счёт аккуратности.
А ещё потом гугловский T5 (seq2seq трансформер, обобщение BERT и GPT) набрал уже 89.3 балла, а NLU всё ещё не "решён". Так что, похоже, человечеству нужен новый бенчмарковый датасет.
#ботоводство
Сегодня решил отдохнуть от пипблота, и вернулся к @the_watchman_bot на денёк - поправил кнопки в режиме коуча, добавил счётчик вопросов и дополнительный вопрос для обратной связи.
Сейчас думаю, что ещё сделать со Стражником, чтобы сделать его пизже.
Наверное, правильный ответ: пойти поспрашивать людей.
#sotanlu
Начал разбираться с вышкинским бенчмарком, и вижу, что всё плохо. 🤦

Но начнём с конструктивного. Речь идёт об этой статье: https://arxiv.org/abs/1910.13291
Ребята взяли три GLUE-подобных датасета, и бенчмаркают эмбеддинги предложений на них:
1) MCQA: ребята наскрапали вопросы из части А ЕГЭ по разным предметам, и задача для модельки - выбрать правильный ответ из четырёх предложенных. Правильный ответ - обычно короткая именная фраза; иногда она является продолжением предложения-вопроса, иногда - отдельным предложением. В целом задача дофига сложная: для её решения нужно шарить не только в русском языке, но и в школьных предметах.
2) NSP: из датасета Ленты взяли коротких абзацев, разрезали каждый пополам в случайном месте, и к каждой левой половинке нашли три отрицательных примера, заканчивающихся на те же три слова. Задача - из четырёх продолжений левой половинки выбрать то, которое следовало именно за ней. Задачка кажется полегче предыдущей (по крайней мере, для человека), но именно sentence embedder может с ней не очень хорошо справляться, т.к. сами предложения - рваные. Если в обучающей выборке такого не было, моделька может начать выдавать хрень.
3) PI: всё тот же мой любимый датасет paraphraser.ru, который использовали и в deepPavlovEval, собранный из заголовков новостей.

Вышкинцы, как и диппавловские физтехи, сравнивают fasttext, ELMO и BERT, забывая почему-то и про ванильные w2v, и про клёвые мультиязычные USE и Laser. Я честно не понимаю, почему.

Теперь о плохом:
Во-первых, код писали студенты, и он не запускается. До того, что в разных файлах сигнатуры одной и той же функции разные. Попробую их помучить, конечно. Но, возможно, попытка воспроизведения этого добра - дурацкая затея.
Во-вторых, (1) и (2) задачи - конечно, интересные, но не очень похожи на те прикладные задачи, для которых мне на самом деле хотелось бы использовать эмбеддинги предложений. И потому не очень понятно, насколько они вообще полезны для оценки тех моделек, которые я собираюсь изучать.

Впрочем, мне настолько нравится само намерение вышкинских ребят, что его стрёмную реализацию я готов простить 🙂
#sotanlu
Я в марте писал про многофункционального чатбота от Фейсбука, и один из датасетов, на которых он учился - Empathetic Dialogue.
Этот датасет собрали тоже в Facebook Research и написали про него пейпер: https://arxiv.org/abs/1811.00207
Сам датасет - 25К коротеньких диалогов, собранных на MechanicalTurk, где один спикер ("рассказчик") изображает определенную эмоцию и жизненную ситуацию, с которой она связана, а другой ("слушатель") его активно слушает и эмпатично отвечает. Типа такого:
- Got a bag of candy I'm polishing off. Diabetes be damned
- uh oh! Have you checked your sugar lately?
- I haven't gotten a physical in over a year.
- After that bag of candy, you may want to!

Ребята попробовали пообучать на этих данных разные болталки, и оказалось, что retrieval-болталки по-прежнему работают лучше генеративных, и что сильно помогает перед искомым текстом довписать теги: выделенные из него отдельными классификаторами эмоцию или тему. И что в целом болталки справляются неплохо - эмпатичность и релевантность оцениваются людьми на 4 балла из 5, а fluencу на все 4.6 (как у хьюманов - но это и неудивительно, если ты отвечаешь готовыми фразами).

Прочитав эту статью, я предпринял героическую попытку перевести этот датасет на русский, чтобы встроить в своего бота. Конечно же, не вышло - API яндекс.переводчика выдаёт какой-то трэш, а другие онлайн переводчики чё-то дороговаты.
Надеюсь, удастся с кем-нибудь скооперироваться и перевести этот датасет вскладчину)
А вот что я писал про большого фейсбучного чатбота
Forwarded from Матчасть
Недавно Facebook Research опубликовали статью про нового чатбота. Вот их блогпост: https://ai.facebook.com/blog/state-of-the-art-open-source-chatbot/. Если у вас нет времени или большого интереса, почитайте его. Если время и интерес есть, почитайте и их большую статью. Она длинная, но затрагивает много вещей, важных для понимания текущего состояния чатботов и NLP в целом. В частности:

1. Размеры моделей продолжают расти. Фейсбучная модель втрое жирнее, чем гугловская Meena (предыдущая SOTA); в ней уже почти 10 миллиардов параметров. Хотя по качеству этот гигант вроде не сильно лучше, чем втрое меньшая модель.
2. Разработчики сблендили несколько подходов к генерации диалоговых ответов и несколько разных датасетов, сфокусированных на диалоговых навыках. Получилась кракозябра, работающая ожидаемо лучше, чем более узкоспециализированые модельки.
3. Для генерации ответов использовали (А) retrieval-модельку, выбирающую ответ, наиболее подходящий под контекст, из готового набора ответов. (Б) классический seq2seq трансформер, генерирующую ответ слово-за-словом, глядя на контекст и готовый префикс ответа. (В) их гибрид, так же генерирующий ответ слово-за-словом, но но глядя так же на ответ, предложенный retrieval-моделью, или на подтянутый по ключевым словам абзац из Википедии.
4. Файн-тюнили модели на трёх датасетах: ConvAI2 (диалоги, где участники общались с учётом описания приписанного им персонажа), Empathetic Dialogues (где один участник описывал свою ситуацию, а другой эмпатично активно слушал), и Wizard of Wikipedia (где обсуждение строилось вокруг релевантного абзаца из Википедии). Разнообразные задачи - разнообразное и поведение получившегося бота.
5. Разные боты друг с другом сравнивались ассессорами side-by-side. Это не настолько секси, как более явные числовые метрики по отдельно взятому диалогу, зато, возможно, результат получается менее шумным.
6. Если оценивать диалоги бота с ботом, то модель с поиском по готовым ответам работает лучше, чем модель с генерацией ответов пословно. А если оценивать диалоги бота с человеком, то наоборот. Из этого следует как минимум то, что бот общается с ботом как-то существенно иначе, чем человек. И ещё, что retrieval подход сдаёт свои позиции довольно медленно.
7. При генерации ответов дофига важно ограничивать пространство возможных реплик. В частности, не допускать слишком коротких ответов или ответов с повторяющимися словами. В результате применения этих простых фильтров качество растёт прям существенно. В ходе своих экспериментов товарищи из фейсбука применяли разные фильтры, и, возможно, непонятные результаты из предыдущего пункта объясняются именно этим.
Forwarded from Матчасть
8. Авторы статьи умнички и самостоятельно находят косяки в своём чатботе. Самый неприятный из них - это, кажется, забывчивость, например, когда бот снова и снова задаёт один и тот же вопрос. Другая особенность бота - что он уворачивается от углубления в любой разговор, предлагая сменить тему. Что предлагает тему - это хорошо, но что уклоняется от ответов - не очень. И ещё одно слегка бесящее свойство этого и других ботов - когда у них нет фактического ответа, они не сознаются в этом, а выдумывают его.
9. Авторы статьи справедливо замечают, что качество человеческой оценки бота не определяется его перплексией на тестовых диалогах, ибо и тестовые диалоги могут быть разные, и для одной и той же модели разные алгоритмы декодирования дают разное качество.

Итак, Гугл свой чатботный ход сделал зимой, Фейсбук - весной. Ждём, кто выступит следующий (: