Advertisement

神经网络优化的方法

阅读量:

文章目录

  1. 概述
    2. 优化网络的方法
    (1)动态学习率策略
    (2)基于梯度的信息调整
    (3)模型适应性与过拟合控制

一、概述

经过神经网络的系统性训练后, 必须通过优化技术来实现预期的目标, 即所谓的'调参', 从而实现参数的更精确更新。
通常情况下, 神经网络的训练过程分为两个主要阶段:

  • 第一阶段首先运用前向传播算法来生成预测输出,并将预测结果与实际观测值进行对比分析。
    • 第二步基于反向传播算法系统性地计算出每个参数对应的损失函数偏导数,并依据这些导数值结合预设的学习率逐步优化调整各个模型参数。

二、优化网络的方法

1、学习率的优化

每个参数对目标函数的依赖程度各异,在某些情况下已有部分参数已经达到局部极小值附近的位置;然而另一些情况则存在显著未被利用的空间。因此无法采用统一的学习率策略:当学习率过小时会导致优化过程收敛速度显著降低;而当学习率过大时,则会导致那些已经接近最优的参数出现不稳定性问题;目前已有三种主要的不同自适应学习率优化算法

AdaGrad
该算法能够自适应地调整每个模型参数的学习速率,并根据其所有历史梯度平方和的平方根来缩放每个参数的学习速率。具体而言,在具有较大梯度值的位置上会较快地降低学习速率,在具有较小梯度值的位置上则相对保持较高的学习速率以避免过快收敛到局部最优解的情况。

  • RMSProp
    RMSProp算法基于AdaGrad的基础上对梯度计算进行了改进,在计算过程中将梯度更新规则从简单的累加优化为采用指数加权的移动平均策略,并通过这种方式实现了对复杂损失函数空间中的极值搜索能力的有效提升。

    • Adam

学习率的独立设置
按照指数规律递减的学习速率是一种常见的优化策略。该方法通过先采用较高的学习速率以迅速获得较为优化的结果,并在迭代过程中逐渐降低 learning rate 以确保模型在训练后期达到更为稳定的收敛状态。

复制代码
    tf.train.exponential_decay(learning_rate,global_step,decay_steps,decay_rate,staircase=False,name=None)
    
    
      
    
    代码解读

参数

初始学习率(initial learning rate)
衰减因子(decay factor)
衰减步长(decay_step)决定衰减速率
全局迭代次数(global_step)
采用阶梯式策略:一个布尔变量(staircase)。当其为真时(即 staircase=True),表示每 decay_step 轮次后更新模型参数的学习率

2、梯度下降的优化

总体思想:
梯度下降法是一种通过沿着损失函数减少的方向迭代更新参数以最小化损失值的方法。为了实现这一目标,需要设定一个合适的学习率来控制每轮参数调整的步幅。需要注意的是,该方法在处理非凸优化问题时可能无法找到全局最优解,结果受初始参数值的影响较大。只有在损失函数为凸的情况下才能确保找到全局最优解。具体来说,梯度下降法主要分为三种形式:批量梯度下降、随机梯度下降和小批量梯度下降。这三者的主要区别在于每轮迭代所使用的样本数量。

  • 批量梯度下降法(Batch Gradient Descent)

在更新参数时使用所有的样本 来进行更新

  • 随机梯度下降法(Stochastic Gradient Descent)

随机梯度下降算法其本质是与批量数据集训练方法存在差异,在于其每次迭代时未使用完整的训练数据集而仅从单个样本中计算梯度。

  • 小批量梯度下降法(Mini-batch Gradient Descent)

小批量梯度下降法介于批处理梯度下降法和随机梯度下降法之间,在训练过程中基于一定数量的数据样本来更新参数。

随机梯度下降法和批量梯度下降法对比

  • 在训练速度方面对比而言随机梯度下降法基于单个样本的迭代机制使得其计算效率显著高于批量梯度下降法尤其是当数据规模较大时其训练速度能够快速提升。
  • 相较之下对于模型准确度而言随机梯度下降法受限于仅根据单个样本确定更新方向这一特点可能导致解并非全局最优尤其是在初始条件或学习率调度不够优化的情况下其训练效果可能不如其他优化算法稳定。
  • 从收敛速度角度来看随机梯度下降法由于每次迭代仅使用单个样本会导致更新方向频繁变化从而延缓了算法向局部最优解的收敛过程这也意味着即使在较高精度要求下SGD可能会陷入鞍点状态而无法保证全局最优性

在使用梯度下降时,进行调优的要点

在算法设计中,学习率的选择至关重要。具体来说,在前面的算法描述中提到采用1作为初始学习率设定是不够严谨的。实际上,在实际应用中应尝试多个不同的数值,并按照从高到低的顺序进行实验验证。每次运行后观察到损失函数是否持续下降,则可判断当前参数设置的有效性。如果发现损失函数随着迭代次数增加而持续减小,则说明当前参数设置是合理的;反之则应考虑增大学习率以加快收敛速度。然而,在某些情况下仅仅增大学习率并不能解决问题,并可能导致模型难以收敛。因此,在确定最优参数时,通常需要通过实验探索不同设置下的表现,并综合考虑计算效率与模型性能的关系

确定算法参数的初始取值。 不同的初始取值可能导致不同的极小点; 通过梯度下降法通常只能得到局部最优解; 如果损失函数是凸函数,则能够保证找到全局最优解。 为了避免陷入局部最优解的影响,请考虑使用多种不同的初始取值进行多次运行算法; 最终目标是确保损失函数达到全局极小的状态。

归一化是一种常见的数据预处理方法。因为各特征的数据范围差异较大,在实际应用中可能会导致训练速度变慢。为了消除各特征量纲差异的影响,在模型训练前通常会对数据进行标准化处理(即经过z-score标准化),使得每个特征的新期望为0、新方差为1。经过这样的预处理后,在后续的学习过程中能够使模型收敛更快、训练效率更高

一般而言,在TensorFlow框架中主要通过优化器来实现梯度下降过程以及自适应调整学习率;其中learning\_rate这一参数则被定义为学习速率;同时loss这一变量则代表了损失函数。进一步详细信息可参考网页1以及网页2的相关介绍。

复制代码
    train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
    ##梯度下降,使用全部样本更新参数
    
    train_step = tf.train.AdagradOptimizer(learning_rate).minimize(loss)
    ##实现Adagrad优化器
    
    train_step = tf.train.RMSPropOptimizer(learning_rate)).minimize(loss)
     ##实现RMSProp优化器
     
     train_step = tf.train.AdamOptimizer(learning_rate)).minimize(loss)
     ##实现Adam优化器
    
    
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

3、欠拟合和过拟合的优化

常见有三种优化方法可用于解决模型过拟合的问题

Dropout
为了防止神经网络的过拟合。它的主要思想是让隐藏层的节点在每次迭代时(包括正向和反向传播)有一定几率(keep-prob)失效 ,这样来预防过拟合。它主要避免对某个节点的强依赖,让反向传播的修正值可以更加平衡的分布到各个参数上
(1)Dropout只发生在模型的训练阶段 ,预测、测试阶段则不用Dropout
(2)Dropout随机删除神经元后,网络变得更小,训练阶段也会提速
(3)有了dropout,网络不会为任何一个特征加上很高的权重 (因为那个特征的输入神经元有可能被随机删除),最终dropout产生了收缩权重平方范数的效果
(4)Dropout的一大缺点就是损失函数不再被明确定义 ,所以在训练过程中,损失函数的值并不是单调递减的
(5)使用时,先关闭Dropout,设置keep-prob为1,使损失函数的值单调递减,然后再打开Dropout

Bagging 详见集成学习介绍

正则化方法
(1)L1正则化
(2)L2正则化

复制代码
     #在权重参数上实现L2正则化

     regularizer = tf.contrib.layers.l2_regularizer(0.01)
     regularization = regularizer(weight1)+regularizer(weight2)+regularizer(weight3)
     tf.add_to_collection("losses",regularization)     #加入集合的操作
     
     #get_collection()函数获取指定集合中的所有个体,这里是获取所有损失值
     #并在add_n()函数中进行加和运算
     loss = tf.add_n(tf.get_collection("losses"))#损失包括误差和正则项
     tf.add_to_collection("losses", error_loss)      #加入集合的操作
    
    
        
        
        
        
        
        
        
        
        
    代码解读

数据和特征方面

重新清洗数据可能源于过拟合的一个原因也有可能是由数据不纯引起的。若出现过拟合,则需我们重新清洗数据。

2)提高训练数据量的效果,并不是没有原因的。另一个原因是由于所使用的训练数据数量不足所导致的问题。使得在总数据中的占比偏低。

3)为了解决欠拟合问题,在模型中添加其他类型的特征项是一个有效的方法。当我们的模型出现欠拟合现象时通常是由于提供的特征不够全面所导致的。通过合理地选择和引入其他类型的特征变量能够有效地改善这一问题。
例如在实际应用中可以选择引入多项式特 trưng变量能够提高模型的泛化能力。
而对于过拟合问题可以通过减少不必要的高阶特 trưng变量来缓解这一现象。
4)在某些情况下降低正则化的强度有助于缓解欠拟合的问题。
同样地增加正则化的强度能够在一定程度上防止过拟合现象的发生。

全部评论 (0)

还没有任何评论哟~