有关如何在 spaCy v3.0 上为 NER 微调 BERT 以成功预测各种实体(例如工作经验和简历教育)的分步指南。
自从Vaswani 等人发表开创性论文“Attention Is All You Need”以来,transformer 模型已经成为 NLP 技术中的最新技术。从 NER、文本分类、问答或文本生成等应用,这项惊人技术的应用是无限的。
更具体地说,BERT——代表来自变压器的双向编码器表示——以一种新颖的方式利用了变压器架构。例如,BERT 用一个随机屏蔽的词分析句子的两边来进行预测。除了预测被屏蔽的token之外,BERT还通过在第一个句子的开头添加一个分类token [CLS]来预测句子的顺序,并尝试通过添加一个separation token [SEP]来预测第二个句子是否在第一个句子之后两句话之间。
BERT架构
在本教程中,我将向您展示如何微调 BERT 模型以预测软件职位描述中的技能、文凭、文凭专业和经验等实体。
微调变压器需要具有并行处理功能的强大 GPU。为此,我们使用 Google Colab,因为它提供免费可用的带有 GPU 的服务器。
在本教程中,我们将使用新发布的spaCy v3.0 库来微调我们的转换器。以下是有关如何在 spaCy v3.0 上微调 BERT 模型的分步指南。Github repo中提供了代码和必要的文件。
要使用 spaCy v3.0 微调 BERT,我们需要以 spaCy v3.0 JSON 格式(请参阅此处)提供训练和开发数据,然后将其转换为.spacy
二进制文件。我们将提供包含在 TSV 文件中的 IOB 格式的数据,然后将其转换为 spaCy JSON 格式。
我只标记了 120 个职位描述,其中包含培训数据集的技能、文凭、文凭专业和经验等实体,以及开发数据集的大约 70 个职位描述。
在本教程中,我使用了UBIAI注释工具,因为它具有广泛的功能,例如:
机器学习自动注释
字典、正则表达式和基于规则的自动注释
团队协作共享注释任务
直接注释导出为 IOB 格式
使用 UBIAI 中的正则表达式功能,我预先注释了所有遵循“\d.*\+.*”模式的经验提及,例如“5 + 年的 C++ 经验”。然后我上传了一个包含所有软件语言的 CSV 字典并分配了实体技能。预注释可以节省大量时间,并将帮助您最大限度地减少手动注释。
有关 UBIAI 注释工具的更多信息,请访问文档页面。
导出的注释将如下所示:
MSB-DIPLOMAinOelectricalB-DIPLOMA_MAJORengineeringI-DIPLOMA_MAJORorOcomputerB-DIPLOMA_MAJORengineeringI-DIPLOMA_MAJOR.O5+B-EXPERIENCEyearsI-EXPERIENCEofI-EXPERIENCEindustryI-EXPERIENCEexperienceI-EXPERIENCE.I-EXPERIENCEFamiliarOwithOstorageB-SKILLSserverI-SKILLSarchitecturesI-SKILLSwithOHDDB-SKILLS
为了从 IOB 转换为 JSON(请参阅此处的文档),我们使用 spaCy v3.0 命令:
!python-mspacyconvertdrive/MyDrive/train_set_bert.tsv./-tjson-n1-ciob!python-mspacyconvertdrive/MyDrive/dev_set_bert.tsv./-tjson-n1-ciob
转换为 spaCy v3.0 JSON 后,我们需要.spacy
使用此命令将训练和开发 JSON 文件都转换为二进制文件(用您自己的更新文件路径):
!python-mspacyconvertdrive/MyDrive/train_set_bert.json./-tspacy!python-mspacyconvertdrive/MyDrive/dev_set_bert.json./-tspacy
模型训练
打开一个新的 Google Colab 项目,并确保在笔记本设置中选择 GPU 作为硬件加速器。
为了加速训练过程,我们需要在 GPU 上运行并行处理。为此,我们安装了 NVIDIA 9.2 CUDA 库:
!wgethttps://developer.nvidia.com/compute/cuda/9.2/Prod/local_installers/cuda-repo-ubuntu1604-9-2-local_9.2.88-1_amd64-Ocuda-repo-ubuntu1604–9–2-local_9.2.88–1_amd64.deb!dpkg-icuda-repo-ubuntu1604–9–2-local_9.2.88–1_amd64.deb!apt-keyadd/var/cuda-repo-9–2-local/7fa2af80.pub!apt-getupdate!apt-getinstallcuda-9.2
要检查是否安装了正确的 CUDA 编译器,请运行:!nvcc --version
安装 spacy 库和 spacy 转换器管道:
pipinstall-Uspacy!python-mspacydownloaden_core_web_trf
接下来,我们安装为 CUDA 9.2 配置的 PyTorch 机器学习库:
pipinstalltorch==1.7.1+cu92torchvision==0.8.2+cu92torchaudio==0.7.2-fhttps://download.pytorch.org/whl/torch_stable.html
安装 PyTorch 后,我们需要安装针对 CUDA 9.2 调整的 spaCy 转换器并更改CUDA_PATH
和LD_LIBRARY_PATH
如下。最后,安装 CuPy 库,它相当于 NumPy 库,但适用于 GPU:
!pipinstall-Uspacy[cuda92,transformers]!exportCUDA_PATH=”/usr/local/cuda-9.2"!exportLD_LIBRARY_PATH=$CUDA_PATH/lib64:$LD_LIBRARY_PATH!pipinstallcupy
SpaCy v3.0 使用config.cfg
包含所有模型训练组件的配置文件来训练模型。在spaCy 训练页面,您可以选择模型语言(本教程中为英文)、组件(NER)和硬件(GPU)使用并下载配置文件模板。
我们唯一需要做的就是填写 train 和 dev.spacy
文件的路径。完成后,我们将文件上传到 Google Colab。
现在我们需要用 BERT 模型需要的其余参数自动填充配置文件;你所要做的就是运行这个命令:
!python-mspacyinitfill-configdrive/MyDrive/config.cfgdrive/MyDrive/config_spacy.cfg
如果出现错误,我建议调试您的配置文件:
!python-mspacydebugdatadrive/MyDrive/config.cfg
我们终于准备好训练 BERT 模型了!只需运行此命令即可开始训练:
!python-mspacytrain-g0drive/MyDrive/config.cfg—output./
注意:如果出现错误,cupy_backends.cuda.api.driver.CUDADriverError:
CUDA_ERROR_INVALID_PTX:
则表示 PTX JIT 编译失败。只需卸载cupy
并重新安装它,它应该可以解决问题。
如果一切顺利,您应该开始看到模型得分和损失正在更新。
在训练结束时,模型将保存在文件夹下model-best
。模型分数位于meta.json
文件model-best
夹内的文件中:
!python-mspacyconvertdrive/MyDrive/train_set_bert.tsv./-tjson-n1-ciob!python-mspacyconvertdrive/MyDrive/dev_set_bert.tsv./-tjson-n1-ciob0
由于训练数据集有限,分数肯定远低于生产模型水平,但值得在示例工作描述中检查其性能。
使用 Transformer 提取实体
要在示例文本上测试模型,我们需要加载模型并在我们的文本上运行它:
!python-mspacyconvertdrive/MyDrive/train_set_bert.tsv./-tjson-n1-ciob!python-mspacyconvertdrive/MyDrive/dev_set_bert.tsv./-tjson-n1-ciob1
以下是从我们的示例职位描述中提取的实体:
Python
!python-mspacyconvertdrive/MyDrive/train_set_bert.tsv./-tjson-n1-ciob!python-mspacyconvertdrive/MyDrive/dev_set_bert.tsv./-tjson-n1-ciob2
仅使用 120 个培训文档就令人印象深刻!我们能够正确提取大部分技能、文凭、文凭专业和经验。
随着更多的训练数据,模型肯定会进一步改进并产生更高的分数。
结论
由于令人惊叹的 spaCy v3.0 库,我们只用几行代码就成功地训练了一个功能性的 NER 变换器模型。继续并在您的用例上尝试一下,请分享您的结果。请注意,您可以使用UBIAI注释工具来标记您的数据。
和往常一样,如果您有任何意见,请在下方留言或发送电子邮件至 admin@ubiai.tools