̶с̶а̶м̶̶о̶изолента мёбиуса
2.48K subscribers
14 photos
2 videos
1 file
194 links
Костыли и технологии для обработки естественных языков. Обзоры статей и личный опыт. by @cointegrated
Download Telegram
Как посмотреть, кто забил все gpu на коммунтальном сервере и не использует: watch -c gpustat -cp --color
(предварительно pip install gpustat)
Недавно понадобился корпус plain text русского языка.
Мне хвалили Тайгу, но она по умолчанию лежит в conllu формате, т.е. с кучей синтаксической разметки. Я переупаковал архив, оставив только текст; можно пользоваться.
Сейчас, впрочем, это уже не так актуально, т.к. rusvectores выложили в открытый доступ НКРЯ, который раньше был закрытым. Впрочем, Тайга всё равно больше и прикольнее)
Одна из особенностей естественного языка, важная для разработки чатботов, это эллипсис, то есть пропуск слов, понятных из контекста. В частности, люди любят отвечать на вопросы "эхом": там, где ожидается ответ "да/нет", человек повторяет слово из вопроса. Например, так:

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

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

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

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

А ещё они собрали большой датасет, на котором потенциально можно бенчмаркать свои собственные модельки для переноса стиля.
Если вы когда-нибудь захотите с нуля решить задачу тегирования текстов (типа NER), плюс-минус стандартный рецепт такой:
- Попробовать бейзлайн, основанный на словаре (для быстрого поиска большого количества подстрок в тексте удобно использовать pyahocorasick);
- Если словаря вам мало мало, разметить данные для ML можно в бесплатном labelstudio;
- Пофайнтюнить на этой разметке BERT или другой трансформер для вашего языка, примерно как в этом блокноте.
̶с̶а̶м̶̶о̶изолента мёбиуса
Клёвая статья Reformulating Unsupervised Style Transfer as Paraphrase Generation (https://arxiv.org/abs/2010.05700) Решаемая задача: научиться менять стиль предложения на заранее заданный, не меняя при этом его смысл. Решение: обучить этому seq2seq-модель.…
Прошлогодняя статья A Probabilistic Formulation of Unsupervised Text Style Transfer на ту же тему переноса стиля.

Здесь авторы решили строго вероятностно подойти к решению задачи переноса стиля между стилями, содержащимися в непараллельных корпусах A и B.
Для этого они обучают две языковые модели на A и B, и две seq2seq модели для перефразирования из A в B и обратно (точнее, это одна рекуррентная нейронка с дополнительным флажком для домена). Инновация в том, что авторы собирают из этих моделек конструкцию, честно описывающую совместное правдоподобие корпусов A и B и их "переводов" A' и B', и потом оптимизируют его честную же вариационную нижнюю границу.

В результате авторы получили крутые скоры на ряде задач переноса стиля, составив все свои модели из простых LSTMок. Правда, чуть позже их побила предыдущая описанная мною статья. И, кажется, причиной этого побития было использование предобученных трансформеров, в том числе явно обученных на задачу перефразирования. Всё-таки выучиться сохранять смысл, видя только коллекцию неразмеченных непарных текстов - дофига сложно, и не факт, что возможно вообще. И если уж есть возможность явно поучиться на хоть какой-то задаче перефразирования, стоит этим пользоваться.
Недавняя статья [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) примечательна тем, что модель из нее сейчас сидит на верхушке лидерборда SuperGLUE, обогнав кожаных мешков на пол процентных пункта. Удалось это сделать за счёт пары небольших архитектурных изменений. Про классический BERT известно, что он не очень хорошо учитывает порядок слов. Чтобы справиться с этим, исследователи из Microsoft:

1) Добавили в атеншн веса для позиций токенов относительно друг друга. В ванильном берте позиция учитывается единожды, когда к эмбеддингу токена на самом первом слое добавляется эмбеддинг его абсолютной позиции, и дальше все self-attentions считаются примерно как softmax(Q*K). А в деберте атеншны считаются как softmax(Qc*Kc + Qc*Kp+QpKc), где матрицы с префиксами c учитывают активации на предыдущем слое, т.е. "контент" токена, а матрицы с префиксами p учитывают только позиции токенов относительно друг друга. Таким образом, модель гораздо охотнее выучивается смотреть на определенных соседей слова. И ещё, как бонус, мы получаем возможность обрабатывать неограниченно длинные тексты, т.к. эти самые относительные позиции считаются только по окну ограниченной ширины.

2) Абсолютные позиции токенов добавляются только на самом последнем слое, перед финальным софтмаксом. Не очень понятно, почему именно, но оказалось, что в таком виде их скармливать в модель лучше, чем на самом первом слое, и чем вообще не скармливать. Почему - не очень понятно; может быть, это заставляет модель больше обращать внимания на относительные позиции, а значит, лучше справляться с синтаксическими наворотами.

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

В итоге: мы получаем чуть более крутой BERT, чем раньше, и SuperGLUE, продержавшийся два года, уже тоже пора чем-то заменять.
#sotanlu
Если предобученные модели такие умные, почему им требуются обучающие примеры для такой простой задачи, как классификация текстов? Люди вот вполне могут размечать тексты без обучающих примеров, ориентируясь только на названия классов. В статье Text Classification Using Label Names Only: A Language Model Self-Training Approach (https://arxiv.org/abs/2010.07245) авторы придумали, как заставить BERT делать так же. Правда, им всё-таки нужен для подготовки модели большой неразмеченный корпус.

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

1. Найдем данные названия классов в неразмеченном корпусе, и обычным BERTом предскажем для каждого вхождения топ 50 слов, которые могли бы стоять на их месте.
2. Почистим предсказанные слова, удалив стоп-слова и слова, часто встречающиеся в нескольких классах. Остальные будем считать "характерным словарем для данного класса".
3. Ещё раз пройдемся по всему корпусу, и разметим тексты следующим образом: если в тексте есть такое слово, что из топ 50 его замен минимум 20 входят в характерный словарь класса А, то весь текст относится к классу А. А само это словно заменим на маску, чтобы усложнить задачу
4. Обучим BERT-for-sequence-classification на текстах, которые удалось разметить таким образом.
5. Разметим полученным классификатором оставшиеся тексты, и дообучим классификатор на них тоже.

Оказалось, что на ряде задач классификации этот метод перформит сильно лучше остальных zero-shot бейзлайнов, и соответствует берту, обученному на примерно 50 размеченных примерах на класс.

В целом, идея кажется достаточно хитроумной и даже полезной, особенно для случая, если классов очень много, так что совокупно примеров нужно разметить дофига, но при этом классы достаточно простые, так что подход с ключевыми словами - справится. Напрягает только то, что с каждым новым классом такую модельку нужно будет обучать на всем корпусе заново, и в этом смысле подход явно недотягивает до человеческой гибкости.
Ребята во главе с @yuri_baburov наконец-то затащили русские модели в spacy!
https://nightly.spacy.io/models/ru
spacy - это, если что, примерно самая популярная питонячья либа для прикладного NLP. Там для кучи языков есть морфология, парсеры зависимостей, ner, и очень компактные векторные модели, да и в целом всё компактно и оптимизировано для продакшна. То есть это примерно как обновленная natasha, только ещё можно из коробки переключится на другой язык.
Попробовал русским GPT генерировать вопросы для рефлексии в @the_watchman_bot.
Среди них получилось довольно много нетривиальных. Вот 8 перлов, отобранные из 30 сгенерированных:

- Как Вы относитесь к тому, что ваши друзья должны быть лучшими из лучших?
- Какова ваша цель и за чем она стоит?
- На что способны ваши способности?
- Что для вас является лучшим подарком на Новый год?
- Что нужно сделать, чтобы перестать быть рабом своего тела и начать жить полноценной жизнью без всяких вредных привычек?
- Как давно Вы планируете начать новую жизнь?
- Как часто вы смотрите телевизор (особенно когда он выключен)?
- Что вы знаете о своей работе?
Включил пару своих алисьих навыков в "утреннее шоу", надо было быстренько сделать им нагрузочное тестирование, чтобы понять, с каким RPS их нормально прокачивать.
Нашёл тулзу molotov - питонячий load tester с очень низким порогов входа.
Тем, кто вообще нагрузочное тестирование своих веб-сервисов не проводит, крайне рекомендую)
Недавно я участвовал в последнем хакатоне Яндекса по разработке "городских" навыков Алисы, и позорно его слил. Но было интересно)
У хакатона были три фишки.
1) Тематика: его соорганизатор - правительство Великого Новгорода, и навыки должны быть посвящены этому городу.
2) Возможности: для участников хакатона открыли долгожданную фичу доступа к геолокации (до этого она была только у in-house навыков Яндекса).
3) Формат: хакатон растянули на месяц, в ходе которого сотрудники Яндекса пытались обучить народ правильной методологии разработки голосовых приложений.

Если всё такое вкусное, почему же я запорол этот хакатон?
- У меня тупо было мало времени: сначала я пытался успеть сделать статью к ACL, потом меня захватил водоворот других важных и срочных дел, и в итоге навык всё равно пилил в последнюю ночь.
- У меня не было хорошей идеи. Все мои успешные навыки делают по сути одну вещь, и делают её хорошо: собирают продукты для заказа доставки, ищут другие навыки, засекают время, предлагают отгадать автора цитаты. На этом хакатоне я попробовал сделать навык-экскурсовод, и это оказалось суперсложно, потому что экскурсовод должен хорошо мочь много вещей: ориентироваться на местности, обращать внимание на достопримечательности и интересные места, рассказывать связную историю. Это в принципе можно закодить, но нужно много часов кодинга, и ещё больше часов отладки. И нужен сильный контент: качественные тексты, качественные маршруты для навигации. Это тоже трудоёмко.
- Отсутствие нормальной команды. В одну меня звали сильные ребята, но мне был лень пересаживаться на их фреймворк разработки. В итоге я нашёл себе неопытного партнёра, и это оказалось полным провалом. Когда я погружён в проект достаточно сильно, в неопытного товарища можно отгружать отдельные таски, не требующие большой ответственности, а все ключевые решения принимать самому. Когда времени в обрез, и проектом занимаешься по остаточному принципу, это работает так себе: на коммуникацию уходит дефицитное время, которое я бы иначе потратил, чтобы сделать хоть что-нибудь. В следующий раз буду следить, чтобы в команде был кто-то решительный и инициативный, даже если я сам намереваюсь работать на отвали.
- Низкая мотивация. В качестве приза Яндекс предлагал свою колонку (которая в принципе у меня уже есть), а самостоятельно навык монетизировать не очень интересно: гостей Новгорода, являющихся пользователями Алисы и готовых платить за навык-экскурсовод вряд ли много. Возможно, для Москвы, которая сильно больше, такое разработать ещё стоит попробовать.

Работать с "географическим" навыком оказалось неожиданно сложно, ибо это требует многозадачности: нужно и выдерживать сюжет рассказа, и управлять перемещениями пользователя, и адекватно отвечать на все вопросы, возникающие в процессе - а их у туриста возникает очень много. Пока что я не понял, как это сделать правильно. Но, наверное, буду ещё пытаться, ибо это любопытно 🙃
Статья Beyond BLEU: Training Neural Machine Translation with Semantic Similarity - сентябрь 2019.

В принципе, смысл понятен из названия: учить NMT, добавив в лосс косинусное сходство сгенерированных фраз с образцовым переводом, вычисленное заранее обученной моделью. Модель сходства - мешок эмбеддингов, обучалась на корупсе парафраз, полученных машинным переводом.
Так уже делали раньше с BLEU, но метрика BLEU слишком разреженная, и оказалось, что с лоссом, основнанным на эмбеддинговом сходстве, переводчик учится быстрее и качественнее.

Этот урок можно попробовать обобщить не только для перевода, но и для других задач NLG: пытаться максимизировать не только правдоподобие правильного ответа, но ещё и оценку семантического сходства ответа модели с правильным ответом.

Кажется, что эта штука хорошо работает, потому что по смыслу это transfer learning: знания о семантике "перекачиваются" из модели сходства в переводчик или другую генерировалку текстов. А значит, особенно полезным такой подход должен быть, когда обучающих данных сравнительно мало. Собственно, в оригинальной статье так и было: в каждой языковой паре, на которой делали эксперименты, было 200-300 тысяч обучающих примеров, что для машинного перевода довольно скудно.

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

Одна из маленьких полезных тулзовин, доставшаяся мне с дорожки по детекции токсичных спанов в тексте.
Посмотрел видос митапа от сберовского Салюта по разработке их навыков - "смартапов" (https://youtu.be/Y6J3QR-Tq6I) . Видос на три часа, и даже на x2 довольно долго получается. В целом, рекомендую ещё их доки: https://salute.sber.ru/smartmarket/dev/.

На митапе показывали, кроме прочего, интервью с тремя победителями их программы поощрения, которые получили кучу денег за это. Их пересказ я опущу, сосредоточусь на том, что рассказали сотрудники Сбера.

Есть куча гибких настроек синтеза и распознавания речи, типа подсказок распознавателю, какие слова ожидать и сколько ждать.

Монетизация - через апи покупки товаров и услуг, для подключения нужно юрлицо или ИП. Встроенную в аппы рекламу обещают через полгода.

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

Салют предлагает несколько сервисов для исполнения сценарной логики: smartservices для действий с пользователем, NLU сервисы, и среда исполнения для аппов на графе.

Граф - это язык визуального создания сценариев state machine, типа как aimylogic. Есть классификаторы интентов. Можно смотреть логи.

Code - IDE в браузере на своём DSL со вставками JS. Можно интегрироваться с гитхабом и делать совместную разработку. Можно делать слот филлинг, есть куча именованных сущностей.

Юрлица могут присоединиться к программе аккредитации Салюта - они получат продвижение и приоритетную поддержку. На сайте есть требования, одним из обязательных является монетизация.

В целом, создалось ощущение, что Сбер очень старается привлекать в свой голосовой помощник внешних разработчиков, любит и облизывает их. Это радует. Если даже весьма спартанский Яндекс развил довольно богатую экосистему вокруг Алисы, то у Сбера, похоже, есть все шансы сделать что-то грандиозное.

Сам я собираюсь в каком-то обозримом будущем попробовать разработать развлекательный смартап. Если хотите поучаствовать, пишите)

P.S. На следующих выходных у них хакатон - нужно будет делать свой креативны будильник. Опять же, если хотите попробовать сделать это вместе со мной, пишите в личку.
Решил посмотреть, какие навыки побеждают в премии Алисы - ежеквартальном состязании её внешних навыков.

В декабрьской премии все 10 призовых мест заняли игры.

1 место - игра песни. Очень громкий и музыкальный, основанный на куче аудиозаписей. Основная механика - играется аудиозапись задом наперёд, надо её отгадать и назвать песню или исполнителя. На мой взгляд, игра довольно растянута, а песни - попсовые. Но видимо, массовому пользователю нравится. Возможно, все играют кнопками, NLU не очень сильный. Есть ещё режим продолжения песни (по вариантам), он очень простой, т.к. вопросы там в рифму, и тоже медленно играется. Но видимо, пользователям это ок, и их развлекает то, что диалог перемежается музыкой, и что есть много красивых карточек с картинками.
2 место - игра магазин. Посетитель описывает игрушку, и её надо называть. Тоже основан на аудиозаписях, разных предзаписанных голосах, много музыки, много карточек с картинками. Явно рассчитано на маленьких детей, но их в Алисе, по ходу, много.
3 место - игра чудесное поле, рассчитанная на мультиплеер. Надо угадывать загаданное слово по буквам, пока кто-то не отгадает его полностью. Механика очень простая, но за счёт азарта и сложности затягивает.
4 место - тайна темного лабиринта - чисто картиночная игра, классический квест на выход из комнаты. Играется довольно быстро, много звуков, много простых загадок по пути. Собственно ориентироваться слишком много не надо. Подсказки просит за 10 рублей. В целом, тоже довольно азартно.
5 место - угадай фильмы. Включает аудио отрывки из фильмов, в принципе нормально играется одним голосом, потом рассказывает любопытные факты об этих фильмах. Хорошо играется за счёт того, что аудиоотрывки даются интересные и яркие и часто музыкальные, и слушать их прикольно, и факты тоже прикольные. И фильмы в основном советские и хорошо узнаваемые.

В моём личном рейтинге "чудесное поле" и "угадай фильмы" - лучшие из этих 5. Места 6-10 рассматривать не стал.

Премия за сентябрь дала только три приза, тоже все игры.
1 место - море слов. Надо собирать слова из букв. Меню с красивыми иконками (как и во многих навыках), приятные звуки. На мой вкус играется тоже медленновато и монотонно, не хватает разнообразия реплик и какого-то драйва. Ну или может быть просто слова слишком лёгкие. Я бы первое место такому навыку не дал. Но, наверное, дети любят.
2 место - пьяный аристотель - запустить мне не удалось. Навык говорит "работа приостановлена". Но вроде как это игра для весёлой компании.
3 место - угадай воинское звание - часть проекта quiz101 по заваливанию Алисы викторинами. Сделан армейски стилизованно, погоны на картинках, играет Прощание Славянки и другие марши, после каждого звания про него рассказывают.

Вывод: похоже, типичным пользователям Алисы нравятся только игры, и её сотрудники не пытаются поощрять "полезные" навыки. Среди самих игр много креативных, но лично я бы ими регулярно пользоваться не стал. Впрочем, я в игры в целом не особо играю, не то что в голосовые.

Думаю, что хотя бы один крутой игровой навык сделать нужно, просто чтобы ознакомиться с этим жанром. И идти куда-то ещё)
Пара статей про мультиязычные модельки.

LaBSE: language-agnostic BERT sentence embeddings (2020)
Чего хотят авторы: добыть мультиязычные эмбеддинги предложений, как Laser или mUSE, только лучше: чтоб и хорошо перформили на редких языках, и не теряли качество на самых частотных.
Что сделали: предобучили BERT на задачах masked language modeling + translation language modeling (см.ниже) для 109 языков, потом пофайнтюнили на задаче translation ranking. Translation ranking - значит, в батч подаются много пар предложений на языках А и Б, и надо правильно выбрать, какие являются переводами каких. Сходство предложений изменяется как косинусная близость между [CLS] эмбеддингами, и у правильной пары она должна быть хотя бы на margin больше, чем у всех неправильных пар. Замечу ещё, что в модели конский wordpiece словарь - 500к токенов, против 30К у BERT-multilingual, так что редкие языки они должны покрывать куда полнее.
Оценивают это также на задачах подбора правильных переводов на корпусах BUCC, Tatoeba, UN. Для топ 14 языков качество выходит чуть выше чем у mUSE и сравнимо с Laser, на большее редких языках - сильно лучше, чем Laser. На англоязычных задачах semantic text similarity перформанс, впрочем, ниже, чем у mUSE или SentenceBERT - но это они на моноязычных датасетах с парами предложений вообще не файн-тюнились.
Модель выложена на tfhub и даже уже на huggingface, можно пользоваться. Есть основания надеяться, что с её помощью межъязычный transfer learning может получиться хорошо.

Cross-lingual Language Model Pretraining (2019)
В этой статье как раз представляют translation language modeling, на котором предобучали LaBSE. Задача - получить хорошие предобученные мультиязычные модели для NLU. Сравнивают три задачи: causal language modeling CLM, masked language modeling MLM, и MLM+TLM. TLM работает так: в BERT подаётся пара предложений с одинаковым смыслом на разных языках, причем segment embeddings обозначают язык, а position embeddings в обоих предложениях идут с нуля, и к такому инпуту применяется обычное MLM. Поскольку два предложения могут _внимать_ друг другу, модель выучивается сопоставлять слова из разных языков.
Модель, обученную на MLM+TLM, тестировали на датасете XNLI, и выбили SOTA с большим отрывом в двух сетингах: 0-shot (когда модель учится NLI только на англоязычных парах предложений, а потом применяется к куче языков), и translate-train (когда англоязычные обучающие примеры переводятся на все языки, и классификатор учится на многоязычном корпусе).
Модель, обученная только на MLM (без параллельных корпусов) оказалась полезной для инициализации как unsupervised, так и supervised моделей для машинного перевода - оба раза взяли новый рекорд. Языковые модели CLM для редких языков дали более низкую перплексию, чем монолингвальные (проверяли на непальском). Наконец, MLM модель дала словные эмбеддинги, лучше совпадающие для пар слов из разных языков, чем mUSE.
Модельки есть на гитхабе и называются XLM.

Upd. Потестировал LaBSE для русского языка на задаче детектирования парафраз с paraphraser.ru. Оказалось на одном уровне с rubert-sentence от DeepPavlov, чуть лучше чем Laser, и сильно лучше, чем mUSE, BERT-multilingual, SBERT от Сбера, и разные более простые бейзлайны.
RuSentEval: Linguistic Source, Encoder Force!
Коллеги из НИУ ВШЭ опубликовали статью, где они препарируют предобученные трансформеры, выясняя, какими лингвистическими свойствами обладают их представления предложений при работе с русским и английским языком. Делается это так: берётся эмбеддинг предложения (как средний эмбеддинг всех токенов на выбранном слое), и поверх него обучают простенький классификатор предсказывать какое-то лингвистическое свойство предложения. Свойства разделили на три группы: поверхностные (длина предложения, вхождение определенных слов), синтаксические (тип связи между вложенными предложениями, обезличенность, глубина синтаксического дерева, наличие эллипсиса, неправильный порядок слов), и семантические (число и род субъекта и объекта, наклонение, вид и время предиката). В качестве моделей используют мультиязычные BERT, BART, LaBSE, XLM-R и MiniLM из huggingface. Довольно странно, что не стали рассматривать специализированные sentence encoders - Laser и USE.
Выяснили, что качество и свойства представления предложения моделями примерно одинаковые для русского и для английского языка - и это неожиданно. Для "поверхностных" задач более полезными оказались эмбеддинги с первых слоев, для синтаксических - с более глубоких, что весьма ожидаемо.
Датасеты и код выложены на гитхаб, так что если будете обучать свой энкодер для русского языка, можно будет сразу проверить, насколько он умеет в лингвистику.
Работая в Яндексе, я часто слышал людей, описывающих свою работу как "перекладывание jsonов". Но насколько перекладывательным на самом деле может быть перекладвание, я ощутил только сейчас, когда попробовал разработать навык Алисы для умного дома - интегрировать с ней производителя отопительного оборудования. Это довольно любопытный опыт:
- Работать с NLU и NLG не надо, это происходит полностью на стороне Яндекса.
- Необходимость сделать связку аккаунтов заставляет наконец-то разобраться, как работает OAuth.
- Вся оставшаяся работа - по сути, приведение к общему знаменателю мира Умного дома Яндекса и мира моих отопительных систем.
- Пришлось разобраться в предметной области: контроллерах, котлах, отопительных контурах, нагревании воды, теплых полах, отопительных кривых.
- Разработать навык - недорого. Сказать "Алиса, сделай в гостиной потеплее" - бесценно.
Свежая статья Self-training Improves Pre-training for Natural Language Understanding
Едва ли не основная проблема в NLU - дефицит и дороговизна релевантных размеченных данных. Произошедшая три года назад революция предобученных трансформеров частично решила эту проблему: если долго обучать нейросеть как языковую модель, то, оказывается, и задачи классификации она ухватывает с небольшим числом примеров. Есть и другие способы преодолеть маленькость обучающей выборки. Один из них - аугментация: как-то деформировать обучающие примеры, повысив их разнообразие. Это офигенно работает для картинок, ведь их можно вертеть, отражать, накладывать шум, менять палитру и масштаб, - но не так хорошо работает для текстов, ибо при деформации они обычно теряют смысл и складность. И есть ещё self-learning (или же pseudo labeling): обученной моделью разметить неразмеченные примеры, и на этой разметке её же и дообучить. Хорошо работает, если примеры релевантные, а доразметка надёжная. Так вот авторы статьи как раз этого и добились.

Что сделали: взяли кучу задач на классификацию текстов, и для каждой помайнили из миллиардного корпуса предложений (Common Crawl) дополнительные обучающие примеры. Как майнили: сначала отобрали по косинусной близости к размеченным примерам, потом разметили уже обученной RoBERTa. Косинусную близость брали из собственной модели, обученной на детекцию парафраз. Оказалось, что почти ко всем задачам такая схема докидывает пару процентов к точности (по сравнению с просто файнтюнингом RoBERTa). И особенно она хорошо докидывает при дистилляции классификаторов: для дистилляции нужно сильно больше релевантных текстов, чем для файнтюнинга.

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