对于优化模型性能表现而言,主要可归纳为两种方式:
诚然,对于第一种方式来说,NAS对算力的消耗是巨大的,因而需要具备巨量计算资源才能够进行,因此具有较高的门槛;而第二种方式来说,消耗的资源要小很多,因而对于本钱小的用户来说,采用第二种是比较合理的方式;尤其是在诸如kaggle等比赛上,很多团队并不具备类似于google那样的算力,因而采用第二种方法提高模型表现是最重要的手段。
首先需要搞清楚,这里所指的优化模型参数是指在深度学习时代优化模型的超参。什么是超参了?超参是指,必须由人工设定的模型参数,比如学习率,比如mini-batch 的batch size,比如衰减率等等。参数优化特指的是这一类超参。
通常而言,在传统机器学习时代,针对一些结构较为简单的模型,比如随机数森林;其超参数量有限,并且超参的取值范围一般来说比较小,且并非连续数字;比如随机森林的depth参数只能是取整数;因而在这种情况下主要采用的是 网格搜索的方法即grid search 的方法进行合适超参的选取,即超参的优化。
很明显的是,采用grid search的方法不但浪费大量计算资源,并且效率无法保障。经过前人的验证,在传统机器学习时代形成了三种主要的调参方法:
其中普遍来说,后两者的效果要更好;尤其是bayesian optimzie 性能更好,更加优异;在当时广泛用在诸如kaggle等比赛上(我曾经见过有kaggle的比赛团队使用贝叶斯调参将模型accuracy从76% 调到95%)。
贝叶斯优化的主体思想是基于贝叶斯原理,即根据现有发生的事情(一组超参下模型表现情况)来推断如果采用另一组超参模型会是什么样的表现;简而言之就是基于少量的现有超参组合来估计整个超参组合空间,从中挑选出最为合适的超参组合;这个过程常常采用基于高斯回归来做估计;具体的原理可以参考[1]链接。如果需要尝试下贝叶斯优化的效果,在使用传统算法时可以参考链接,这里有使用案例,可以配合sklearn 进行测试。我这里提供一段代码以供测试
那么现在问题来了,在深度学习框架下,一个模型往往比之前复杂的多,且计算资源消耗得多;即便是使用贝叶斯方法,理论上需要运行的次数更少,但是也难以承担这样的开销。
针对这样的问题,普遍的做法是针对特定的框架开发专门的平台来进行优化。
目前主流的优化方式有两种:1. google vizier 2.pytorch ax and Botorch [4]
其中前者是原先google内部进行调参所开发的工具,并于2017年发表相应论文[2]链接; 目前该方法仅仅公开了调用接口,优化过程需要在google的云平台上进行;当然google vizier实际上是一款强大的auto ML的框架,具有很多优良特性,但是针对普通开发者并不友好。
后者是facebook 推出的基于pytorch的贝叶斯调参工具以及适应性试验平台,适用性较为优良。一般来说针对普通需求的团队或者组织,出于快速开发的需要,还是建议使用pytorch ax botorch 为好。
这里的平台安装部署非常简单,保持了pytorch 一贯的易于维护风格,直接使用pip 安装就可以了;安装过程可以参考
ax
botorch
不过需要注意的是,上面两个平台需要基于torch 1.5 版本
使用AX 和 Botorch 优化我们自定义的模型是第一步,这里给出一段代码以供参考
从上面可以看得出,这就是一个普通的pytorch 模型结构定义的方式,接下来就是构建贝叶斯优化要优化的目标函数,这当然是一个黑盒过程。这个函数其实也就是用于描述模型表现的一个函数
然后就是使用Botorch 和Ax进行模型贝叶斯优化的过程,这个过程分为4个主体步骤,下面代码中一一介绍
基本来说,采用Botorch Ax进行优化 就是上面的4个步骤,主要是要把优化的参数在candidates里面列好。
上述的步骤是针对一般性的优化函数,比距高斯回归优化函数的步骤,Botorch 还支持自定义的RBF优化函数;关于这一块的内容可以具体参考Botorch的相关文档。目前有一些研究结果[3]表明一些特定的RBF函数有较好的优化效果。
公司名称: 8A-8A娱乐-注册登录商务站
手 机: 13800000000
电 话: 400-123-4567
邮 箱: admin@youweb.com
地 址: 广东省广州市天河区88号