《Spelling Error Correction with Soft-Masked BERT》
最近在研究中文校对相关的东西,自然免不了先阅读前人大作,今天读的是2020ACL的soft-Masked。该文是做中文拼写纠错(CSC),换言之是实现映射函数F: X —> Y,其中len(X)=len(Y).
算法整体还是使用比较主流的Detection+Correction的两级结构,其中Detection使用Bi-GRU,Correction使用作者改进后的soft-masked bert,算法整体结构如下:
-
Detection
首先,模型的输入是n个中文字符X=(x1,x2,..... ,xn)经过embeddings得到的E = (e1,e2,....,en),该embeding是word embeding+position embeding+segment embeding,经过Bi-GRU得到各个字符错误的概率G = (g1,g2,....,gn),其中g在0-1之间,越靠近1表示该字符错误的概率越大,其损失函数为:
-
soft-masked
作者认为只hard-mask了15%字符的Bert不完全具备纠错的能力(至于为啥不具备,作者也没讲清楚,我觉得这里有些牵强),所以作者提出了soft-mask,大致的思路就是利用Detection输出的得分来引导Bert输入的mask,使得得分高(错误概率高)的地方更大概率被mask,公式如下:
-
Correction
Correction的输入是经过soft-masked的embeding,输出的是生成的字符,损失函数是:
-
Loss
模型没有分阶段训练,而是直接end-to-end,使用Bert的per-trained模型,损失函数由Detection和Correction线性组合,如下:其中为超参数,后面作者做了关于该参数的消融实验。
-
Experiment
作者做了两组实验,第一组使用SIGHAN实验:首先用500万数据(来自新闻app,替换其中的15%字符,其中%80为同音字替换,20%为随机替换)进行第一遍fine-tuned,再利用SIGHAN数据上进行fine-tuned。News Title(作者提出的数据集,包含15,730 texts)实验:只在500玩训练数据上进行fine-tuned。实验结果如下:
-
读者总结
该方法还是比较主流的二阶段方法,先查错再纠错,作者的写作功底很好,方法讲的比较清楚。但是因为需要输入输出对齐,这导致实际使用价值不高,同时,简单的把查错结果利用mask手段加入到纠错输入上,总感觉有点儿隔靴搔痒,同时作者认为传统的hard-mask不适用于CSC领域,这个没搞明白为什么不适用。
-
参考文献