利用特定领域模型训练Bert模型


前言

最近刚完成医疗电子病历模型的预训练,经过测试效果还不错,相比于原生Bert在序列标注任务和文本分类任务中提升了大约2个点,让小编也理解了Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks, ACL2020的真谛,真的是这样的!!


一、预训练模型思路?

对于预训练模型,我们通常想到的是Bert,Albert,Robeta等,这些预训练模型一次又一次的对各种任务SOTA,但在实际的运用场景里面各种翻车(不要问我怎么知道的)。
其实,对于上述的预训练模型,本人的理解是一个大型的迁移学习模型,把在通用数据上训练得到的模型迁移到一些特定的任务上,相比与LSTM或CNN都会有不错的效果,但也不是绝对的哈。
虽然预训练模型在特定任务上有不错的效果,但没有人会满足啊,除非效果为100%,这就衍生出了利用特定领域数据进行预训练,这种方法往往都能够在相应的领域有一些提升。

通常利用特定领域数据进行预训练的思路有两个:

(1). 直接利用开源的预训练模型代码,换成自己的数据进行预训练
(2). 加载已有的预训练模型参数,在此基础上继续训练

对于这两种方法呢,前者需要大规模的相关领域数据,而且需要经过很长时间的训练才能得到,当然,这需要你拥有相应的硬件设备。后者则是利用相关领域的数据来直接进行预训练,当然,需要换一下任务,也就Mask Language Model任务,这也需要相应的硬件。。。个人觉得如果你不差时间,不差钱,还不差数据,可以使用前者进行训练,这样可以使得模型的领域契合度更高。如果像小编一样(没钱,没时间,没数据),建议使用后者的方式进行预训练。。

二、数据处理

1.MLM任务

要想进行预训练,首先就得对数据进行处理,数据处理部分主要分为两大块:(1)对文本中的15%的词语进行随机MASK,在这15%中的80%利用[MASK]标签进行遮罩,另外10%选取词表中的词语进行随机替换,最后10%保持不变,这也是Bert处理数据的基本流程。在这里小编使用的是Whole MASK,也就是全词遮罩,具体步骤如下:

(1) 读取文本数据,数据格式和Bert预训练的一样
(2) 对文本进行分词,分词工具自选(jieba, LTP等)
(3) 分好词的数据存在一个字典中
(4) 把文本转换为id,并且添加特殊标记[CLS],[SEP],[UNK],[PAD]等
(5) 遍历每个句子,然后用random.random()随机产生数字,判断数字与MASK比例的大小来进行MASK,如果MASK了一个词语中的某个字,把整个词语也进行MASK

最终得到的MASK后的句子:

Original_Input: 使 用 语 言 模 型 来 预 测 下 一 个 词 的 概 率 。
Sengment_Input: 使用 语言 模型 来 预测 下 一 个 词 的 概率 。


Original_Bert_Input: 使 用 语 言 [MASK] 型 来 [MASK] 测 下 一 个 词 的 [MASK] 率 。
Whold_Word_Bert_Input: 使用 语言 [MASK][MASK] 来 [MASK][MASK] 下 一 个 词 的[MASK][MASK] 。

全词MASK的部分代码如下(大家谅解一下,只能提供这么点,毕竟签了保密协议的):

import re
import jieba


def get_new_segment(segment):  # 新增的方法 ####
    seq_cws = jieba.lcut("".join(segment))  # 分词
  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值