在Wikipedia上用BERT构建QA系统(二)

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

微调脚本

我们选择了一个模型,得到了一些数据。是时候训练了!

HF支持的所有标准模型都经过了预训练,这意味着它们都得到了大量的无监督训练集,以便学习基本的语言建模。为了在特定的任务中表现良好,比如回答问题,他们必须在特定的数据集和任务上接受进一步的训练——微调。

HF提供了一个run_squad.py脚本,可以在其中一个SQuAD数据集上微调Transformer 模型您可以在这里获取脚本https://github.com/huggingface/transformers/blob/master/examples/question-answering/run_squad.py或运行下面单元格中的脚本

image.png

这个脚本负责对模型进行微调的所有工作,因此非常复杂。它包含不少于45参数,为那些进行大量训练的人提供了有效的灵活性和实用性。这个脚本的细节我们改天再谈暂时把重点放在基本命令上,以便在SQuAD 1.12.0上微调BERT。下面是这次微调脚本run_squad.py最重要的参数

image.png

image.png

下面是第一次执行run_squad.py时的预期结果:

        下载指定模型类型(bert-base-uncased)的预训练模型权重。

        SQuAD训练示例被转换为特征(根据数据集大小和线程数需要15-30分钟)。

        训练特性将保存到缓存文件中(这样您就不必为此模型类型再次执行此操作)。

        --do_train,则训练将开始进行指定的轮数,并每隔--save_steps步数保存模型权重,直到训练结束。这些检查点保存在[--output_dir]/checkpoint-[step number]子目录中。

        最终的模型权重和外围文件保存到--output_dir

        如果--do_eval,则将SQuAD dev示例转换为特性。

        Dev特性也保存到缓存文件中。

        评估开始并输出令人眼花缭乱的各种性能分数。

时候训练了!

但首先,要注意计算量。我们不建议对Transformer模型进行微调,除非您至少拥有一个GPU和相当多的RAM。就背景而言,我们的GPU已经有好几年的历史了(GeForce GTX TITAN X),虽然它的速度不如Tesla V100(目前GPU中的凯迪拉克)快,但它完成了任务。bert-base-uncased微调每大约需要1.75小时。此外,我们的机器有32GBCPU12GBGPU内存,足以在任何一个SQuAD 的数据集上处理和训练大多数模型。

以下单元格演示了两种微调方法:在命令行和在Colab中。

 

命令行中的训练

我将以下内容保存为shell脚本(run_squad.sh)并在我们主机命令行运行($ source run_squad.sh)Shell脚本有助于防止在命令行中键入参数时出现错误,特别是对于像这样的复杂脚本。它们还允许您跟踪上次使用的参数(不过,我们将在下面看到run_squad.py脚本对此有一个解决方案)。我实际上保留了两个shell脚本——一个显式地用于训练,另一个用于评估。

image.png

Colab中训练

或者,可以在单元格中执行训练,如下所示。我们注意到,标准Colab环境只提供12GBRAM。将SQuAD数据集转换为特性是内存密集型的,可能会导致基本的Colab环境崩溃。如果有一个具有额外内存容量(16GB+)的Colab实例,则此代码块能完全执行。不管怎样,在下一节中,我们将下载一个经过微调的模型。

image.png

训练结果

成功执行完run_squad.py后会产生大量输出,可以在上面指定的--output_dir目录中找到。你会发现

模型标记器的文件:

tokenizer_config.json

vocab.txt

special_tokens_map.json

模型本身的文件:

pytorch_model.bin:这些是实际的模型权重(对于某些模型,此文件可是几个GB

config.json:模型体系结构的详细信息

用于训练此模型的命令行参数的二进制表示(因此您永远不会忘记使用了哪些参数!)

training_args.bin

如果你设定了--do_eval,你还会看到这些文件:

predictions_.json:每个例子的官方最佳答案

n best_predictions_uu.json:每个示例的前n个最佳答案

提供此目录的路径给AutoModelAutoModelForQuestionAnswering将加载经过微调的模型以供使用。

image.png

使用 Hugging Face存储库中的预微调模型

如果你没有GPU或者没有时间摆弄和训练模型,那你走运了!HuggingFace不仅仅是一个精巧Transformer类的集合——它还托管了一个存储库,用于存储预训练和微调来自广泛的NLP从业者社区的模型。搜索“squad”至少可以找到55模型

image.png

    单击其中一个链接可以提供使用该模型的显式代码,在某些情况下,还可以提供有关如何训练该模型以及取得了哪些结果的信息。让我们加载这些预微调的模型之一。

image.png

让我们试试我们的模型吧!

无论您是自己微调或使用预先微调的模型,是时候尝试和一下了!QA有三个步骤:

标记输入

获得模型分数

得到答案范围

这些步骤将在HF Transformer Notebooks (https://huggingface.co/transformers/notebooks.html)中详细讨论。

image.png

image.png



英文原文:https://qa.fastforwardlabs.com/pytorch/hugging%20face/wikipedia/bert/transformers/2020/05/19/Getting_Started_with_QA.html
译者:阿布铥