Привет, я Буянов Игорь. Разработчик в команде разметки MTS AI. Сегодня я вам расскажу о способе понять, на что способен ваш аугментатор текста и в каких случаях его лучше использовать.



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


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


Немного теории


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


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


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


A теперь ближе к практике


У нашей команды NLP был внутренний сервис аугментации, который мог использовать любой NLP-инженер для обогащения своего датасета. На момент тестирования внутри сервиса работали три аугментатора:


  • FaissAugmenter — по сути такой семантический поисковик — ты ему текст, а он тебе обратно возвращает список самых похожих текстов из заранее созданной коллекции. В нашем случае это был корпус текстов из социальных сетей с 48 млн. репликами.
  • BertAugmenter — в этом аугментаторе используется мощь предобученной модели BERT предсказывать пропущенные слова по контексту. В случайное место входного текста вставлялась маска и BERT предсказывал слово, которое могло бы там стоять.
  • Paraphraser — перефразирование или парафраз текста кажется тоже вполне естественным способом обогащения текста. Если кто-то забыл, то перефразирование, это переписывание текста другими словами, сохраняя исходный смысл. Отмечу только, что конкретно этот парафразер был обучен на художественных текстах. Этот факт нам понадобится в дальнейшем.

Сама методика


Проста как две копейки:
1) Берем сто текстов из датасета с интересующим нас домена;
2) Прогоняем тесты через аугментатор;
3) Распределяем получившийся результат по определенным категориям.


А вот и сами категории:


  1. Некорректный язык — грамматически неестественные нарушения.
  2. Изменение смысла — получившийся текст частично или полностью подменяет смысл высказывание. Не перестаю удивляться, что иногда это можно сделать одним словом.
  3. Без изменений — применение аугментатора никак не изменило исходный текст.
  4. Допустимо — некоторые спорные примеры, которые вроде и грамматически правильно, и смысл вроде как не сильно изменился, но языковая интуиция слегка протестует.
  5. Хороший результат — то, с чем можно работать.

При должной сноровке, а также в зависимости от длины текстов, оценка работы аугментатора занимает от 10 до 30 минут.


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


Результаты


FaissAugmenter


Статистика:


Некорректно          2
Изменение смысла    31
Без изменений       24
Допустимо            3
Хорошо              40

Примеры

очень много ошибок в ответах | Очень много ошибок в вопросах. 2
бот, прости, но ты неумный | Валер, прости, но ты е***н. 2


твои ошибки мешают | Свои ошибки. 1
давай поясню, что именно не понял? | Не понял, поясни, что не понимать? 1


хоть куда | Хоть куда. 3
первоклассно | Первоклассно. 3


снова железяка ошиблась, да? | Сломалась, да? 4
сформулировал как смог | Как смог d. 4
Как мне выразиться по другому, чтобы было понятнее? | Как мне по-русски сформулировать. 4


Написано все правильно, что не ясно? | Что не так? Все верно написано. 5
ответ мимо кассы | Мимо кассы. 5
ты сейчас ошибаешься | Вот ты ошибаешься сейчас. 5


Вывод:
Поскольку данный аугментатор является поисковиком, то вероятность получения грамматически неверных текстов полностью зависит от качества текстов в корпусе. Большое количество смыслоизмененных текстов можно связать с тем, что корпус по домену находится довольно далеко или используется плохое представление текстов. Без изменений остаются тексты, длина которых около 3 токенов, т.е. когда повышается шанс найти совпадение один-в-один.


BertAugmenter


Статистика:


Некорректно         16
Изменение смысла     8
Без изменений       27
Допустимо           11
Хорошо              38

Примеры
бот, прости, но ты неумный | Я бот, ты прости, но ты неумный.    1
Я что не по-русски пишу, чё тупишь? | Я сказал что не по-русски пишу, чё ты тупишь?   1

бот, ты уходишь от ответа  | Ты бот, ты уходишь от прямого ответа.   2
твои ошибки мешают | Твои ошибки мешают жить.    2

полный абсурд  | Полный абсурд.  3
почему не отвечаешь мне?  |  Почему ты не отвечаешь мне? 3

ты не прав  | Ты был не прав. 4
И что тут не понятного?  | И что тут такого не совсем понятного?   4
с первого раза не понятно? | С самого первого раза не понятно?   4

ответ мимо кассы  |  Твой ответ мимо кассы.  5
давай поясню, что именно не понял? | Давай я поясню, что именно ты не понял? 5

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


Paraphraser


Статистика:


Некорректно         14
Изменение смысла    55
Без изменений        0
Допустимо           10
Хорошо              20

Примеры
Я что не по-русски пишу, чё тупишь?  | Я вовсе не по-русски пишу и не понимаю, что ты имеешь в виду?  1
Я поняла с первого раза  | Я уж и сам не знаю с первого раза. 1

очень много ошибок в ответах | Может быть, есть еще какие-нибудь ошибки в ответах?    2
до вечера ответа ждать? | На что вы будете мне отвечать? 2

бот, прости, но ты неумный  | Да нет, прости, но ты такой неумный.   4
Супер-пупер | Чувак, ты пупер пупер пупер пупер. 4

сколько еще раз ты это скажешь? | Сколько же раз ты еще это скажешь? 5
как можно так медленно отвечать | Почему ты так медленно отвечаешь?  5

Вывод:
Отличительная особенность этого аугментатора, как видно, заключается в отсутствии повторений — аугментатор всегда найдет, как изменить фразу даже из двух слов. Однако, ввиду того, что языковая модель была обучена на данных с доменом литературного языка — весьма далеком от домена датасета — то и результат такой, что у более чем половины текстов смысл изменен.


Какие глобальные выводы можно сделать


Что можно сказать по мотивам этих результатов:


  • Для сохранения смысла текстов, необходимо соблюсти условие близости доменов между обогащаемыми данными и данными, на которых были тренированы модели.
  • BERT показал довольно маленький процент некорректно сгенерированных текстов (~15%), хотя привнесенное разнообразие весьма сомнительное.
  • Необходимо учитывать длину текста при работе с тем или иным аугментатором.

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


Методику можно попытаться автоматизировать, используя, например, метрики автоматической оценки сохранения смысла на основе языковых моделей [1], а посчитать примеры без изменений вопрос пары строчек кода с помощью библиотеки с расстоянием Левенштейна.


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


Ссылки


  1. Ivan P. Yamshchikov et al., Style-transfer and Paraphrase: Looking for a Sensible Semantic Similarity Metric, AAAI, 2020

Комментарии (2)


  1. inkoziev
    30.12.2022 09:22

    Игорь, а можете уточнить, какая именно MLM модель использовалась в вашей оценке "BertScore"? Ибо их много и ведут они себя на этой задаче очень по-разному.

    Для Paraphraser тоже были бы интересны какие-то технические детали, как минимум какая модель под капотом, какие параметры генерации, как ранжировались кандидаты.


    1. aarmaageedoon Автор
      30.12.2022 12:38

      Приветствую, Илья. Рад вас видеть в комментах) Однако, к сожалению, я не могу сказать много, т.к. сам выступал в роли потребителя сервиса.

      Судя по репе, использовался base bert, который был до обучен на, скорее всего, наших внутренних данных. В парафразере используется GPT-2, не знаю, внешняя ли она или была натренирована нами. Особо интересных параметров там нет, а в качестве способа ранжирования используется механизм внутри класса GPT2LMHeadModel из transformers. Судя по тому, что там указано top-k и нет параметра beam_size, то думаю, это обычное жадное декодирование.