Transformers Domain Adaptation
Transformers Domain Adaptation
本指南说明了端到端Domain Adaptation
工作流程,其中我们为生物医学NLP应用程序适应领域转换模型。
它展示了我们在研究中研究的两种领域自适应技术:
- 数据选择 (Data Selection)
- 词汇量增加 (Vocabulary Augmentation)
接下来,我们将演示这样一个Domain Adaptation
的Transformer模型是如何与🤗transformer
的训练流程兼容的,以及它如何优于开箱即用的(无Domain Adaptation
的)模型,这些技术应用于BERT-small,但是代码库被编写成可推广到HuggingFace支持的其他Transformer类。
警告
对于本指南,由于内存和时间的限制,我们使用域内语料库的一个小得多的子集(<0.05%)。
准备工作
安装依赖程序
使用pip
安装transformers-domain-adaptation
|
|
下载demo files
|
|
常量
我们首先定义一些常量,包括适当的模型卡和文本语料库的相关路径。
在domain adaptation
的背景下,有两种类型的语料库。
- 微调语料库(Fine-Tuning Corpus)
给定一个NLP任务(如文本分类、摘要等),这个数据集的文本部分就是微调语料库。
- 在域语料库 (In-Domain Corpus)
这是一个无监督的文本数据集,用于领域预训练。文本领域与微调语料库的领域相同,甚至更广泛。
|
|
加载模型和tokenizer
|
|
数据选择
在领域预训练中,并不是所有的领域内语料库的数据都可能是有帮助的或相关的。对于不相关的文件,在最好的情况下,它不会降低领域适应模型的性能;在最坏的情况下,模型会倒退并失去宝贵的预训练信息即灾难性的遗忘
。
因此,我们使用Ruder & Plank设计的各种相似性和多样性指标,从域内语料库中选择可能与下游微调数据集相关的文档。
|
|
|
|
由于我们在DataSelector
中指定了keep=0.5
,所以选择的语料库应该是域内语料库的一半大小
,包含前50%最相关的文档。
|
|
|
|
词汇扩充
我们可以扩展模型的现有词汇用以包括特定领域的术语。这样就可以在领域预训练中明确学习这种术语的表示。
|
|
用新的词汇术语更新模型和tokenizer
|
|
Domain Pre-Training
Domain PreTraining
是Domain Adaptation
的第三步,我们在领域内语料库上用同样的预训练程序继续训练Transformer模型
。
创建数据集
|
|
实例化TrainingArguments和Trainer
|
|
训练结果
Step | Training Loss | Validation Loss | Runtime | Samples Per Second |
---|---|---|---|---|
50 | 2.813800 | 2.409768 | 75.058500 | 13.323000 |
100 | 2.520700 | 2.342451 | 74.257200 | 13.467000 |
为特定任务进行微调
我们可以为HuggingFace
支持的任何微调任务插入我们的domain adaptation
模型。在本指南中,我们将在BC2GM数据集(一个流行的生物医学基准数据集)上比较一个开箱即用(OOB)模型与一个领域适应模型在命名实体识别方面的表现。用于NER预处理和评估的实用函数改编自HuggingFace的NER微调示例笔记。
对原始数据集进行预处理,形成NER数据集
|
|
安装 seqeval
|
|
seqeval是一个用于序列标记评估的Python框架,可以评估分块任务的性能,如命名实体识别、部分语音标记、语义角色标记等。
|
|
实例化NER模型
在此,我们实例化了三个特定任务的NER模型进行比较:
da_model
: 我们在本指南中刚刚训练的一个Domain Adaptation
的NER模型da_full_corpus_model
: 同样的领域适应性NER模型,只是它是在完整的领域内训练语料库上训练的。oob_model
: 一个开箱即用的BERT-NER模型(没有经过Domain Adaptation)。
|
|
为每个模型创建数据集、TrainingArguments和Trainer
|
|
训练和评估da_model
|
|
训练结果
Step | Training Loss | Validation Loss | Precision | Recall | F1 | Accuracy | Runtime | Samples Per Second |
---|---|---|---|---|---|---|---|---|
100 | 0.258000 | 0.156976 | 0.621130 | 0.604061 | 0.612477 | 0.941589 | 64.652200 | 38.962000 |
200 | 0.148500 | 0.130968 | 0.689895 | 0.693156 | 0.691522 | 0.951615 | 64.609800 | 38.988000 |
300 | 0.131800 | 0.119317 | 0.671880 | 0.774549 | 0.719571 | 0.954099 | 64.629700 | 38.976000 |
400 | 0.116800 | 0.108599 | 0.738141 | 0.743567 | 0.740844 | 0.959777 | 64.621000 | 38.981000 |
500 | 0.078600 | 0.106925 | 0.749023 | 0.771574 | 0.760131 | 0.962172 | 64.869500 | 38.832000 |
600 | 0.074800 | 0.098790 | 0.749081 | 0.784351 | 0.766310 | 0.962727 | 64.517500 | 39.044000 |
700 | 0.073000 | 0.099364 | 0.763633 | 0.784351 | 0.773854 | 0.964268 | 64.496200 | 39.057000 |
训练和评估da_model_full_corpus
|
|
结果
Step | Training Loss | Validation Loss | Precision | Recall | F1 | Accuracy | Runtime | Samples Per Second |
---|---|---|---|---|---|---|---|---|
100 | 0.231900 | 0.127792 | 0.671435 | 0.829809 | 0.742268 | 0.952202 | 8.246900 | 305.450000 |
200 | 0.108300 | 0.086280 | 0.817341 | 0.826690 | 0.821989 | 0.968876 | 8.064200 | 312.366000 |
300 | 0.089600 | 0.083020 | 0.807372 | 0.838995 | 0.822879 | 0.969839 | 8.014300 | 314.313000 |
400 | 0.080600 | 0.078229 | 0.801577 | 0.880763 | 0.839306 | 0.971885 | 8.141400 | 309.405000 |
500 | 0.050800 | 0.075855 | 0.843227 | 0.864125 | 0.853548 | 0.973716 | 8.172500 | 308.230000 |
600 | 0.052500 | 0.075362 | 0.845051 | 0.858232 | 0.851591 | 0.973550 | 8.057900 | 312.611000 |
700 | 0.047400 | 0.073649 | 0.851391 | 0.864818 | 0.858052 | 0.974442 | 8.029400 |
训练和评估oob_model
|
|
结果
Step | Training Loss | Validation Loss | Precision | Recall | F1 | Accuracy | Runtime | Samples Per Second |
---|---|---|---|---|---|---|---|---|
100 | 0.229200 | 0.133785 | 0.678159 | 0.803118 | 0.735368 | 0.947964 | 8.654700 | 291.056000 |
200 | 0.135200 | 0.109798 | 0.745311 | 0.825984 | 0.783576 | 0.957941 | 8.660700 | 290.855000 |
300 | 0.117200 | 0.099117 | 0.782186 | 0.837120 | 0.808721 | 0.962326 | 8.699700 | 289.550000 |
400 | 0.101300 | 0.095984 | 0.827210 | 0.822420 | 0.824808 | 0.965538 | 8.725000 | 288.710000 |
500 | 0.069000 | 0.103978 | 0.788701 | 0.845731 | 0.816221 | 0.961440 | 8.690600 | 289.853000 |
600 | 0.064100 | 0.092247 | 0.827396 | 0.848404 | 0.837768 | 0.967232 | 8.671200 | 290.501000 |
700 | 0.064400 | 0.090411 | 0.829128 | 0.853749 | 0.841258 | 0.968306 | 8.821600 | 285.549000 |
结果
我们看到,在这三个模型中,da_full_corpus_model
(在整个域内训练语料库上进行了域调整)在测试F1得分上比oob_model
高出2%
以上。事实上,这个da_full_corpus_model
模型是我们训练的在BC2GM上优于SOTA的许多领域适应模型之一。
此外,da_model
的表现也低于oob_model
。这是可以预期的,因为da_model
在本指南中经历了最小的领域预训练。
总结
在本指南中,你已经看到了如何使用 “DataSelector “和 “VocabAugmentor”,通过分别执行数据选择和词汇扩展,对变压器模型进行领域调整。
你还看到它们与HuggingFace的所有产品兼容。变换器”、“标记器 “和 “数据集”。
最后表明,在完整的领域内语料库上进行领域适应的模型比开箱即用的模型表现更好。