©PaperWeekly 原创 · 作者|苏剑林

单位|追一科技

研究方向|NLP、神经网络

CRF 是做序列标准的经典方法,它理论优雅,实际也很有效,如果还不了解 CRF 的读者欢迎阅读旧作简明条件随机场 CRF 介绍 | 附带纯 Keras 实现。在 BERT 模型出来之后,也有不少工作探索了 BERT+CRF 用于序列标注任务的做法。然而,很多实验结果显示(比如论文 BERT Meets Chinese Word Segmentation [1])不管是中文分词还是实体识别任务,相比于简单的 BERT+Softmax,BERT+CRF 似乎并没有带来什么提升,这跟传统的 BiLSTM+CRF 或 CNN+CRF 的模型表现并不一样。

▲ 基于CRF的4标签分词模型示意图

这两天给 bert4keras 增加了用 CRF 做中文分词的例子(task_sequence_labeling_cws_crf.py[2]),在调试过程中发现了 CRF 层可能存在学习不充分的问题,进一步做了几个对比实验,结果显示这可能是 CRF 在 BERT 中没什么提升的主要原因,遂在此记录一下分析过程,与大家分享。糟糕的转移矩阵由于笔者用的是自己实现的 CRF 层,所以为了证明自己的实现没有错误,笔者跑完 BERT+CRF 的实验(BERT 用的是 base 版本)后,首先观察了转移矩阵,大体数值如下:

其中第 i 行 j 列的数值表示从 i 转移到 j 的得分(记为 ),其中分值的绝对值并没有意义,只有相对比较的意义。顺便说明下,本文的中文分词用的是 (s,b,m,e) 的字标注法,如果不了解可以参考《【中文分词系列】 3. 字标注法与HMM模型》[3]。 然而,直观来看,这并没有学到一个好的转移矩阵,甚至可能会带来负面影响。比如我们看第一行,,即 明显小于 。但是,根据 (s,b,m,e) 的标注设计, s 后面是有可能接 b 的,但不可能接 e,所以 是明显不合理的,它可能引导出不合理的标注序列,理想情况下 应该为 −∞ 才对。这样不合理的转移矩阵一度让笔者觉得是自己的 CRF 实现得有问题,但经过反复排查以及对比 Keras 官方的实现,最终还是确认自己的实现并没有错误。那么问题出现在哪呢?

学习率的不对等如果我们先不管这个转移矩阵的合理性,直接按照模型的训练结果套上 Viterbi 算法去解码预测,然后用官方的脚本去评测,发现 F1 有 96.1% 左右(PKU 任务上),已经是当前最优水平了。转移矩阵很糟糕,最终的结果却依然很好,这只能说明转移矩阵对最终的结果几乎没有影响。什么情况下转移矩阵几乎没影响呢?可能的原因是模型输出的每个字的标签分数远远大于转移矩阵的数值,并且区分度已经很明显了,所以转移矩阵就影响不到整体的结果了,换言之这时候直接 Softmax 然后取 argmax 就很好了。为了确认,我随机挑了一些句子,观察模型输出的每个字的标签分布,确实发现每个字的分数最高的标签分数基本都在 6~8 之间,而其余的标签分数基本比最高的要低上 3 分以上,这相比转移矩阵中的数值大了一个数量级以上,显然就很难被转移矩阵影响到了。这就肯定了这个猜测。一个好的转移矩阵显然会对预测是有帮助的,至少能帮助我们排除不合理的标签转移,或者说至少能保证不会带来负面影响。所以值得思考的是:究竟是什么阻止了模型去学一个好的转移矩阵呢?笔者猜测答案可能是学习率。BERT 经过预训练后,针对下游任务进行 finetune 时,只需要非常小的学习率(通常是 量级),太大反而可能不收敛。尽管学习率很小,但对于多数下游任务来说收敛是很快的,很多任务都只需要 2~3 个 epoch 就能收敛到最优。另一方面,BERT 的拟合能力是很强的,所以它能比较充分地拟合训练数据。这说明什么呢?首先,我们知道,每个字的标签分布是直接由 BERT 模型算出来的,而转移矩阵是附加的,与 BERT 没直接关系。当我们以  量级的学习率进行 finetune 时,BERT 部分迅速收敛,也就是每个字的标签分布会迅速被拟合,同时因为 BERT 的拟合能力比较强,所以迅速拟合到一个比较优的状态(即目标标签打分很高,并且拉开了与非目标标签的差距)。而由于转移矩阵跟 BERT 没什么联系,当逐字标签分布迅速地收敛到较优值时,它还是以  的速度“悠哉悠哉”地前进着,最终要比逐字标签的分数低一个数量级。而且,当逐字标签分布都已经能很好拟合目标序列了,也就不再需要转移矩阵了(转移矩阵的梯度会非常小,从而几乎不更新)。思考到这里,一个很自然的想法是:能不能增加CRF层的学习率?笔者尝试增大 CRF 层的学习率,经过多次实验,发现 CRF 层的学习率为主体学习率的 100 倍以上时,转移矩阵开始变得合理起来了,下面是 BERT 主体学习率为 、CRF 层的学习率为 (即 1000 倍)时,训练出的一个转移矩阵。

这样的转移矩阵是合理的,量级也是对的,它学习到了正确的标签转移,比如 s→s,b 比 s→m,e 分数大、b→m,e 比 b→s,b 分数大,等等。不过,就算调大了 CRF 层的学习率,结果相比不调整时没有明显优势,归根结底,BERT 的拟合能力太强了,就连 Softmax 效果都能达到最优了,转移矩阵自然也不能带来太大的提升。更多的实验分析CRF 没给 BERT 带来什么效果变化,原因是 BERT 的拟合能力太强了,导致不需要转移矩阵效果都很好。那如果降低 BERT 的拟合能力,会不会带来显著差异呢? 前面的实验中是使用 BERT base 的第 12 层的输出来 finetune 的,现在我们只用第 1 层的输出来进行 finetune,来测试上述调整是否会带来显著性差异。结果如下表:

由于只用了 1 层 BERT,所以主体学习率设置为 (模型越浅,学习率可以适当地越大),主要对比的是调整 CRF 层学习率所带来的提升。从表格可以看到:1. 适当的学习率下,CRF 比 Softmax 有提升;2. 适当增加 CRF 层的学习率也会比原来的 CRF 有一定提升。这说明,对于拟合能力不是特别强大的模型(比如只用 BERT 的前几层,或者对于某些特别难的任务来说,完整的 BERT 拟合能力也不算充分),CRF 及其转移矩阵还是有一定帮助的,而精调 CRF 层的学习率能带来更大的提升。此外,上述所有的实验都是基于 BERT 进行的,对于传统的 BiLSTM+CRF 或 CNN+CRF 来说同样的做法有没有效果呢?笔者也简单实验了一下,发现有些情况下也是有帮助的,所以估计这是 CRF 层的一个通用技巧。本文从给 bert4keras 添加的 CRF 例子出发,发现 BERT 与 CRF 结合的时候,CRF 层可能存在训练不充分的问题,进而猜测了可能的原因,并通过实验进一步肯定了猜测,最后提出通过增大 CRF 层学习率的方式来提升 CRF 的效果,初步验证了(在某些任务下)其有效性。相关链接

[1] https://arxiv.org/abs/1909.09292

[2] https://github.com/bojone/bert4keras/blob/master/examples/task_sequence_labeling_cws_crf.py

[3] https://kexue.fm/archives/3922

点击以下标题查看更多往期内容:

  • AAAI 2020 | 语义感知BERT(SemBERT)

  • 浅谈 Knowledge-Injected BERTs

  • 从 Word2Vec 到 BERT

  • 后 BERT 时代的那些 NLP 预训练模型

  • BERT+知识图谱:知识赋能的K-BERT模型

  • 从三大顶会论文看百变Self-Attention

#投 稿 通 道#

 让你的论文被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。

来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志

? 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site

• 所有文章配图,请单独在附件中发送

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

?

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

关于PaperWeekly

PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

▽ 点击 |

crf的实现 keras_你的 CRF 层的学习率可能不够大相关推荐

  1. 你的 CRF 层的学习率可能不够大

    ©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 CRF 是做序列标准的经典方法,它理论优雅,实际也很有效,如果还不了解 CRF 的读者欢迎阅读旧作简明条件 ...

  2. pytorch load state dict_PyTorch 学习笔记(五):Finetune和各层定制学习率

    本文截取自<PyTorch 模型训练实用教程>,获取全文pdf请点击:https://github.com/tensor-yu/PyTorch_Tutorial @[toc] 我们知道一个 ...

  3. PyTorch 学习笔记(五):Finetune和各层定制学习率

    本文截取自<PyTorch 模型训练实用教程>,获取全文pdf请点击:https://github.com/tensor-yu/PyTorch_Tutorial 文章目录 一.Finetu ...

  4. crf linux使用教程,Linux下CRF++的使用

    在之前使用CRF++的过程中一直是再Windows下运行的,由于训练文本不大,所以很顺利,但为提高结果准确率而增加训练语料内容,随之也出现问题,因为用自己的机子做会使cpu占用率在训练迭代时瞬间达到1 ...

  5. pytorch 冻结层操作 + 学习率超参数设置

    pytorch finetune冻结层操作 知乎文章:pytorch 两种冻结层的方式 - 知乎 文章说了两种冻结层的方法: 一.设置requires_grad为False 第一步: for para ...

  6. dropout层_深度学习两大基础Tricks:Dropout和BN详解

    深度学习 Author:louwill Machine Learning Lab Dropout dropout作为目前神经网络训练的一项必备技术,自从被Hinton提出以来,几乎是进行深度学习训练时 ...

  7. 计算机网络各层设备及功能讲解大汇总~

    文章目录 一.物理层设备 1.中继器 中继器的功能 中继器的使用规则( 5-4-3 规则 ): 2.集线器(多端口的中继器) 集线器的功能: 集线器的特点: 二.数据链路层设备 1.网桥(交换机的前身 ...

  8. 如何用powerPCB设定4层板的层?-道合顺大数据Infinigo

    可以将层定义设为 1:no plane+ component(top route) 2:cam plane或split/mixed (GND) 3:cam plane或split/mixed (pow ...

  9. 技术分享!如何用powerPCB设定4层板的层?-道合顺大数据Infinigo

    可以将层定义设为 1:no plane+ component(top route) 2:cam plane或split/mixed (GND) 3:cam plane或split/mixed (pow ...

最新文章

  1. hdu1501 dp:两个字符串能否组成新串,状态表示能,不能。
  2. 王道考研——计算机组成原理(第二章 数据的表示和运算)
  3. Jquery提交表单 Form.js官方插件介绍
  4. 如何摆脱「自我否定」状态
  5. 下载不了java应用程序_Java 7u45 - java webstart不会下载我的jar并执行应用程序,除非我显示java控制台...
  6. .NET Framework各版本比较
  7. (String) 和 String.valueOf() 两种字符串转换的区别
  8. JavaScript escape() 函数
  9. 可信人工智能白皮书(概要)
  10. 甲骨文裁员,华大人员瘦身优化,亚马逊鼓励离职?
  11. 苹果6S怎么录屏_苹果6s来电没声音怎么回事
  12. int 几个字节 java_java中int是几个字节
  13. 关于UDS诊断会话管理功能相关服务的学习笔记
  14. 怎么彻底处理windows下遇到的广告流氓软件例如:双11天喵、霸业传奇、贪玩蓝约等
  15. 移动硬盘3.5寸和2.5寸的区别
  16. 【雕爷学编程】Arduino动手做(79)---MQ135空气检测模块
  17. 运用计算机控制系统实现逆变过程,电大机电一体化复习题期末复习题(知识点复习考点归纳总结参考)...
  18. MATLAB显函数作图 参数方程作图 极坐标方程作图绘图实例 用 Matlab 绘制高颜值函数图像 放大看告别浓浓锯齿风
  19. 散热性能测试软件,性能测试及散热表现
  20. 新突破!德国MPQ证实光子是量子比特载波的优选

热门文章

  1. D5SJ醴陵 2013最新版
  2. 【转载】早点长大的飞秋
  3. strcat在某种特定条件下的优化
  4. 推荐 6 个不错的JavaScript动画库
  5. 预测一下web前端未来的6个趋势
  6. pcb钻孔披锋改善报告_高速高频PCB技术 || 玻纤效应对高速信号的影响
  7. birt脚本for循环语句_python循环语句(while amp; for)
  8. P5726 【深基4.习9】打分(python3实现)
  9. thinkphp多表查询两表有重复相同字段解决方法
  10. 自动控制原理第二版王建辉_气箱脉冲布袋除尘器的工作原理