调参

作者: Plenari | 来源:发表于2019-11-27 21:23 被阅读0次
    • 死亡的神经元占的比例

    • RELU

    文中给出了一种针对ReLU神经元的特殊初始化,并给出结论:网络中神经元的方差应该是代码为w = np.random.randn(n) * sqrt(2.0/n)。这个形式是神经网络算法使用ReLU神经元时的当前最佳推荐。
    输入方差是1,经过权重之后计算之后输出方差为1的变量,然后再往后传一直是1,所以这样做的目的是什么嗯、

    最后一句话总结:批量归一化可以理解为在网络的每一层之前都做预处理,只是这种操作以另一种方式与网络集成在了一起。搞定!

    • 白化操作
    • l1,l2 正则化,
      有点像是最优化里的方法, 就是求最优解的时候加一个限定条件。这个时候最有解一般在交界处。除非最优解在原点位置。并且大多数时候,l2正则化与其他权重的交点都是权重相等的。而l1正则化的各个方向不是相同。最有可能与等高线相交的是在坐标轴是。以两个数值为例,可能直接一个有值,另一个为0.


      范数的表示
    • BatchNorm

    在实现层面,应用这个技巧通常意味着全连接层(或者是卷积层,后续会讲)与激活函数之间添加一个BatchNorm层

    • 过拟合

    在图中,蓝色的验证集曲线显示相较于训练集,验证集的准确率低了很多,这就说明模型有很强的过拟合。遇到这种情况,就应该增大正则化强度(更强的L2权重惩罚,更多的随机失活等)或收集更多的数据

    • 每层的激活数据及梯度分布

    一个不正确的初始化可能让学习过程变慢,甚至彻底停止。还好,这个问题可以比较简单地诊断出来。其中一个方法是输出网络中所有层的激活数据和梯度分布的柱状图。直观地说,就是如果看到任何奇怪的分布情况,那都不是好兆头。比如,对于使用tanh的神经元,我们应该看到激活数据的值在整个[-1,1]区间中都有分布。如果看到神经元的输出全部是0,或者全都饱和了往-1和1上跑,那肯定就是有问题了。

    • 动量更新
    • Momentum,当前位置的向梯度和之前速度方向的合并
    v = mu * v - learning_rate * dx # 与速度融合
    x += v # 与位置融合
    
    • Nesterov 向前看的一种方式,


      image.png
    x_ahead = x + mu * v
    # 计算dx_ahead(在x_ahead处的梯度,而不是在x处的梯度)
    v = mu * v - learning_rate * dx_ahead
    x += v
    
    • 学习率退火

    如果学习率很高,系统的动能就过大,参数向量就会无规律地跳动,不能够稳定到损失函数更深更窄的部分去。

    随步数赛衰减
    指数衰减
    t衰减
    
    • 自适应调参
    • Adagrad
    # 假设有梯度和参数向量x
    cache += dx**2
    x += - learning_rate * dx / (np.sqrt(cache) + eps)
    

    注意,变量cache的尺寸和梯度矩阵的尺寸是一样的,还跟踪了每个参数的梯度的平方和。这个一会儿将用来归一化参数更新步长,归一化是逐元素进行的。注意,接收到高梯度值的权重更新的效果被减弱,而接收到低梯度值的权重的更新效果将会增强。有趣的是平方根的操作非常重要,如果去掉,算法的表现将会糟糕很多。用于平滑的式子eps(一般设为1e-4到1e-8之间)是防止出现除以0的情况。Adagrad的一个缺点是,在深度学习中单调的学习率被证明通常过于激进且过早停止学习。

    • RMS
    cache =  decay_rate * cache + (1 - decay_rate) * dx**2
    x += - learning_rate * dx / (np.sqrt(cache) + eps)
    

    更新cache的方法:cache减小一点往dx方向增加一点。

    • adam
    m = beta1*m + (1-beta1)*dx
    v = beta2*v + (1-beta2)*(dx**2)
    x += - learning_rate * m / (np.sqrt(v) + eps)
    

    相关文章

      网友评论

          本文标题:调参

          本文链接:https://www.haomeiwen.com/subject/etizictx.html