我做的是图像五分类问题,每个类别300个样本,一共1500样本,随机取20%当作测试集。在训练简单CNN过程中,发现训练有时候可以正常进行,有时候却不能。刚开始我以为是随机取数据出了问题,后来我固定了训练集和测试集,发现还是这样。请问是什么原因


正常,有很多因素。

首先,在训练神经网路时,可能会搜索到局部最优解。可以将这个结果域想像成一个三维面,局部最优解是较浅的凹陷,全局最优解是最深的凹陷。

在进行训练时会采用梯度下降的方法,这些方法可能会找到局部最优解,但是因为学习率也就是步长设置的不够大,就会导致模型被困在局部最优解,无法跳出。

其次,每次训练的时候,神经网路的参数和权重每次都是随机的,所以肯定每次的结果都不一样。除非保存了权重和参数。这样也会导致不断地陷入局部最优解中,当然也可能是全局最优解。

因此,这种情况是很常见的。这也是为什么,现在的神经网路在训练时都要进行多次训练,并使用Adam等能自动调整步长的优化方法。


再固定一下随机数种子看看。检查是否数据集切分是分层的(stratified),即每个类别都出现了。


直接原因有可能是因为网路参数初始化的原因。即使数据是固定的,但是由于网路的参数是随机的,所以有时候网路也可能无法收敛到一个值。这种情况可以尝试固定一下随机数种子看效果能不能更稳定,如果固定随机数种子以后效果趋向于稳定的话应该就是这个问题。

当然背后的根本原因有很多可能,比如可以看看网路的参数数量,因为你的数据量比较小,如果网路参数数量过于大的话会使模型难以拟合,模型训练偏于随机。运气好的时候模型能成功拟合,运气不好就像第二张图这样。这种情况用一个比较小的神经网路看看模型效果。

此外还可以调一调优化器和相关参数,特别是学习率。activation function 其实也可以看一下。


如果每次都能复现就是工程,而不是科学了。这个是一个客观事实:训练不一定收敛,但不好发表成一个发现。


其实八,解决问题才是王道, 我认为问题出现的原因, 按可能性分从大到小:初始化问题&>结构问题&>数据集问题。这样导致对该病态处理不够鲁棒,归根是神经网路张成的高维空间非凸性拥有可比的损失函数的可能解, 即局部极小值,鞍点很多哦;即使仅一个全局解, 有时候我们依赖梯度的方法,依靠损失函数渐进螺旋逼近山形前进,可能只是逼近低值而不是局部极小值,因此没有办法求精确解大多数时候,无所谓啦,有时候局部的极小值也足够好了。

如果有时候能跑出来,修正初始化试试,如果不行,分步修改看看:

  1. 固定Dataset,把这个simple CNN换用ResNet或者Inception试一下,如果持续能求解,就证明是网路问题;
  2. 固定simple CNN,把数据集换成Cats vs. Dogs如果持续能求解,就证明是数据集问题;
  3. 把这个simple CNN带入高stars的别人的代码中调用,如果能跑就证明是优化方法,loss计算或者是代码哪里写大意了的问题。。。


调小学习率试试


推荐阅读:
相关文章