屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_Soft-Masked BERT 一种新的中文纠错模型...

2023-11-08

今年,字节AI-Lab与复旦大学合作提出了一种中文文本纠错模型:Soft-Masked BERT[1].这项工作发表在了ACL 2020上,由于论文并没有开源代码,所以我将对这篇论文进行解读与复现。

问题提出:

中文文本纠错是一项挑战性的任务,因为模型要想获得令人满意的解决方案,就必须具备人类水平的语言理解能力。比如:

  • eg1 Wrong:埃及有金塔。Correct: 埃及有金塔。
  • eg2 Wrong: 他的求胜欲很强,为了越狱在挖洞。 Correct: 他的求生欲很强,为了越狱在挖洞。
  • eg3 Wrong: 他主动拉了姑娘的手, 心里很高心。 Correct: 他主动拉了姑娘的手, 心里很高兴

在Soft-Masked BERT被提出之前,最好的方法是先通过在句子的每个位置建立基于BERT的语言表示模型,再从候选字符列表中选择一个字符进行修正。然而,BERT使用了mask的方式进行预训练,没有足够的能力来检测每个位置是否存在误差(只有15%的错误被找出),所以这种方法的精度不够好。

Soft-Masked BERT解决方案:

使用两个网络模型,一个用于错误检测;另一个基于BERT进行纠错。

Soft-Masked BERT结构
  • Detection Network

Detection Network通过双向的GRU来实现:

输入

(input embeddings)是包含每个字符的字嵌入(word embedding)、位置嵌入(position embedding)、段嵌入(segment embedding)三部分的相加的embedding.

输出

是对应每个字符的0到1之间的概率标签,该值越小表示对应字符错误的可能性越大.

那么文本序列中的每一个字符的错误概率计算公式为:

其中

就是由Detection Network计算出的错误概率,
是sigmoid函数,W为全连接的权重矩阵,
为偏置项,
就是Bi-GRU最后一层的hidden state,具体为:

构建Detection_Network中的网络层与实例化代码:

#构建Detection_Network网络层
  • Soft Masking Connection

input embeddings

与使用Detection Network计算出的
加权求和后的结果在论文中叫做soft-masked embedding,
是以误差率为权重的mask embeddings .下式中的
即代表第
个字符通过计算得到的soft-masked embedding.

不难看出,上个步骤中得到的

越小,则soft-masked embedding计算出的
越接近input embeddings 中的
,此字符错误的可能性也越小.

构建Soft Masking Connection层代码

# 中文预训练的Bert模型词表,特殊符[MASK]在词表中的索引都为103
  • Correction Network

该层主要的结构就是Bert模型,其中有12个Encoder层,以整个序列作为输入。每个block包含一个多头部的self-attention操作,然后接一个前馈网络:

取Bert模型中最后一层Encoder的所有隐藏状态与input embeddings对应相加进行残差连接(Residual Connection)得到残差连接值

接着将残差连接值

输入到一个全连接层中,该全连接层会使用bert的hidden state将残差连接值映成为与候选词表维数相同的向量. 后面再跟一个softmax函数输出字符
可以被纠正为候选字符
的概率:

# bert嵌入、encoder、池化、权重.
  • 训练

训练数据是原始序列对和修正序列对组成的元组

创建训练数据的是使用混淆表反复生成包含错误序列
的序列.

损失函数是由Detection Network的损失与Correction Network的损失函数线性相加构成:

系数

一般要取一个大于0.5的值,因为
是 Correction Network的损失函数前的线性组合系数,Correction Network的损失函数为多分类损失函数,分类任务明显更难;而Detection Network的损失函数是二分类损失函数,任务明显更简单,这样也会令整个Soft-Masked BERT模型的效果更好。

其中Detection Network与Correction Network的损失均为交叉熵损失,即:

实验结果

论文中使用的数据集有3个:

  1. Chinese Spelling Check Task(CSC)数据集:选择了其中《对外汉语测试》的作文部分(SIGHAN);
  2. News Title数据集:来自于今日头条app中的文章的标题部分;
  3. 5 million news titles数据集:从一些中文新闻app中爬取,该数据集只用来fine-tuning

其中公开数据集为Chinese Spelling Check Task数据集[2],包含1100个文本和461种错误(字符级别).

不同方法在CSC数据集上的表现对比

可以看出,在CSC数据集的测试中,Soft-Masked BERT模型的效果基本上都是比其他Baseline模型的效果要好。

而在Detection部分,HanSpeller++模型的精准率要高于Soft-Masked BERT模型的精准率,且Correction部分HanSpeller++模型的精准率也高于Soft-Masked BERT模型的精准率.

这是因为HanSpeller++模型中有许多人工添加的规则与特征,这些人工添加的规则与特征能在Detection部分过滤错误的识别,虽然这种人工规则与特征效果很好,但这种方式需要很多人工成本,而且泛化性也不好.

综上,在SIGHAN数据集的测试集上,Soft-Masked BERT模型的效果是最优的。

此外作者还用实验证明了:

  1. fine-tuning的数据集(在5 million news titles数据集上)的规模越大,fine-tuning之后的模型在CSC任务中的效果也会越好;
  2. 消融对比研究,证明该提出的模型每一部分都是不可或缺的.

关于以上内容:

完整代码以及更详细的注释(一行代码三行注释)已上传到github:wanglke/Soft-Masked-BERT

其中代码中用到的bert中文训练模型与config文件可以通过以下链接下载:

config文件下载:https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-config.json

bert中文预训练模型:https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-pytorch_model.bin


遗憾的是该论文的作者并没有对该论文中的算法进行开源,有对中文文本纠错感兴趣的小伙伴可以使用这个开源的中文纠错工具PYcorrector[3]

pycorrector​github.com

它不仅安装简单,同时支持加载自定义混淆集、英文拼写纠错,也支持加载kenlm、rnn_crf、seq2seq、BERT等各种模型。可以结合具体领域的fineturn,是一款可应用在工业级的中文纠错软件,可以满足大部分场景中的文本纠错需求.

问题探讨

那么中文纠错对下游NLP任务有没有影响?,在这里我就使用PYcorrector做了一个小实验,在一个文本分类任务中,我使用的数据集来自电商评论,其中有部分的错误

但在使用PYcorrector的时候,我发现PYcorrector确实能找出部分文本中的错误:

原句


但更多的是False Positive,比如以下:

原句

有这种结果是因为:

  1. 我使用默认的kenlm统计语言模型,要比深度学习模型要差;
  2. 更重要的是我使用的是单品类商品的评价文本,而且没有使用自己的数据做fine-tune,之后再使用通用型的 纠错模型纠错就会使模型"水土不服".

我把该部分数据在纠错前和纠错后以及分别放在相同的模型中(ALBERT+TextCNN[4])进行实验,得到如下的对比结果:

效果意料之中的变差了,虽然是次失败的尝试,但起码证明了效果差的纠错会对NLP下游任务造成负面影响。

后续我将会继续探讨纠错任务对下游NLP任务的影响,主要考虑使用深度学习模型在专门的语料上训练针对性模型

参考

  1. ^[1] https://arxiv.org/pdf/2005.07421.pdf
  2. ^http://ir.itc.ntnu.edu.tw/lre/sighan7csc.html
  3. ^https://github.com/shibing624/pycorrector
  4. ^https://zhuanlan.zhihu.com/p/164873441
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_Soft-Masked BERT 一种新的中文纠错模型... 的相关文章

  • 解决在cmd中输入mongo出现‘mongo‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件的问题~

    当我想通过shell连接mongoDB时 输入mongo命令 出现下述错误 起初我以为我是忘记配置环境变量了 但检查后发现自己配置了 如果你和我是一样的问题 明明配置了环境变量 但上述问题依然没有被解决 后来我通过这篇文章完美了解决了问题
  • SelectNodes 与 XPath

    XPath 是 XML 的内容 这里 SelectNodes 是 javascript 中 XmlDocument 或 XmlNode 的一个方法 SelectNodes 使用 XPath 来选取节点 重要语法 SelectNodes it
  • 七、过滤器(Filter)、拦截器(Interceptor)、监听器(Listener)

    七 过滤器 Filter 拦截器 Interceptor 监听器 Listener 1 过滤器 Filter 依赖于Servlet容器 是JavaEE标准 是在请求进入容器之后 还未进入Servlet之前进行预处理 并且在请求结束返回给前端
  • 彻底弄懂typedef struct和struct定义结构体的区别

    1 语法 定义结构体有两种定义方式 typedef struct 结构名 类型 变量名 类型 变量名 结构别名1 结构别名2 结构名 和 结构别名 都不能直接用 因为它们是结构体这种数据类型的名称 这种方式定义的结构体使用时 需要先声明 结
  • KBQA是个啥?

    什么是KBQA KBQA的全称是基于知识库问答 Knowledge Base Question Answering 即给定自然语言问题 通过对问题进行语义理解和解析 进而利用知识库进行查询 推理得出答案 知识库是用于知识管理的一种特殊的数据
  • k8s的yaml文件格式(完整)

    apiVersion v1 必选 版本号 例如v1 kind Pod 必选 Pod metadata 必选 元数据 name string 必选 Pod名称 namespace string 必选 Pod所属的命名空间 labels 自定义
  • 鼠标悬停(点击)出现文本提示框

    下面的是鼠标点击出现文字 如果想要鼠标移动上去出现 移出消失的话 UI可以使用OnPointerEnter跟OnPointerExit方法 命名空间是UnityEngine EventSystems 如果是3D物体的话可以用OnMouseE
  • centos7 使用mount -t cifs 挂载windows共享目录方法与问题解决

    使用 域 账号 密码 访问 10 100 xx Android 的windows 共享 mount t cifs o domain test com username administrator password test123 192 1
  • ctf.show web7,8,10

    web7 查看列表文章发现 id 判断为sql注入 当有空格时会报错 用 绕过 得到注入点 盲猜flag from flag web8 测试发现过滤了空格 逗号 and 当url判断为真时有回显 数据库视角 进行盲注 substr data
  • HTTP协议——缓存

    缓存的概念 缓存这个东西真的是无处不在 有浏览器端的缓存 有服务器端的缓存 有代理服务器的缓存 有ASP NET页面缓存 对象缓存 数据库也有缓存 等等 http中具有缓存功能的是浏览器缓存 以及缓存代理服务器 http缓存的是指 当Web
  • C++的volatile

    在C 中 编译器为了提高代码的执行效率 常常会对变量进行反向优化 比如将变量缓存在寄存器中 这样可以减少对内存的访问次数 提高访问速度 然而 在某些情况下 我们希望确保每次访问变量时都能从内存中读取最新值 而不是使用缓存中的旧值 volat
  • colmap论文学习

    Structure from Motion Revisited 该文章是colmap对应的稀疏重建论文 主要讲了稀疏重建的几个步骤 特征提取与匹配 colmap利用SIFT算子进行特征提取与匹配 匹配完之后就获得了两两图像之间的匹配对 但是
  • swift 中的标记关键字

    1 MARK 我们知道 在OC中我们可以使用pragma mark添加一些说明 能够快速定位到相应的代码 例如 pragma mark 说明文字 那么在swift中怎么实现类似的功能呢 其实也很简单 只要在需要添加说明的地方加上如下格式的注
  • Linux如何查看目录占用空间大小?

    在Linux操作系统中 查看目录占用空间的大小可以使用du命令来完成 那么Linux du命令是什么 如何使用 常用参数有哪些 本文为大家详细介绍一下 在Linux中 可以使用du命令来查看目录占用空间大小 Linux du命令 du是统计
  • 运维常用的shell命令.md

    1 后台启动脚本 nohup start sh gt dev null 2 gt 1 dev null代表linux的空设备文件 所有往这个文件里面写入的内容都会丢失 俗称 黑洞 2 gt 1错误输出2重定向到标准输出1 意思是标准输出和错
  • 这10种赚钱方法,用手机就可以做,看看哪种适合你?

    现在很多人都想着做第二职业 也就是兼职赚钱 即使能够赚个零花钱也不错 今天给大家分享10个可以利用自己的空闲时间 可以赚到钱的办法 一部手机就能操作的赚钱方式 看看哪一种适合你 只要你有网络主播这一方面的才能 很多网络直播平台都会按照主播的
  • matlab坐标污染物浓度,基于MATLAB城市空气质量评价体系.doc

    基于MATLAB城市空气质量评价体系 基于MATLAB城市空气质量评价体系 本文针对大气污染问题 采用动态加权综合评价方法建立了合理的空气质量评价模型 同时 采用灰色关联度分析方法和BP神经网络模型较好地研究了空气质量和气象参数之间的关系
  • 深度解密Go语言之context

    Go 语言的 context 包短小精悍 非常适合新手学习 不论是它的源码还是实际使用 都值得投入时间去学习 这篇文章依然想尝试全面 深入地去研究 文章相比往期而言 整体不长 希望你看完可以有所收获 什么是 context Go 1 7 标
  • IDEA如何搭建Maven(安装&下载&配置)

    https www cnblogs com xihehua p 9639045 html 1 下载 Maven 压缩包 https maven apache org Use Download gt Files Binary zip arch

随机推荐

  • Linux 递归修改文件时间日期

    在操作 Linux 系统时 发现文件时间总是出现错误 在文件时间超越系统时间时 在执行文件时 就有可能出现错误 查看文件时间 stat test txt 修改一个文件的时间 touch d 2020 11 11 11 00 00 test
  • 【Bugs】解决报错CondaValueError- prefix already exists

    Bugs CondaValueError prefix already exists 1 问题情景 在conda create n ur env name python 3 7的时候报错 WARNING A directory alread
  • Unity游戏性能分析最终指南 02

    设置每帧时间预算 帧率 fps 并不是衡量游戏稳定体验的理想指标 考虑以下情况 在运行时的前0 75s内渲染了59帧 然后接下来的1帧需要0 25s才能渲染完毕 虽然是60fps 但实际上会让玩家感觉卡顿 这是需要设置帧时间预算的重要原因之
  • 数据分析师从业必问的5个问题~

    写在前面 经常有小伙伴问船长一些数据分析从业的问题 类似如何转行 毕业如何择业 如何学习成为数据分析师 今天就抽空总结了一下大家入行数据分析的问题 基本囊括在以下5个问题中 下面5个问题将解答你的困惑 也可能在后续的面试中问到 另外我为你准
  • 23062QTday2

    完善登录框 点击登录按钮后 判断账号 admin 和密码 123456 是否一致 如果匹配失败 则弹出错误对话框 文本内容 账号密码不匹配 是否重新登录 给定两个按钮ok和cancel 点击ok后 会清除密码框中的内容 继续进行登录 如果点
  • CondaValueError: Malformed version string ‘~‘: invalid character(s)

    创建python3 6环境 conda create n py36 python 3 6 anaconda和 升级conda环境 conda update conda和conda upgrade n base c defaults over
  • Unity3DAI行为------避开障碍物简单实现

    public float speed 20 0f public float mass 5 0f public float force 50 0f public float minimumDistToAvoid 20 0f private f
  • 键盘的测试点

  • ajax tottenham,Tottenham end Ajax dream in injury-time, reach first Champions League final

    Video PlayerClose AMSTERDAM May 9 Xinhua Tottenham Hotspur set up a Champions League final against Liverpool after beati
  • Netty介绍(一)————为什么使用Netty

    Netty的简单介绍 Netty 是一个 NIO client server 客户端服务器 框架 使用 Netty 可以快速开发网络应用 例如服务器和客户 端协议 Netty 提供了一种新的方式来使开发网络应用程序 这种新的方式使得它很容易
  • 记一次arm交叉编译的cmake写法

    1 背景 用cmake交叉编译高通4G模组Linux应用代码 2 问题 之前都是参考网上各种所谓的cmake交叉编译写法 例如某乎上config cmake是这样写的 set CMAKE SYSTEM NAME Linux set TOOL
  • vue2的文档

    三 Vue 2 1 Vue 基础 1 环境准备 安装脚手架 npm install g vue cli g 参数表示全局安装 这样在任意目录都可以使用 vue 脚本创建项目 创建项目 vue ui 使用图形向导来创建 vue 项目 如下图
  • C 修改文件或文件夹的权限,为指定用户 用户组添加完全控制权限

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 http blog csdn net jiangjunshow 也欢迎大家转载本篇文章 分享知识 造福人民 实现我们中华民族伟大复兴 C 修改文件或文件夹的权限 为指定用户 用户组添加完全
  • 阿里一道Java并发面试题 (详细分析篇)

    说明 前天分享了一篇关于阿里的 Java常见疑惑和陷阱 的文章 有人说这个很早就有了 可能我才注意到 看完之后发现内容非常不错 有几个我也是需要停顿下想想 题目 我个人一直认为 网络 并发相关的知识 相对其他一些编程知识点更难一些 主要是不
  • Dingo + Laravel + JWT + Entrust + memcache 实现API设计

    Dingo Laravel JWT Entrust memcache 实现API设计 Dingo Api 是一个为laravel设计的用于API开发的开源包 规范和简化了Api的设计 JWT 即 Json Web Token 是一种新的用于
  • 将类模板做为参数(类模板中使用)

    将类模板做为参数 类模板中使用 这种方式只在类模板中使用 函数模板不能使用这种方法 将模板名做为一种特殊的数据类型 实例化对象的时候 使用模板名做为参数 传递给模板 下面例子中 数组和链表都是线性表 数组和链表自身为了适用不同的数据类型参数
  • 代理IP与Socks5代理:跨界电商智能爬虫与出海之道

    跨界电商正成为全球市场的关键驱动力 而代理IP和Socks5代理则为其提供了技术支持 本文将深入研究这两种代理技术在跨界电商 爬虫和出海战略中的重要作用 引言 介绍跨界电商的崛起和全球化趋势 引出代理IP和Socks5代理的重要性以及本文的
  • 魔兽争霸3宽屏显示器适配

    魔兽争霸只提供 4 3 的分辨率选择 800 600 1024 768 等等 如果显示器是 16 9 或 16 10 的话就有点儿蛋疼了 两边都会留出黑边来 可以在 windows 下面双击执行如下的文件来解决这个问题 wide scree
  • Atcoder Beginner Contest 291

    A camel Case AC代码 include
  • 屏蔽预训练模型的权重。 只训练最后一层的全连接的权重。_Soft-Masked BERT 一种新的中文纠错模型...

    今年 字节AI Lab与复旦大学合作提出了一种中文文本纠错模型 Soft Masked BERT 1 这项工作发表在了ACL 2020上 由于论文并没有开源代码 所以我将对这篇论文进行解读与复现 问题提出 中文文本纠错是一项挑战性的任务 因