这也是困扰我一段时间的问题,loss不下降,一直在找其他的原因,权重初始化从gaussian到xiavier,查看了反向传播的diff后,总觉得梯度消失了,还想着加上BN层。
以上统统没有效果,为什么呐?
数据没有shuffle!每一个minibatch几乎都是同一类,这样必然出现大问题。
为什么呐?
caffe中的优化方法默认是SGD,这里的SGD其实是minibatch-SGD算法,计算过程如下公式:
N就是minibatch 的大小。我们可以这样理解,将原始大的数据划分成了多份minibatch大小的数据。
换句话说是用CNN在一个个minibatch上进行训练后的权重平均作为最后的权重分布。
minibatch其实是大数据集的一个采样,我们知道,合理的采样必须要和原始数据集保持相同的分布才是合理的。
也就是每一个minibatch中的数据都是随机从原始数据中抽取的。
而caffe在读取数据时是从头到尾依次读取的,那么我们怎么能保证进来的数据是一个合理采样呐?
方法其实很简单就是将原始数据随机打乱。
另外一个问题是,为什么loss会在log(类别数)左右呐?
从两个角度来分析这个问题,
- 从计算过程来看 大部分分类网络使用的都是softmax作为代价函数。我们先看看softmax代价函数的样子:
经过上面的分析我们知道,在一个minibatch中,这里y只取一个值,那么上面公式就成为了下图这个样子:
那么计算后大约就等于:log(k),其中k是类别数。
无论CNN怎么做?其目的都是在找代价函数的最小值,而这个函数最小值即是log(k)。
那么loss必然会在log(k)左右徘徊。
2.
从结果来分析:
我们用CNN来做分类,也就是找到分类器使这些classes合理的分开,怎么才能算合理呐?我们要制定一个标准,
这个标准也就是代价函数,当代价函数最小的时候,我们就说这个分类器合理的讲这些classes分开了。
公式推导的话还是比较麻烦,一图胜千言。
看左下图,第一批数据的分布,而且这些数据是属于一类的,第一次训练的分类器可能是右下图这样的。
如果第二批数据分布是这样的呐?
分类器可能又被训练成右下图这样:
CNN训练后很容易就将一类数据分开了,这时被定义的softmax loss肯定还是一个很大的值。
另外一个角度是否可以从信息论的角度出发(这个还需要思路的整理)待我日后更。