最后的结果过于依赖某一特征,比如我们的模型过于依赖A特征,但是A 特征的准确率只有88%左右,导致A特征的准确率成了我们模型优化的瓶颈 (占比约30%)
泛化能力较差,比如"我要看黄渤的电影"可以判别正确,但是"我要看周星驰的电影"就判别不对 (占比约20%)
缺乏先验知识,比如"青花瓷" 更容易出现在音乐当中, 而不是出现在baike 当中,但是我们在训练数据当中并没有特征可以体现这一先验知识(占比约10%)
3: 针对原因,专项优化
原因一:训练集合和测试集合部分特征抽取方式不一致
优化方法
由于测试集合是使用java 代码进行特征抽取以及预测的,训练集合是用python 代码进行特征抽取以及训练的,所以我们统一了预测代码与测试代码,共用一套代码
由于之前历史原因,我们训练集合与测试集合抽取特征使用的数据源不同,根据分析来看这种影响非常的大,本次优化使用了同一份数据源
优化结果:相对于原来的baseline,提升了0.4%
原因二:过于依赖效果不佳的特征
优化方法
在全连接层 增加dropout层,设置神经元随机失活的比例为0.3,即keep_rate= 0.7
在数据预处理的时候,随机去掉10%的A特征
优化结果
针对方法1,效果提升了0.11%,可以认为在这里随机扔掉30%的所有特征(包括A特征),让训练结果与A特征不强相关
针对方法2,效果提升了0.29%,因为我们只是过于依赖A特征,并没有过分依赖其他特征,故只在数据预处理的随机去掉10%的A特征,更有针对性的
原因三:泛化能力差
优化方法:增加槽位抽取:针对部分query, 增加槽位抽取的处理,比如将"黄渤", "周星驰" 等映射为aritist. 这样此类query, 模型见到的都是 我要看artist的电影,不存在缺乏泛化能力的问题. 瓶颈在于槽位抽取的准确率。
优化结果:没有单独实验, 增加槽位抽取后共同实验,分析badcase发现此类问题基本解决
原因四:缺乏先验知识
优化方法:引入200万外部词表以及 计算”青花瓷“在整体语料中出现在其他类别的频率来部分解决这个问题
优化结果:模型提升了0.5%
4.模型调优实操
1) 模型优化术语说明在我们下面行文中,会有一些术语,为了方便说明我们先提前解释一下
baseline: 最开始的实验结果, 后续所有的实验结果,都会和baseline的结果进行对比,来体现每一次实验优化的提升
baseline diff:相比baseline的结果, 我们实验的提升有多少
测试集acc:即我们的模型在测试集合的准确率
epoch :一个epoch 表示将将所有训练样本学习一遍
iteration(step)或者叫迭代步数: 表示运行一次iteration或者(step) 更新一次参数。每运行一次iteration 都需要一个batch size 的数据进行学习,学习完一个batch size 的数据,更新一次参数, 下面的所有实验 迭代步数全部为26万步
batch size: 迭代一次需要的样本量,下面的实验,batch size 全部设置为64
举例说明:exampleNums(样本数) = 100000, epoch = 64, batch size = 64, 那么iteration = 100000
实验0 baseline 测试基本参数在测试集合的表现
修改内容
测试集acc
迭代步数
baseline diff
无任何修改
85.14%
26w
0
优化实验一:修改embedding_dim长度
Embeddinga_dim :128, 即将我们的query 映射成向量的时候,向量本身的维度