Неконтролируемое кодирование предложений на основе шумоподавляющего преобразователя

алгоритм

Это 21-й день моего участия в ноябрьском испытании обновлений. Узнайте подробности события:Вызов последнего обновления 2021 г.

В EMNLP2021 Findings есть статья под названиемTSDAE: Using Transformer-based Sequential Denoising Auto-Encoder for Unsupervised Sentence Embedding LearningВ статье с использованием структуры Transformer для неконтролируемого кодирования обучающих предложений сетевая архитектура выглядит следующим образом.

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

JSDAE(θ)=ExD[logPθ(xx~)]=ExD[t=1llogPθ(xtx~)]=ExD[t=1llogexp(htTet)i=1Nexp(htTei)]\begin{aligned} J_{\text{SDAE}}(\theta) &= \mathbb{E}_{x\sim D}[\log P_{\theta}(x\mid \tilde{x})]\\ &=\mathbb{E}_{x\sim D}[\sum_{t=1}^l \log P_{\theta}(x_t\mid \tilde{x})]\\ &=\mathbb{E}_{x\sim D}[\sum_{t=1}^l \log \frac{\exp(h_t^T e_t)}{\sum_{i=1}^N \exp(h_t^T e_i)}] \end{aligned}

в,DDобучающая выборка;x=x1x2xlx = x_1x_2\cdots x_lдлинаllвходное предложение;x~\tilde{x}даxxПредложение после добавления шума;ete_tэто словоxtx_tвстраивание слов;NNобъем словарного запаса;hth_tдекодер первыйttскрытое состояние пошагового вывода

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

H(k)=Attention(H(k1),[sT],[sT])Attention(Q,K,V)=Softmax(QKTd)V\begin{aligned} &H^{(k)}=\text{Attention}(H^{(k-1)}, [s^T], [s^T])\\ &\text{Attention}(Q,K,V) = \text{Softmax}(\frac{QK^T}{\sqrt{d}})V \end{aligned}

в,H(k)еRt×dH^{(k)}\in \mathbb{R}^{t\times d}декодер первыйkkЭтажttскрытое состояние на каждом шаге декодирования;ddразмерность вектора предложения (размерность выходного вектора энкодера);[sT]еR1×d[s^T]\in \mathbb{R}^{1\times d}- это вектор предложения (строки), выводимый кодировщиком. Из приведенной выше формулы мы видим, что независимо от того, какой уровень перекрестного внимания,KKиVVВсегда будетsTs^T, цель авторского замысла — искусственно добавить узкое место в модель, если вектор предложений, закодированный КодировщикомsTs^TЕсли он недостаточно точен, декодеру трудно успешно декодировать.Другими словами, этот дизайн должен сделать кодирование кодера более точным. После обучения, если вам нужно извлечь вектор предложения, вам нужно использовать только Encoder.

Настроив параметры набора данных STS, автор обнаружил, что наилучший метод комбинирования выглядит следующим образом:

  1. Используется метод добавления шума путем удаления слов, а соотношение установлено на 60%
  2. Используйте вывод позиции [CLS] в качестве вектора предложений

Results

Судя по результатам TSDAE, это в основном пробивает SimCSE и пинает BERT-поток.

Персональное резюме

Если бы я был рецензентом, то один из вопросов, который я особенно хотел бы задать, звучит так: «В чем разница между вашим методом и BART?»

Исходный код статьи находится вUKPLab/sentence-transformers/, фактически, преобразователи предложений инкапсулировали TSDAE в пакет pip, Полный процесс обучения см.Использование Sentence-Transformer и учебник по тонкой настройке, исходя из этого, нужно только изменить набор данных и потери, чтобы легко обучать TSDAE

# 创建可即时添加噪声的特殊去噪数据集
train_dataset = datasets.DenoisingAutoEncoderDataset(train_sentences)

# DataLoader 批量处理数据
train_dataloader = DataLoader(train_dataset, batch_size=8, shuffle=True)

# 使用去噪自动编码器损失
train_loss = losses.DenoisingAutoEncoderLoss(model, decoder_name_or_path=model_name, tie_encoder_decoder=True)

# 模型训练
model.fit(
    train_objectives=[(train_dataloader, train_loss)],
    epochs=1,
    weight_decay=0,
    scheduler='constantlr',
    optimizer_params={'lr': 3e-5},
    show_progress_bar=True
)