文章目录

  • 前言
  • 掩码任务
    • 掩码比例
    • 替换策略
    • 掩码方式
      • 全词掩码
      • N-gram掩码
      • 实体掩码
      • Span掩码
    • 代码实现

欢迎大家访问个人博客: https://jmxgodlz.xyz

前言

本文在上文不要停止预训练实战-Roberta与Albert的基础上,进一步完成以下内容:

  • keras预训练
  • N-gram掩码任务
  • Span掩码任务

掩码任务

BERT等预训练模型中掩码任务主要涉及下列要素:

  • 掩码比例
  • 替换策略
  • 掩码方式

掩码比例

常用掩码比例设置为15%,该比例经过许多研究,已证明该比例能够取得很好的效果。

从理论上来说,笔者从网上找到的说法为:“当取15%时,恰好大概7个词mask一个,正好就是CBOW中,长度为7的滑动窗口的中心词,因此会有比较好的效果”

而近日丹琦大佬等人的论文Should You Mask 15% in Masked Language Modeling?表明掩码40%能够取得与15%差不多的效果。

该论文表明**“所谓的optimal masking rate并不是一个一成不变的神奇数字,而是一个随着模型大小、mask策略、训练recipe、下游任务变化的函数。”**

替换策略

常用的替换策略如下:

  • 80%词语替换为[MASK]
  • 10%词语保持不变
  • 10%词语随机替换为其他词语

这样做的目的在于强迫模型学习词语上下文的语义信息。任何一个词语都有可能被替换,不仅靠当前词语,还需要利用上下文的信息预测当前词语。

但是[MASK]标签并未出现在下游任务中,因此存在预训练与微调的不一致问题。

MacBERT提出MLM as correction的方法,替换策略如下:

  • 80%词语替换为同义词
  • 10%词语保持不变
  • 10%词语随机替换为其他词语

MacBERT论文中与下列替换策略进行对比,对比结果如图所示:

  • MacBERT:80%替换为同义词,10%替换为随机词语,10%保持不变;
  • Random Replace:90%替换为随机词语,10%保持不变;
  • Partial Mask:同原生的BERT一样,80%替换为[MASK],10%替换为随机词语,10%保持不变;
  • ALL Mask:90%替换为[MASK],10%保持不变。

图中横坐标代表训练步数,纵坐标代表EM值。第一幅图是CMRC数据集结果,第二幅图是DRCD数据集结果。

掩码方式

目前的掩码方式主要分为以下几种:

  • 单词掩码
  • 全词掩码
  • 实体掩码
  • N-gram掩码
  • Span掩码
中文 英文
原句 使用语言模型来预测下一个词的概率。 we use a language model to predict the probability of the next word.
分词 使用 语言 模型 来 预测 下 一个 词 的 概率 。 -
BERT Tokenizer 使 用 语 言 模 型 来 预 测 下 一 个 词 的 概 率 。 we use a language model to pre ##di ##ct the pro ##ba ##bility of the next word.
单词掩码 使 用 语 言 [M] 型 来 [M] 测 下 一 个 词 的 概 率 。 we use a language [M] to [M] ##di ##ct the pro [M] ##bility of the next word.
全词掩码 使 用 语 言 [M] [M][M] [M] 下 一 个 词 的 概 率 。 we use a language [M] to [M] [M] [M] the [M] [M] [M] of the next word.
实体掩码 使 用 [M] [M] [M] [M][M] [M] 下 一 个 词 的 概 率 。 we use a [M] [M] to [M] [M] [M] the [M] [M] [M] of the next word.
N-gram掩码 使 用 [M] [M] [M] [M][M] [M] 下 一 个 词 的 概 率 。 we use a [M] [M] to [M] [M] [M] the [M] [M] [M] [M] [M] next word.
Span掩码 使 用 [M] [M] [M] [M] [M] [M] [M] 下 一 个 词 的 概 率 。 we use a [M] [M] [M] [M] [M] [M] the [M] [M] [M] [M] [M] next word.
MAC掩码 使 用 语 法 建 模 来 预 见 下 一 个 词 的 几 率 。 we use a text system to ca ##lc ##ulate the po ##si ##bility of the next word.

全词掩码

以分词结果为最小粒度,完成掩码任务。

N-gram掩码

同样以分词结果为最小粒度,以n-gram取词语进行掩码。

例如MacBERT采用基于分词的n-gram masking,1-gram~4gram Masking的概率分别是40%、30%、20%、10%。

实体掩码

代表模型为:ERNIE

引入命名实体信息,将实体作为最小粒度,进行掩码。

Span掩码

代表模型为:SpanBERT

以上做法让人认为,或许必须得引入类似词边界信息才能帮助训练。但前不久的 MASS 模型,却表明可能并不需要,随机遮盖可能效果也很好,于是就有SpanBERT的 idea:

根据几何分布,先随机选择一段(span)的长度,之后再根据均匀分布随机选择这一段的起始位置,最后按照长度遮盖。文中使用几何分布取 p=0.2,最大长度只能是 10,利用此方案获得平均采样长度分布。

代码实现

相关代码实现可见:https://github.com/447428054/Pretrain/tree/master/KerasExample/pretraining

Span掩码核心代码如下:

def __init__(self, tokenizer, word_segment, lower=1, upper=10, p=0.3, mask_rate=0.15, sequence_length=512
):"""参数说明:tokenizer必须是bert4keras自带的tokenizer类;word_segment是任意分词函数。"""super(TrainingDatasetRoBERTa, self).__init__(tokenizer, sequence_length)self.word_segment = word_segmentself.mask_rate = mask_rateself.lower = lowerself.upper = upperself.p = pself.lens = list(range(self.lower, self.upper + 1))self.len_distrib = [self.p * (1-self.p)**(i - self.lower) for i in range(self.lower, self.upper + 1)] if self.p >= 0 else Noneself.len_distrib = [x / (sum(self.len_distrib)) for x in self.len_distrib]print(self.len_distrib, self.lens)def sentence_process(self, text):"""单个文本的处理函数流程:分词,然后转id,按照mask_rate构建全词mask的序列来指定哪些token是否要被mask"""word_tokens = self.tokenizer.tokenize(text=text)[1:-1]word_token_ids = self.tokenizer.tokens_to_ids(word_tokens)sent_length = len(word_tokens)mask_num = math.ceil(sent_length * self.mask_rate)mask = set()spans = []while len(mask) < mask_num:span_len = np.random.choice(self.lens, p=self.len_distrib) # 随机选择span长度anchor = np.random.choice(sent_length)if anchor in mask: # 随机生成起点continueleft1 = anchorspans.append([left1, left1])right1 = min(anchor + span_len, sent_length)for i in range(left1, right1):if len(mask) >= mask_num:breakmask.add(i)spans[-1][-1] = ispans = merge_intervals(spans)word_mask_ids = [0] * len(word_tokens)for (st, ed) in spans:for idx in range(st, ed + 1):wid = word_token_ids[idx]word_mask_ids[idx] = self.token_process(wid) + 1return [word_token_ids, word_mask_ids]

不要停止预训练实战(二)-一日看尽MLM相关推荐

  1. 不要停止预训练实战-Roberta与Albert

    文章目录 前言 任务描述 任务数据集 实验设置 预训练数据生成 roberta的预训练数据处理 albert的预训练数据处理 预训练代码 模型结构 Roberta embedding_lookup e ...

  2. bert预训练实战篇-持续更新

    导读 使用bert预训练会遇到很多坑,包括但不限于数据预处理的正确姿势.数据预处理的高效实现.bert单机多卡分布式训练的基本实现,以及如何debug并提升使用单机多卡来进行深度学习训练的性能瓶颈.本 ...

  3. MedicalGPT:基于LLaMA-13B的中英医疗问答模型(LoRA)、实现包括二次预训练、有监督微调、奖励建模、强化学习训练[LLM:含Ziya-LLaMA]。

    项目设计集合(人工智能方向):助力新人快速实战掌握技能.自主完成项目设计升级,提升自身的硬实力(不仅限NLP.知识图谱.计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用户 ...

  4. 拒绝无脑吹!从ACL20看预训练缺陷

    星标/置顶小屋,带你解锁 最萌最前沿的NLP.搜索与推荐技术 文 | 舒意恒.兔子酱 以 BERT 为代表作的预训练模型的研究热度一直很高,到 0202 年了,预训练的研究依旧层出不穷,而且 ACL ...

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

    ©PaperWeekly 原创 · 作者|程任清.刘世兴 单位|腾讯游戏知几AI团队 研究方向|自然语言处理 简介 深度学习时代,为了充分训练深层模型参数并防止过拟合,通常需要更多标注数据喂养,在 N ...

  6. NeurIPS 2022 | 清华提出P2P:基于预训练图像模型的点到像素提示学习方法

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 点击进入-> CV 微信技术交流群 在这里和大家分享一下我们被NeurIPS 2022录用的点云理解工 ...

  7. 大规模搜索+预训练,百度是如何落地的?

    大家好,我是kaiyuan.今天一起来看百度KDD2021的一篇工作,关于工业界语义检索召回系统,落地场景非常值得借鉴~ Pre-trained Language Model for Web-scal ...

  8. 深度学习--使用预训练的卷积神经网络

    文章目录 前言 一.使用预训练网络 二.将VGG16卷积基实例化 三.使用卷积基进行特征提取 1.不使用数据增强的快速特征提取 2.使用数据增强的特征提取 四.微调模型 前言 想要将深度学习应用于小型 ...

  9. 论文笔记 | code pretraining(代码预训练系列)

    文章目录 Pre-trained contextual embedding of source code CodeBERT: A Pre-trained model for programming a ...

最新文章

  1. org manual翻译--3.5.8 更新表格
  2. 关于java类型数据组的调用
  3. Tomcat中的字体请求跨域问题解决
  4. 什么是云计算基础设施?
  5. java原子类场景,CAS你知道吗?原子类AtomicInteger的ABA问题谈谈?,原子共面问题...
  6. java ee空指针_Java EE 7是最终版本。 思想,见解和进一步的指针。
  7. 【渝粤题库】广东开放大学 英语语法与基础写作 形成性考核 (2)
  8. 自动登录360,百度
  9. 面试驱动技术 - Category 相关考点
  10. 安装Lr11.0(LoadRunner) 出现安装LoadRunner时出现:缺少vc2005_sp1_with_atl_fix_redist的解决办法
  11. Linux下安装wechat
  12. 怎么添加usb虚拟打印机端口_佳能LBP2900,夏普等特殊打印机使用教程
  13. 使用引导扇区维护工具BOOTICE编辑系统启动列表BCD文件
  14. 合肥宏晶微MS9334芯片特性/HDMI一分四开发板/HDMI分配器芯片/HDMI 1分4芯片
  15. 2017长乐国庆欢乐赛Day1
  16. 计算机网络CiscoPacket Tracer实验
  17. eja变送器故障代码al01_EJA的差压变送器三种常见故障
  18. 罗技x56c语言编程,【罗技X56评测】模拟飞行好伙伴,X56在x-plane中的应用
  19. CISSP认证每日知识点和常错题(12月18日)
  20. python爬取玉米、小麦、水稻信息数据到本地为网页形式和mysql数据库中

热门文章

  1. 驱动人生7装驱动开机显示选择系统
  2. 为啥妹子给我发的 Excel 打开之后是乱码?
  3. 作图笔记 - mermaid的字体大小设置
  4. 手机邮箱格式怎么写你知道吗?带你注册个人邮箱账号
  5. linuxpgrepgrep_Linux pgrep与kill的使用
  6. 单量子比特的布洛赫球(Bloch Sphere)分析
  7. 【官宣】传智教育使命升级!
  8. Python入门初学一、Python简介及发展,带你深入认识Python
  9. 良好的微服务架构能够取代企业服务总线吗?
  10. C# NI VISA 仪表控制编程实例