论文链接: http://arxiv.org/pdf/1711.04411.pdf
github代码:GitHub - chqiwang/convseg: Convolutional neural network and word embeddings for Chinese word segmentation
一 前言
分词是NLP领域中非常重要的一步,例如一个中文句子:“阿里巴巴是一家中国公司”,让计算机来处理,第一步需要切分为“阿里巴巴/是/一家/中国/公司”这样的词串的形式,然后再进行后续的理解和处理。可见如何正确的根据语义完成中文切分是一个关键性的任务,一旦切词发生失误,会导致后续的文本处理产生连锁反应,给正确理解语义带来障碍。
这些天看了一篇关于中分分词的论文(主要是太久没输出),复现后过来总结一下。目前,在深度学习中,各种神经网络也是百花齐放,NLP领域中也是,feed-forward neural network,tensor neural network,recursive neural network,LSTM,LSTM与recursive neural network组合等模型在分词上都取得了不错的表现,但是它们都有两个很大的缺陷:一是严重依赖手动设计的bigram feature,即不擅长自动捕获n-gram特征;二是没有使用完整词汇信息。
针对这两个缺陷,论文提出了带词嵌入的卷积神经网络用于中文分词的思路,模型在不加任何特征工程的条件下,在两个基准数据集PKU和MSR上都有着不俗的表现:在PKU上为95.7%(F1值),MSR为97.3%(F1值);加入词嵌入后,PKU上为96.5%,MSR上为98.0%。
二 分词现状
中文分词指的是讲一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。现有的分词方法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。
基于字符串匹配的分词方法又叫机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大”的机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。常用的字符串匹配方法有如下几种:正向最大匹配法(从左到右);逆向最大匹配法(从右到左);最小切分(每一句中切出的词数最小);双向最大匹配(进行从左到右、从右到左两次扫描)。这类算法的优点是速度快,时间复杂度可以保持在 O(n),实现简单,效果尚可;但对歧义和未登录词处理效果不佳。
基于理解的分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
基于统计的分词方法是在给定大量已经分词的文本的前提下,利用统计机器学习模型学习词语切分的规律(称为训练),从而实现对未知文本的切分。例如最大概率分词方法和最大熵分词方法等。随着大规模语料库的建立,统计机器学习方法的研究和发展,基于统计的中文分词方法渐渐成为了主流方法。主要的统计模型有:N元文法模型(N-gram),隐马尔可夫模型(Hidden Markov Model,HMM),最大熵模型(ME),条件随机场模型(Conditional Random Fields,CRF)等。在实际的应用中,基于统计的分词系统都需要使用分词词典来进行字符串匹配分词,同时使用统计方法识别一些新词,即将字符串频率统计和字符串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
三 网络架构
文章采用的是自下而上的介绍。
1 查找表
通过神经网络处理句子的第一步通常是将句子中的词汇或字符转换成embeddings的形式,给定一个句子,经过查找表,可以生成一个L×d矩阵X,d代表嵌入的大小。我们会为一个特征关联一个查找表,某些特征可能会共享一个查找表,最终的表示形式将作为所有相应特征嵌入的并置来计算。
2 卷积层
众所周知,n-gram特征对模型的表现有很大的影响,为了模型有优质的表现,必须充分利用n-gram特征。为了克服以往模型不能自动捕获n-gram特征的弊端,paper使用了卷积层,因为字符水平的CNN能够学着自动区分不同类型的n-gram特征。paper使用的网络十分简单,只有卷积层,没有池化层,GLU作为卷积层的非线性单元,这里没有用ReLU是因为在语言模型任务中,GLU优于ReLU。
如图,是卷积层的架构图,一般做法,定义输入通道数为 N,输出通道数为M,输入长度为L,内核宽度为k。因此卷积层可以写为:
其中为输入层,,,,是可学习的参数,σ是sigmoid函数,。
3 CRF(条件随机场)
对于序列标签任务,明确考虑相邻标签之间的相关性是有益的,相邻标签之间的相关性可表示为过渡矩阵。给定一个句子,有卷积层给的相应分数,对于一个标记序列,定义非规范化分数为:
因此标签序列的概率定义为:
其中是所有有效标签的集合,这实际上是采用线性链CRF的形式,最终模型的损失函数定义为真实标签序列的负对数似然性:
训练过程中,通过反向传播使损失函数最小化;在测试过程中,采用维特比算法以最大概率快速找到标记序列。
4 用词嵌入整合
基于字符的中文分词具有很好的灵活性和有效性,但是完全的词信息并不是那么容易被利用,对此,有另一种中文分词模式:基于词的中文分词。它不仅可以利用字符水平的信息,而且可以利用词水平的信息。paper提出了一个有效的方案:用我们的基于字符的模型对词嵌入进行积分。这个整合主要带来了两个收益:一是可以利用完整的词信息,二是大量无标签数据能被更好的利用。
为了使用词嵌入,paper设计了一系类的词特征,如表:
具体做法是,给定句子 ,在位置i处的单词特征,只有包含当前字符Ci的单词才能被视作为单词特征。因此,可以将特征数量控制在合理范围内,paper还限制了词的最大长度为4,因为很少有中文词汇超过4个中文字符,但是特征空间仍然很大。关键性的一步就是将内存成本限制在可行范围之内,同时数据稀疏性的问题也能被缓解。
主要过程如下:
· 1.不依赖词特征训练一个“教师”模;
· 2.使用“教师”模型切分无标签数据D,获得自动切分的数据D';
· 3.通过D'建立一个词表V,用UNK(unknown words)替换所有未在V里面的词;
· 4.使用word2vec在D'上预训练词嵌入模型
· 5.使用预训练好的词嵌入模型和词特征训练“学生”模型。
注意,在这个过程中没有使用任何的外部标记数据。
四 模型训练
1 数据集
模型训练在两个基准数据集PKU和MSR上进行,这两个数据集来自第二届国际汉语分词大赛,两个数据集都是最少10%的训练集作为验证集,使用的无标签数据来自来自搜狗的新闻数据搜狗实验室(Sogou Labs)。需要重申的是,paper的工作是没有对这两个数据集做过任何的预处理的。
2 参数设置
模型超参数的选择如下:
Dropout:用来防止过拟合,这里应用于模型所有卷积层,设置为0.2;
Hyper-parameters:两个数据上使用的超参数一样,和计算机视觉里很深的CNN一样,对所有卷积层采用了较小的内核宽度,设置为3,另外为了避免计算效力低下,使用了较小dimension of word embeddings,设置为50;
Optimization:使用adam算法来优化模型,这里均使用原文中默认的参数,batch size设置为100,两个训练集训练轮数均不超过100(我自己也跑了模型,基本模型训练20轮左右就已经很接近paper中的结果,后面的提升相对较小,而且很慢,如图)
Weight normalization:应用于所有卷积层的加速,加速很明显。
3 网络层数选择
网络深度对模型表现有很大的影响,浅了可能欠拟合,深了可能过拟合,那到底多少层合适呢?paper也给出了结果如图:
很明显,卷积层在5层之后表现几乎没有更优,因此,paper也是选择了5层卷积层。但是如果训练数据更大,质量更优的话,卷积层再加层数,模型表现应该会更好。(最近接触了空洞卷积和跳跃卷积的概念,如果这里的卷积使用空洞卷积或者跳跃卷积,不知效果如何,有兴趣可以试试)
4 主要结果
4.1 模型结果
其中,带*号的是使用了外部汉语成语词典,带◇号的是通过使用唯一令牌替换连续的英文字符和数字来处理数据集。可以很明显的观察到,F1值有了很明显的提高,CON-SEG是预训练模型未使用词嵌入,WE-CONV-SEG是使用了词嵌入,将CON-SEG作为“教师”模型。
4.2 字符嵌入预训练
通过添加预训练字符嵌入,模型表现也有显著上升如图4.2:
4.3 N-gram特征
paper也测试了模型捕获n-gram特征的能力,因为unigram必不可少,trigram超出了内存限制,所以paper只考虑了bigram,bigram在基于字符的神经中文分词模型中起到了至关重要的作用,之前的模型没用bigram的表现都很糟糕,paper的bigram embeddings的尺寸设置为50,结果模型命名为AVEBE-CONV-SEG,出乎意料的是AVEBE-CONV-SEG的表现劣于没有使用bigram特征的CONV-SEG,如图4.3:
这个结果与之前的结论完全不一致,之前通过此方法的模型表现都有提升,同时,观察到AVEBE-CONV-SEG的损失要比CONV-SEG低很多,由此可以推断,这个反常现象是因为过拟合,一个合理的推测就是CONV-SEG已经自动捕获了丰富的bigram特征,因此,当再添加bigram时,模型会出现过拟合。由此可以推断,模型能够自动捕获丰富的n-gram特征。
4.4 词嵌入
词嵌入使强基线性模型CONV-SEG得到了显著的提升。这些提升来自“教师”模型和大量的无标签数据,那么问题来了,多大的无标签数据可以造成显著提升呢?图4.4.1给出了结果:
从实验结果图可知,MSR数据集test score在268MB之后便没有了提升,而PKU数据集test score则在1.1GB之后也没有提升,MSR相比PKU具有更强的鲁棒性,当无标签数据只有68MB时,已经可以很明显的观测到模型表现显著的提升。
同时,“教师”模型的表现是如何影响“学生”的呢?paper训练了两个模型使用两个不同的“教师”模型,其中一个使用了“差一点教师”模型,另一个使用“好一点教师”模型,结果如图4.4.2:
由图可知,“差一点教师” 培养了“差一点学生”,但是幅度很小,“好一点老师”没有影响,由此可以推断,“学生”的表现对“老师”的能力不敏感,只要这个“老师”不要太糟糕。
除此之外,paper从自动切分的数据建立的词表对模型提升应该也有积极的影响,对此paper训练了对比模型,没有使用预训练词嵌入但是使用了词特征和词表,词嵌入采用随机初始化,结果如图4.4.3:
根据结果可知,预训练词嵌入和词表大致对最后的提升有一样的贡献。
五 个人总结
虽然说这篇论文是17年发的,相对来说不够新,但里面的很多创新性思路很值得借鉴。现今优质的论文基本都是国外专家学者发表,其主要也是针对英文,中文较少,而中文与英文又有很多不同,难点也多。英文单词的提取要比中文简单的多,在英文文本处理时,可以非常容易地通过空格来切分单词,而中文文本是一连串的中文文字,中文分词需要按照人理解汉语的方式,将连续的汉字串切分为单独表义的词汇,难度相对英文难了不少。
使用卷积层可以捕获丰富的n-gram特征,这为我今后的工作带来了参考,而且另外一个突出的点是不需要对数据进行任何的特征工程,这样会节省很多工作和时间。经过卷积层后将其送入CRF层进行序列水平的预测。关于这里,我之前也提到了,paper做的工作证明了卷积层5层左右是最合适的,用的是普通的卷积,如果将卷积改为空洞卷积或者跳跃卷积不知效果如何,待我有时间便去尝试一下。
关于如何充分利用所有的词汇信息,paper也提供了参考,将词嵌入整合至模型内,不需要使用任何外部标记数据,而词嵌入则是来自大量自动分段的数据,这使得我们模型的表现提升很多。paper设定的词汇最大长度是4,但我们知道中国有些成语是超过4个字的,有些网络用语也是超过四个字的,设定为4对正确理解这部分词的语义有很大困扰,但是设定过大带来的特征空间也很巨大,设定为4的特征空间为。鱼与熊掌,看你如何取舍。
关于为何模型在跑20轮就已经接近最后水平,我想应该也是归功于使用了卷积层,前面就已经捕获了大量n-gram特征,使得模型可以在用较少的轮数就能得到接近最终水平的表现。我自己也跑了模型,第一轮loss69,经过三轮loss已经降到了个位数,而模型表现F1值已经达到0.943。
我个人也尝试调了几组参数,显卡是1070Ti的,跑一遍下来需要4个多小时,时间成本有点大,所以目前只是试了几组而已,效果很接近,但都不如作者最新给出的,相信作者也是花时间试了很多组参数吧。