当前位置:   article > 正文

预训练永不止步,游戏问答语言模型实操

问答训练语言

©PaperWeekly 原创 · 作者|程任清、刘世兴

单位|腾讯游戏知几AI团队

研究方向|自然语言处理


简介

深度学习时代,为了充分训练深层模型参数并防止过拟合,通常需要更多标注数据喂养,在 NLP 领域,标注数据更是一个昂贵资源。在这种背景下,预训练应运而生,该技术可以从大量无标注数据中进行预训使许多 NLP 任务获得显著的性能提升,大批的预训练模型也相继开源了。

但是由于场景的偏差,通用的预训练模型通常无法在垂直领域取得理想的效果,在我们的实际业务中同样也遇到了这个问题, 为了能进一步提升业务下游任务的性能,将大量无标签领域数据价值发挥到最大,我们尝试在游戏问答场景下自研预训练模型 [1],主要遇到的挑战是如何在预训时引入更多的知识。

本文将介绍我们在这方面所做的系列工作,通过这篇文章你将了解到如何快速上手模型预训练,以及如何结合业务知识进一步提升垂直预训的效果。

(我们所有的实验都是在腾讯云智能钛上进行的,感谢为我们提供算力资源!)

我们的模型已开源:

https://share.weiyun.com/S0CeWKGM (UER版)

https://share.weiyun.com/qqJaHcGZ(huggingface版)



基于UER-PY——中文预训练初探

UER-PY 是公司内开源项目 BERT-PyTorch 对外开放的版本,提供了对 BERT [2] 等一系列预训练模型进行了精准的复现,包括预处理、预训练、下游任务微调等步骤,并增加了多项预训练相关的功能和优化。至于我们为什么选用这个框架,一是该项目对中文的支持及一些下游评测的脚本确实挺好用的,二是目前项目在不断更新优化中,遇到问题能得到及时的解决。

上面便是 UER-PY 的简介,感兴趣的同学可以参考 UER-py:

https://github.com/dbiir/UER-py

本小节主要讲述基于 UER-PY 进行 MLM 预训和词粒度预训练的实操。

2.1 MLM预训练

基于 UER-PY 进行预训练,主要步骤如下:

  • 步骤 1:准备训练数据(这里需要注意:语料的格式是一行一个句子,不同文档使用空行分隔,前提是 target 是 bert(包括 mlm 和 nsp,如果 targe 只有 mlm 的话,不需要空行分隔,当时踩了这个坑)

  • 步骤 2:对语料进行预处理

  • 步骤 3:进行预训

具体脚本都可以在官网上找到,我们简单的用自己的业务数据跑了下,并进行了评测。

主要在 CLUE 和游戏领域分类任务上进行了评测。UER-PY 提供了一些挺好用的脚本,方便评测,可以参考 Competition solutions:

https://github.com/dbiir/UER-py/wiki/Competition-solutions

查看其 loss,取的是 100000 steps 的结果。

各任务评测结果:

从上述结果可以看出,使用领域语料进行预训练对于通用的评测任务影响较小,而在业务任务上性能得到提升。除了字粒度,我们也尝试了词粒度的预训,以比较哪种粒度更适合我们的场景。

2.2 词粒度预训练

当我们想要获得特定领域的预训练模型,如果很多词汇不在提供的 vocab.txt 中,这是我们就想根据自己的领域语料来构建自己的词典进行 word-base 预训练。

本节将主要讲述基于游戏领域的语料进行 word-base 的预训练(同样还是在 UER-PY 框架上,并在 Wikizh(word-based)+BertEncoder+BertTarget 基础上进行增量训练,该模型可在 Modelzoo 下载)。

https://github.com/dbiir/UER-py/wiki/Modelzoo

首先利用 jieba 分词进行切词,并在 jieba 自定义词典里加入领域实体词,生成得到分词后的训练数据(all_qa_log.txt),通过脚本构建词典:

  1. #构建领域词典
  2. python3 scripts/build_vocab.py --corpus_path ../data/all_qa_log.txt \
  3.     --vocab_path ../data/zhiji_word_pre/zhiji_word_vocab.txt \
  4.     --workers_num 10 \
  5.     --min_count 30 \ 
  6.     --tokenizer space   

可以调整 min_count 来调整词典大小,min_count 表示一个词在语料中重复出现的次数。我们构建后的词典大小为 137011, 原本词典大小为 80000。

重构词典后,需要相应的调整预训练模型,可通过以下脚本实现:

  1. python3 scripts/dynamic_vocab_adapter.py --old_model_path ../data/wiki_word_model/wiki_bert_word_model.bin \
  2.     --old_vocab_path ../data/wiki_word_model/wiki_word_vocab.txt \
  3.     --new_vocab_path ../data/zhiji_word_pre/zhiji_word_vocab.txt \
  4.     --new_model_path ../data/zhiji_word_pre/zhiji_bert_word_model.bin

这里遇到一个问题:就是词典明明是 137011 大小,调整后的模型 embedded 层词典大小对应是 137010,后查看原因是:构建的词典中有""和" ",uer/utils.vocab.py 中读取代码会将这两个词弄成一个。

  1. #将下行
  2. w = line.strip().split()[0if line.strip() el
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/226171
推荐阅读
相关标签
  

闽ICP备14008679号