机器学习 | 浅谈神经网络优化方式


背景:目前各种神经网络相关算法,在实验和生产环境中都会大量被应用。那么,如何应用神经网络以及如何优化神经网络,作为一项可以被系统化的工程,流程化实现就显得很有必要且很有价值。
目标:本文的目的是为了能够将一般优化神经网络的流程系统化梳理。对于customed情况下的优化暂不在本文的讨论范围内。持续完善ing,浅谈不足之处欢迎在评论区指正。


在...应用神经网络之前?

  • First of all, 需要明确定义模型需要优化或者预测的指标。
    所有的策略最终都是为了业务目标服务的,首先要将业务问题转换为需要优化的具体指标,也就是转换为机器学习可以优化的问题。

  • Secondly,从逻辑层面判断模型能达到的效果。
    也就是从逻辑出发判断算法能实现业务指标提升的可能性。如果逻辑上就否定了算法的必要性,就完全没有必要采用算法试验。

  • Thirdly, 从技术角度确认是否需要使用神经网络算法。
    任何一种技术都有其试用范围,特别是在机器学习领域,没有绝对的Silver Bullet。
    任何一种技术也都有其优越性和缺陷。代价永远存在。那就要考虑为了神经网络的优势,这样的代价是否值得。
    比如在数据量很小的情况下,神经网络强大的拟合能力就会成为项目效果的制擘,反而用简单的决策树效果会更好。或者在要求高性能或是高解释性的金融行业,有时候简单的逻辑回归会是更优的选择。

  • Fourth, 选用最简单模型进行快速试验模型能达到效果。
    当回答了以上所有的问题,答案指向都是可以也值得使用神经网络。那下一步就是搭建一个简单的传统机器学习模型来为该项业务指标设定一个指标下限,为神经网络的优化提供一个参考基准。

  • Fifth,初步搭建简单有效的神经网络来实现效果。
    前置准备工作中的最后一步,通过搭建一个同领域验证有效的神经网络模型。在不调差和调整复杂网络结构的情况下,完全采用前人的有效参数和网络结构,快速搭建一个神经网络,实现初步的效果。这一步的目标是走通整个流程,为之后的优化神经网络提供流程上的支持。



不智能的人工经验调参

在完成了上述神经网络建模的前置步骤之后,下面需要做的就是对神经网络的各种参数和结构进行调整,目标是获取更优的指标效果。
P.S. 这里调参主要基于Keras/Tensorflow。

参数类型调整
  • epoch
    通过validation样本accuracy随着epoch改变的曲线,来调整epoch的量级。(如果训练过程较长的话,为了防止重复训练,可以在模型训练过程中设置checkpoint。在Keras中,可以通过回调函数callback来实现checkpoint的设置。)
    更方便的,可以采用earlystopping的方式,对待监测值进行监测,如果待检测值不再优化,则提前停止训练。这也是一种对epoch的数值进行选取的较好方案。
  • 学习率和参数更新方式
    1. 回调参数:通过在Keras中设置回调函数来进行参数更新方式和学习率的更新。
    2. adam:通过adam进行参数学习更新的方式。adam的全称:adaptive moment estimation。
      一般情况下,adam的参数根据前人的经验来设定,基本无需进行调参。Gentle Introduction to the Adam Optimization Algorithm for Deep Learning
  • 其他参数
    神经网络参数贪婪的网格搜索进行调整。比如dropout的比率。

模型正则化方式:
  • 数据样本角度:正负数据样本数量的平均,防止在梯度下降过程中,模型梯度方向严重偏差。
  • L1或者L2正则化: 采用weight参数的L1或者L2对神经网络权重参数的大小进行控制。比如最大范数是5的正则项,就被证明可以提升结果。本质上,也是通过控制模型参数的拟合能力来进行正则控制。
  • Early Stopping:也是一种正则化的方法,可以用来减少对于训练数据的过度拟合。
  • Batch normalization: 通过对特征进行normalization的方法,对参数空间的数值进行标准化,防止拟合过程中不同特征参数步长不一致导致收敛到较差的局部最优,而不易通用化到test data的参数空间中。
  • 神经网络结构控制:从神经网络的结构上,减少结构的复杂度,减少参数空间的大小,对模型的VC维进行控制。
  • Dropout:对神经网络连接在训练的时候进行随机断连接。正则化的有效性由两个方面保证:1. 减少神经网络的参数,控制拟合能力。2. 通过融合模型的思想,降低模型的variance,来达到正则化目的。

神经网络结构调整
  • 神经网络激活函数调整
    Relu作为减少梯度消散的激活函数,更加适用于深度神经网络。
  • 有效神经网络结构扩展
    选择或者增加被验证有效的神经网络结构,来提升神经网络的效果。比如,采用inception的方式对神经网络的特征更好的拟合。
  • 神经网络层数和结构
    在前人文章经验的基础上,尝试不同层数和不同种类层的效果。贪婪的调整结构。
  • 集成学习
    集成多个神经网络(皮尔逊不相关)来融合学习。

P.S. 模型效果的可解释性
  • 主要可以采用LIME框架对模型可解释性进行解释和提升。不作为本文重点,后续再作讨论。

  • 参考文章
    关于模型可解释性的深入思考:从哪里来,到哪里去?
    机器学习模型的“可解释性”到底有多重要?

你可能感兴趣的:(机器学习 | 浅谈神经网络优化方式)