最直观的随机搜索和网格搜索解释可以看scikit-learn的User Guide(含实现代码):3.2. Tuning the hyper-parameters of an estimator ,这里结合Bengio的Deep Learning再啰嗦一下:
网格搜索适用于三四个(或者更少)的超参数(当超参数的数量增长时,网格搜索的计算复杂度会呈现指数增长,这时要换用随机搜索),用户列出一个较小的超参数值域,这些超参数值域的笛卡尔集(排列组合)为一组组超参数。网格搜索算法使用每组超参数训练模型并挑选验证集误差最小的超参数组合。
以SVM为例,挑选SVM的超参数C值、kernel类型和gamma值。下面的配置表示我们要搜索两种网格:一种是linear kernel和不同C值;一种是RBF kernel以及不同的C和gamma值。Grid Search会挑选最适合的超参数值。- param_grid = [ {'C': [1, 10, 100, 1000], 'kernel': ['linear']}, {'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']}, ]
复制代码 同时,Grid Search适合重复的、迭代的进行。以上面的数据为例,如果在linear kernel的情况下,最合适的C值显示为1,那么说明我们高估了C值的范围,我们应该降低C值的搜索区域,开始第二次搜索:- param_grid = [ {'C': [0.1, 0.5,0.8,1], 'kernel': ['linear']} ]
复制代码 而随机搜索提供了一种更高效的解决方法(特别是参数数量多的情况下),Randomized Search为每个参数定义了一个分布函数并在该空间中采样(sampling)。上文对SVM的网格搜索在此处可以表示为:- param_grid = [ {'C': scipy.stats.expon(scale=100), 'gamma': scipy.stats.expon(scale=.1), 'kernel': ['rbf'], 'class_weight':['balanced', None]}]
复制代码 Randomized Search指数级高效于Grid Search,因为Grid Search将大量的计算浪费在了指数级的对结果无影响的参数中,而Randomized Search几乎每次都搜索了对结果有影响的参数的值。
参考资料:
Bergstra, J. and Bengio, Y., Random search for hyper-parameter optimization, The Journal of Machine Learning Research (2012)
3.2. Tuning the hyper-parameters of an estimatorLecun Y, Bengio Y, Hinton G. Deep learning[J]. Nature, 2015, 521(7553):436-444.
|