经常会在网上看到调侃我们做算法的是炼丹工程师,是调参工程师,调侃归调侃,但是也说明了调参在实际是很重要的。怎么快速地选择参数,这是一个很现实的问题。前段时间QQ浏览器就这个问题出了一道题, QQ浏览器2021AI算法大赛(https://algo.browser.qq.com/),目前该比赛提交已经结束。
QQ浏览器的超参优化是一个十分好的题目,具有很强的现实意义,能够很大程度上解决深度/机器模型中调参耗时的问题。听说腾讯准备把Top方案布置到一些可以应用的产品线上,如果说腾讯花几十万就可以获取最优的解决方案真的赢麻了,那么你现在不用花一分钱就可以获取到次优的解决方案也同样赢麻了。下面我将就我们这个比赛做一个赛后总结。
我们的队伍名是Roger-ChallengeHub,由Roger和ChallengeHub的选手Starry组成。我们在该比赛中取得了初赛第四,决赛第九的成绩。与取得的成绩相比,更重要的是在该比赛中学习到了很多东西。
初赛总结:
初赛是一个十分典型的黑盒优化问题,每次迭代我们需要返回5个参数组合,然后线上计算5个参数组合的得分,我们根据已经有的参数组合和相应的得分生成新的参数组合,反复执行20次,总共生成100个参数组合。
官方给了2个baseline,一个是随机生成,一个是简单地根据贝叶斯调参。在线上一般可以取得0.1到0.3的分数。
第一步:
在仔细查看了官方的baseline之后,我们的操作是试着调整贝叶斯模型,主要的操作有:
1:保证生成的解不重复
2:初始化的次数变多(等到有20或者更多随机初始化的结果的时候再调用贝叶斯模型求解)
最后线上的得分是0.40+
第二步:
尝试过之后,我们决定采用启发式或者元启发式的方法生成解,最后采用了粒子群算法。
具体的方法为(保留上一步对贝叶斯的改进操作):
1:初始化一次次数后,选取最大的5个参数组合,组成一个粒子群。
2:执行简单的粒子群算法
除此之后进行的优化操作有:初始化使用超拉丁采样
此外我们还采取了双粒子群循环迭代的方法
两种方法的最后得分在0.5-0.6+
第三步:
此时我们无意中发现了一个之前的黑盒优化的比赛,也看了一些关于这个方面的论文,从中学习到了不少的东西(多学习才是正道)。最后我们初赛的模型是这样的:
以贝叶斯优化为基础,其余的优化操作有:
1:coxbox对目标函数y进行空间变换,使得目标函数比较分散变得集中
2:对参数组合进行空间缩放,将其缩放至0-1内,并且继续将y进行StandardScaler。
3:贝叶斯中acquisition function的优化,结合了EI,UCB等常见的函数组合成MACE函数,进行多目标的优化。
4:贝叶斯核函数的选取,选取了线性核函数和非线性核函数的组合核函数。
这是我们初赛最后的基础模型,除此之外,我们考虑到最后局部优化的 问题,引入了粒子群和差分进化的方法在最后几轮进行局部优化。
其余尝试:
我们尝试了以随机森林为优化模型的贝叶斯,发现效果并不如意(也有可能是参数或者某种姿势不对),该模型时间长,并且效果没用我们上面的贝叶斯要好。
吐槽:
初赛的时候我们线下可以稳定取得0.99以上的成绩,但是由于初赛的线程设置原因(该问题在我们队伍的强烈反馈后在决赛中被解决了),我们的模型在初赛中经常超时,尝试了很多种方法在线上都没有解决后,我们无奈只能减少贝叶斯的迭代次数,再线上实际判断运行时间,在即将超时的时候调用差分进化或者粒子群快速生成解。这也一定程度上影响了我们初赛的成绩。
决赛总结:
下面就是决赛的思路了,决赛的题目相较于初赛的题目发生了很大的改变,具体表现为考虑到实际情况中每次验证一个参数的时间很长很长,但是我们可以得到参数组合的中间结果,可以辅助判断该参数的效果,如果判断觉得该参数不行的话,可以及时停止该参数的验证工作,将资源留给别的参数的验证。最后总结就是如果不采用及时停止的策略的话,我们可以迭代10次,总共可以生成50个解,比初赛少了一半。(听完这个讲解可能大部分人不太理解,大家可以去比赛官网看问题介绍)
首先我们验证一下我们初赛的模型在不止停的情况下的效果,无奈发现分数只有0.5+。
对于这种问题来说,我们总结难点主要有:1:采用停止的方法,2:采用了止停之后虽然可以生成更多的解,但是由于训练数据会变少(提前停止的数据无法直接放到贝叶斯模型中训练)。
决赛我们表现的并不好,因为这两个难点我们都没有很好的解决,特别是第二点。
其余操作:
一:止停操作:最近5次的最大值小于当前的最优值;当前的迭代的上界小于目前的最优值;每次迭代生成的值方差过大;
根据我们线下观测的结果,通过这三种止停方法过滤的参数都是可以过滤的,但是由于过滤了过多的参数导致我们贝叶斯无法训练充分,生成的解并不太好。最终线下的结果也比较低。
二:我们后来了解到了MFES-HB文章,采取了他们将止停的数据也进行训练的思想,但是最终的结果没有取得预期,可能是止停数据和模型个数没有调整好。
三:使用MFES-HB将上界下界分别训练模型,将其结合在一起,效果也是降低了。
改进操作:
很遗憾的我们采取的止停的策略和相应的方法都没有取得很好的结果,因此,我们最后只能继续优化初赛的模型,主要是针对性地调整函数,比如acquisition function中的x_i,kappa等,最终在线上取得了0.6+的结果。
总结:
总体来说,这是一个十分棒的比赛,通过该比赛让我们接触到一个之前只是略微了解的领域,并且学习了一些该领域最近的研究情况,对于我们自身的知识有了很大的增长,感谢举办方,接下来希望可以学习前排的模型,了解到自己在比赛中没有注意或者没有接触到的知识。(后续比赛结束如果我们开源代码或别的选手开源代码第一时间通知大家)。



原文作者:ChallengeHub;如有侵权,请联系管理员删除。