美文网首页李宏毅深度学习(2017)
15.调参(Tuning hyperparameters)

15.调参(Tuning hyperparameters)

作者: SpareNoEfforts | 来源:发表于2019-03-03 16:53 被阅读1次

    不可否认的是,现在在做深度学习的过程中,调参数是一件非常重要且主要的事情。那么,今天我们来讲一下调参数这件事。

    Grid Search

    Grid Search就是穷举,穷举所有的超参组合。
    当你对决策树调参,如果只对一个超参优化,比如树的最大深度,尝试[3, 5, 7]。那么可以表示为:


    如果你还想对分裂标准进行调参,分别试试gini和entropy,那么就相当要对
    所以这就是为什么叫做gird search,网格搜索。grid search是对网格中每个交点进行遍历,从而找到最好的一个组合。
    网格的维度就是超参的个数。如果有

    Model-based Hyperparameter Optimization

    有另外一个做法叫做Model-based Hyperparameter Optimization,这个做法就叫做Bayesian的optimization,今天我们就只讲一下它的概念。
    假设横轴代表说你要去调的参数,比如说learning rate,(这边一维就代表你要调一个参数,但实做上你要调的参数往往有数十个,所以它其实是在一个高维的空间中做Bayesian的optimization)我们选择一个learning rate,然后去跑一下结果得到一个Accuracy,见下图中的点1;我们再选另外一个learning rate再跑一下,结果再得到一个Accuracy,见下图中的点2;现在我们就得到两个Accuracy。接下来我们根据这两笔training data就learn一个regression model估测说:如果给定不同的学习率,我们期待的Accuracy有多大?这个regression model通常会有一个Bayesian的model,这个Bayesian的model可以告诉我们说在这些region里面model的confidence有多大。举例来说,如下图所示,因为1.2两个点是已知的,所以这两个点的confidence就非常大,3这个位置因为没有取样的点,所以这个位置的confidence就非常小,蓝色的区域代表今天model在估测的时候觉得可能的区间;蓝色区域越大就代表confidence越小。

    好,接下来我们要根据上图中黑色的这一个曲线,即estimate的结果选下一个点。怎么选 就取决于两件事,一个是:我们希望找一组根据我们的model估测出来它会得到比较好的结果的参数组合;假设我们只这么做,那machine已经知道说这个点它的正确率最高,每次选要estimate正确率的时候,他就只会选在这个区域,这不是我们要的。第二条件是我们也需要machine去做一些探查去做一些搜寻,看看说在hyperparameter的空间里面,有没有哪些地方是我们没有探查到的,那没有探查到的地方我们应该探查看看:如果设那一组参数组合会得到什么样的结果,所以今天会同时考虑两件事情,一件事情是根据这个模型估测出来的结果,另外一个是这个模型他的confidence,我们希望选一个估测出来正确率高,但是confidence低的地方,根据估测的正确率和confidence,你会定出一个acquisition function,就是上图中绿色的这个函数,还有选绿色的函数值最高的地方,比如说在上图红色三角这个点。

    好,接下来选了这个点,比如说这个learning rate以后,再去跑一下你的model得到Accuracy;你现在你就有三笔training data去做你的regression的problem,你在得到一条regression的线,还有得到在每一个区域这个regression的confidence。如下图所示: 而接下来就反复那个过程,接下来取样在这个地方你就得到新的点:

    你这个regression的estimate就会越来越准。
    这个是Bayesian的optimization,这个方法到底work嘛?我有点难告诉你说他是work的,因为这个方法的好坏就取决于你的regression的model做的好不好,而regression的model也是一个假设,也是hyperparameter……
    这个regression的model到底合不合理,你也是要凭着直觉设出来,所以这个方法到底好不好久取决于regression的model到底好还是不好。

    Reinforcement Learning

    刚才是用一个regression的model,也许可以作用更复杂的model,比如说用RNN来决定network的架构,google现在很流行的用machine来learn machine,用network来learn network;所以假设你要train一个CNN,怎么做?你先train一个神奇的RNN,这个RNN它的output就是数字,它的第一个output就代表第一个layer的filter的高,然后接下来output第一个layer的output的宽,接下来output你的stride是多少,然后output要有几个filter,这是第一层,然后接下output第二层,然后就一直output下去,把它所有的数据收集起来,你就得到了一个CNN的架构。


    RNN它的架构是每个时间点的的输出会被当做下一个时间点的输入,你使用RNN去sample一排数字你就得到一个CNN,那么这个RNN怎么来?是这样来的,我们得到一个CNN以后你就拿他去你的training set上train一下,然后在验证集上你就可以得到Accuracy,然后这个Accuracy就是RNN的reward,我们用reinforcement learning的方法来硬train这个RNN,所以我们还没有讲过reinforcement learning,但是它的基本概念你就是调RNN的参数,希望它得到的reward的期望值越大越好。

    你用同样的方法其实也可以设计LSTM的架构,我们之前上课的时候已经讲过了,而且这样的方法可以被视为是一种meta learning了,或者是learn to learn的方法。这边是设计了CNN跟LSTM的架构,也可以设计激活函数,那个Swish就是这样子来的:
    你先假设说激活函数有固定的样子(即输入一个值,输出一个值),今天假设说输入这个值先把它复制3份,然后前面两个值通过一个Unary的函数,Unary函数如下图所示;然后通过一个Binary函数,Binary函数有如图所示;然后再通过一个Unary函数;然后第三份也通过Unary函数;再在一起通过Binary函数得到最后的output。

    在每一个block里面Unary函数Binary函数要选什么呢?把它当做RNN的output,让RNN告诉你说到底要选哪一个Unary或者是Binary函数。在learn 激活函数的时候,RNN的output就是有可能的Unary或者是Binary函数,然后接下来你就硬train下去,RNN先产生一个激活函数,这个激活函数learn一下得到Accuracy,然后去update一下RNN,再产生新的激活函数再update,就这样不断的循环,最后就可以找出一个最好的激活函数,就是Swish。

    在这边Swish的paper里面,他们有讲说他们找到的最好的八个激活函数就列举在这边,如下图所示:

    这些的激活函数有什么特色?有一个特色是他们好像都有直接使用到input x。然后另外一个特色就是有一些激活函数,居然是有周期性的,这个也是作者相当自豪的一点,因为正常在设计激活函数的时候,你绝对不会设计这种激活函数,举例来说,像绿色的这样的一个激活函数,有一些奇怪的地方,觉得不太make sense:因为你input在这个地方,在这个地方它的output都是一样的,machine就会分辨不出到底是什么样的input,反正用RNN learn出来就是这个样子,machine超越人,设计出来的激活函数就是这么回事,你没有办法想象的。

    还可以拿来决定学习率,我们知道说学习率有一些决定的strategy,比如说Adam和RMSProp等等,其实这些不同的学习率的strategy,有一个共同的表示是:举例来说SGD,我们大家都熟知的SGDG代表那个gradient,gradient乘上identity,就是SGD
    RMSProp呢?RMSProp是有同样gradient乘上identity,,但是这边有一个\hat v\hat v是过去的gradient的平方的estimation,就等于是你把过去的gradient的平方和 把它平均起来。 好,把平方和开根号,然后再把G除上开根号的结果就是RMSProp。
    那么Adam呢?AdamRMSProp不一样的地方就是把gradient换成{\hat m}{\hat m}就是momenton,momenton就是gradient平均,{\hat v}是gradient的平方的estimation,{\hat m}是gradient的estimation,{\hat m}除掉{\hat v}的开根号就得到Adam

    好,我们怎么知道说什么时候要{\hat m},什么{\hat v},什么时候开根号,什么时候做什么?所以怎么办?让machine来决定要怎么调学习率:


    这边一样learn一个RNN,他的第一个输出就代表了第一个Operand,那Operand有什么呢?
    ,然后再输出第二个Operand,再输出第一个Unary函数,这边有各种Unary函数:
    再输出第二个Unary函数,然后输出Binary函数,有各种不同Binary函数:
    你就可以制造一个新的learning的strategy,新版的Adam,新版的RMSProp,最后得到什么结果?最后得到一个新的learning的strategy叫做PowerSign,其实他没有做很完整的实验,但他的结果看起来疑似可以training得到新的test上,叫它作为reinforcement learning的时候,machine是train在image的test上,但是你learn出来的learning的strategy好像可以apply在其他比如说translation,language model上面,好像也可以得到不错的结果。

    然后他这边是举其中一个实验,这个实验是在月牙形的loss函数上面,它是一个对gradient descent来说经典的难题,四个经典的方法包括SGD,Momenton,Adam,RMSProp,来发现说SGD,Adam,RMSProp,其实都没有办法从开始的地方走到终点这个地方,这三个方法都走不到;Momenton可以走到,那PowerSign跟Momenton一样强,而且走了一个很崎岖的路径但是他最后也走到了。

    而且很好奇,说PowerSign长什么样子,它其实也没有很复杂,它长这样


    。他还蛮单纯的,我们把gradient前面乘上
    这次听起来蛮自觉的,如果gradient跟Momenton同向,e的指数项就是正,那你的gradient就会乘上一个正的值,是一个比较大的学习率,因为如果你今天你的gradient跟Momenton反向,那指数项就是负的,e的指数项就是一个小于1的值,所以你学习率就会减小,所以这个听起来蛮直观的。

    这些方法虽然听起来很潮,但是这是好孩子也没办法学,你在家里也没办法自己尝试,你可会想说我现在在做作业2,还有一点点时间,看要不要自己发明一些新的RNN的结构,我看你还是洗洗睡了这样子,其实你给我看产生SVN的架构paper,他说他用了800张gpu,这个实验实在是好,还是没办法学的一个task。

    相关文章

      网友评论

        本文标题:15.调参(Tuning hyperparameters)

        本文链接:https://www.haomeiwen.com/subject/kwayuqtx.html