段智华
摘 要 本文对字符级CNN深度神经网络在中国电信上海公司的自动甩单类型识别案例进行了研究。我们使用电信自动甩单数据集,通过与传统的机器学习算法比较,实验表明字符级CNN卷积神经网络在文本分类预测中具有竞争力的结果。
关键词 电信自动甩单;CNN;BERT模型
1 背景
本论文是中国电信上海公司自动甩单类型识别内部竞赛的案例,训练数据集来自中国电信上海公司的甩单数据,内部竞赛分为2个阶段,初赛根据甩单数据,预测分类是生成一张订单还是多张订单;复赛在预测订单为单订单或多订单的基础上,进一步预测生成订单的具体数量、行项目数量和业务类型。
传统的机器学习文本分类算法首先提取文本的特征(Bag、TF-IDF等),然后将抽取的文本特征输入模型进行训练,常用的机器学习分类器模型包括Bag Naive Bayes、TF-IDF Naive Bayes、TF-IDF SVM、TF-IDF LGB、TF-IDF XGB、Model Ensemble等算法;深度学习算法在文本分类的应用,包括CNN等模型;我们采用的是CNN深度学习模型,在此次内部竞赛中荣获鼓励奖。
2 中文字符级别的CNN卷积模型
本案例中整个CNN模型架构包括6层,包括嵌入字向量层、CNN卷积层,最大池化层、2层全连接层及Softmax多分类层。
2.1 字向量映射层embedding(字符级别的向量编码)
新建字向量嵌入表embedding的维度为 [字汇表大小vocab_size,字向量维度embedding_dim],对于每一个输入的甩单特征文本[数据批次大小, 句子长度],我们读入甩单数据文本的信息,从字向量嵌入表查找对应索引位置的字向量,字向量映射层计算输出的大小为:[batch_size, seq_length ,embedding_dim]。
2.2 CNN卷积层
使用一层卷积层提取甩单文本字向量特征,卷积层输出的维度是[batch_size, seq_length - kernel_size +1, num_filters]。然后使用最大池化函数提取卷积层的最大值特征,池化以后的数据维度为[batch_size,num_filters]。
2.3 全连接层
采用2个全连接层,全连接层节点的个数为hidden_dim,为防止过拟合,第一个全连接层每次随机将dropout_keep_prob的节点抛弃;然后将全连接的结果进行relu激活函数的非线性变换计算,第一个全连接层输出的维度为[batch_size, hidden_dim]。第二个全連接层输出的维度为[batch_size, num_classes]。
2.4 Softmax分类
Softmax函数将全连接层计算处理的得分转变为概率计算。Softmax分类取概率最大值的索引为预测的业务分类,维度为[batch_size,],对于每一个甩单特征文本预测出业务类型,行项目数,订单数组合的分类。
2.5 CrossEntropyLoss交叉熵及优化器
使用softmax_cross_entropy_with_logits交叉熵方法度量甩单文本预测值的业务分类的数据分布与目标值y实际的业务分类数据分布的接近程度。采用AdamOptimizer优化器,Adam是带有动量项的自适应优化器。
3 模型比较
为了提升自动甩单类型识别案例预测分类的得分,我们使用传统机器学习算法及深度学习算法分别进行了一系列实验,尽最大努力选择能够提供可比性的分类模型及预测具有竞争力的分类结果。
3.1 传统机器学习方法
传统的机器学习分类包括2个步骤,第一步采用词袋模型N-gram、词频-逆词频TF-IDF等特征工程方法提取文本的特征信息;第二步使用机器学习分类器进行分类。
词袋模型特征-朴素贝叶斯分类器:采用CountVectorizer构建甩单文本信息N-gram词袋特征,选取中心词前后N个词的特征构建向量。通过MultinomialNB进行贝叶斯模型训练及预测。
TF-IDF特征-朴素贝叶斯分类器:词频TF表示一个词语出现的次数,逆词频IDF表示一个词语的重要程度。我们使用sklearn机器学习库的TfidfVectorizer提取文本词频特征,采用sklearn.naive_bayes的MultinomialNB进行贝叶斯模型训练及预测。
TF-IDF特征-SVM分类器:使用sklearn的TfidfVectorizer提取TF-IDF特征,使用sklearn.svm的LinearSVC线性分类支持向量机进行模型训练及测试集分类预测。
TF-IDF特征-LGB分类器:将数据提取TF-IDF特征以后序列化为pkl文件,加载pkl文件,采用微软开源的Lightgbm.LGBMClassifier分类器进行分类预测。
TF-IDF特征-XGB分类器: 提取数据的TF-IDF特征,序列化为pkl文件,然后加载pkl文件,采用Xgboost.XGBClassifier分类器进行分类预测。
各算法模型集成(投票法):对于每一个机器学习的算法模型分别生成了一个训练集的预测结果文件,将每个分类器投票票数最多的类作为预测的类别。
3.2 深度学习算法[1]
我们体验了基于Pytorch版本的中文版本的基线预训练模型,在GPU服务器测试了训练,预测时取得了较不错的得分。同时,我们深入研究了Harvard NLP实验室Annotated-Transformer算法源码,Harvard NLP对BERT模型的多注意力模型进行了注释版本的代码复现,让我们对BERT的注意力模型机制有了深入的理解。
注意力模型是一个标准编码器-解码器结构,每层有两个子层:第一层是多头自注意机制,第二层是一个简单的、位置导向的、全连接的前馈网络。Decoder 解码器也由一个N=6个相同层的堆栈组成,每层由自注意力、源注意力和前馈网络组成,即在每个编码器层中的两个子层外,解码器还额外插入第三个子层,该子层在编码器堆栈的输出上执行多头注意力关注,解码器与编码器类似,使用残差连接解码器的每个子层,然后进行层归一化。
4 甩单数据集及预测结果
自动甩单类型识别案例的训练数据集的甩单数据-训练数据(153446行记录), 订单数据-训练数据(443731行记录),测试集甩单数据(50000行记录)。我们首先进行了数据预处理:将甩单数据-训练数据与订单数据-训练数据根据甩单号进行关联,然后选择相关的字段组成输入数据X甩单的特征,将“业务类型|行项目数#订单数”组成一个y订单标签。此次竞赛采用F1作为评分标准,评分公式为F1=2P*R/(P+R)*10000,其中P 准确率=预测成功/预测生成多个订单;R 召回率=预测成功/实际生成多个订单。
我们对于CNN模型采用Relu激活函数,测试了配置不同的学习率情况下CNN模型的得分。实验表明,在学习率lr=1e-04,采用Relu激活函数,CNN模型取得了一个较高的分数8612.45。
5 案例研究及讨论
输入数据特征优化:
如何提高模型算法的得分,从输入数据优化的角度,我们进行了一些思考。借鉴BERT模型论文中数据处理MASK的思路:我们对于部分重复的词语,将80% 的词语直接替换为[MASK],10% 的词语替换为新单词,10%保留原词。优化效果:验证集准确率0.5%~1%左右的提升。
同時,我们从数据模式匹配的角度考虑优化:在单订单、多订单的分类预测中,从训练集的甩单备注与测试集的甩单备注做模式匹配,如匹配,将训练集的多订单类型直接作为测试集的预测类型。然后将预测为多订单的此部分甩单号与之前预测为多订单的甩单号去重合并作为多订单的甩单号。但模式匹配的优化效果不明显。
大规模精准分类:
从算法模型的角度,借鉴计算机视觉领域目标检测的思路,先识别图像大类,再检测为目标实例。如果对大规模6008个分类进行精准分类,可以考虑分成2个深度学习网络,一个深度学习网络用于大的分类,另一个深度学习网络用于进一步的精准分类。将每300个分类做一个大类,20(20=[6008/300])个模型来训练每个类别的300个小类别,训练20+1个模型保存,测试集将预测到某一个大类的记录取出来,再训练到更精准的小类别,从理论上可以实现6008个分类。从GPU服务器硬件资源的角度,可以在具备多GPU计算能力的服务器上运行大规模分类数据。
6 结论及展望
本文对CNN字符级别模型的电信自动甩单类型识别的案例进行了研究。我们比较了大量的传统机器学习和深度学习算法模型,使用了电信自动甩单数据集进行了训练及推测。一方面,分析表明字符级CNN卷积神经网络是一种有效的方法;另一方面,我们模型的表现取决于许多因素,例如,超参数的调优,文本特征的优化等。
在未来,自然语言处理NLP将成为人工智能一个重要的发展领域。谷歌最强NLP模型BERT开源,这是2018年人工智能领域最重要的事件,对于技术人员而言,这是整个人工智能领域接下来五年最重要的机遇!
7 致谢
感谢中国电信上海公司组织此次内部竞赛活动及提供自动甩单类型识别案例的数据集。
参考文献
[1] 王家林.五节课内从零起步(无需数学和Python基础)编码实现AI人工智能框架电子书[J/OL].https://www.docin.com/p-2104188986.html.