原始模型优化笔记

2017/3/1 17:4 下午 posted in  Deep Learning

对于原始弹幕分类CNN模型进行优化。

修改 word2vec model 的 vector size

  • 400: Nice at epoch 38, validation acc 96.56%
  • 200: Nice at epoch 37, validation acc 95.22%
  • 100: Nice at epoch 34, validation acc 94.78% 单轮训练时间与50维相近,测试样例测试耗时 0.92secs
  • 50: Nice at epoch 40, validation acc 94.39% 单轮训练时间在7秒左右,测试样例(av 8365806)测试耗时 0.7secs

尝试加入dropout

在两个 conv 层之间和两个 fc 层之间各加入了一个 \(p=0.5\) 的 dropout

40 epoch 时只有 89.1 acc, 和预想的一样,会导致 达到最佳效果的 epoch 数上升。

用了 dropout 后一个很明显的变化是,原本训练过程中通常是train acc 高于 validation acc,现在通常是 validation acc 高于 train acc,训练后期才基本持平或反超

vector在 epoch 90 左右 达到了96.50%上下的 acc,最终在epoch 300 以上能达到 97.10% 左右的 acc

屏幕快照 2017-02-24 22.15.27

人工检查实际识别效果,仍有少量漏网。果然几个百分点的区别,人简单扫视还是很难看出区别的,而且还要排除安慰剂效应。

实验证明 dropout 确实有效防止了过拟合,并且提高了一定的分类准确度。

接着将几个 word2vec 长度的模型训练图都画出来对比:

屏幕快照 2017-03-01 16.57.28

可以从左下角的 tooltip 看到,从上至下分别是词向量长度为 400、200、100、50、25 的模型,在相同迭代次数下的准确度排序。由于选取的是上述模型都仍有收敛空间的迭代数,所以这个排名一定程度上可以代表模型训练所需的迭代次数排序。

由此可以得出结论,词向量维数越多,模型收敛所需的迭代次数越少,但是最终收敛的效果没有变化,这可能是目前训练样本较少的原因。

屏幕快照 2017-03-01 17.01.36

切换到训练时间为横轴的图来看,收敛速度实际上是100维最快,这倒是出乎意外,原本以为会是低维模型最快,结果发现,100维由于单次迭代提升更大,虽然迭代速度稍慢但是总体收敛最快。我还特地检查了100维的data graph,确定的确是在用100维的词向量来训练的。

关于卷积层是否应该加入 dropout 的问题

这个问题我找到了 Reddit 的这个讨论串

里面提到了以下这些说法:

  • 卷积层的参数数量没有全连接层那么多,所以不那么需要 regularizaion
  • 卷积层 filter map 的梯度是对于整个样本进行平均化的1,这样会使得卷积核原本存在相关性的参数,在样本的不同位置使用了不同的 dropout mask,导致 dropout 无效。当然,你可以想办法使卷积核的 dropout mask 在同一层中固定,但是这又会导致 regularizaion 过强。
  • Srivastava/Hinton 在 dropout 的论文中也有提到:在卷积层加入 dropout 的效果等于没有 \((3.02\% \rightarrow 2.55\%)\),因为卷积层的参数太少了,不存在过拟合的问题,所以 dropout 几乎没有效果。但是 dropout 在较低的层仍是有用的,它的效果相当于产生一点噪声,使得后面层数较高的全连接层避免过拟合。
  • 在卷积层使用 dropout 也不是绝对没有的,以下几篇论文中就有用到:

    但是他们都有卷积层的 dropout 『keep_prob 较大』的特点。

以下是测试的结果:

先测试了卷积层不使用 dropout 的效果
屏幕快照 2017-02-27 13.11.43

绿线是没有 卷积层dropout 的 acc, 紫线是卷积层 p=0.5 dropout 的 acc,两者都有一个 p=0.5 的全连接 dropout。由此可得卷积层的 dropout 还是有效果的,首先防止过拟合的程度要更高,其次对于准确度的提升也是有的 \((\uparrow2.3\%)\)

屏幕快照 2017-03-01 15.45.56

卷积层 p=0.6 和 p=0.4 dropout 的测试,相比 p=0.5 的模型,收敛速度、收敛精度都没有明显的区别。

尝试加入 max_pooling

先在卷积层和全连接层之间加入一个大小为2的 max_pooling1d
屏幕快照 2017-02-26 16.54.23

可以看到,这个 max_pool 对于最终收敛精度没有影响,在前期略微加快了收敛,但是中期减慢了收敛。

尝试移动该 pooling 层到两个卷积层之间。

屏幕快照 2017-02-28 13.42.28

上图为多次测试的结果。收敛速度和收敛准确率没有较为明显的提高或降低 \((96.623\% \rightarrow 96.694\%)\),只有训练速度有略微的提高。

值得一提的是,加入了 max-pool 的模型在高迭代次数的时候,标准差在逐渐增大。我认为这是因为 max-pool 一定程度上降低了训练样本的精度,相当于训练样本变少了,于是乎少量增加了整个模型在高迭代次数过拟合的风险。这里我选择使用84次迭代的模型,也就是图中横坐标约为 1k 的位置。相对来说过拟合的程度应该是非常小的。

屏幕快照 2017-02-26 18.49.29


  1. the gradients are averaged over the spatial extent of the feature maps