Аугментация для текстов (Text Augmentation)

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

Аугментация (augmentation) – это построение дополнительных данных из исходных при решении задач машинного обучения. Обычно при аугментации применяют преобразования исходных объектов, которые не меняют их метки, но меняют (иногда существенно) описания. Например, если мы, тренируя нейросеть, которая должна отличать фотографии кошек от фотографий собак, будем вращать, растягивать, менять яркость и контрастность исходных изображений, то это не изменит того, что на них изображено, но даст возможность обучиться сети на «плохих», деформированных фотографиях, а также на ракурсах, которые могут быть в недостатке в обучающей выборке.

Аугментация текстов немного сложнее аугментации изображений. Во-первых, преобразуя текст больше шансов исказить его смысл (или вообще получить бессмысленный текст). Во-вторых, здесь преобразования «менее автоматические». Например, чтобы повернуть фотографию не надо быть фотографом или знать законы оптики, а вот чтобы перефразировать какое-то предложение надо быть, по крайней мере, носителем языка (а также знать синонимы, контекст и т.п.)

Недостижимая мечта при аугментации текста это как раз перефразирование, например,

Для себя автор систематизировал аугментации текста следующим образом:

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

Замена синонимом

Самый простой способ перефразировать — заменять слова синонимами (Synonym Replacement). Обычные замены с помощью словаря синонимов рассматривались в работе Zhang et al. Character-level Convolutional Networks for Text Classification. Ниже в примере показано, что подобная замена может быть и некорректной. Так, слово «лёгкие» может быть существительным или прилагательным, при этом совершенно меняя смысл. Обычно при замене не выбирают стоп-слова (артикли, предлоги, союзы и другие очень часто встречающиеся слова, которые не передают основной смысл текста).

Сокращения

Можно как применять какие-то принятые сокращения (так как = т.к., так далее = тд), так и «раскрывать эти сокращения». Есть списки подобных принятых сокращений. Например, для английского языка такой список есть на Wiki. Не все сокращения можно однозначно раскрыть, например в английском языке «He’s» может означать «Не is», а может «He has». Есть библиотека для подобных аугментаций.

Использование представлений слов

Случайные слова заменяем на близкие к ним в пространстве представлений (Word Embeddings). Как показано в примере, здесь не всегда используются синонимы. Часто — слова, которые употребляются в похожих контекстах или вместе с заменяемым словом. Чтобы обезопасить себя от нежелательных замен, можно заменять только словом той же части речи.

Такую аугментацию применяли в работе Wang and Yang «That’s So Annoying!!!: A Lexical and Frame-Semantic Embedding Based Data Augmentation Approach to Automatic Categorization of Annoying Behaviors using #petpeeve Tweets»

Использование контекстных представлений

Кроме классических представлений (Word2Vec, fasttext, GloVe), можно использовать те, которые учитывают контекст слова (его окружение другими словами). В работах Marzieh Fadaee et al. «Data Augmentation for Low-Resource Neural Machine Translation», Kobayashi «Augmentation: Data Augmentation by Words with Paradigmatic Relation» для построения таких представлений использовались двунаправленные LM (языковые модели). Языковые модели, вообще говоря, получают не конкретное слово, а распределение на множестве слов. Поэтому для замены можно использовать любое слово, которому соответствует высокая вероятность.

В последние годы популярны модели на базе архитектуры трансформера. В частности, их обычно предобучают на больших наборах данных заполнять маскированные токены, по-простому, восстанавливать пропущенные слова. Поэтому такие модели логично использовать для замены слов: заменяем некоторые слова на маски и подаём на вход трансформеру, а он «превращает» маски в слова. В работе Garg. et al. «BAE: BERT-based Adversarial Examples for Text Classification» модель BERT использовалась для подобной замены, а также для вставок слов (можно между любыми словами в предложении поместить маску, модель заменит её на подходящее слово). Ниже показан поясняющий рисунок из статьи.

Замена и удаление несущественного / существенного

Один из основных вопросов, связанных с заменой или удалением слов при аугментации: какие слова лучше заменять / удалять? Причём на него разные авторы дают часто совсем противоположные ответы. В Xie et al. «Unsupervised Data Augmentation» предложено заменять несущественные слова — слова с маленьким значением TF-IDF. Пример подобной замены приведён ниже:

В Hanjie Chen «Improving the Explainability of Neural Sentiment Classifiers via Data Augmentation», напротив, предложено заменять самые значимые слова. Так, в задаче определения сентимента можно находить самое «сентиментное» слово и удалять его (например, слова «отличный», «превосходный», «классный», «улётный» и т.п.). Положительный отзыв на фильм должен определяться нашим алгоритмом как положительный и без явных эпитетов (а на основе отсутствия критики, построения повествования и т.п.). Кроме того, в указанной работе в тексты добавлялись т.н. состязательные примеры (Adversarial Examples), т.е. слова, которые приводят к неправильной классификации и «путают» алгоритм.

При заменах также иногда анализируют контекст. Например, в работе Jacob Andreas «Good-Enough Compositional Data Augmentation» предложен метод GECA (good-enough compositional augmentation), который анализирует то, что авторы назвали «лексическим окружением» слова. Скажем, в предложениях

  • Я устал и хочу спать прямо сейчас.
  • Я выпил и хочу танцевать прямо сейчас.

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

Обратный перевод (Back Translation)

При наличии хороших автоматических переводчиков часто текст переводят на другой язык, а затем переводят «обратно» на исходный. Понятно, что при этом как раз получается перефразировка исходной фразы. Такой метод использовался, например, в работе Xie et al. «Unsupervised Data Augmentation», а также победителем Kaggle-соревнования «Toxic Comment Classification Challenge». Есть несколько полезных заметок, посвящённых обратному переводу:

Есть несколько приёмов, применяемых при обратном переводе, которые увеличивают число возможных аугментаций. Первый — перевод можно осуществлять на разные языки. Второй — можно играться с настройкой языковой модели, которая формирует текст перевода (генерируя чуть менее вероятные, с точки зрения LM, тексты, которые могут быть удачными перефразировками). Как показано в примере ниже, современный google-translate также не справляется со словом «лёгкие» в нашем примере.

Зашумление

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

Можно удалять слова или заменять их специальным токеном (Blank Noising), переставлять слова (Random Swap), а также целые предложения (Sentence Shuffling).

Интересный приём, который редко делают — случайная вставка / Random Insertion (RI), когда в предложение в случайное место вставляется синоним случайного слова этого же предложения, подробнее см. в Wei et al. «EDA: Easy Data Augmentation Techniques for Boosting Performance onText Classification Tasks». Пример применения случайной вставки показан ниже:

Кроссовер

Довольно оригинальный и простой приём аугментации предложен в Franco M. Luque «Atalaya at TASS 2019: Data Augmentation and Robust Embeddings for Sentiment Analysis». Для генерации новых объектов класса берём два его представителя: A и B. Каждый из этих текстов делим пополам, получаем тексты A = A1 + A2, B = B1 + B2, где плюс означает конкатенацию. После этого тексты A1 + B2 и B1 + A2 добавляются в обучение. Пример применения кроссовера показан ниже:

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

MixUp для текстов

Аугментация MixUp хорошо зарекомендовала себя для изображений и табличных данных. При её использовании берутся два объекта, выбирается коэффициент λ∈(0,1), новый объект, добавляемый в обучение, является линейной комбинацией с коэффициентами λ, 1-λ выбранных объектов (неформально говоря, объекты «смешиваются»). Его метка также является линейной комбинацией с такими же коэффициентами меток выбранных объектов (тут есть некоторая тонкость, но мы её пропустим). С текстами есть проблема в применении этого метода, т.к. тексты дискретны и не понятно, что такое линейная комбинация текстов. В работе Hongyu Guo «Augmenting Data with Mixup for Sentence Classification: An Empirical Study» предложено несколько вариантов обобщения MixUp на тексты. Можно «смешивать» тексты следующим образом

  1. Выравниваем два текста по длине (более короткий дополняем спец-токенами). Новый текст будет иметь такую же длину, его i-е слово с вероятностью λ является i-м словом первого текста и с вероятностью 1-λ — i-м словом второго текста. Это логично назвать равномерным кроссовером предложений.
  2. Аналогичная процедура, но теперь для каждого i берём представление (word embedding) i-х слов первого и второго текста. Вычисляем линейную комбинацию представлений с коэффициентами λ, 1-λ. В новом тексте i-е слово выбирается так, чтобы его представление было ближайшим к полученной линейной комбинации. Такой способ называтеся wordMixUp.
  3. Если в нейросети, которая решает задачу, используются представления предложений (Sentence Embeddings), то логично организовывать линейную комбинацию над ними. Представления предложений в простом варианте являются усреднением представлений слов предложения, а в более сложном вычисляются модулем нейросети по токенам предложения. Строго говоря, это не совсем аугментация, т.к. мы можем в явном виде не пополнять выборку новыми объектами, но это более логичная процедура, которая называется senMixUp.
Рис. Из работы Hongyu Guo.

Совсем недавно (в прошлом месяце) в работе R Zhang «Seqmix: Augmenting active sequence labeling via sequence mixup» предложены модификации MixUp для текста в задаче с метками токенов (каждый токен имеет некоторую метку, например такое имеет место в Named entity recognition). Основная идея — подвергать смешиванию не полные предложения, а их подфрагменты, в простой реализации авторы назвали такую аугментацию Sub-sequence mixup. В более сложной предполагается смешивание только специальных подфрагментов: ищутся последовательности токенов, у которых одинаковые соответствующие им последовательности меток. Тогда при смешивании не нужно делать линейную комбинацию меток, достаточно смешивать описания токенов подпоследовательностей, см. рис. Такая аугментация называется Label-costrained Sub-sequence mixup.

Рис. Из работы R Zhang.

Синтаксическое дерево

По аугментируемому предложению можно построить синтаксическое дерево разбора, тогда можно перейти к эквивалентному дереву и по нему перестроить предложение. Подобный подход применялся в работе Coulombe «Text Data Augmentation Made Simple by Leveraging NLP Cloud APIs», см. рис.

Рис. Из работы Coulombe.

Генеративные модели

Для синтеза новых данных можно использовать генеративные модели, которых сейчас довольно много. Можно взять, например, языковую модель и донастроить её на обучающую выборку в конкретной задаче. Более того, можно предварительно донастроить её на похожих задачах, а также провести обуславливание (генерация будет проводиться при определённых условиях), например, генерация начинается с метки, а потом идёт текст. В этом случае, в задаче определения сентимента, если модели подать на вход начало текста с меткой «POSITIVE», то она породит текст позитивной тональности. Подобные подходы рассматривались в работах Kafle et al. «Data Augmentation for Visual Question Answering» и Kumar et al. «Data Augmentation using Pre-trained Transformer Models». Опишем для примера метод LAMBADA (Language  Model  Based  Data  Augmentation) из работы Anaby-Tavor et al. «Not Enough Data? Deep Learning to the Rescue!».

  • На обучающей выборке обучаем классификатор.
  • Донастраиваем на этой же выборке предварительно обученную языковую модель.
  • Синтезируем с помощью модели объекты с конкретными метками.
  • Прогоняем классификатор на синтезированных объектах. Если он уверенно приписывает объекту его метку, то пополняем этим объектом выборку, в противном случае удаляем его.

Некоторые новые аугментации

Довольно много статей по описанному выше генеративному подходу с приложениями в медицине. В частности, довольно много появляется работ, в которых трансформеры используются для синтеза медицинских текстов (приведём работу Exploring Transformer Text Generation for Medical Dataset Augmentation для примера). Строго говоря, в них часто речь идёт не об аугментации, а о создании эквивалентного датасета. В медицине истории болезней пациентов относятся к т.н. персональным данных, а следовательно, их нельзя выкладывать в открытый доступ и сравнивать на них различные подходы в «воспроизводимом и верифицируемом формате». Поэтому есть надежда использовать для исследовательских целей синтетические датасеты.

Из интересных направлений упомянем использование RL для аугментации. В работе Zhiting Hu  et al «Learning Data Manipulation for Augmentation and Weighting» предлагается выбор аугментации и весов объектов обучающей выборки рассматривать как выбор стратегии некоторого игрока. Качество решения исходной задачи при этом соответствует награде, здесь она называется «data reward«. Соответственно, предлагается алгоритм для максимизации этой награды.

Ссылки

Описанный выше обзор есть и в форме видеодоклада, который делался на научном семинаре компании dasha.ai, а потом в изменённом виде на спецсеминаре в МГУ. Видео с последнего мероприятия представлено ниже:

Также рекомендуем следующие источники:

Аугментация для текстов (Text Augmentation): 2 комментария

  1. Спасибо за статью!
    Подскажите в каких задачах NLP Вы сами используете аугментации для улучшения качества?
    Ну например, улучшит ли это качество NER задачи? Или лучше заходит в других типах задач…

  2. Александр, спасибо за эту огромную и полезную статью!

    Добавил её в копилку issues в своём инструменте для очистки текстовых датасетов ( https://github.com/TextDatasetCleaner/TextDatasetCleaner ), тут есть над чем подумать и возможно добавить какие-то аугментации туда 🙂

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

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s