目前的机器学习/深度学习框架日渐成熟,工具的发展为模型的自动调参提供了完善的功能,帮助我们可以快速、有效的达成优化模型,确定最有参数的目的。
在开始讲述这个调参之前,我们先来回顾一个空间概念。
我们的模型未知参数可以构成一个平面,如果只有 2 个未知参数,那就是一个 2 维平面,如果是多个未知参数,则构成一个多维平面,但在这里我们依然把他理解成一个高维空间里面的曲面(如下图)。
图1 空间曲面我们所要寻找的最优点,则是这个曲面里的极值,因此自动调参就是自动搜索极值的过程。
1. 机器学习中的自动调参
机器学习目前最流行的python库,为Scikit-learning。这个库为我们提供了丰富的机器学习工具,当然也少不了自动调参,那我们就从这个库的功能讲起。
这个库中间,可以通过 estimator 来调用自动调参的函数:
estimator.get_params()
上述函数可以获取需要自动搜索最优参数,比如支持向量机里面的 C,kernel 和 gamma,或者 Lasso 中的 alpha 等模型参数。
1.1 grid search
由于我们刚刚提到的,调参的目标是为了找寻曲面中的极点。那么其中最简单的方式,就是网格式搜索,在我们输入给定的范围内,对不同的参数组合进行测试,之后找出最优解。
图2 Grid Search 的形象展示代码实现:
param_grid=[{'C':[1,10,100,1000],'kernel':['linear']},{'C':[1,10,100,1000],'gamma':[0.001,0.0001],'kernel':['rbf']},]
上述代码就是 support vector machine 的参数组合,根据 任意的组合,找出所有组合中 cross validation值最优的组合,作为自动寻优最佳组合。
1.2 randomizedsearch
除了比较均匀的采样以外,grid search 也可以采用随机采样的方式,来替代上述均匀网格的方式。
图3 随机采样示意图代码实现:
{'C':scipy.stats.expon(scale=100),'gamma':scipy.stats.expon(scale=.1),'kernel':['rbf'],'class_weight':['balanced',None]}
在上述代码中,通过scipy的stats库进行exponential分布的采样,此外这个函数还支持gamma,uniform 以及 randint 分布的采样。
1.3 深度学习中的自动调参
从上面的描述中,我们可以发现其实这个工具就是提供了一个pipeline,通过循环的方式帮你自主找到合适的参数组合。比起我们自己写这个循环,会稍微方便一点,但是并没有真正做到无限环境。
那么,在深度学习里面也是有这样可以做到 grid search,以及 random search 的工具。
那就是 Ray Tune,链接放在这里,http://ray.readthedocs.io/en/latest/tune.html
代码实现:
希望对大家有帮助~
网友评论