无炫技:纯粹的Bert和Roberta

项目连接:https://github.com/whgaara/pytorch-roberta

项目概述
bert作为当代NLP的基石型模型,熟练掌握是至关重要的。笔者阅读了很多大牛的代码,发现很多内容过于繁琐,考虑的范畴与功能也非常的复杂。本着让更多小伙伴能通过代码直击bert精髓因此自己一行行纯手工敲出这个项目,尽可能做到的是纯粹。

因为roberta和bert极其相似,因此这里顺便给出了两种训练模式,其主要区别就是预训练数据的区别。此外,考虑到应用场景,此处bert也放弃了NSP任务,大家阅读时可注意。

欢迎star,目前本功能支持错别字的检测,后续会跟进NER的功能。

 

使用
如果不加载预训练模型:
- 第一步,将训练文本添加到data/src_data中,文本内容就是一行行的句子即可。
- 第二步,运行根目录的gen_train_test.py生成对应的训练和测试集。
- 第三步,打开根目录的pretrain_config.py设置你需要的参数,注意:ModelClass可设置为Bert或Roberta两种,如果你的任务只是错别字纠错或者实体识别这种简单任务,非常建议选择Bert。
此外,local2target_emb和local2target_transformer是用于加载预训练模型的参数名对照表,如果是自主训练无需管它。
- 第四步,修改好参数后,即可运行python3 pretrain_mlm.py来训练了,这里训练的只是掩码模型。训练生成的模型保存在checkpoint/finetune里。
- 第五步,如果你需要预测并测试你的模型,则需要运行根目录下的inference.py。需要注意的事,你需要将训练生成的模型改名成:roberta_trained.model,或者自行统一模型名称。
预测中有一个参数:mode,值为'p'或者's',前者表示按拼音相似性纠错,后者表示按字形相似性纠错。遗憾的是汉字的笔画数据本人没空准备,因此自形相似性的纠正字是候选字中的top1。

如果加载预训练模型:
- 本人使用的预训练模型是哈工大的版本:https://pan.iflytek.com/link/92ADD2C34C91F3B44E0EC97F101F89D8
因为代码使自己手撸,因此参数名存在出入,所以pretrain_config.py中会存在对应的参数名映射表,预训练模型保存在checkpoint/pretrain下即可。
如果你有其他的预训练模型要注意参数名的映射问题。此外,在使用预训练模型后,SentenceLength要改成512,HiddenLayerNum要改成12。其他步骤则与上述相同。

演示下例子:


经验
本项目有两点值得一提:
- 第一,是在做bert模式训练时,本人借鉴了faspell的思路,输入的每一句话的每一个字都用了其他字进行随机替换和预测。
- 第二,在mlm层最后的全链接,不论是google源码还是很多其他大神,都使用了transformer的输出结果(512,768)与embedding权重的转置(768,21128)相乘得到最后的预测值。
但是本人在实验时发现,这部分如果使用一个新的全链接与transformr的输出结果(512,768)相乘,不论是收敛速度还是预测效果都是更好的。
最后,提一下本在工作中一些专有领域进行错别字纠错的结果:可以做到召回率和正确率双90%以上的效果,当然如果是要求更高的开发场景可能还是有待提升的。

欢迎大家留言了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值