一章我们来聊聊在中文领域都有哪些预训练模型的改良方案。Bert-WWM,MacBert,ChineseBert主要从3个方向在预训练中补充中文文本的信息:词粒度信息,中文笔画信息,拼音信息。与其说是推荐帖,可能更多需要客观看待以下'中文'改良的在实际应用中的效果~

Bert-WWM

全词掩码并不是中文的专属,而是google最早在英文预训练任务中提出的。在英文中的使用方式是当word piece tokenizer把一个单词分割成几个部分时,在MASK阶段只要一个部分被掩码,一个单词的其他部分也会被MASK。google提供的英文全词掩码的处理方式如下,很直观就是把所有'##'的部分都补充进掩码

def create_masked_lm_predictions(tokens, masked_lm_prob,
max_predictions_per_seq, vocab_words, rng):
"""Creates the predictions for the masked LM objective."""
cand_indexes = []
for (i, token) in enumerate(tokens):
if token == "[CLS]" or token == "[SEP]":
continue
if (FLAGS.do_whole_word_mask and len(cand_indexes) >= 1 and
token.startswith("##")):
cand_indexes[-1].append(i)
else:
cand_indexes.append([i])
...

而在中文使用中,并不存在字被拆分的情况,因此中文全词是指对词粒度进行掩码。在哈工大开源的Bert/Roberta-WWM系列中,以LTP分词结果作为掩码的最小粒度如下

实现方案其实可以借鉴上面的英文代码,只需要根据分词结果对字符加上'##'前缀,例如'语言模型',正常tokenize会得到['语','言','模','型'], 基于LTP的分词结果['语言','模型'], 只需要把tokenizer调整为['语','##言','模,'##型'],就可以和英文用相同的处理方式了~

这里的全词掩码只影响MLM预训练任务,和下游微调以及模型自身结构无关,因此可以迁移到任意的预训练模型框架和下游任务中。全词掩码有两个优点

  • 部分解决了MLM独立性假设,使得预测token之间拥有了一定的关联性
  • 提高了MLM任务难度,使得模型需要更多依赖远距离的上下文来判断掩码部分的内容

但是WWM是否在所有中文任务中都比字符粒度的模型更好呢?在使用过程中感觉也不尽然,例如在做一些信息抽取任务时会发现当抽取信息的粒度和词粒度存在一定不一致时,字符BERT的效果是要显著由于WWM的。猜测是WWM引入了部分词边界信息,和下游任务抽取的边界存在一定冲突。

简单说就是中文词本身的粒度在不同上下文语境中是存在差异的,这是和英文单词最大的差异,而这个差异并不能通过LTP单一的分词器来引入。Ref3的论文也指出在中文字符纠错任务中对WWM的效果并没有BERT好,不过论文只给出了字符+WWM的混合掩码方案,感觉。。。如果预训练模型都需要因地制宜的话,那只能说我们还没找到合适的预训练方案。。。

MacBert

  • Take Away: MLM->纠错任务,解决MASK在预训练和微调的不一致性
  • Paper:MacBert, Pre-Training with Whole Word Masking for Chinese BERT
  • Github:https://github.com/ymcui/MacBERT

MacBert可能放在中文这里并不太十分合适,其实是针对MASK在预训练和微调中的不一致问题进行的改良。在Bert不完全手册4. 绕开BERT的MASK策略?XLNET & ELECTRA中聊到Electra和XLNET也分别通过生成-判别器,以及乱序语言模型的方案绕开MASK学习双向上下文信息,MacBert给出了另一种方案。

MacBert对原始的MLM任务做了如下调整

  • 用相似词替代[MASK]进行掩码,这里的相似词是基于word2vec similarity来召回候选,如果没有召回就降级为随机掩码,于是完形填空任务其实变成了纠错任务(这里应该也要限制召回的词和原词长度相同)
  • WWM + N-gram掩码,10%的4gram,20%3gram,30%2gram,40%1gram。个人理解这里的gram不是字符粒度而是词粒度,否则会有大量的ngram不再以上word2vec的词表内无法召回,不过MacBert并没有开源训练代码所以无从考证

在抽取式阅读理解上,MacBert略有提升,其他任务感觉提升不太明显。整体改良非常简单易懂,但是逻辑上其实有一点存疑,就是基于word2vec的相似词替换作为掩码,真的不会导致模型在训练过程中出现信息泄露的问题么?因为部分相似词替换例如高兴->快乐, 下雨->降雨,其实是提供了近乎一样的文本信息的,这种情况下模型其实不需要依赖上下文,直接通过替换后的文本也能进行预测。这里其实和Electra的生成器部分不能太强是有些相似的问题。N-gram的掩码可能一定程度上缓解了这个信息泄露的问题,但感觉这个问题还是存在的~

ChineseBert

最后这个模型是有一些起名nb症在的,虽然整体效果提升只能说比随机波动要更显著一些。不过改良的方向,包括拼音和笔画信息的引入比较有意思,相似的方案在一些文本纠错,风控文本变形之类的领域也看到过有类似的应用,所以还是来简单聊聊

  1. 拼音信息

相同汉字在不同的场景下会存在发音不同的情况,例如音乐和快乐中,yue发音对应的是乐曲,le对应的发音是喜悦,因此发音和汉字交互后也会提供一定的共享信息。不过一字多音的情况相对少,所以感觉拼音层能提供的信息比较有限。不过类似的方案之前有想在风控领域去做尝试,因为风控中经常会出现同音字的变形,例如把佳琪改写成嘉琪,加7等形式去绕过违禁词封禁。如果使用这里已经与训练好的拼音embedding去在下游进行迁移可能效果会有提升~

这里用了pypinyin来生成文字对应的拼音和声调,例如猫->mao1。拼音复用原始的token,4个声调额外用4个特殊token来表征,拼音部分用特殊字符'-'pad到等长。提取信息这里用了width=2的CNN+max pooling来生成每个字符最终的拼音embedding

  1. 笔画信息

笔画信息一定程度给字之间增加了共享信息,例如'江','河','湖','泊'都三点水的偏旁部首,他们存在的上下文也会有一定相似性,因此可以有一部分信息迁移,算是变相增加了上下文信息的丰富程度。不过ChineseBert使用的方式并没有用五笔,而是用了图像信息。使用了仿宋,隶书,行楷三种字体的图片向量化(24243),对3种字体的图片输入进行拼接,然后过全连接层得到每个字符的笔画embedding

  1. 信息融合

在原始Bert token embedding的基础上,加入了拼音和笔画embedding层。特征融合层,简单使用了3个embedding拼接,过全连接层的方式得到融合后的输入embedding,之后的模型结构就和BERT一致了。

  1. MASK: 使用了字符+WWM的混合掩码方式

Reference

  1. Spelling Error Correction with Soft-Masked BERT
  2. https://github.com/shibing624/pycorrector
  3. Is Whole Word Masking Always Better for Chinese BERT?": Probing on Chinese Grammatical Error Correction
  4. https://blog.csdn.net/Jiana_Feng/article/details/123539083

Bert不完全手册6. Bert在中文领域的尝试 Bert-WWM & MacBert & ChineseBert的更多相关文章

  1. Bert不完全手册9. 长文本建模 BigBird & Longformer & Reformer & Performer

    这一章我们来唠唠如何优化BERT对文本长度的限制.BERT使用的Transformer结构核心在于注意力机制强大的交互和记忆能力.不过Attention本身O(n^2)的计算和内存复杂度,也限制了Tr ...

  2. Bert不完全手册1. 推理太慢?模型蒸馏

    模型蒸馏的目标主要用于模型的线上部署,解决Bert太大,推理太慢的问题.因此用一个小模型去逼近大模型的效果,实现的方式一般是Teacher-Stuent框架,先用大模型(Teacher)去对样本进行拟 ...

  3. Bert不完全手册2. Bert不能做NLG?MASS/UNILM/BART

    Bert通过双向LM处理语言理解问题,GPT则通过单向LM解决生成问题,那如果既想拥有BERT的双向理解能力,又想做生成嘞?成年人才不要做选择!这类需求,主要包括seq2seq中生成对输入有强依赖的场 ...

  4. Bert不完全手册3. Bert训练策略优化!RoBERTa & SpanBERT

    之前看过一条评论说Bert提出了很好的双向语言模型的预训练以及下游迁移的框架,但是它提出的各种训练方式槽点较多,或多或少都有优化的空间.这一章就训练方案的改良,我们来聊聊RoBERTa和SpanBER ...

  5. Bert不完全手册5. 推理提速?训练提速!内存压缩!Albert

    Albert是A Lite Bert的缩写,确实Albert通过词向量矩阵分解,以及transformer block的参数共享,大大降低了Bert的参数量级.在我读Albert论文之前,因为Albe ...

  6. Bert不完全手册7. 为Bert注入知识的力量 Baidu-ERNIE & THU-ERNIE & KBert

    借着ACL2022一篇知识增强Tutorial的东风,我们来聊聊如何在预训练模型中融入知识.Tutorial分别针对NLU和NLG方向对一些经典方案进行了分类汇总,感兴趣的可以去细看下.这一章我们只针 ...

  7. Bert不完全手册8. 预训练不要停!Continue Pretraining

    paper: Don't stop Pretraining: Adapt Language Models to Domains and Tasks GitHub: https://github.com ...

  8. 学习《Python数据科学手册》高清中文PDF+高清英文PDF+代码

    如果有一定的数据分析与机器学习理论与实践基础,<Python数据科学手册>这本书是绝佳选择. 是对以数据深度需求为中心的科学.研究以及针对计算和统计方法的参考书.很友好实用,结构很清晰.但 ...

  9. Python学习手册第4版 中文PDF版|网盘下载内附地址

    本书是学习Python编程语言的入门书籍.Python是一种很流行的开源编程语言,可以在各种领域中用于编写独立的程序和脚本.Python免费.可移植.功能强大,而且使用起来相当容易.来自软件产业各个角 ...

随机推荐

  1. Linux嵌套目录权限的比较探究

    在/tmp目录下新建一个嵌套目录,名字分别为test_0.test_1.test_2.在test_2目录下新建普通文件,名为tryme.设置test_0和test_2的权限为777,设置test_1的 ...

  2. 每日一题20180401-Linux

    一.题目 1.1 在mysql命令行临时开启自动补全 1.2 通过shell脚本打印乘法口诀表 二.答案 2.1 # auto-rehash:读取表信息和列信息,可以在连上终端后开启tab补齐功能 # ...

  3. JAVA数组案例!

    数组的用例 一.案例需求: 有这样的一个数组,元素是{68,27,95,88,171,996,51,210}.求出该数组中满足要求的元素和, 要求是:求和的元素个位和十位都不能是7,并且只能是偶数如何 ...

  4. [2018-03-04] 利用 Settings Sync 插件同步 VS Code 设置

    VS Code 已原生支持设置同步,本文仅备份记录 [2018-03-04] 早就听说这个插件了,今天用了一下,确实挺方便的.通过把配置文件创建为 Gist 上来实现了 VS Code 设置的同步,下 ...

  5. 【Java面试】如何理解Spring Boot中的Starter?

    一个工作了3年的Java程序员,遇到一个Spring Boot的问题. 他对这个问题有一些了解,但是回答得不是很好,希望参考我的高手回答. 这个问题是:"如何理解Spring Boot中的S ...

  6. MTK 平台sensor arch 介绍-hal

    MTK 平台sensor arch 介绍-hal 一:整体框架 二:具体流程简介 AP-HAL: (1)init & control flow 我们以前文的originchannel 的 ac ...

  7. SQL的语法

    SQL的语法 SQL通用语法 SQL语句可以单行或多行书写,以分号(";")结尾. SQL语句可以使用空格或缩进增强可读性. MySQL数据库的SQL语句不区分大小写(建议关键字大 ...

  8. Java学习-第一阶段-第一节:Java概述

    JAVA概述 Java版本 原网址(https://www.oracle.com/java/technologies/java-se-support-roadmap.html) Oracle 将仅将某 ...

  9. 为什么 C# 访问 null 字段会抛异常?

    一:背景 1. 一个有趣的话题 最近在看 硬件异常 相关知识,发现一个有意思的空引用异常问题,拿出来和大家分享一下,为了方便讲述,先上一段有问题的代码. namespace ConsoleApp2 { ...

  10. 名校AI课推荐 | UC Berkeley《人工智能导论》

    深度学习具备强感知能力但缺乏一定的决策能力,强化学习具备决策能力但对感知问题束手无策,因此将两者结合起来可以达到优势互补的效果,为复杂系统的感知决策问题提供了解决思路. 今天我们推荐这样一门课程--U ...