使用caffe训练CNN,Loss不下降,维持在某个数字-log(类别数)

这也是困扰我一段时间的问题,loss不下降,一直在找其他的原因,权重初始化从gaussian到xiavier,查看了反向传播的diff后,总觉得梯度消失了,还想着加上BN层。
以上统统没有效果,为什么呐?
数据没有shuffle!每一个minibatch几乎都是同一类,这样必然出现大问题。
为什么呐?
caffe中的优化方法默认是SGD,这里的SGD其实是minibatch-SGD算法,计算过程如下公式:

N就是minibatch 的大小。我们可以这样理解,将原始大的数据划分成了多份minibatch大小的数据。
换句话说是用CNN在一个个minibatch上进行训练后的权重平均作为最后的权重分布。
minibatch其实是大数据集的一个采样,我们知道,合理的采样必须要和原始数据集保持相同的分布才是合理的。
也就是每一个minibatch中的数据都是随机从原始数据中抽取的。
而caffe在读取数据时是从头到尾依次读取的,那么我们怎么能保证进来的数据是一个合理采样呐?
方法其实很简单就是将原始数据随机打乱。

另外一个问题是,为什么loss会在log(类别数)左右呐?
从两个角度来分析这个问题,

  1. 从计算过程来看 大部分分类网络使用的都是softmax作为代价函数。我们先看看softmax代价函数的样子:

 经过上面的分析我们知道,在一个minibatch中,这里y只取一个值,那么上面公式就成为了下图这个样子:

那么计算后大约就等于:log(k),其中k是类别数。
无论CNN怎么做?其目的都是在找代价函数的最小值,而这个函数最小值即是log(k)。
那么loss必然会在log(k)左右徘徊。

    2. 从结果来分析:

我们用CNN来做分类,也就是找到分类器使这些classes合理的分开,怎么才能算合理呐?我们要制定一个标准,
这个标准也就是代价函数,当代价函数最小的时候,我们就说这个分类器合理的讲这些classes分开了。
公式推导的话还是比较麻烦,一图胜千言。
看左下图,第一批数据的分布,而且这些数据是属于一类的,第一次训练的分类器可能是右下图这样的。
   


如果第二批数据分布是这样的呐? 分类器可能又被训练成右下图这样:
 
  
CNN训练后很容易就将一类数据分开了,这时被定义的softmax loss肯定还是一个很大的值。
另外一个角度是否可以从信息论的角度出发(这个还需要思路的整理)待我日后更。




  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值