查看原文
其他

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

苏剑林 PaperWeekly 2022-03-17


©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 




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





#投 稿 通 道#

 让你的论文被更多人看到 



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


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


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


📝 来稿标准:

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

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

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


📬 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site 

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

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




🔍


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

进入知乎首页搜索「PaperWeekly」

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



关于PaperWeekly


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


▽ 点击 | 阅读原文 | 查看作者博客

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存