前言:本篇是TextCNN系列的第三篇,分享TextCNN的优化经验
前两篇可见:
文本分类算法TextCNN原理详解(一)TextCNN代码详解(附测试数据集以及GitHub 地址)(二)
调优模型的基本方法
大家如果跑过模型的话,不论是demo还是实际项目,通常的情况都是先跑一次看看效果,然后针对某些效果不好的地方做一些调优,俗称「调参狗」,调优有很多方法,基本的方法是:根据模型在测试集合的badcase 来分析有没有共性的问题,譬如做一个文本分类,我们在训练集上效果很好,但是测试集上,某一类的文本总是容易判断错误,那么这就属于一个共性问题。
如何解决这种问题呢?两种方式:
从特征的角度优化。我们可以通过做一些特征分析等来找到有区分度的特征来进行优化。特征与特征之间如何结合,如何判断与测试结果是否有相关性,都是我们重点需要分析的。
从模型结构上调整。深度学习虽然大家可能认为是一个黑盒,可解释性差,但是不同的网络模型确实能对结果产生一些变化。我们可以从网络模型上优化,适当调整结构,再来训练看测试的效果。不断的迭代再调整。
这是我们调优的基本思路和两个着手点。如果只是按照常规的手段直接去调参,往往达不到我们想要的效果,所以通过分析bascase,可以针对性的解决问题,更加符合我们的应用场景和实际项目。如果单纯的通过使用更fancy的模型来替换老模型来提高准确率,无异盲人摸像,很可能达不到我们最终想要的效果。
具体调优方法介绍
1:明确所有类别预测错误的badcase
假设我们的任务是一个三分类的任务,其中一个类别是"movie",即判断一个query 是不是属于视频。在测试集的预测结果中,有部分预测错误,如图一所示
label
predict
错误分类原因
movie
music
标注问题
movie
book
数据分布不平衡
movie
music
缺乏先验知识
movie
book
过于依赖A特征
movie
book
数据分布不平衡
分析示例一
从表中我们可以看到,一共有5条文本,原label是movie,预测结果与label都不相同,其中3条预测成book、2条预测成music等,这些就属于“badcase”。除了可以统计这一个label的错误预测,也可以把其他类别的badcase全部统一集合,做成list来具体分析。
2: 分析badcse预测错误的共性原因
我们把这些badcase挑出来以后,需要分析每个预测错误的badcase的具体原因是什么,譬如,表中有两条预测成book的原因是“数据分布不一致”,这就属于找到badcase的共性。把原始的特征拿出来再分析,就可以分析出预测错误的共性是什么。
总结出共性原因后,按照错误原因的频次从高到低排列,可以看到我们当前最需要解决的问题有哪些。假设我们一共分析出四类原因,分别是:
训练集合和测试集合部分特征抽取方式不一致,如训练集合是用python 来实现抽取特征,但是部署到线上的时候是用java实现来抽取特征,训练和预测抽取特征的时候不是同一套代码,虽然理论上两者应该一致,但是实现的时候由于语言差异以及二次开发的差异很容易造成某一特征在java版本和python版本有不同的结果 (占比约40%)