小言_互联网的博客

神经网络中的网络优化和正则化(三)之超参数优化

232人阅读  评论(0)

公众号标题:神经网络中的优化方法之学习率衰减和动态梯度方向

引言

神经网络中的网络优化和正则化问题介绍主要分为一,二,三,四篇进行介绍。

  • 第一篇包括
    • 网络优化和正则化概述
    • 优化算法介绍
  • 第二篇包括
    • 参数初始化
    • 数据预处理
    • 逐层归一化
  • 第三篇包括
    • 超参数优化
  • 第四篇包括
    • 网络正则化

无论是神经网络还是机器学习都会存在很多的超参数,在神经网络中,常见的超参数有:

  • 网络结构:包括神经元之间的连接关系,层数,每层的神经元数量,激活函数的类型等
  • 优化参数:包括优化方法,学习率,小批量样本数量
  • 正则化系数

超参数优化(Hyperparamter Optimization) 主要存在两方面的困难:

  • 超参数优化是一个组合优化问题,无法像一般参数那样通过梯度优化的方法来求解,也没有一种通用的优化方法
  • 评估一组超参数配置时间代价很高,从而导致一些优化算法(比如时间演化算法)在超参数优化中难以应用

对于超参数的设置,一般有三种比较简单的优化方法,人工搜索,网格搜素,随机搜索


网格搜索

网格搜索(grid search)是一种通过尝试所有超参数的组合来寻找一组合适的超参数组合的方法。如果参数是连续,可以将其离散化。比如“学习率”,我们可以根据经验选取几个值: α 0.01 , 0.1 , 0.5 , 1.0 \alpha \in {0.01, 0.1, 0.5, 1.0}

一般而言,对于连续的超参数,不能采用等间隔的方式进行划分,需要根据超参数自身的特点进行离散化。

网格搜索根据不同的参数组合在测试集上的表现,选择一组最优的参数作为结果。

随机搜索

不同超参数对模型的影响不同,有的超参数(比如正则项系数)对模型的影响有限,有的超参数(比如学习率)对模型的影响比较大,这时候采用网格搜索就会在影响不大的超参数上浪费时间。

一种在实践中比较有效的方法是对超参数进行随机组合(比如不太重要的参数进行随机抽取,重要的参数可以按照网格搜索的方式选择),选择表现最好的参数作为结果,这就是随机搜索(random search)

网格搜索和随机搜索没有利用超参数之间的相关性,即如果模型的超参数组合比较类似,其模型的性能表现也是比较接近的,这时候网格搜索和随机搜索就比较低效。下面介绍两种自适应的超参数优化方法:贝叶斯优化和动态资源分配。


动态资源分配

在超参数优化中,每组超参数配置的评估代价很高,如果我们可以在较早的阶段就估计出该组超参数效果就比较差,然后提前终止该组参数的测试,从而将更多的资源留给其他。这个问题可以归结为多臂赌博机问题的一个泛化问题,即最优臂问题(best-arm problem),即在给定有限次数的情况下,如何获取最大收益。

动态资源分配的一种有效方法是逐层减半(successive halving),将超参数优化看作是一种非随机的最优臂问题。该方法出自2015年的一篇论文,论文下载地址为:https://arxiv.org/pdf/1502.07943.pdf

假设要尝试N组超参数配置,总共可利用的摇臂资源次数为B,我们可以通过 T = [ l o g 2 N ] 1 T= [log_2N]-1 轮逐次减半的方法来选取最优的配置,具体计算过程如下:

在逐次减半方法中,N的设置十分重要,如果N越大,得到最佳配置的机会也越大,但每组配置分配到的资源就越少,这样早期的评估结果可能不准确,反之,如果N越小,每组超参数配置的评估就会越准确,但也有可能无法得到最优的参数配置。因此如何设置N是评估“利用-探索”的一个关键因素,一种改进的方法是:HyperBrand方法,通过尝试不同的N来寻找最优的参数配置。对应的论文下载地址为:https://openreview.net/pdf?id=ry18Ww5ee


贝叶斯优化

贝叶斯优化背后的思想

贝叶斯优化(Bayesian optimization)是一种自适应的超参数优化方法,根据当前已经试验的超参数组合,来预测下一个可能带来最大收益的组合。

对于同一个算法来讲,不同的超参数组合其实是对应不同的模型,而贝叶斯优化可以帮助我们在众多模型中寻找性能最优的模型,虽然我们可以使用交叉验证的思想寻找更好的超参数组合,但是不知道需要多少样本才能从一系列候选模型中选择出最优的模型。这就是为什么贝叶斯优化能够减少计算任务加速优化过程的进程,同样贝叶斯优化不依赖于人为猜测需要样本量的多少,这种优化计算是基于随机性和概率分布得到的。


简单来说,当我们把第一条样本送到模型中的时候,模型会根据当前的样本点构建一条直接,当把第二天样本送到模型中的时候,模型将结合这两个点并从前面的线出发绘制一条修正的线,当输送第三个样本的时候,模型绘制的就是一条非线性曲线,当样本数据增加时,模型所结合的曲线就会变得更多,这就像统计学里的抽样定理,即我们从样本参数出发估计总体参数,且希望构建出的估计量与总体参数相合,无偏估计。


下图为非线性目标函数曲线图,对于给定的目标函数,在输送了所有的观察样本之后,它将搜寻到最大值,即寻找令目标函数最大的参数(arg max)。

我们的目标并不是使用尽可能多的样本去完全推断未知的目标函数,而是希望能求得使目标函数最大化的参数,所以我们将注意力从曲线上移开,当目标函数组合能提升曲线形成分布时,其就可以称为采集函数(Acquisition funtion),这就是贝叶斯优化背后的思想。(灰色区域部分参考:https://www.jiqizhixin.com/articles/2017-08-18-5)

时序模型优化

一种常用的贝叶斯优化方法为时序模型优化(Sequential Model-Based Optimization,SMBD),假设超参数优化的函数f(x)服从高斯过程,则 p ( f ( x ) x ) p(f(x)|x) 为一个正态分布。贝叶斯优化过程是根据已有的N组实验结果 H = x n , y n , n ( 1 , N ) H={x_n,y_n}, n\in(1,N) y n y_n f ( x n ) f(x_n) 的观测值)来建模高斯过程,并计算 f ( x ) f(x) 的后验分布 p ( f ( x ) x , H ) p(f(x)|x,H)

为了使得 p ( f ( x ) x , H ) p(f(x)|x,H) 接近其真实分布,就需要对样本空间进行足够多的采样,但是超参数优化中每一个样本的生成成本都很高,需要使用尽可能少的样本来使得 p θ ( f ( x ) x , H ) p_\theta(f(x)|x,H) 接近于真实分布。因此需要定义一个收益函数(Acquisition funtion) α ( x , H ) \alpha (x, H) 来判断一个样本能否给建模 p θ ( f ( x ) x , H ) p_\theta(f(x)|x,H) 提供更多的收益。收益越大,其修正的高斯过程会越接近目标函数的真实分布。

收益函数的定义有很多方式,一个常用的是期望改善(Expected Improvement,EI)。假设 y = m i n { y n , 1 n N } y^* = min \left \{ y_n, 1 \leq n \leq N \right \} 是当前已有样本中的最优值,期望改善函数为:
E I ( x , H ) = + m a x ( y y , 0 ) p ( y x , H ) d y EI(x, H) = \int_{-\infty }^{ +\infty } max (y^* - y, 0) p(y|x, H) dy
期望改善是定义一个样本 x x 在当前模型 p ( f ( x ) x , H ) p(f(x)|x,H) 下, f ( x ) f(x) 超过最好结果 y y^* 的期望。除了期望改善函数之外,收益函数还有其他函数的定义,比如改善概率(Probability Of Improvement),高斯过程置信上界(GP Up Confidence Bound,GP-UCB)等。

时序模型优化过程如下所示:

贝叶斯优化的缺点是高斯建模过程需要计算矩阵的逆,时间复杂度为 O ( n 3 ) O(n^3) ,因此不能很好的处理高维过程,深层神经网络的参数一般比较多,需要更加高效的高斯过程建模,也有一些方法将时间复杂度从 O ( n 3 ) O(n^3) 降到了 O ( n ) O(n)

至此,超参数优化部分已经介绍完成,这里并没有对超参数优化进行实现,有很多Python库已经对其进行了封装,感兴趣的可以关注下,另外贝叶斯优化在日常实践中用的比较多但是不太好理解,可以多看几遍,对比一些文章什么看下理解下。


转载:https://blog.csdn.net/Gamer_gyt/article/details/101033047
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场