1 黑盒优化的概念
什么是黑盒优化?「黑盒优化问题」泛指目标函数难以从数学上解析表达,缺少可直接利用的梯度信息,仅可利用目标函数输入和对应输出函数值进行最优解搜索的优化问题。
太抽象,不懂,根据达摩院MindOpt的教程,它“通过获取不同控制参数(输入变量)对应的系统表现,来推断和搜寻优化解"、“可用于强化学习策略搜索、工业冶炼方案设计、计算资源额度预算优化等”。
云栖大会上王孟昌博士有讲解: https://yunqi.aliyun.com/2021/agenda/session170 在这个直播回放大约20分钟的时候,截图如下:
其中的黑盒优化的架构就像下面的图这样,我们假设我们要求解的问题不好描述,就把这个问题做成一个仿真系统,这个系统可以根据输入的变量值(“候选解”)来给出对应的评价(“观测值”),然后黑盒优化算法,就是接上这个仿真系统,通过不断地去提供候选解和得到观测值,来搜索可能的最优表现的候选解。
2 黑盒优化benchmark:RABBO
这次达摩院MindOpt优化求解器团队出的「开发者福利」RABBO V1.0看起来挺有意思的,题目集包含4种问题:
从这儿可以看到他们的网页介绍:https://tianchi.aliyun.com/specials/promotion/BlackBox
2.1 瞄一眼长长的文档
点击“查看文档”,会进入个长长的文档,供了解细节。提交评测实际是进的同一个页面,上面有一排tab不要错过,有“排行榜”和“提交结果”。太长,瞄一眼文档结构就行。
2.2 看git项目
点击首页的“下载数据”按钮,和数据列表的“guide.html.zip”文件,都会引导到阿里云家的git(code.aliyun.com),用阿里云的账号登录,第一次用需要根据指引把自己的账号设置好,账号折腾好后,在https://code.aliyun.com/mindopt001/RABBO 可以看到文件截图如下图。
点击“3.27MB”的图标,可以看到文件如下图:
2.3 下载它
然后根据自己的喜好下载它。考虑到官方好像在不停更新的样子,我们fork这个项目,在页面上点击“派生”,等待系统完成
这个页面会转很久很久,好像有bug的样纸。 点击左侧导航栏的“项目”就可以看到项目已经有了,地址是https://code.aliyun.com/你的Username/RABBO
,比如我的名字是wuyoy520。可以进项目设置将“可见等级”改成Private。
然后clone克隆到本地自己喜欢的文件夹内。
git clone git@code.aliyun.com:你的Username/RABBO.git
clone完了后,根据git指导来安装它,"Note: RABBO supports Python3.6 or newer." 由于我的python3是分开的指令所以我是这样做的:
cd RABBO
pip3 install -r requirements.txt
python3 setup.py install
pip3 install -e .
运行看结果的主程序示例程序在这儿:
python3 examples/experiment_example.py
最后的运行结果好像是不OK的,没解出来:
2.3.1 偷懒的换git账号方法
这里分享一个我切换git账号的偷懒方法:建立一个空的empty项目,然后里面会有Git全局设置参数,复制这两句到终端命令行运行。
3 参考文档,学习RABBO
3.1 RABBO V1.0 问题集
4个问题分别对应文件夹中的不同文件。在目录 blackbox_starter_kit
-> problems
文件夹下面。
只有4个文件夹,是因为里面的2 金属冶炼配比优化并没有开放直接下载,参与公开测评,也就是评分的分数里会有它。
3.2 步骤1,实现一个自己的算法,嗯,姑且先copy一个
前面说运行看结果的主程序示例程序examples/experiment_example.py
,内容是:
直接不改的运行结果好像是不OK的,没解出来:
我们要改的文件在blackbox_starter_kit/algorithms/submission/submission_algorithm.py
里面有一些指导,我们先copy一份示例算法过来,示例算法在blackbox_starter_kit/algoriths/
文件夹下的cmaes/cma_algorithm.py
和random_search/random_search_algorithm.py
。
将cma的算法代码“有技巧”地拷贝至submission/submission_algorithm.py
,不要动函数名,其他的copy进去。然后将examples/experiment_example.py
中的算法改成选手算法:
运行,可以看到有类似的输出了,后续就在这个submission_algorithm.py
改造自己的算法就行。
3.3 步骤2,额,上1步运行过了,改算法后面再研究,先跳过
3.4 步骤3,打包算法提交测评
文档写的很轻松的几句话,但是前面需要安装docker,点击进入标的链接,根据这个页面的内容来安装、开通容器镜像服务,打镜像,和推仓库。
首先,先安装docker;
然后,从https://www.aliyun.com/product/acr容器镜像服务ACR的产品页,开通进入“管理控制台”,如下图,创建个人版(免费)实例。根据文档指引,在页面上操作,创建一个私有的命名空间,然后再创建一个本地镜像仓库。
然后,回到rabbo的目录,运行sh build.sh来打包仓库:
cd RABBO
sh build.sh
由于我电脑多个Python版本,因此要进build.sh把python
改成python3
。
然后我家的龟速网络就要漫长地等待了。。。
镜像打结束后,注意,最后一行显示:
naming to docker.io/library/mind-blackbox-bench:20211218,
复制mind-blackbox-bench:20211218,后面要这个ImageId。
然后,推镜像到仓库。从推镜像的指令在仓库里面复制更方便:
第一次推不晓得啥米原因它卡住了,然后取消了后重新推又很快就上去了。这时候刷新镜像版本就能看到多了个镜像啦。
最后,提交评测。提交结果的tab页。镜像的地址从奖项的基本信息里面拷贝公网的地址,并在后面加上刚刚提交的版本,如:0.1
。
提交了后,等待一会后,出现结果。
注意,如果前面一个没结束的时候重复提交,上一个任务会被停掉,之前提交的任务会获得一个“task terminated”的已经失败提示。
点击模型的超链接,会弹出日志先是各个分数。排行榜不是实时更新的,需要等待。
至此,整个流程走通了。
4 其他文
后面我会发如何去读官方参考算法代码,和如何研发自己的算法。
先立个flag:
1.《学习一下官方提供的两个参考算法和开源算法》
2.《改编一个自己的黑盒优化算法》