权重初始化

出现梯度爆炸时候考虑是权重初始化过大的原因

权值初始化的方法主要有:常量初始化(constant)、高斯分布初始化(gaussian)、positive_unitball初始化、均匀分布初始化(uniform)、xavier初始化、msra初始化、双线性初始化(bilinear)

常量初始化(constant)

       把权值或者偏置初始化为一个常数,具体是什么常数,可以自己定义

高斯分布初始化(gaussian)

       需要给定高斯函数的均值与标准差 

positive_unitball初始化

       让每一个神经元的输入的权值和为 1,例如:一个神经元有100个输入,让这100个输入的权值和为1.  首先给这100个权值赋值为在(0,1)之间的均匀分布,然后,每一个权值再除以它们的和就可以啦。这么做,可以有助于防止权值初始化过大,从而防止激活函数(sigmoid函数)进入饱和区。所以,它应该比较适合simgmoid形的激活函数

均匀分布初始化(uniform)

       将权值与偏置进行均匀分布的初始化,用min 与 max 来控制它们的的上下限,默认为(0,1)

xavier初始化

       对于权值的分布:均值为0,方差为(1 / 输入的个数) 的 均匀分布。如果我们更注重前向传播的话,我们可以选择 fan_in,即正向传播的输入个数;如果更注重后向传播的话,我们选择 fan_out, 因为在反向传播的时候,fan_out就是神经元的输入个数;如果两者都考虑的话,就选  average = (fan_in + fan_out) /2。对于ReLU激活函数来说,XavierFiller初始化也是很适合。关于该初始化方法,具体可以参考文章1文章2,该方法假定激活函数是线性的。

msra初始化

       对于权值的分布:基于均值为0,方差为( 2/输入的个数)的高斯分布;它特别适合 ReLU激活函数,该方法主要是基于Relu函数提出的,推导过程类似于xavier,可以参考博客

双线性初始化(bilinear)

      常用在反卷积神经网络里的权值初始化

如果说loss值在一个上界和下界中间来回摆动,也是learning rate过大或者梯度有轻微爆炸情况的表现,这就像是你快到山谷底端,但是步子跨得很大,跳到对面了,然后又跳回来,如此反复。

 

如何选取一个较为理想的medel?

  1. 要有一个期望的准确率,通过不同模型的实验,找到最能接近的;
  2. 选定模型后进行参数调优;提高模型train的准确率,同时提高其泛化的能力,不能单一看某一指标,此时可参考准确率、召回率、虚警率、F1Score等指标综合评判,或者采用多重验证随机划分训练、预测、验证集合,多次随机后找到最优参数。
  3. train的loss很低,但是泛化能力很差test的loss很高,即产生过拟合,有特殊性或者其他异常点较多。

一般而言,训练集loss < 验证集loss <测试集loss

但是实际情况下都有可能,特别是数据量不太大的时候。样本集合的数据也只是近似整体的分布,肯定会有波动。

一个好的网络,二者的差距应该是很低的。但一般情况下因为网络不可避免地存在一定程度上的过拟合,所以肯定是train_loss低于test_lost,但如果低太多,就得考虑是过拟合的问题还是因为样本的特征空间不统一的问题。

一般训练集不大时,最终训练的网络及容易过拟合,也就是说train-loss一定会收敛,但是test-loss不会收敛;

训练时的loss会低于test的loss大概1~2个数量级,通常是10倍左右。

单独观察训练集loss曲线

  1)如果你的 learning_rate_policy 是 step 或者其他变化类型的话, loss 曲线可以帮助你选择一个比较合适的 stepsize;
  2)如果loss曲线表现出线性(下降缓慢)表明学习率太低;
  3)如果loss不再下降,表明学习率太高陷入局部最小值;
  4)曲线的宽度和batch size有关,如果宽度太宽,说明相邻batch间的变化太大,应该减小batch size。

可能导致不收敛的问题(如loss为87.3365,loss居高不下等)的解决方案

  1)在caffe中可以在solver里面设置:debug_info: true,看看各个层的data和diff是什么值,一般这个时候那些值不是NAN(无效数字)就是INF(无穷大);
  2)检查数据标签是否从0开始并且连续;
  3)把学习率base_lr调低;
  4)数据问题,lmdb生成有误;
  5)中间层没有归一化,导致经过几层后,输出的值已经很小了,这个时候再计算梯度就比较尴尬了,可以尝试在各个卷积层后加入BN层和SCALE层;
  5)把base_lr调低,然后batchsize也调高;
  6)把data层的输入图片进行归一化,就是从0-255归一化到0-1

  7)网络参数太多,网络太深,删掉几层看看,可能因为数据少,需要减少中间层的num_output;
  8)记得要shuffle数据,否则数据不够随机,几个batch之间的数据差异很小。

loss出现NAN

  1)观察loss值的趋势,如果迭代几次以后一直在增大,最后变成nan,那就是发散了,需要考虑减小训练速率,或者是调整其他参数。
  2)数据不能太少,如果太少的话很容易发散"
  3)Gradient Clipp
  处理gradient之后往后传,一定程度上解决梯度爆炸问题。(但由于有了batch normalization,此方法用的不多)
  4)原因可能是训练的时间不够长。
  5)可以看一下训练时,网络参数的L2或L1


联合观察loss曲线和acc

  1)单独的 loss 曲线能提供的信息很少的,一般会结合测试机上的 accuracy 曲线来判断是否过拟合;
  2)关键是要看你在测试集上的acc如何;
  3)可以把accuracy和loss的曲线画出来,方便设定stepsize,一般在accuracy和loss都趋于平缓的时候就可以减小lr了;
  4)看第一次test时(即iteration 0),loss和精度,如果太差,说明初始点的设置有问题
  5)使用caffe时,train时,看见的loss是训练集的;accuracy才是测试集的
  6)所谓的过拟合是:loss下降,accuracy也下降

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪里摸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值