(十六)提出正确的问题:在新任务中训练 T5 Transformer 模型

自从 T5(文本到文本传输转换器)问世以来,一直渴望尝试它,早在 2019 年 10 月(已经有几个月了)。我弄乱了几次来自 Google 的开源代码,但我从未设法让它正常工作。其中一些有点超出我的脑海(Tensorflow 😫),所以我想我会等待 Hugging Face 来救援!与往常一样,Transformers 实现更易于使用,我对其进行了调整以用于 Simple Transformers

在我们讨论好东西之前,先简单说一下 T5 模型是什么以及为什么它如此令人兴奋。根据 Google AI 博客中关于 T5 的文章,该模型是对迁移学习技术进行大规模研究(论文链接)的结果,以了解哪种技术效果最好。T5 模型在 C4 (Colossal Clean Crawled Corpus) 上进行了预训练,这是一个新的、绝对庞大的数据集,与模型一起发布。

预训练是迁移学习的第一步,其中模型在大量未标记文本数据的自我监督任务上进行训练。在此之后,该模型在针对特定任务量身定制的较小标记数据集上进行微调(训练),与在没有预先训练的情况下在小型标记数据集上进行训练相比,其性能要优越得多。有关预训练语言模型的更多信息,请参阅下面的帖子。

了解 ELECTRA 并训练 ELECTRA 语言模型

Transformer 模型如何学习语言?ELECTRA 中有什么新功能?你如何在一个 ...

towardsdatascience.com

 

T5 模型的一个关键区别是所有 NLP 任务都以文本到文本的格式呈现。另一方面,类似 BERT 的模型将文本序列作为输入,并从输入中输出单个类标签或文本范围。通过在变压器模型之上添加相关的输出层,为特定任务改造 BERT 模型。例如,为分类任务添加一个简单的线性分类图层。然而,T5 避开了这种方法,而是重新构建了任何 NLP 任务,使输入和输出都是文本序列。这意味着相同的 T5 模型可用于任何 NLP 任务,而无需对架构进行任何售后更改。要执行的任务可以通过 input 前面的简单前缀(同样是文本序列)来指定,如下所示。

 

从 https://ai.googleblog.com/2020/02/exploring-transfer-learning-with-t5.html

T5 论文探讨了 NLP 迁移学习的许多最新发展。非常值得一读!

但是,本文的重点是调整 T5 模型以执行新的 NLP 任务。多亏了统一的文本到文本方法,这变得(令人惊讶地)简单。那么,让我们来看看前面提到的好东西吧!

任务

T5 模型针对各种 NLP 任务进行了训练,包括文本分类、问答、机器翻译和抽象摘要。我们将教授 T5 模型的任务是问题生成。

具体来说,模型的任务是在给定上下文时提出相关问题

您可以在 Simple Transformers 存储库的 examples 目录中找到本指南中使用的所有脚本

数据集

我们将使用 Amazon Review Data (2018) 数据集,其中包含 Amazon 上各种商品的描述以及与这些商品相关的问答对(除其他外)。

说明和问答对必须单独下载。您可以按照下面的 描述 和 Question-Answer 对中的说明手动下载数据,也可以使用提供的 shell 脚本。本研究中使用的类别列表如下。

 

描述

  1. 转到评论 URL
  2. 从页面上的链接下载元数据文件 (json.gz)。请注意,最好从按分类数据链接(例如 http://deepyeti.ucsd.edu/jianmo/amazon/metaFiles/meta_AMAZON_FASHION.json.gz下载,而不是下载所有商品的完整元数据。完整的元数据是一个 24 GB 的存档,您需要大量的 RAM 来处理它。
  3. 重命名为以匹配问答文件中的名称。meta_ALL_Beauty.json.gz meta_Beauty.json.gz

问答对

  1. 转到 qa URL
  2. 下载按类别文件。请注意,我使用的是没有多个答案的问答对。

Shell 脚本

或者,下面的 shell 脚本应该通过从下面给出的两个文本文件中读取链接来下载所有必要的文件(将文本文件放在与 shell 脚本相同的目录中)。它还将重命名为以匹配问答文件中的名称。data/meta_ALL_Beauty.json.gz meta_Beauty.json.gz

 
元 JSON 文件的链接
 
指向 qa JSON 文件的链接

 

用于下载 JSON 文件的 Shell 脚本

数据文件就位后,我们就可以开始训练我们的模型了!

设置

我们将使用 Simple Transformers 库(基于 Hugging Face Transformers)来训练 T5 模型。

下面给出的说明将安装所有要求。

  1. 此处安装 Anaconda 或 Miniconda Package Manager。
  2. 创建新的虚拟环境并安装软件包。
    conda create -n simpletransformers python pandas tqdm
    conda activate simpletransformers
    conda install pytorch cudatoolkit=10.1 -c pytorch
  3. 如果您使用的是 fp16 训练,请安装 Apex。请按照此处的说明进行操作。(从 pip 安装 Apex 给几个人带来了问题。
  4. 安装 simpletransformers。
    pip install simpletransformers

查看安装文档

数据准备

我们可以处理数据文件并使用下面给出的脚本将它们保存为方便的格式。这还会将数据拆分为训练集和评估集。

改编自 Amazon Review Data 页面中提供的有用脚本

import pandas as pd
import gzip
from sklearn.model_selection import train_test_split
import os
from tqdm.auto import tqdm


def parse(path):
    g = gzip.open(path, 'rb')
    for l in g:
        yield eval(l)


def getDF(path):
    i = 0
    df = {}
    for d in parse(path):
        df[i] = d
        i += 1

    return pd.DataFrame.from_dict(df, orient='index')


categories = [category[3:] for category in os.listdir("data") if category.endswith(".gz") and category.startswith("qa")]

for category in tqdm(categories):
    if not os.path.isfile(f"data/{category.split('.')[0]}.tsv"):
        try:
            df1 = getDF(f'data/qa_{category}')
            df2 = getDF(f'data/meta_{category}')

            df = pd.merge(df1, df2, on="asin", how="left")
            df = df[["question", "answer", "description"]]
            df = df.dropna()
            df = df.drop_duplicates(subset="answer")
            print(df.head())

            df.to_csv(f"data/{category.split('.')[0]}.tsv", "\t")
        except:
            pass

df = pd.concat((pd.read_csv(f"data/{f}", sep="\t") for f in os.listdir("data") if f.endswith(".tsv")))
df = df[["question", "description"]]
df["description"] = df["description"].apply(lambda x: x[2:-2])
df.columns = ["target_text", "input_text"]
df["prefix"] = "ask_question"

df.to_csv(f"data/data_all.tsv", "\t")

train_df, eval_df = train_test_split(df, test_size=0.05)

train_df.to_csv("data/train_df.tsv", "\t")
eval_df.to_csv("data/eval_df.tsv", "\t")

 

检查您的目录中是否有 和 文件 train_df.tsveval_df.tsvdata/

训练模型

数据格式

T5 模型的输入数据应该是包含 3 列的 Pandas DataFrame,如下所示。

  • prefix:指示要执行的任务的字符串。
  • input_text:输入文本序列。
  • target_text:目标序列。

在内部,Simple Transformers 将从 Pandas DataFrame 构建格式正确的输入目标序列(如下所示)。

T5 模型的输入具有以下模式;

目标序列具有以下模式;

prefix 值指定我们希望 T5 模型执行的任务。要训练 T5 模型来执行新任务,我们只需训练模型,同时指定适当的前缀即可。在这种情况下,我们将使用前缀 .即 DataFrame 中的所有行都将在 prefix 列中具有该值。ask_questionask_question

训练

使用 Simple Transformers 训练模型非常简单。

import pandas as pd

from simpletransformers.t5 import T5Model


train_df = pd.read_csv("data/train_df.tsv", sep="\t").astype(str)
eval_df = pd.read_csv("data/eval_df.tsv", sep="\t").astype(str)

model_args = {
    "reprocess_input_data": True,
    "overwrite_output_dir": True,
    "max_seq_length": 128,
    "train_batch_size": 8,
    "num_train_epochs": 1,
    "save_eval_checkpoints": True,
    "save_steps": -1,
    "use_multiprocessing": False,
    "evaluate_during_training": True,
    "evaluate_during_training_steps": 15000,
    "evaluate_during_training_verbose": True,
    "fp16": False,

    "wandb_project": "Question Generation with T5",
}

model = T5Model("t5", "t5-large", args=model_args)

model.train_model(train_df, eval_data=eval_df)

 

正如您可能从训练脚本中观察到的那样,我们使用的是预先训练的模型。在模型中使用这些参数需要使用单个 Titan RTX GPU 进行大约 12 小时的训练。根据您的 GPU 资源,您可以增加 以加快训练速度,也可以减少它以适应 VRAM 较少的 GPU(Titan RTX 有 24 GB)。t5-larget5-largetrain_batch_size

请注意,您可以通过增加 .有效批量大小大致等于 gradient_accumulation_stepstrain_batch_size * gradient_accumulation_steps

您还可以通过选择模型来显著提高训练速度和 GPU 内存消耗。这可能会导致相对较差(但绝不)的模型。t5-base

这个训练脚本也会使用Weights & Biases框架自动记录训练进度。你可以在这里看到我的日志。

评估模型

评估语言生成模型比评估分类模型之类的东西要复杂一些。这是因为没有可以像分类模型那样比较的正确答案。评估数据集包含描述和人们提出的有关这些产品的问题,但这并不意味着这些是您可以提出的唯一正确问题。

因此,评估语言生成模型的最佳方法之一是生成文本并让一个真实的人(或几个人)对其进行评估。

说到生成文本,过去几年解码算法的令人印象深刻的发展导致模型能够生成非常逼真的文本序列。(使用解码算法生成文本)

以下部分简要概述了当前使用的常用解码算法。

解码算法

本部分在很大程度上基于文本生成的 Hugging Face 笔记本。我强烈建议您浏览该笔记本,以更深入地了解解码算法,因为它在解释算法和展示如何使用它们方面做得非常出色。

  1. 贪婪搜索 — 在每个时间步长中选择最有可能作为下一个单词的单词。T5 论文使用此算法进行短序列生成(例如分类)。
  2. Beam search (光束搜索) — 在每个时间步跟踪最可能的假设 (基于单词概率),最后选择总体概率最高的假设。( 是梁的数量)nn
  3. Top-K sampling (前 K 个采样) – 在每个时间步长,从 个最有可能的下一个单词中随机采样一个单词。每个步骤中可供选择的可能单词数是固定的。
  4. Top-p 采样 — 从累积概率 (每个单词的概率总和) 在每个时间步长超过概率 的最小可能单词集中采样一个单词。每个步骤中可供选择的可能单词数是动态的。

我们将结合使用 Top-K 和 Top-p 抽样技术来使用我们的 T5 模型生成问题。此策略通常会导致文本看起来更自然

问题生成

Simple Transformers T5 模型的方法用于生成预测,或者在我们的例子中,用于生成问题。predict()

from simpletransformers.t5 import T5Model
import pandas as pd
from pprint import pprint


model_args = {
    "reprocess_input_data": True,
    "overwrite_output_dir": True,
    "max_seq_length": 128,
    "eval_batch_size": 128,
    "num_train_epochs": 1,
    "save_eval_checkpoints": False,
    "use_multiprocessing": False,
    "num_beams": None,
    "do_sample": True,
    "max_length": 50,
    "top_k": 50,
    "top_p": 0.95,
    "num_return_sequences": 3,
}

model = T5Model("test_outputs_large/best_model", args=model_args)

df = pd.read_csv("data/eval_df.tsv", sep="\t").astype(str)
preds = model.predict(
    ["ask_question: " + description for description in df["input_text"].tolist()]
)

questions = df["target_text"].tolist()

with open("test_outputs_large/generated_questions_sampling.txt", "w") as f:
    for i, desc in enumerate(df["input_text"].tolist()):
        pprint(desc)
        pprint(preds[i])
        print()

        f.write(str(desc) + "\n\n")

        f.write("Real question:\n")
        f.write(questions[i] + "\n\n")

        f.write("Generated questions:\n")
        for pred in preds[i]:
            f.write(str(pred) + "\n")
        f.write("________________________________________________________________________________\n")

 

在这里,我们为数据集中的每个描述生成 3 个问题。eval_df

让我们看一下其中的一些示例。

为了好玩,我将生成的问题与数据集中的实际问题进行了随机排序。每个描述有 4 个问题,其中 3 个是生成的,1 个是原始问题。看看你是否能分辨出哪个是哪个!我很想在评论中看到您的猜测。😉

示例 1

描述:

Smart Solar San Rafael II Solar Mission Lantern 将为任何户外环境提供优雅的氛围,非常适合您的露台、甲板或花园:15 英寸灯笼由全天候聚乙烯制成,具有种子玻璃效果,可放置在任何表面上,也可以使用集成的吊环悬挂。Rafael II 由顶部的两个暖白色 LED 照亮,灯笼内有一个柱状蜡烛,带有琥珀色 LED,营造出温暖的发光效果。Rafael II 由一体式单晶太阳能电池板和可充电镍氢电池供电,无需布线或运营成本。灯笼在黄昏时自动亮起,在黎明时自动关闭。Smart Living Home & Garden提供从原始购买日期开始的1年有限制造商保修,适用于从授权分销商和零售商处购买的全部产品。Smart Solar 成立于 2002 年,提供广泛的纯太阳能产品选择。我们为您的露台和花园设计、制造和定制我们自己的所有物品。享受我们的太阳能、节能和环保照明解决方案、水景和户外装饰。我们相信您会喜欢太阳能生活——这就是我们近 15 年来一直在创造太阳能产品并发展太阳能生活方式的原因。

问题:

  • 从地面到 LED 灯泡的高度是多少?谢谢
  • 柱状蜡烛使用什么样的电池?
  • 它需要什么尺寸的灯泡?
  • 它们很重吗?我们风很大,它们将出现在桌子上

示例 2

描述:

耐用的狗球,带零食孔

问题:

  • 哈巴狗玩它安全吗?
  • 它是否发出吱吱声?
  • 当狗咀嚼它时它会弹出吗
  • 此物品的重量是多少?

示例 3

描述:

Petco River Rock 浅溪水族馆砾石Petco 水族馆砾石是淡水的理想选择,对海洋水族馆也很安全。这种高质量的砾石具有色彩缤纷、耐用的涂层,专为其持久性和无毒而开发。砾石经过加工以去除可能有害的碎屑和材料。它不会影响水的化学成分,也不会伤害任何鱼类、无脊椎动物或植物。可用于水族馆、池塘、水上花园和玻璃容器。

问题:

  • 我有一条鳍非常精致的斗鱼。我想确保我得到的砾石不会划伤或撕裂它们。这东西有用吗?
  • 有人在盐水中试过吗,如果有,它怎么撑呢?
  • 袋子和它所装的塑料/东西的尺寸是多少?
  • 这种砾石对在水族箱中生长藻类有好处吗?

示例 4

描述:

玩乐这款乐高城市组入门套装,探索充满拼搭乐趣的世界,套装内包含 3 辆标志性车辆。抓住骑摩托车的警察和劫匪!用消防员的快速消防车灭火。然后争先恐后地帮助救护车上摔倒的溜冰男孩。利用小拼搭者探索拯救世界的有趣方式,创造无尽的玩乐机会!包括 5 个小人仔及配件:强盗、警察、消防员、救援人员和溜冰男孩。272 件5 岁 +.', “玩乐乐高城市组入门套装,进入充满拼搭乐趣的世界,套装内包含 3 辆标志性车辆。抓住劫匪和骑摩托车的警察。用消防员的快速消防车扑灭大火。然后争先恐后地帮助救护车上摔倒的溜冰男孩。利用小拼搭者所需的所有灵感,创造无尽的玩乐机会,探索拯救世界的有趣方式。包括 5 个小人仔及配件:强盗、警察、消防员、救援人员和溜冰男孩。

问题:

  • 当所有部件都在套装中时,起始套装在盒子中会占用多少空间?
  • 区块本身有多大?
  • 乐高小人仔可以安装在 LEGO HOMES 上吗?
  • 这套是什么颜色的呢?图片不清晰,看起来很暗。

示例 5

描述:

优雅而时尚,这款电视柜为您的家带来了新的面貌。以深浓缩咖啡色完成。两个滑动门。四个存储部分。

问题:

  • 有什么方法可以调整本机的高度,或者如果我的电视不是 32 英寸,宽度是否需要自行调整?
  • 货架有多高?我有一个高大的接收器,想确保它适合。
  • 两个储物箱的尺寸是多少?谢谢!
  • 抽屉可以拆下还是固定下来?

示例 6

描述:

我们说的是棉花吗?你敢打赌我们做到了。男士 Charged Cotton 长袖 T 恤可能感觉像普通的棉质 T 恤,但它一点也不普通。其独特的面料将棉质的经典舒适性与全天候装备的内置防水功能相结合,打造出世界上第一款真正的高性能棉质 T 恤。它感觉柔软,但比普通棉花干得更快,因此您永远不会感到沉重。轻便舒适。可伸缩的活动能力。这是你穿过的最有力的棉质 T 恤。毕竟,它是 Under Armour。

问题:

  • 你能帮我弄个大吗?
  • 这适用于运行/执行 sprint?我的手臂很小,灵活性不高,但做很多冲刺。VRS2 在我身上看起来还不错吗
  • 一个 12 岁男孩的衬衫尺码是多少?
  • 大号是什么胸围尺寸(英寸)?

奖金样本

描述:

连接 Dotters!', “连接 Dotters!Dotters,我们的 10 只快乐脸斑点狗,由我们超柔软的 Pluffies 材料制成,不仅可爱,而且可机洗!

问题:

  • 这个可以吃吗?

👀

 

您还可以根据其他商品描述测试您的模型。下面的脚本使用了我在 eBay 上找到的随机描述。

from simpletransformers.t5 import T5Model


model_args = {
    "reprocess_input_data": True,
    "overwrite_output_dir": True,
    "max_seq_length": 128,
    "eval_batch_size": 16,
    "num_train_epochs": 1,
    "save_eval_checkpoints": False,
    "use_multiprocessing": False,
    # "silent": True,
    "num_beams": None,
    "do_sample": True,
    "max_length": 50,
    "top_k": 50,
    "top_p": 0.95,
    "num_return_sequences": 3,
}

model = T5Model("outputs/best_model", args=model_args)

query = "ask_question: " + """
ANTIQUE CAST METAL 3 GLOBE CANDLABRA JADITE LAMP.
Stunning antique lamp with three candle style globes. Cast metal base with jadite green glass insert. Has been rewired with new braided cord. In excellent condition with only one chip (as pictured) on the edge of the glass insert. E9 69 on underside of metal base. Missing finial. New low wattage globes.
"""

preds = model.predict([query])

print(preds)

 

以及生成的问题:

  • 地球仪的大小是多少?
  • 这盏灯是什么颜色的?
  • 我可以为这款灯购买更多地球仪吗?

对我来说,T5 模型最有趣的方面是只需更改前缀即可训练它完成全新的任务。在本文中,我们训练了模型,通过查看产品描述来生成问题。但是,完全有可能在其他任务上训练相同的模型,并通过简单地更改前缀在不同任务之间切换

这种灵活性为 T5 型号开辟了一个充满可能性和应用的全新世界。我迫不及待地想看看接下来会发生什么!

您还可以通过选择模型来显著提高训练速度和 GPU 内存消耗。这可能会导致相对较差(但绝不)的性能。t5-base

posted @ 2024-08-26 18:11  jasonzhangxianrong  阅读(100)  评论(0编辑  收藏  举报