不可否认的是,现在在做深度学习的过程中,调参数是一件非常重要且主要的事情。那么,今天我们来讲一下调参数这件事。
Grid Search
Grid Search就是穷举,穷举所有的超参组合。
当你对决策树调参,如果只对一个超参优化,比如树的最大深度,尝试。那么可以表示为:
如果你还想对分裂标准进行调参,分别试试gini和entropy,那么就相当要对
所以这就是为什么叫做gird search,网格搜索。grid search是对网格中每个交点进行遍历,从而找到最好的一个组合。
网格的维度就是超参的个数。如果有
Random Search
有另外一个方法叫做Random Search,就是说我们不要循规倒矩的把每一个可能性都试过,我们随机取样的方式取样出我们想要测试的test。举例来说我这边有个点,我们不要个点都做,我们说个点里面抽一些点出来试,看哪一点的结果最好,就选那一个点就好了,这个叫做Random Search。
其实在deep learning里面,Random Search通常是蛮有效率的,为什么?你把所有你要search的方法组合统统拿出来在data做测试,其实 的那些方法,他们的performance可能没有太大的差距。因为今天在做deep learning的时候,通常只有某几个参数对你的结果有特别决定性的影响,有很多参数对你的结果的影响是不大的。所以今天在所有的参数组合里面有很多种参数,它的performance的其实都是一样,你performance最好的那几组的参数组合,它的结果可能都是大同小异的,所以其实没有必要找过所有的参数组合,举最好的那一组出来,你其实只要选前名的几种的出来,其实结果应该就够好了。
好,这是基本的假设。在这个前提之下,假设我们现在有个点,我们想要做grid search,我们从点里面随便选一个点,它落在 的几率是多少?很简单,就是除以;接下来我们取样次,他们落在 里面的几率是多少?你就先计算每一次取样 不到 的几率是,取样到 的几率即: 。
我们希望这个几率大于的话,如果给你跟你就可以轻易地把推出来。举例来说,如果今天,要选到 , 如果你要确保说有超过的几率,你一定可以取样到 的结果,你只需要取样次;或是更进一步假设只要是取样到 你就满足了,那你取样的次数就可以降到只要取样次就可以保证有超过的几率取样到 的参数组合,因为的指数项的下降是非常快的,所以其实你不需要取样太多次,就可以取样到你想要的东西,所以其实做random 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有多大。举例来说,如下图所示,因为两个点是已知的,所以这两个点的confidence就非常大,这个位置因为没有取样的点,所以这个位置的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,我们大家都熟知的SGD,代表那个gradient,gradient乘上identity,就是SGD;
那RMSProp呢?RMSProp是有同样gradient乘上identity,,但是这边有一个,是过去的gradient的平方的estimation,就等于是你把过去的gradient的平方和 把它平均起来。 好,把平方和开根号,然后再把除上开根号的结果就是RMSProp。
那么Adam呢?Adam跟RMSProp不一样的地方就是把gradient换成,就是momenton,momenton就是gradient平均,是gradient的平方的estimation,是gradient的estimation,除掉的开根号就得到Adam。
好,我们怎么知道说什么时候要,什么,什么时候开根号,什么时候做什么?所以怎么办?让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。