Не думал, что Mixup можно использовать и для текста: SSMix

искусственный интеллект задняя часть
Не думал, что Mixup можно использовать и для текста: SSMix

Название статьи: SSMix: Saliency-Based Span Mixup for Text Classification Ссылка на бумагу:АР Вест V.org/PDF/2106.08…Код диссертации:GitHub.com/Помимо любви к OVA/что угодно…Автор статьи: {soyoungyoon и т. д.}

Абстрактный

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

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

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

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

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

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

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

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

Алгоритм SSMix

Основной принцип SSMix таков: при наличии двух текстовxAx^{A}иxBx^{B}, преобразовав текстxAx^{A}ФрагментxSAx_{S}^{A}заменить на из другого текстаxBx^{B}существенные фрагменты информацииxSBx_{S}^{B}создать новый текстx~\widetilde{x}. Тем временем для нового текстаx~\widetilde{x}, на основе двух текстовых метокyAy^{A}иyBy^{B}переписать на новый текстx~\widetilde{x}установить новый ярлыкy~\widetilde{y}. Наконец, вы можете использовать этот сгенерированный расширенный фиктивный образец (x~\widetilde{x},y~\widetilde{y}) для обучения модели.

Важность: важная информация

Важность измеряет влияние каждого символа текстовых данных на конечный результат предсказания. Методы на основе градиента широко использовались для расчета заметности в предыдущих исследованиях, и в тексте также вычисляются потери при классификации.L\mathcal LВложение относительно вводаeeградиент , и используйте его величину как заметность:s=L/es=\left \| \partial{\mathcal L}/\partial{\mathcal e} \right\|. Мы применяем норму l2, чтобы получить величину вектора градиента, представляющего значимость каждого символа в стиле PuzzleMix.

Смешивание текста: синтез текста

Как упоминалось ранее, микширование текста в основном относится к двум текстовым последовательностям.xAx^{A}иxBx^{B}Как синтезировать новый текст. Общая идея состоит в том, чтобы получить оценку значимости каждого символа в двух текстах в соответствии с методом вычисления градиентной заметности, а затем вычислить оценку заметности каждого символа в тексте.xAx^{A}выберите сегмент с наименее значимымxSAx_{S}^{A}, длинаlAl_{A}, в текстеxBx^{B}выберите сегмент с наименее значимымxSBx_{S}^{B}, длинаlBl_{B}. длина установлена ​​наlAl_{A}=lBl_{B}=max(min([λ0xA],xB),1)max(min([\lambda_{0}|x^{A}|],|x^{B}|),1)λ0\lambda_{0}– параметр отношения смешения. Наконец сгенерировать новый текстx~\widetilde{x}ш это(xLA;xSB;xRA)(x_{L}^{A};x_{S}^{B};x_{R}^{A})xLAx_{L}^{A}иxLBx_{L}^{B}как исходный текстxAx^{A}заменить фрагмент вxSAx_{S}^{A}левая и правая части.

Длина выборки: равная длина фрагмента

Эта статья будет оригинальной (lAl_{A}) и замену (lBl_{B}) интервалы устанавливаются одинаковыми, в основном потому, что использование интервалов (сегментов) разной длины приведет к избыточным и семантически неоднозначным переходам смешивания. Кроме того, расчет коэффициента смешения между пролетами разной длины слишком сложен. Эта стратегия замещения того же размера также использовалась в предыдущих исследованиях. В случае замены промежутка на ту же длину алгоритм SSMix статьи может максимизировать эффект заметности. Поскольку SSMix не ограничивает положение символов, можно одновременно выбрать наиболее заметный диапазон и наименее заметный сегмент, подлежащие замене. Как на картинке 1,in thisв текстxAx_{A}Это не значимо,transcedent loveв текстxBx_{B}является наиболее важным, то вы можете использоватьtranscedent loveзаменятьin this.

Микширование текста: синтез этикетки

Автор устанавливает коэффициент смешивания следующим образом:λ=sSB/x~\lambda =|s_{S}^{B}|/|\widetilde{x}|Поскольку λ пересчитывается путем подсчета количества символов внутри фрагмента, оно может быть не равно λ0. потомx~\widetilde{x}Теги:y~=(1λ)yA+λyB\widetilde{y}=(1-\lambda)y^{A}+\lambda y^{B}Алгоритм 1 показывает, как вычислить потерю примеси для расширенных выборок, используя пары исходных выборок. В формуле кросс-энтропийная потеря расширенного выходного логита по отношению к исходной целевой метке каждой выборки вычисляется и объединяется взвешенной суммой, поэтому алгоритм SSMix не зависит от количества меток в наборе данных. , выходная метка Масштаб вычисляется путем линейной комбинации двух исходных меток.

Задания на парные предложения: задания на пары предложений

Для задач, требующих пары текстов в качестве входных данных, таких как неявный текстовый вывод и классификация подобия, SSMix смешивает попарно и вычисляет коэффициент смешивания путем агрегирования количества токенов в каждом результате смешивания. данный образецxA=(pA,qA)x^{A}=(p^{A},q^{A}),xB=(pB,qB)x^{B}=(p^{B},q^{B}), синтезированный новый образецx~=(p~,q~)=(mixup(pA,pB),mixup(qA,qB))\widetilde{x}=(\widetilde{p},\widetilde{q})=(mixup(p^{A},p^{B}),mixup(q^{A},q^{B})), коэффициент смешения записывается какλ=(pS+qS)/(p~+q~)\lambda=(|p_{S}|+|q_{S}|)/(|\widetilde{p}|+|\widetilde{q}|)pSp_{S}иqSq_{S}Замените фрагменты для каждой операции смешивания.

Как показано ниже:

  • pAp^{A}за «Развлечение только для детей».
  • qAq^{A}для «Развлечений для взрослых и детей».
  • pBp^{B}за «Проблемы синтеза данных».
  • qBq^{B}за «Вопросы синтеза данных».
  • λ=(pS+qS)/(p~+q~)=(1+1)/(5+6)=2/110.18λ = (|pS|+|qS|)/(|\widetilde{p}|+|\widetilde{q}|) = (1+ 1)/(5+ 6) = 2/11 ≈ 0,18

Экспериментальная установка

Экспериментальный набор данных

Экспериментальный набор данных статьи имеет задачи классификации текста и классификации пар предложений:

Сравнительный эксперимент

В документе сравнивается SSMix с тремя базовыми уровнями: (1) стандартное обучение без смешивания, (2) EmbedMixMix и (3) TMix.Были сопоставлены экспериментальные результаты базовых исследований и исследований абляции. Все значения точности представляют собой среднюю точность (%) 5 прогонов с использованием разных семян. MNLI представляет точность набора разработчиков, не соответствующего MNLI. В документе сообщается о точности проверки GLUE, точности теста TREC и эффективной (верхней)/тестовой (нижней) точности ANLI, Видно, что SSMix лучше, чем другие алгоритмы гибридного улучшения в большинстве наборов данных.

Резюме статьи

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

  • SSMix особенно эффективен для наборов данных с несколькими метками классов (TREC, ANLI, MNLI, QNLI). Таким образом, в условиях обучения без перемешивания прирост точности SSMix на TREC-fine (47 меток) намного выше, чем у TRECcrare (6 меток), +3,56 и +0,52 соответственно. Наборы данных с несколькими метками общего класса повышают вероятность выбора для перекрестных меток при случайной выборке из смешанных источников, поэтому можно предположить, что эффективность смешивания в этих наборах данных классификации с несколькими метками значительно улучшится.
  • Значительные преимущества в задачах с парными предложениями, таких как текстовая импликация или классификация сходства. Существующие методы (Hidden Layer Blending) применяют смешивание к скрытым слоям без учета специальных маркеров, т.е. [SEP], [CLS]. Эти методы могут привести к потере информации о начале предложений или правильном разделении пар предложений. Напротив, SSMix может учитывать свойства отдельных символов при применении микса.

- Результаты исследований абляции на SSMix и его вариантах показывают улучшенную производительность с увеличением ограничений на сегменты и информацию о значимости. Добавление ограничений сегмента в операцию смешивания дает преимущество в виде лучшей локализуемости, а наиболее значимые сегменты имеют больше связей с соответствующими метками, при этом отбрасываются наименее значимые сегменты, которые семантически не важны по сравнению с исходными метками. Среди них вклад введения важной информации в точность относительно выше, чем вклад ограничений сегмента.

Код

import copy
import random
import torch
import torch.nn.functional as F

from .saliency import get_saliency


class SSMix:
    def __init__(self, args):
        self.args = args

    def __call__(self, input1, input2, target1, target2, length1, length2, max_len):
        batch_size = len(length1)

        if self.args.ss_no_saliency:
            if self.args.ss_no_span:
                inputs_aug, ratio = self.ssmix_nosal_nospan(input1, input2, length1, length2, max_len)
            else:
                inputs_aug, ratio = self.ssmix_nosal(input1, input2, length1, length2, max_len)
        else:
            assert not self.args.ss_no_span

            input2_saliency, input2_emb, _ = get_saliency(self.args, input2, target2)

            inputs_aug, ratio = self.ssmix(batch_size, input1, input2,
                                           length1, length2, input2_saliency, target1, max_len)

        return inputs_aug, ratio

    def ssmix(self, batch_size, input1, input2, length1, length2, saliency2, target1, max_len):
        inputs_aug = copy.deepcopy(input1)
        for i in range(batch_size):  # cut off length bigger than max_len ( nli task )
            if length1[i].item() > max_len:
                length1[i] = max_len
                for key in inputs_aug.keys():
                    inputs_aug[key][i][max_len:] = 0
                inputs_aug['input_ids'][i][max_len - 1] = 102
        saliency1, _, _ = get_saliency(self.args, inputs_aug, target1)
        ratio = torch.ones((batch_size,), device=self.args.device)

        for i in range(batch_size):
            l1, l2 = length1[i].item(), length2[i].item()
            limit_len = min(l1, max_len) - 2  # mixup except [CLS] and [SEP]
            mix_size = max(int(limit_len * (self.args.ss_winsize / 100.)), 1)

            if l2 < mix_size:
                ratio[i] = 1
                continue

            saliency1_nopad = saliency1[i, :l1].unsqueeze(0).unsqueeze(0)
            saliency2_nopad = saliency2[i, :l2].unsqueeze(0).unsqueeze(0)

            saliency1_pool = F.avg_pool1d(saliency1_nopad, mix_size, stride=1).squeeze(0).squeeze(0)
            saliency2_pool = F.avg_pool1d(saliency2_nopad, mix_size, stride=1).squeeze(0).squeeze(0)

            # should not select first and last
            saliency1_pool[0], saliency1_pool[-1] = 100, 100
            saliency2_pool[0], saliency2_pool[-1] = -100, -100
            input1_idx = torch.argmin(saliency1_pool)
            input2_idx = torch.argmax(saliency2_pool)
            inputs_aug['input_ids'][i, input1_idx:input1_idx + mix_size] = \
                input2['input_ids'][i, input2_idx:input2_idx + mix_size]

            ratio[i] = 1 - (mix_size / (l1 - 2))

        return inputs_aug, ratio

    def ssmix_nosal(self, input1, input2, length1, length2, max_len):
        inputs_aug = copy.deepcopy(input1)
        ratio = torch.ones((len(length1),), device=self.args.device)

        for idx in range(len(length1)):
            if length1[idx].item() > max_len:
                for key in inputs_aug.keys():
                    inputs_aug[key][idx][max_len:] = 0
                inputs_aug['input_ids'][idx][max_len - 1] = 102  # artificially add EOS token.
            l1, l2 = min(length1[idx].item(), max_len), length2[idx].item()

            if self.args.ss_winsize == -1:
                window_size = random.randrange(0, l1)  # random sampling of window_size
            else:
                # remove EOS & SOS when calculating ratio & window size.
                window_size = int((l1 - 2) *
                                  self.args.ss_winsize / 100.) or 1

            if l2 <= window_size:
                ratio[idx] = 1
                continue

            start_idx = random.randrange(0, l1 - window_size)  # random sampling of starting point
            if (l2 - window_size) < start_idx:  # not enough text for reference.
                ratio[idx] = 1
                continue
            else:
                ref_start_idx = start_idx
            mix_percent = float(window_size) / (l1 - 2)

            for key in input1.keys():
                inputs_aug[key][idx, start_idx:start_idx + window_size] = \
                    input2[key][idx, ref_start_idx:ref_start_idx + window_size]

            ratio[idx] = 1 - mix_percent
        return inputs_aug, ratio

    def ssmix_nosal_nospan(self, input1, input2, length1, length2, max_len):
        batch_size, n_token = input1['input_ids'].shape

        inputs_aug = copy.deepcopy(input1)
        len1 = length1.clone().detach()
        ratio = torch.ones((batch_size,), device=self.args.device)

        for i in range(batch_size): # force augmented output length to be no more than max_len
            if len1[i].item() > max_len:
                len1[i] = max_len
                for key in inputs_aug.keys():
                    inputs_aug[key][i][max_len:] = 0
                inputs_aug['input_ids'][i][max_len - 1] = 102

            mix_len = int((len1[i] - 2) * (self.args.ss_winsize / 100.)) or 1
            if (length2[i] - 2) < mix_len:
                mix_len = length2[i] - 2

            flip_idx = random.sample(range(1, min(len1[i] - 1, length2[i] - 1)), mix_len)
            inputs_aug['input_ids'][i][flip_idx] = input2['input_ids'][i][flip_idx]
            ratio[i] = 1 - (mix_len / (len1[i].item() - 2))

        return inputs_aug, ratio