前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >视频 | 硅谷深度学习网红传授超参数优化宝典

视频 | 硅谷深度学习网红传授超参数优化宝典

作者头像
AI研习社
发布2018-03-19 16:53:47
9200
发布2018-03-19 16:53:47
举报
文章被收录于专栏:AI研习社AI研习社

AI 研习社按:今天为大家带来硅谷深度学习网红 Siraj 在人工智能在线大会 AI WITH THE BEST(AIWTB)上的演讲,雷锋字幕组独家译制。本次演讲的主题为 Learning to Learn,主要讲解了深度神经网络中超参数优化的相关内容。视频后面我们还附带了对应的 Github 文档汉化版供读者参考,原地址见文末“阅读原文”。

如今神经网络非常流行,许多问题都可以用神经网络解决,但是,找出最有效和最合适的神经网络却没那么容易。人们习惯于依靠自己的经验,尝试出最佳参数。这个过程需要付出高额的代价,因此人们经常使用尚未优化的网络。在这个简短的笔记里,以MNIST database作为例子,我尝试比较了几种常有的参数优化手段:

  1. MNIST database及其超参数介绍
  2. 随机搜索
  3. NN designing NN,利用神经网络来预测参数
  4. MADS 算法
  5. 贝叶斯优化
  6. 方法比较与集成

1. 项目

数据集

这个项目使用的是MNIST 数据库。这是被大家所广泛熟知的数据库。 这个数据库包括了80000张照片,每张上都是1个0-9之间的数字。这个训练集选取了60000张照片。

模型

使用Keras,并用tensorflow和Theano作为基础层。基本模型是一个有784个输入和10个输出的逻辑回归。选择设定epoch为100,批大小为200。这是为了简化问题和加强网络,在有限时间内找到解决方法。其他的参数都会被用来优化。 一个MNIST训练要1-2分钟来运行

超参数选择

利用随机梯度优化选择下面的参数来优化网络模型:

  • 层数: 0-3
  • 每层的神经元数:0-500
  • 学习率:0-1
  • 一层正规化系数:0-1
  • 二层正规化系数:0-1
  • 动量 (wheight of previous gradient in SGD): 0-1
  • 学习率衰退:0-1
  • Nesterov方法计算动量:TRUE or FALSE
  • 隐藏层的激活函数: tanh, sigmoid or relu

层数和神经元个数需要非常严格的控制,因为这将决定模型的能力。而其他所给的参数范围只是个大概的参考,更多用来引导算法。如果算法无法很好的计算零附近或者大数时,我们会调整我们的参数范围。这是在最佳精度和算法趋同之间找到平衡。

模型比较

都经过100批次的训练集的学习后,以验证集上的准确率为超参数的衡量指标。从纯理论的角度看,除了训练集MNIST固定,还要多次学习来排除算法学习时的其他偶然因素干扰。因此我们要从不同人的训练角度比较不同算法。

2. hyperRand: 随机搜索

除了蛮力搜索,最自然的方法就是随机搜索。任何一组超参数比现有的差就不会当作是一组好的超参数。

试验采用来自下列边缘概率分布的超参数:

  • 隐藏层数设定为2
  • 每层神经元个数来自lambda=200 的泊松分布
  • 学习率来自对数正态分布,超参数为 -2和3
  • L1,L2正则系数,momentum,decay是来自log normal分布,超参数为 -2和3
  • nesterov,activation 来自均匀分布

隐藏层固定为2层,可以更好的与hyperMads方法对比,跑3层以上的太费时了。

泊松分布是已知事件发生频率,用来预测其发生概率。泊松分布给出了事件在固定时间段内的发生概率。

对数正态分布是一个随机变量的连续概率分布。

均匀分布有时被看作矩形分布,概率为常数。

10组超参数准确率均超过80%,最大的准确达91.73%。随机搜索在最优超参数上算不上好算法。有个有争议的点是超参数是用来初始化另一个算法,但是其他算法本身就有自己的方式来生成随机。

从某种角度来看,训练结果是依赖超参数的随机分布的。这个算法的优势是容易实现,也便于并行(没有同步)。

3. hyperLearn: 利用神经网络设计超参数

方法

训练一个神经网络来预测一个给定超参数的网络的性能。这个方法难点在于要生成几个网络能学习的几个点,然后改善网络来找到最优方法。训练点的采样是十分要的。

算法

随机生成超参数,在MNIST训练集上训练这个神经网络(RSM)

采样

前面的方法很依赖于测试的超参数采样。采样方法是Metropolis–Hastings算法的变体。下一个采样值是来自以前一个值为中心的高斯分布。这个方法能够围绕最优解附近进行局部搜索。同时也允许在其余的搜索空间内试探。译者注:这里问题的解是一组超参数。

我们已经开始用可能的连续超参数。但是这个方法陷入局部最小值,导致无法在全局寻找一组可行解。出现这样的坏结果是在于学习率的作用。学习率0.1和0.13效果差不多,但0.001就和0.031相当不一样了。高斯分布和这两个例子也没什么不一样。回归正传,我们离散搜索空间。这种方式我们可以处理前面的问题,但是对最优解就不适用了。

参数的可能值如下:

RSM算法(随机搜索算法)快速找到一组可行解(迭代9次准确率可达96%)。最后的结果与其他算法相当。 这个算法控制大部分时间在可能区域内搜索,特别是开始运行的时候。一旦找到一组可行解,就开始在搜索空间内找其他可行解。

4. hyperMads: MADS 算法

MADS 算法,即网格自适应直接搜索算法,起初为黑箱优化而设计,求一个定义域为少量信息的函数最小值。这个函数很难计算,也可能不光滑,甚至无法计算。这个算法用一个自适应网络来搜索解空间。

在自适应网格细化技术中,先从基本粗网格开始,利用一些参数表示的解来确定更细分辨率的区域,例如局部截断误差。 我们只在这些区域叠加更细的子网格。 越来越精细的子网格不断地递归叠加,直到细化水平达到给定的最大值,或者局部截断误差降低到期望水平以下。 因此,在自适应网格细化计算时,只有基本网格才固定网格间距,同时根据问题的要求确定局部确定子网格。

  • 我们没有限制使用分类变量,虽然软件支持,也设置为
  • 其他参数需要一个默认值,可以随意赋值。

注意:当我只默认的是两层隐藏层时,在第三层隐藏层的神经元数量是0。

算法很快找到一个可行解(迭代9次,准确率96.29%),但是需要注意的是第一次训练准确率就有92.22%,这个很幸运的。

(搜索空间规范化后)基于超参数使用MDS算法来搜索。需要注意两点:

  1. 可行解彼此之间是近间距的
  2. 在这个稠密空间内,精度是波动的

优化函数训练的结构不同,导致不能找出其他解。典型例子就是,只用22个训练样本却需要训练在第三层两个及两个以上的神经元。为提升性能,可以用新函数替换。和原函数有相同作用,但不必去近似原函数。这样的函数需要可以减少每个批次的最大训练样本量。

5. hyerBayes:贝叶斯优化

贝叶斯优化是另一种连续函数的黑箱优化技术,假设这个函数是高斯随机过程。可能用到神经网络来表示这些分布,但本文不探讨。

贝叶斯优化是一类所谓的基于序列模型的最优化算法(SMBO)。这类算法利用损失函数f在前面的步骤的观察值,来决定下面步骤中来着f的可优化的样本点。算法思想大概如下:

  1. 利用前面的评分x,近似计算损失值f的后验期望。
  2. 再重新取一个点计算f损失值,最大化f的期望。使得在样本空间内f值域空间最优。
  3. 重复以上步骤直到满足收敛准则

需要进一步优化,可以超参数的取值范围限制严格点:

  • 学习率从1e-4到0.5
  • L1正则系数从1e-6到0.1
  • L2正则系数,动量,延迟量设置在1e-4到0.1
  • 两层隐藏层的神经元个数在200到300个。

用这些参数设值,得到一个很好的可行解:

在规范化搜索空间后,使用MDS算法前,需要核实这组解是不是彼此近间距。

算法找到能够找到一组覆盖解空间的重要部分的可行解。

接下来,尝试减少每层神经元数量限制,神经元总数在100-500个。用前面的方案,解空间用很好的稠密性,找最优解没有那么费劲了。

6. 方法比较与集成

不用的算法模型没有可比性,每个算法模型都需要根据自己的类型进行优化。进一步讲,每一个算法都有随机因素(更重要的是在算法开始的时候)会使性能有很大的变化。从统计角度看,这就需要大量的仿真。

尽管如此,我们还是可以有几点总结:

  • 随机搜索不是找可行解的好方法。解的稠密性会让随机搜索很缓慢。没有经验的话,手动调参很难让模型收敛,让人深陷其中。这个时候可以找其他方法。
  • MDS好像很容易快速微调可行解,而不在整个搜索空间内探索。
  • 贝叶斯优化好像可以在微调可行解的时候可以搜索更大的空间。
  • 神经网络方法好像可以近似到最优解附近的响应超平面,但是过拟合会带偏超参数。一旦找到可行解,算法还会去可行解的可能区域找。
  • 我们没有花太多时间和精力来研究这些算法。

这些算法可能需要大量的测试来优化超参数。每个算法我设法测试100-500组参数设置。当少于50次是可以手动。

模型集成

第一个想法就是彼此无依赖地并行运行所有的算法和随机初始化。在所有的算法中找一个最好的是可行的。

还有个想法就是,由于贝叶斯优化每一步根据前面的观察重复计算函数值密度,这便于合并其他算法的结果到搜索过程。其他算法再开始用贝叶斯优化给的最优解。同样的,也适用于神经网络算法。

下面展示这个算法,只用MADS作为辅助算法。简单点,假设任一算法的一次迭代耗时相同。

开始先用贝叶斯优化,MADS算法固定迭代次数,就20次吧。贝叶斯优化给出一个最好的解,用作MADS算法的初始解。第一步MADS给的点(最多60个点)放进贝叶斯优化,这要再执行20迭代。在这20次迭代后,再重复上面的交换。

这个方法能够给贝叶斯优化更多的点,同时也用了不同算法微调这些解。可以把NN designing NN 作为辅助算法,替代贝叶斯优化,或者作为主算法。我们没有时间实现这个方法,但我相信,像bagging算法一样,可以弥补每一个算法的不足之处。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档