📜  数据增强中的文本到文本传输转换器

📅  最后修改于: 2022-05-13 01:57:05.914000             🧑  作者: Mango

数据增强中的文本到文本传输转换器

  • 您想在下一个 NLP 项目中获得“最先进”的结果吗?
  • 您的数据不足以训练机器学习模型吗?
  • 你想用一些额外的数据来提高你的机器学习模型的准确性吗?

如果是,那么您只需要数据增强。无论您是构建文本分类、摘要、问答还是任何其他机器学习模型。数据增强将有助于提高模型的性能。

有五种数据增强技术:

  1. 词嵌入
  2. BERT
  3. 返回翻译
  4. 文本到文本传输转换器
  5. 集成方法。

文本到文本传输转换器:

使用文本到文本传输转换器 (T5) 的数据增强是在Colossal Clean Crawled Corpus (C4)数据集上训练的大型转换器模型。谷歌开源了一个预训练的 T5 模型,该模型能够完成翻译、摘要、问答和分类等多项任务。

  • 示例 1 :T5 模型可以训练英语德语翻译,输入将文本英语翻译成德语、英语文本和德语文本作为输出。
  • 例2:训练情感分类模型,输入可以是情感分类,输入文本,输出可以是情感。

通过指定不同的任务,可以为多个任务训练相同的模型。输入训练数据中的特定前缀字符串。 T5 在各种 NLP 任务上取得了最先进的结果。

如何使用此模型进行数据增强?

这可以通过多种方式完成。

在反向翻译中,我们使用了开箱即用的预训练模型。如果我们想开箱即用地使用 T5,我们可以利用它的文本摘要功能进行数据增强。

  • T5可以接受格式的输入,总结,输入文本,生成输入的总结。
  • T5 是一种抽象的摘要算法。
  • T5 可以改写句子或使用生词来生成摘要。
  • T5 数据增强技术对于涉及长文本文档的 NLP 任务很有用。

对于短文本,它可能不会给出很好的结果。

使用 T5 进行数据增强的另一种方法是利用迁移学习技术并使用存储在 T5 中的知识来生成合成数据。这可以通过多种方式完成。

1) 一种方法是在掩码词预测任务上微调 T5,与训练 BERT 的任务相同。

对掩码词预测任务进行微调数据

我们可以使用相同的 C4 数据集,在该数据集上对 T5 进行预训练,以进一步对其进行微调以进行掩码词预测。因此,模型的输入将以一些前缀开始,例如预测掩码,然后是具有掩码单词的输入句子,输出将是没有掩码的原始句子。

我们还可以在同一个句子中屏蔽多个单词并训练 T5 来预测单词的跨度。如果我们屏蔽一个单词,该模型将无法生成具有句子结构变化的新数据。但是,如果我们屏蔽多个单词,该模型也可以学习生成句子结构略有变化的数据。这样,我们的数据增强方法将与基于 BERT 的方法非常相似。

2)另一种使用 T5 进行数据增强的方法是在释义生成任务上对其进行微调。

使用 PAWS 数据集微调 T5 以生成释义

释义意味着生成一个与输入具有相同含义的输出句子,但句子结构和关键字不同。这正是我们数据增强所需要的。

我们将使用 PAWS 数据集来找到用于释义生成的 T5 调谐。 PAWS 代表单词加扰中的意译对手。该数据集包含数千个释义,并提供英语以外的六种语言。

因此,我们使用 T5 的数据增强方法如下:

第 1 步:涉及一些数据预处理,这会将 PAWS 数据集转换为训练 T5 所需的格式。

第2步:下一步将是微调,T5。为了进行微调,我们对模型的输入将是格式,生成释义的输入文本,输出将是输入文本的释义。

一旦我们有了一个微调的模型,我们就可以使用它来生成任何输入文本的释义。我们可以提供带有前缀生成释义的输入,模型将输出其释义。

该模型可以配置为输出多个释义。通过这种方式,我们可以非常轻松地为数据增强创建自己的释义生成模型。

预训练的 T5 模型有五种不同的尺寸。

  1. T5 小型(60M 参数)
  2. T5 底座(220 参数)
  3. T5 大号(770 参数)
  4. T5 3 B(3 B 参数)
  5. T5 11 B(11 B 参数)

较大的模型可以提供更好的结果,但也需要更多的计算能力并且需要大量的时间来训练。但这是一个一次性的过程。一旦你在适当的数据集上训练了一个高质量的微调释义生成模型,它就可以用于多个 NLP 任务中的数据增强。

使用 T5 实现数据增强

我们将使用简单的转换器库使用文本到文本传输转换器来实现数据增强。该库基于 Hugging face 转换器库。它使微调基于变压器的模型变得简单。

  • 第 1 步:我们将上传微调所需的 PAWS 数据集(从单词加扰中解释对手)。
  • 第 2 步:我们需要为训练准备数据集,以便我们可以开始微调模型。
  • 第 3 步:我们将在 Google Drive 上创建并保存微调模型。
  • 第 4 步:最后,我们将加载保存的模型并生成可用于数据增强的释义

1) 安装依赖

Python3
!pip install simpletransformers
  
import pandas as pd
from simpletransformers.t5 import T5Model
from pprint import pprint
import logging


Python
df = pd.read_csv('train.tsv',sep='\t')
df.head(5)


Python
df.describe()


Python
paraphrase_train = df[df['label']==1]
paraphrase_train.head(5)
paraphrase_train.describe()


Python
paraphrase_train["prefix"] = "Generate Paraphrase for this line"
paraphrase_train= paraphrase_train.rename(
  columns={"sentence1": "input_text", "sentence2": "target_text"})


Python
df = pd.read_csv('dev.tsv',sep='\t')
paraphrase_dev = df[df['label']==1]
paraphrase_dev["prefix"] = "Generate Paraphrase for this line"
paraphrase_dev = paraphrase_dev.rename(
  columns={"sentence1": "input_text", "sentence2": "target_text"})


Python
model_args = {
    "reprocess_input_data": True,
    "overwrite_output_dir": True,
    "max_seq_length": 128,
    "train_batch_size": 16,
    "num_train_epochs": 10,
    "num_beams": None,
    "do_sample": True,
    "max_length": 20,
    "top_k": 50,
    "top_p": 0.95,
    "use_multiprocessing": False,
    "save_steps": -1,
    "save_eval_checkpoints": True,
    "evaluate_during_training": True,
    "evaluate_during_training_verbose": True,
    "num_return_sequences": 5
}


Python
model = T5Model("t5","t5-small", args=model_args)
model.train_model(paraphrase_train, eval_data=paraphrase_dev)


Python
//import drive
from google.colab import drive
drive.mount('/content/gdrive')
  
//copy path of best_model
!cp -r /content/outputs/best_model/ /content/gdrive/'My Drive'/T5/
  
//load model
pre_trained_model = T5Model("/content/gdrive/My Drive/T5/best_model", model_args)


2)准备数据集进行训练

您可以从此链接 PAWS wiki 标记数据集下载数据集。它有三个文件traindevtest.tsv 。我们只会使用训练开发文件。这个数据集有三列,句子一、句子二和标签。标签是两个句子之一是释义,否则为零。

Python

df = pd.read_csv('train.tsv',sep='\t')
df.head(5)


当可以保持可比较的流速时,结果很高。相应的句子 2 表明,当可以保持可比较的流速时,结果很高。这两个句子是释义,所以标签是一个。

我们将微调 T5 以生成释义。所以我们只需要这个数据集中的释义。这意味着只有标记为一个的样本对我们的任务有用。

Python

df.describe()


该数据集的大小为 49401。

让我们只保留标签为 1 的对。

Python

paraphrase_train = df[df['label']==1]
paraphrase_train.head(5)
paraphrase_train.describe()


现在尺寸减少到几乎一半。 T5 可以针对多项任务进行训练。所以在给模型输入时,我们需要添加一些特定于任务的前缀。为此,我们在数据框中添加了一个新的列前缀,其中包含值生成的释义。

我们还需要重命名句子一和句子二列。请注意,重命名应为“input_text”“target_text” ,否则会显示运行时错误。

Python

paraphrase_train["prefix"] = "Generate Paraphrase for this line"
paraphrase_train= paraphrase_train.rename(
  columns={"sentence1": "input_text", "sentence2": "target_text"})

同样的步骤,我们需要申请 dev.tsv。

Python

df = pd.read_csv('dev.tsv',sep='\t')
paraphrase_dev = df[df['label']==1]
paraphrase_dev["prefix"] = "Generate Paraphrase for this line"
paraphrase_dev = paraphrase_dev.rename(
  columns={"sentence1": "input_text", "sentence2": "target_text"})

3) 微调 T5 以生成释义

首先,我们需要确定一些配置参数。您可以通过 Simple Transformer 的文档来了解所有这些参数。

最后一个参数是确定为每个输入生成多少个释义。释义是使用top-k samplingtop-p nucleus sampling的组合生成的。

要创建 T5 模型类的对象,我们需要传递配置参数和 T5 模型的类型。 T5 有多种尺寸可供选择,我们将使用 T5 小型版本。

Python

model_args = {
    "reprocess_input_data": True,
    "overwrite_output_dir": True,
    "max_seq_length": 128,
    "train_batch_size": 16,
    "num_train_epochs": 10,
    "num_beams": None,
    "do_sample": True,
    "max_length": 20,
    "top_k": 50,
    "top_p": 0.95,
    "use_multiprocessing": False,
    "save_steps": -1,
    "save_eval_checkpoints": True,
    "evaluate_during_training": True,
    "evaluate_during_training_verbose": True,
    "num_return_sequences": 5
}

Python

model = T5Model("t5","t5-small", args=model_args)
model.train_model(paraphrase_train, eval_data=paraphrase_dev)


将最佳模型保存到谷歌驱动器:

Python

//import drive
from google.colab import drive
drive.mount('/content/gdrive')
  
//copy path of best_model
!cp -r /content/outputs/best_model/ /content/gdrive/'My Drive'/T5/
  
//load model
pre_trained_model = T5Model("/content/gdrive/My Drive/T5/best_model", model_args)

4) 通过输入前缀为“Generate Paraphrase for this line”生成释义

在某些情况下,它可能不会给出好的结果,但是有很多改进模型的空间,而不是使用 T5 小版本。如果我们使用更大的版本并在更大的数据集上对其进行微调,我们可以获得更好的结果。

另外,你可以去拥抱人脸模型库并在那里搜索 T5。您可能会发现一些 T5 模型在释义生成方面进行了微调。您还可以试用这些模型或在特定领域的数据集上进一步微调它们。

这是这种数据增强技术的优势。