zoukankan      html  css  js  c++  java
  • CNN超参数优化和可视化技巧详解

    https://zhuanlan.zhihu.com/p/27905191

    在深度学习中,有许多不同的深度网络结构,包括卷积神经网络(CNN或convnet)、长短期记忆网络(LSTM)和生成对抗网络(GAN)等。

    在计算机视觉领域,对卷积神经网络(简称为CNN)的研究和应用都取得了显著的成果。CNN网络最初的诞生收到了动物视觉神经机制的启发,目前已成功用于机器视觉等领域中。

    技术博客Towards Data Science最近发布了一篇文章,作者Suki Lau。文章讨论了在卷积神经网络中,该如何调整超参数以及可视化卷积层。

    为什么用卷积神经网络?

    首先,我们想要计算机具有什么能力呢?

    当我们看到一只猫跳上窗台或在沙发上睡觉时,我们的潜意识会认出它是一只猫。

    我们希望计算机也能完成这项任务,即将图像输入后,找出其独有的特征,最终输出该图像的类别信息。

    卷积神经网络可以完成这项任务。

    何为卷积神经网络?

    先谈定义,卷积神经网络是一种特殊的神经网络,其中至少包含一个卷积层。在典型的CNN网络结构中,输入一张图像,经由一系列卷积层、非线性激活层、池化层和全连接层后,可输出相应的类别标签。

    卷积神经网络的特别之处在于加入了卷积层。

    在经典的神经网络中,整张图片会被传入网络中来训练各网络层权值。当输入为简单居中的图像时,如Mnist手写数字图,网络识别效果较优,但是当输入变为更为复杂多变的图像时,如跳上窗户的小猫,此时网络识别效果不佳甚至无法辨识。

    加入更多隐含层学习输入图像的抽象特征,可能会有所帮助,但是这样会增加神经元的数目,大大增加训练所需的计算资源和占用过多的内存,这是不切实际的。

    而CNN识别目标的过程,是先寻找诸如边缘、线段和曲线等相关低级特征,然后使用多个卷积层来构建更多抽象的高级特征。

    在卷积层的学习过程中,CNN网络通过共享多个卷积核(或特征检测器)的权值,来学习每张图片的局部信息,并用于构建抽象特征图谱。卷积核共享特性大大降低了训练网络所需的参数量。

    由于经过训练的检测器可以通过卷积层重复用来组合地检测图片中的抽象特征,因此卷积神经网络更适用于复杂的图像识别任务。

    超参数调整

    在深度神经网络中,调整超参数组合并非易事,因为训练深层神经网络十分耗时,且需要配置多个参数。

    接下来,我们简单列举几个影响CNN网络的关键超参数。

    学习率

    学习率是指在优化算法中更新网络权重的幅度大小。

    学习率可以是恒定的、逐渐降低的、基于动量的或者是自适应的,采用哪种学习率取决于所选择优化算法的类型,如SGD、Adam、Adagrad、AdaDelta或RMSProp等算法。

    优化策略这方面的内容可参阅量子位之前编译过的“一文看懂各种神经网络优化算法:从梯度下降到Adam方法”。

    迭代次数

    迭代次数是指整个训练集输入到神经网络进行训练的次数。当测试错误率和训练错误率相差较小时,可认为当前的迭代次数是合适的,否则需继续增大迭代次数,或调整网络结构。

    批次大小

    在卷积神经网络的学习过程中,小批次会表现得更好,选取范围一般位于区间[16,128]内。

    还需要注意的是,CNN网络对批次大小的调整十分敏感。

    激活函数

    激活函数具有非线性,理论上可以使模型拟合出任何函数。通常情况下,rectifier函数在CNN网络中的效果较好。当然,可以根据实际任务,选择其他类型的激活函数,如Sigmoid和Tanh等等。

    隐含层的数目和单元数

    增加隐含层数目以加深网络深度,会在一定程度上改善网络性能,但是当测试错误率不再下降时,就需要寻求其他的改良方法。增加隐含层数目也带来一个问题,即提高了训练该网络的计算成本。

    当网络的单元数设置过少时,可能会导致欠拟合,而单元数设置过多时,只要采取合适的正则化方式,就不会产生不良影响。

    权重初始化

    在网络中,通常会使用小随机数来初始化各网络层的权重,以防止产生不活跃的神经元,但是设置过小的随机数可能生成零梯度网络。一般来说,均匀分布方法效果较好。

    Dropout方法

    作为一种常用的正则化方式,加入Dropout层可以减弱深层神经网络的过拟合效应。该方法会按照所设定的概率参数,在每次训练中随机地不激活一定比例的神经单元。该参数的默认值为0.5。

    手动调整超参数是十分费时也不切实际。接下来介绍两种搜索最优超参数的常用方法。

    网格搜索和随机搜索

    网格搜索是通过穷举法列出不同的参数组合,确定性能最优的结构。随机搜索是从具有特定分布的参数空间中抽取出一定数量的候选组合。

    网格搜索方法也需要制定策略,在初始阶段最好先确定各超参数值的大概范围。可以先尝试在较小迭代次数或较小规模的训练集上进行大步幅的网格搜索。然后在下个阶段中,设置更大的迭代次数,或是使用整个训练集,实现小幅精确定位。

    虽然在许多机器学习算法中,通常会使用网格搜索来确定超参数组合,但是随着参数量的增大,训练网络所需的计算量呈指数型增长,这种方法在深层神经网络的超参数调整时效果并不是很好。

    有研究指出,在深度神经网络的超参数调整中,随机搜索方法比网格搜索的效率更高,具体可参考文末中的“随机搜索在超参数优化中的应用”。

    当然,可根据神经网络的理论经验,进行超参数的手动调整在一些场景下也是可行的。

    可视化

    我们可以通过可视化各个卷积层,来更好地了解CNN网络是如何学习输入图像的特征。

    可视化有两种直接方式,分别是可视化激活程度和可视化相关权重。在网络训练过程中,卷积层的激活情况通常会变得更为稀疏和具有局部特性。当不同输入图像的激活图都存在大片未激活的区域,那么可能是设置了过高的学习率使得卷积核不起作用,导致产生零激活图像。

    性能优良的神经网络通常含有多个明显而平滑的卷积器,且没有任何干扰特征。若在权重中观察到相关干扰特征,可能原因是网络未被充分训练,或是正则化强度较低导致了过拟合效应。

    相关链接

    1.在深度结构中关于梯度方法的几个实用建议(Yoshua Bengio):

    2.随机搜索在超参数优化中的应用:

    3.CS231n课程中理解和可视化卷积神经网络:

    4.如何使用网格搜索来优化深度学习模型中的超参数(Keras):

    【完】

    神经网络CNN训练心得--调参经验

    1.样本要随机化,防止大数据淹没小数据

    2.样本要做归一化。关于归一化的好处请参考:为何需要归一化处理
    3.激活函数要视样本输入选择(多层神经网络一般使用relu)
    4.mini batch很重要,几百是比较合适的(很大数据量的情况下)
    5.学习速率(learning rate)很重要,比如一开始可以lr设置为0.01,然后运行到loss不怎么降的时候,学习速率除以10,接着训练
    6.权重初始化,可用高斯分布乘上一个很小的数,这个可以看:权值初始化
    7.Adam收敛速度的确要快一些,可结果往往没有sgd + momentum的解好(如果模型比较复杂的话,sgd是比较难训练的,这时候adam的威力就体现出来了)
    8.Dropout的放置位置以及大小非常重要
    9.early stop,发现val_loss没更新,就尽早停止
     
    另:心得体会
    深度学习真是一门实验科学,很多地方解释不了为什么好,为什么不好。
    网络层数、卷积核大小、滑动步长,学习速率这些参数的设置大多是通过已有的架构来做一些微调
     
     
     
    参考:知乎讨论 https://www.zhihu.com/question/41631631
  • 相关阅读:
    C语言的AES加密
    curl指定域名的IP
    gdb调试知识
    C++获取寄存器eip的值
    C++嵌入lua
    [置顶] python字典和nametuple互相转换例子
    【python】redis基本命令和基本用法详解
    xshell登录到CentOS7上时出现“The remote SSH server rejected X11 forwarding request.
    selinue引起的ssh连接错误
    SCP和SFTP相同点和区别
  • 原文地址:https://www.cnblogs.com/bnuvincent/p/7570867.html
Copyright © 2011-2022 走看看