大家好,今天非常荣幸能到运筹帷幄这样的论坛来,我讲一下我们最近的工作。这次讲座主要用中文来讲,希望能让大家听懂更多一点。主要讲的内容是如何在优化问题中使用蒙特卡洛树搜索。在此中间,我们提出了一个比较有意思的算法叫 Latent Action,即学习隐动作。目的是学习一个隐的状态空间和隐的行动空间,通过这种方式能更好地进行优化。目前主要通过这个想法,我们做了一系列的工作。

首先,如果大家还没有用过,可以试用一下。我们的代码已经开源并放在网上。如果想使用,可以点击、拷贝或用手机扫描 QR 码进入网站,体验我们的算法。这个算法主要用于黑盒优化,即对于一个未知的函数,通过黑盒优化的方式找到其最优解。这是一个库。

黑盒优化的意思是,如果你有一个函数 f,它不知道里面的导数,也不知道任何内部信息。你能做的是从函数出发,每次调用函数得到一个数字,通过该数字的值决定下一步去哪里搜索,从而达到函数的最优解。我们提供了一个代码库,能以最小的代价获取较大的函数值收益。

讲完库之后,先讲讲这个库的思路或研究的创新点。优化问题是一个非常广泛的问题,很多领域不仅仅是计算机,其他领域也要解决优化问题。例如旅行商问题,即把所有城市连在一起,找到一条路径使距离最短,同时跨越所有给定城市。

这是一个 NP-hard 问题,即在最差情况下,可能需要花指数级的时间才能解决,得到最优解。相似的问题还有作业调度、蛋白质折叠等,各行各业都存在。这类问题完全可以用深度学习,不仅可以用传统优化方法,现在流行的还有用神经网络或强化学习来找到最优解。

这种方法是将优化问题变成一个序列式决策或序列式优化的问题。在每一步找到下一个位置时,用神经网络预测下一步怎么走。通过这种方式,利用神经网络的泛化能力找到更好的解。有时可能比常规求解器速度更快,或在同样时间内得到更好的解。

这种方法是否可用于其他问题?目前只是一个非常广泛或开放的问题,大家很难有定论,需要每个问题具体分析。这里讲一下,如果用强化学习做优化问题,和用强化学习做游戏有什么区别?我们知道强化学习成名之作是用深度强化学习做围棋、象棋或星际争霸等游戏。

这些游戏里有一个很有意思的点,就是行动空间是固定的。例如围棋,每一步走在交叉点上。围棋盘是十九乘十九的,有三百六十一个交叉点,你可以找一个空的地方下子。这就是围棋的行动空间,非常直观明确。

但对于一般的优化问题,本质是从一个初始值出发,该初始值在高维空间中。如何找到一个局部或全局的最优解?对于优化问题,你并不需要定死行动空间,完全可以通过各种方式走过去。也许可以选择走直线,或者绕远路。

绕远路有好处,也许可以绕过山峰或峡谷,达到最大最优点。所以在高维空间中,可选的行动空间非常大,大到你很难想象。因此,对不同行动空间的参数化,可能会有完全不同的搜索性能。这是我讲座的一个主要点。

有什么方法能够自动去学会这个行动空间,自动找到更好的行动空间,使得最后的搜索效率提高?看以前的文章,你会发现很多文章通过人工设计来设计行动空间。例如有一篇有名的文章,讲如何用随机强化学习做神经网络搜索。

这张图很清楚设计了行动空间,每一步把要做的事情写下来。例如第一步设定前面那层的 filter 数目、高度、宽度,以及每个卷积层的参数。一步步通过一个卷积层和一个 RNN 生成出来。这个空间是固定死的,非常清楚。

右边是最近一篇做旅行商问题的文章,也用强化学习。其行动空间是:给定当前状态,现在在哪个城市?下一步要去哪个比较近的城市?通过这种方式得到一条路径。这些都设计过了。但之前的文章让你想到,也许对于优化来说,行动空间本身也是可以被优化的。

这是很多其他过去文章没有做或忽略的点。接下来这张图显示不同的行动空间可能对结果有很大不同。这是一个简单的例子,应用在神经网络架构搜索上。我们设计了一个非常简单的搜索空间,将神经网络简化成三个参数:深度、通道数目和 kernel size 大小。

现在有五种深度可选,两个通道可选,两种 kernel size 可选。通过乘法,你会得到一些不同大小的网络。有了这个网络空间后,我们在这空间里怎么搜索?有很多种方法。当然可以说穷举,这样很容易得到最优解是多少,知道最优解在哪里。

但我们想模拟一下,如果我们使用不同的行动空间,是不是能更快找到最优解?我们试了两种不同的行动空间。一种是非常简单的 sequential action space,这与之前 Google 的方法一样。每次加一层上去,设置 kernel size 和 channel 大小,第一层设计完再去设计第二层,一层层往上叠。

这种行动空间非常直观、简单。另外一种行动空间可以搞得稍微高级一点。我们可以说,先设定整个神经网络的深度,设完深度之后,再设每一层的 k 和 c。这两个行动空间看起来有一点点不一样,global action space 是先设深度。

你会发现照这两个行动空间来搜,用蒙特卡洛树搜索,效率是不一样的。右边的图表现出效率不同。这个图的意思是,搜了多少样本,对应到现在为止的最优正确率是多少。我们希望曲线能给你两个样本就马上跳到最高,但这不太可能。

一般来说,随着样本数变多,这个数字会变得变大,单调肯定是单调的,但能快速单调是我们想要追求的目标。你会发现,在这个图里,如果你用 global action space,这根线起来的速度要快于 sequential action space。这意味着行动空间不一样,搜索效率是不一样的。

这是一个很有意思的例子。这是为什么呢?下面两张图显示了原因。例如从根节点开始,对于 sequential action space,第一个选择是加这一层,这一层的 k 是多少?这是第一个选择。但对于 global 行动空间,第一个选择是深度是多少?

你会很清楚地发现,如果我第一个选择是神经网络有多深,它对不同的深度,平均准确率的峰值差距是很大的。这非常符合我们的直觉。我们直觉上觉得神经网络里每一层的具体 kernel size 没有特别大的用处,最大的还是看有多深,这是最重要的点。

因此,我们在做决策时,先把最重要的决策放最前面做,这样可以提高搜索效率。接下来,怎么做到这一点?我们要去学到这个 action space。首先要想,如果要这样做,首先怎么定义 action space?我们可以先以井字棋为例。

井字游戏很简单,画叉和圈,三个叉和三个圈,横竖斜连在一起就赢了。在这个简单游戏里,每次做一个决策,这个决策实际上把整个游戏的最后结果切分成几块。决策越多,切分得越小。最后把游戏区间切分到非常小时,结局就已注定。

照这个想法,切分方式对于订制器是固定的,但对于一般优化来说,切分方式是不固定的,可以自动学习。这是一个很有意思的现象。右边给了一个清楚的图,讲如何切分整个搜索空间,使得最后切分后的结果有更好表现。

根据不同切分,你会画出图来。左边是切分,右边是根据切分画出的树。先把整个空间切分成两块,一块是绿红的,还有一块是绿的。绿的这一块可以再切分成蓝色的和咖啡色的。通过这种方式把空间切分开。这种切分方式就是行动空间的定义。

有了这个定义,我们可以回到刚才的问题。根据不同的行动空间切分,可以看到对应的值的分布是不一样的。这提供了很好的基础,说明为什么切分行动空间很有道理。这个图说了我们有两个 action space,一个是 sequential,一个是 global。

对 sequential 来说,在行动空间切分的结构下,你会发现每个子树切分完后,有些点很好,有些点很差。这些点指准确率。你会发现很好很差的点之间可以离得非常近。每棵树切完后,并不能保证这棵树里所有东西都是好的。

这样增加了搜索难度,因为搜索时必须把所有树都变一遍,才慢慢找到最优解。因为每棵树里都可能出现最优解,这是一个很大的麻烦地方。但是,如果你把行动空间换一种定义方法,例如定义成 global,你会发现好点和坏点之间的结构相对规整一点。

例如这边有一个很大的枝,这个枝上的很多点都是好;那边这些枝很多点都是差的。你会发现行动空间不同的话,它就自然把问题切分成好的区域和坏的区域。坏的区域不用太多再做建模,好的区域可以继续切分。

这样你就有一个更好的值函数分布。更好的值函数分布,最后的结果就是你的效果更好。这就是整个文章这一系列文章的一些思路。有了这个思路,我们接下来看具体的算法是什么。这个算法一开始是用在神经网络搜索上的。

我们现在讨论的具体应用是神经网络搜索。我们怎么样把这个方法应用到上面去?这是一个非常高、非常初步的示意图。左边是其他文章的做法:先从一个空的神经网络出发,一点一点加,每一层加上去,树就往下走一格,一直走到最后子节点是一个完整的神经网络。

神经网络里面你可以做一下训练,看效果有多少、多好。右边是我们的方法。根据刚才说的,我们一开始是从整个神经网络的设计空间出发。然后我每个……

行动,或者说每个行动,其实是在这个设计空间上的一个切分。所以我们每次把这个设计空间切成好的和坏的两块,这个切分可以继续下去,一直再继续到比如说一个好的节点,最后有一个叶子节点。这个比较左边的叶子节点,其实就是说,我希望前面切分切完之后,这个叶子节点对应的那个神经网络的那个子集,这个子集里面的那个节点呢,都是还不错的。

通过这个方式去学,然后这个切分的方案呢,其实在整个的搜索过程中呢,是可以动态地去调整去学习的。它可以通过根据以前的所有搜索过的东西,动态地去生成一个新的切分方案,然后用这个切分方案去反复地去切分原来的这个行动空间,能够让最后的那个切分出来结果更好。

根据这个想法呢,就自然而然就会有这样一个算法。那么这个算法呢,就是有一两个步骤,交替进行。首先呢,就是说我们给定了一棵树,那么这棵树的这个结构是给定的,那它的行动空间的定义呢是没有给定的。所以我们可能先要随机地训练,随机地采样一些点,根据这些点的位置呢,去把行动空间的那个大致的结构或者大致的那个划分呢,给切分开。

有了这个切分开了之后呢,好,然后我们定义了行动空间,那我们就可以用蒙特卡洛树搜索,去根据这个行动空间去搜索,什么样的那个节点呢是比较有希望的,或者说你能在上面找到更好的节点。那么搜到一定程度之后呢,然后我们把这些数据拿过来,然后再去训练一遍我们的行动空间。

那么行动空间根据新的那个节点,那我们可以就重新再切分,一些地方可能切的不好,那么我们可以继续切分。切分完之后呢,那么回到第一步,然后用这在用在第一步上呢,用那个神经网络的,用我们的蒙特卡洛树搜索呢继续去切分,诸如此,就是这样的迭代。

然后呢,就看就是我给定了多少样本之后呢,我们最后最高能达到什么样的效果?那么这里面有几步是要讨论的。第一步嘛,就是说我们怎么样去学习这个行动空间?那么这边呢,这边先讲一下,就是怎么做线性的,非常简单的线性方案。这个非常非常简单,基本上就是属于机器学习101的一些简单的那个想法,对吧?

就比如说吧,假设你这个动作空间是由两个参数组成的,一个是一个是那个宽度,一个是那个深度,还有一个是那个每一层的决策的数目。那么这两个参数呢,就可以根据这两个参数,你可以得到一个performance。那么根据这个呢,你就可以在上面切一刀。我希望切完之后呢,能够把好的所有好的呢切到一边去,然后坏的呢切到另外一边去。

所以这样的话,这一刀切完之后呢,就是有一边呢是左边的,还有一边是右边的,这么这样一种新的模型就出来了。这就是一个非常简单的一个想法,对吧?所以就说这根红线呢,就表示就是什么方向呢,能够让那个性能呢升的最快。那么沿这个方向上,你横过来切一刀,那上面和下面就是好的和坏的结构。

所以用这个呢,可以拿来做行动空间的一个定义。是这样子,那么大家会说了,就是说这是线性的,非常简单,那么完全可以做非线性的,对吧?所以接下来就是这篇其实已经中了,是我们投到了那个NeurIPS,后来最近是中。那么这篇,那么这边呢,就是我们怎么样去拓展它?

怎么拓展呢?就是我们可以把行动空间的那个空定义从线性变成非线性。我可以先去学一个,我们先做个简单的聚类,可以把好的跟坏的两块呢,就是聚类出来。那么就是变成二和三,然后二和三加上这个剧烈标记之后呢,可以用SVM再训练一遍,得到一个非线性的一个boundary。

那么用这个方式呢,去切分的整个action space。有这个切分之后呢,你这个行动空间那个定义也就有了,然后你可以iteratively做这个事情。好,然后我们说我说到这儿呢,就是说大家可能就已经清楚了什么叫行动空间,然后怎么去定义行动空间,怎么样自动去学习行动空间。

但是呢,大家可能并不理解是为什么我们要去做蒙特卡洛树搜索,就是为什么MCTS呢在这个方面是有用的。这边这里面我们先简简先跟大家讲一下,就是有一个就是有一些就是在实际应用中你会发现有很多的疑难杂症呢,其实没有那么简单。

像这边是一个非常简典型的例子,就是说我们假设就这棵树,这棵树只有两个枝,一个是左边,一个右边。然后你在切完之后呢,你可能会发现就是因为样本数不足,所以呢,这左边和右边这两个区间呢,就是也许你左边看到的那个结果结果,那个它解呢都还可以,但没有一个没有非常好的。

那右边那一块呢,其实大部分的解都非常糟糕,黑点子。但是有一个解或者有一小区域是非常好的,是optimal solution。那么在这种情况下呢,如果你开始建立行动空间的时候呢,就是你只采样到了那些左边那些还OK的、还可以的那个解。那你你可能会本能的觉得左边比右边好啊。

那如果左边比右边好的话呢,你就你就会发现,啊,我把这个刀一刀切下来之后,我把左边右边分开了。然后啊,按照这个切的切完切完的逻辑,如果我没有任何的exploration,没有任何探索,我会觉得我就一直往左边探索就行了,我就不想往右边走。

那么这样的话,你就会失去这个找到optimal的机会。啊,所以这就是为什么我们还是要做exploration,就是虽然我我现在觉得右边不好,但是呢,就是我保留去右边那边探索的权利,也许它探索了一阵子之后呢,它会真正发现一个更好的解。

那么有了这个之后呢,我们在下次决定行动空间的时候呢,就是我会自然而然的把右边的一些点划到左边去。啊,那这样的话呢,就是行动空间重新定义了。然后啊,我在下一步的那个搜索的时候呢,我就能找到一个最优解。所以因为这个呢,所以我们其实是需要做exploration,在这个优化的那个情况下。

那么这边可能要回顾一下我们蒙特卡洛树搜索的那个具体的那个工作的过程。这个是一个非常简单的一个非常基本的一个算法,那么这个算法是在围棋上呢获得了一个很大的成功,就是AlphaGo AlphaGo这个系列里面就用了这个算法。我们这边的围棋的软件呢也是用这个算法,然后有更好的结果。

那么这个想法非常简单,就是说我我在每时每刻呢是维护了一棵树,那么这棵树的根节点呢是当前的状态,然后它所有子节点呢是在下完几步之后呢得到新的状态。那每次你在做那个探索的时候呢,啊,你其实是希望你在你在你在探索的时候,你其实是希望就是它有两个选择。

一个选择是我希望沿着以前胜利道路走。我希望就是我每次走的道路呢,是以前证明过是比较有希望赢的道路,就比如说B那边那那边那条红线,啊,这是一个。那么但是呢,就是除此之外呢,其实我还是希望加一些exploration,加一些探索。

那么这探索呢,完全取决于,啊,就是每个节点上的那个被访问过的次数。如果有节点没被被访问过很少的次数呢,那么有可能这个节点还不错。也许我会我需要花点时间去探索它啊,虽然这节点目前胜率不高,但是我还是需要花时间探索它。

因为探索的那个criterion是在右下角,就这个就叫那个UCB的一个criterion,啊叫PUCT,啊这个这个可以呃用在很多不同的地方。那么这个时候你只要维护每个节点上的一个探索的那个次数呢,就可以算出来,对吧?通过这个方式呢,然后每次探索完整个pass之后呢,然后你就会做一次那个back trace。

这个back trace呢会把每个节点上的一些当前的胜率啊和当前的访问次数这个数字更新一下,然后整个过程重新开始。啊,其实是这样的一个算法,好。那用这算法呢,其实它就它就平衡了,就是呃,我当前利用我现在对于这个每个节点的胜率的预测和那个exploration和一些探索。

如果我们希望兼顾探索呢,同时也要利用那个之前的探索的结果,希望这两边能够平衡,那么最后结果比较好。那么这个算法最后一个问题呢,就是说我怎么样去采样,就在一个那个具体的那个树节点上采样,这个是很重要的,因为在按照蒙特卡洛树搜索里面呢,其实有一个很有意思的点。

就是你每次到结存根节点的时候呢,你希望就是再往前走一步,我希望拓展这棵树啊树树的那个节点。那么对于我们这边来说呢,因为每个节点对应的是一个子区域。对吧?所以有这个子区域之后呢,如果我们要探索更细的子区域的话呢,我们就需要在原来子区域上去做一些样本。

有了样本之后,我才能继续呃做那个线性分割或者是非线性分割,让这个区域再分成两个更小的子区域。所以为此呢,你必须在每个子区域里面呢,啊做一些采样。那么怎么做采样呢?就是这边我们提供两个方法,一个是就是简单的就是线性情空间里面可以采样的。

因为如果你每一个行动空间都是线性切分的,那么你最后的那个树节点呢,它其实是一堆线性切分的交。因为是这对线性约束交呢,啊,所以就是最后它得到一个polytop,这个polytop呢,其实可以比较有效的采样,有一些算法可以做的,啊,这是一种方案。

那么另外一种方案呢,就是说,如果大家都比较懒,也不愿意搞一些非常fancy的方法,那我们总可以做reject sampling。的意思就是说,我完全可以啊,先创建一个比较大的区域,那么这个区域可能就包括了,或者说部分大部分包括了这个最后的那个节点的一个区域。然后采完之后呢,就是每个点,我可以从很简单的步骤去判断它是不是在这个区域里面,啊,然后把那些不在这个区域里面的点给去掉。

这个很简单,你就可以把那个从这个节点到所有的父节点呢,它的constraint都查一遍,他们都全部都要通过,才能保证这个节点确实在这个区域里面。那么这个方式呢,你也可以通过采样。那么这个方法就是有一个问题,就是你必须有一个initial的点去做种子,然后在这种子附近呢,就是找地方采样。

那么这种子呢,很简单,就是说你可以把已有的样本点拿过来做种子,啊,在它上面附近采样就可以。OK,那么还有一种方法呢,其实是啊,就是也许我不做采样,那么我可以在这个子区域的那个周围,或者说在子区域里面,我可以去做一个高线的啊,就是fitting。

假设我有一个就是高斯过程啊,这高斯过程器原则上可以拟合任何函数,那么你可以在这个子区里面去拟合一个函数。啊,通过我们现在已有样本去,你可以去拟合一个函数。这函数拟合了之后呢,啊,你就可以用这个函数啊,然后去找这个函数在这个区域里面的一个比较大的一个值。

啊,那么这个呢,已经是有比较好的方法可以做了啊。高线process已经有做了可以做。那么这有这里这样的做法呢,其实有很多好处啊。我这边列了四个,一个呢是说,因为这个区域比较小啊,所以你用高线process来那个fit这个区域呢,啊,其实是比较容易的。

啊,这是一个很好的一个一个性质啊。刚才Foss的问题就是说,它虽然说fit能力很,它的那个拟合能力很强,但是如果区域很大的话,它就需要指数级的样本去拟合它啊。所以,呃,如果区域小的话呢,它的优势会体现出来啊。对,然后呢,还有就是说,如果你做采样啊,如果你做采的话呢,计算拟合呢,不是说这个区域的最大值,而是区域的平均值。

但是如果你找这个区域上一个函数的max呢,其实是它能够预测这个区域的最大值,啊,这是跟我们的目的呢是一致的。啊,对,然后呢,还第三个好处呢,就是说,比如说对Gaussian process来说,它的拟合的那个复杂度呢,啊,其实是一个非常呃,不是是一个非常好的,它不是线性的,啊,因为点越多,其实你需要解,你就需要解一个呃一个比较复杂的矩阵。

如果你有n个点呢,你就要解一个,就你要去对一个n乘n的矩阵去那个做求逆,那么这个其实要花很多时间的,对吧?你可能要花那个平方或者立方的那个时间才能把这个去把这个矩阵给逆回来,那么那么这样的话呢,你就呃会浪费时间,特别点多的时候非常慢啊。

但是呢,我们这边比较好的地方呢是啊,因为每个区域都比较小,所以里面的点也不多。点里面点一旦多了呢,就它就会分成两个小的子区域。那么这样的话呢,你其实啊永远不会碰到就是我需要大量点来拟合一个高阶高次过程这样一个是这样一个问题啊。所以这是一个很有很有趣的一个一个tradeoff啊。

那么有这些的呢?那其实那个最后的,就是那么很自然,就是我们希望最后每个区域呢,就是高层破层来拟合的。那么接下来就是现在算法呢基本上讲完了,然后我们现在讲一下就是它在一个是神经网络搜索上的应用,啊,还有呢就是说啊它在那个一个黑盒优化上的一个。

那么这个呢是神经网络搜索的一个这样一个问题,就是这个是这有一个神经网络里面有一个搜索空间叫NASNet,那么这NASNet呢其实是一个人工定义的一个搜索空间啊。这里面是就是说如果你输入样本呢,你可以通过很多层啊,这些层呢是一个normal cell和reduction cell的一个交替。然后最后输出得到一个classification的结果。

那么这个每个层里面这个cell的一个结构呢,是啊经过参数化,是可以啊让计算机自动自动设计的。啊,它有一些比较复杂的一个设计的一个一个一个一个啊一个空间,那么在这个一个空间里面呢,其实我们完全可以再继续用我们的那个nice啊,我们的那个搜索算法,那么这是一个比较有趣的结果。

那么这个结果呢,可能现哦现在out of date啊,但是现应该不是最优最最optimal,但是它可以表现出来就是它确实效果呢也是不错的,这边子线呢是我们的,然后其他的颜色的线呢是各种各样的其他算法。啊,你可能会发现,就是很有意思的地方是,我们的算法在很很少用了很少的样本呢,就会得到非常高的那个accuracy。

啊,这个可能是因为我们这边确实学到了一个比较好的那个action space。我们action space用这个action那组搜索呢,效果比较高。啊,那么这边呢是一些更多的一些结果啊,这个结果基本上就是显示出来我们的算法呢还是相对来说比较reasonably good,它的。对它的formance还是不错的。

然后呢,我们也在YouTube上面做了实验,就是说我们因为前面的那那些呢都是有数据集的,什么样数据集呢?就是我们先啊有一个比如说10K的这样一个数据集啊,然后里面每一个architecture呢都是经过计算过的,然后都已经算出来它的formance是多少,把它们静态的放在一个数据集里面,然后让这个搜索呃算法去搜索,得到波动结果。

那么别人可能会问了,就是OK,如果我们并没有把每一个那个architecture都都做过evaluation,我让它在空间中自由的探索,是不是会更好的结果?答案当然是,但是也会有问题,就是说用空间可能太大了,可能效果不一定好啊。但是呢,我们会发现,就是我们的啊方案呢,其实用黑的来来呢,用黑的来表示。

啊,你会发现就是啊我们的方案在那个Cypher 10上呢,它的top one error其实还是啊非常低的,而且我们用的那个啊用的那个数目呢,用用的那个搜索的次数呢,可能就是八百次啊,相对来其他软其他的方案来说,这数字是很小很小的,嗯。那么这这是第一张表。

那第二张表呢?其实用了叫Win Shot,那么Win Shot的你改进呢,其实就是说是我,在采样每个样本点啊之后,啊,如果是用传统的方法呢,这个样本点呢是一个神经网络,那么这神经网络你需要通过训练,然后得到它的那个最后的结果。那么文少的方法就是我用一个非常简单的一个值函数去代替这个训练过程。

就值函数会给你一个比较差的但是还不错的估计,那么这估计呢你可以做很快的搜索,那么这种情况下呢你可以得到一个还不错的效果,那么效果肯定没有原来的好,但是啊效果也还是挺好,啊而且还也会这样的话你可以节省大量GPU的时间。啊,然后我们可以发现,就是用我们这个啊网络呢,然后可以在那个ImageNet

上做,然后你发现效果也还是不错的。好,然后那个我们也可以拿这个算法呢用来做啊,成为把它当成一个 meta method 啊。前面因为我们说过是啊,我们的每一个那个啊,每个叶节点,这个叶节点里面其实可以用任何的 approximate 的分式 approximate 来做函数的拟合啊。我之前说过了,我们可以用那,比如说别的,我们可以用那 Gaussian process,我们可以用其他东西。那么在里面你可以做一个,就是你可以把一个任何一个 solver 套到里面去,这个 solver 会告诉你最优解是在哪里。啊,那么如果套上这个 solver 的话,那我们想看到这个结果是不是更好啊?你会发现,就是我们的方法加上一个已有的 solver,在每一个节点上,它的效果呢其实是高于这个 solver 本身的。

啊,这是一个很有意思的一个现象啊,像比如说这边列举了两个啊人工的函数,这两个函数是比较复杂的啊,一个是叫阿克里,一个叫那个啊罗斯布洛克。阿克里呢,就是说有很多的local minimum,就发现这是二d的版本,它有很多很多的坑啊,如果使用传统的最优化方法呢,它会掉在一个另外掉在任何一个坑里面啊,然后最优解呢,其实在零点附近啊,但就在零点上。啊,你会发现就是说,呃,如果用我们的那个 AIMCTS 的方法去做搜索的话呢,啊,我们的这个搜索效率呢其实是高于如果你只用,比如 Bayesian Optimization,或者用最近的 Open 那边提出来那个 Tube 啊,所以我们的效率呢是比他们要高一点的。

啊,这是很有意思的一个现象。那么,特别是在高维空间,那么在高维空间呢,你会发现啊啊,我们这边这个曲线呢,啊,就那个实的曲线呢是啊,是我们用了这我们的方法,而那个虚线呢是没有用啊,我们这方法。你发现就是特别在高维空间里面,这个实的曲线呢,它的掉的速度会更快,说明它的搜索效率更高。啊,那么一在一百维的空间里面呢,你会发现就两根纯线呢是非常非常的啊短的,短了一截,这是为什么呢?

啊,主要问题是特别是在虚线的情况下呢,因为一百维空间你如果用啊,basis optimization呢,这个速度是非常慢的啊,所以啊,这是一个问题,然后就还要花很长时间才能把它跑出来。但是同样的那个情况下呢,就会发现我们还是MCT的加AI MCT加完之后呢,它的效果呢,它的降向下降速度还是比较快。呃,然后呢,我们也用这个方法呢,然后用它来做啊,Monte Carlo的task啊。

那么这边呢,就是说Monte Carlo呢这边我们没有用这个Gradient Descent方法来做,我们就用的是啊,就是我们假设有个零点policy,这边policy的parameter呢是要通过黑盒优化优化出来的。啊,那么就是怎么样才能让它优化的更快,效率更高?啊,那这个时候呢,就是我们没有用那个 reinforcement 那个方法,但是我们就把它当成一个黑盒函数来来做。啊,你会发现呢,就是说,特别是在高,特别是在高维的函数、高维的那个啊问题上,比如说 e e 和 f,一个是 ant,还有一个是那个 humanoid。

啊,这两个情况下呢,你会发现就是啊,我们的算法呢,就是那个蓝线呢,其实效率要比啊其他方法呢要高很多很多。啊,就是说,这说明就是我们的方法可能在高维空间里面呢,效果会比其他的黑盒优化的方法要好。啊,我们作为对比的那些函数呢,那那些方案呢,就是大部分呢就是属于在比如说进化算法啊这个框架里面,或者说传统的那个贝叶斯优化的一个框架。啊,所以有很多函数是很很多的那个算法是作为baseline比较,啊,然后我们的方法呢相对来说跟感觉上还是不错的,就是主要是这些。

当然,如果那个我们真的跟那些基于梯度的方式来来做比较的话呢?啊,我们的方法可能不会特别的好,因为在梯度的在基于梯度的方案上,啊,在在这个问题上呢,其实基于梯度的方案会比较好,因为像我做过这个task呢,就是你用当前的梯度啊,来计算它的下一步的那个优化的那个方向,这个效率是比较高的啊,而且是很快就能达到更好的结果啊。但是我们对于这些,但我的方法相对来说是一个啊,没有用梯度的方法,是一个那 gradient free 的啊一个 approach。所以呢,这边呢我们就跟啊所有的 gradient free 的其他的黑盒优化方法进行比较。

OK,所以我们这边再说了一遍,就是我们的代码已经开源啊,然后呢,我们希望大家,嗯,欢迎大家来过来使用啊,所以这个代码里面呢是包含了那个我们这边黑盒优化的算法,也包含了之前啊用它来做神经网络搜索啊这样的一个一个一个算法。所以大家如果有兴趣的话呢,可以欢迎大家使用啊。一做啊,王林南在这个问题上做了很多的时间,花很多大家时间去做这个事情,啊,我们在此我感谢他的辛勤工作,啊,所以啊,这就是我这次的讲的内容啊。如果大家有问题呢,可以给啊,可以提出,非常感谢大家。

呃,行,可以可以,啊,我看到了,我会回答一下这个问题。嗯,好,这边有几个问题,一个问题是那个,请问好的结果和坏的结果的判断标准是什么?这篇这篇这边判断标准呢,其实有很多的criteria,就一个简单的标准是一个神经网络训练的时候呢,啊,它的最后的训练结果,它的在测试集上的结果是什么?那么这个标准是人定的啊,是其实是独立于整个框架之外的,就是说,因为这个你可以定义,比如说我们希望找到更优的啊神经网络,它的效果是它的测试集效果是最好的,啊,这是一个。

然后第二个呢,就是说我们可以说我们希望这个神经网络呢效果还不错,但是。啊,但是呢,我们希望这个神经网络大小啊比较小,那么这样的话,你这个判断标准呢就变成了就是,呃,也许你需要对每个部分加权,对吧?你希望这神经网络的效果很好,还不错,但同时呢,要减去它的代价,就是比如说神经网络非常大,那么我也不喜欢,所以这个呃判断标准是人可以预先设计的。然后这个算法呢,在这个判断判断标准的基础上去做啊,去去去去去去去去去做那个训练的,就是这样子一个一个问题啊。

对,然后第二个问题是,这种随机搜索会不会陷入局部最优的情况啊?呃,这个肯定是可能会出现的,但是因为呃这边用了蒙特卡洛树树搜索,所以呃局部最优的,如果你训练足够长的时间,或者说你进行足够多的那个搜索的话呢,那个你总是会有机会跳出,啊局部最优解,然后得到最得到全局最优解。所以它有这个性质,当然了,就是说这个所花的那个时间呢,可能是比较大的啊。是的,对,所以但具体的就是说你需要花多久?你需要花定量的或有个有个有没有一个算法复杂度?那么这部分呢,现在现在还没有啊,所以需要呃需要我们继续再做下去啊。所以这里面有没有一个比如说啊那个理论能够支持啊这个算法啊?这个是接下来想要做的一个一个方向啊。

好,下面一个问题是可以简单举例运用高斯过程吗?我不知道这个问题是什么意思。啊,我不知道那个。呃,如果如果哪位是把问这个问题的,可以你可以解释一下。呃,下问题是应用在神经网络中是替代了梯度下降算法吗?哦,答案不是的,因为呃,神经网络搜索呢是在梯度下降呃上面的啊一个啊一个更大的一个meta的一个算法。对,就是说我们希望不仅找到神经网络更优的参数,而且呢,我们希望找到神经网络的架构啊,其实是这样子,就是架构的搜索。

所以就是说,给定架构之后呢,你完全可以用梯度下降去跑它,啊,但是在梯度下降跑完之后,或者说在梯度下降跑之前,你是希望找到一个更优的啊神经网络的架构。那么这个架构呢,跟这个梯度下降呢是两回事儿情啊。是,主要是这样子,所以所谓的神经网络搜索呢,是怎么样去找更好的架构?那么这有了架构之后呢,你完全可以用现在的那个消消消算法去跑它啊。

好,下一个问题是在Go和Poker之类的game上有用吗?呃,因为这两个游戏呢,其实是已经是有了一个固定的行动空间的啊,所以在这上面,如果你要做啊。这样的一个方案呢,其实我觉得用处,啊,没有特别大啊,因为就是这这些 action space 这些动作空间呢,他们在这几张游戏上已经定义定义下定义好了,啊,当然了,就是我怀疑也许是有用的,就是因为人真正在下棋的时候,或者是在做战术决策的时候呢,其实还是会有个大致战术思路。然后再把这算法应用在具体的游戏的那个行动空间上啊,呃,但是这个问题可能,呃,可能是本身是个研究的问题啊,所以没有特别的清楚答案,可能需要慢慢的去去去去想啊,啊,这是一个很大的问题。

呃,目前看起来,我觉得还是用线额方法去跑 go 和 poker,那么效果会更好一点啊。后面是相比梯度方法,用梯度的优势是什么?啊,那么一般来说呢,有梯度总是更好的啊。一般来说,有了梯度之后呢,你总是可以跑啊更好、更有效率的结果。但是不用梯度的好处呢,一个是也许它能够比有梯度的方法呢,能够跳出啊 local minimum。有梯度的问题是它局部很准,对吧?它可以很让很快让你到一个比较好的解,但你并不知道这个解到底有没有效果啊。也许这个解是个 local minimum,然后你又跳不出去。

所以这种情况下呢,你不用梯度呢,也许你能够跳出 local minimum 啊,这是第一个问题。像我们最后那个母锥库的 task,那个 task 呢,相对来说还是,啊,还是梯度的那个优势还是比较大的,因为最后的那个解,啊,还是能够通过梯度找到的。但是对于其他一些task呢,你你所以这个梯度本身呢,就是可能是比较误导的啊,这是其中一个。然后第二个呢,就是说是有些呃目标函数是根本没有梯度的啊,比如说目有些目标函数是啊,你这个你这个呃调度函数跑调度程序跑一天。啊,得到一个啊比较好的那个值,比如说你今天赚了多少钱啊,有一个很大的系统,这里系统里面你有很多参数要调,啊,这些参数你随便调一下,啊,得到个值,今天赚了多少钱,那明天又赚了多少钱,但是你并不知道就是你赚钱跟嗯你里面每一个参数之间的梯度。

啊,这个是很难算出来,因为它这是个大R系统,所以它不是一个数学上可以算的函数。那么在这种情况下呢,你只能用 gradient free 的 approach,就是无梯度的方法来做。那么而且这种情况其实在很多的应用场景中出现的次数还是很多,非常常见啊。所以这个是一个不用梯度方法的一个优势啊。

请问这个黑盒求解的源码直接调用吗?呃,这个你可以看一下它的 README,然后你可以啊用这个方法去啊,你可以看一下它怎么做的。其实这个思路很简单,就是说你可以自己写一个简单的类,这个类就包括了就是一个简单的。呃,调用的那个接口,啊,就这个类可能就是说我有个函数,这函数怎么定义的?给定这个函数的输入,输出是什么?只要有这个之后呢,就可以调用这个那个这个求解器,啊,是这样子。

呃,如何平衡求解精度和求解速度?啊,这个。就是这个,就是说是,如果你有很多的啊,CPU啊,有很多计算资源,那比较好的地方是你这个算,因为我们这个呃,我们这个算法呢,其实是叫 anytime algorithm,就是说你可以一直跑下去。你可以跑到就是天荒地老,如果你你想跑多久跑多久,那么跑的越久它效果会越好,啊,其实是这样的一个算法,因为整个蒙特卡洛树搜索都是这样的一个算法,所以这就是你可以啊通过速度和呃和那个和你的那个计算资源去呃去给你的精度交换。

啊,好像这个算法有什么样的应用场景?因为它是一个黑盒优化算法,所以它应用场景还是比较多的。只要是有黑盒优化的那个背景的问题,就是有一个黑盒的函数,这个函数调这函数花很多时间,然后你要求这函数最优解,那只要是有这样的应用场景呢,应该就可以使用啊。

SVM的kernel如何定义,是不是通用的?啊?对这边我们用的还是比较简单的坑洞,应该是高线坑洞吧。嗯,你可以用别的坑洞来做这个,这个是个一个参数可以调的啊。这个应该是只要不要找一些非常奇葩的坑洞,应该是可以work。嗯,BO不支持高维是因为里面选择GPR嘛?对啊。对,就只要是不,它不是高维的原因呢,是因为它的它必须它作为高它它是高斯ian process,所以高斯ian process呢,就是说它把所有点放在一起,认为它们满足一个联合高斯分布。

啊,然后用这个呢去算出来每一个点的后验,这后验的那个均值呢,就是你预测出来的那个啊y,预测出来你你的那个函数的值啊。所以,但是你这个高多维高分布,它的协方差矩阵呢是啊。跟你的那个数那个跟你的那个点的数目的乘平方关系的啊,所以呃,如果高维维数越大的话呢,那你的那计算代价就越大,这是一个问题啊。然后第二个问题就是维数灾难的问题,就是如果你需要那个拟合一个高维函数,那这高维函数需要啊,其实原则上你需要指数个点才能把它拟合的很准啊,所以这是一个很大的问题。啊,这个问题更肯定更加更加 fundamental 啊。

架构是表示神经元数量、层数吗?或者说是全连接层啊?对对,架构其实是啊表,它其实是一个非常广义的概念,它可以表示任何东西,就是神经网的神经元的任何架构,任何的那个那个 hyperparameter,任何超超参数都可以啊,对。如x高维是怎么办?呃,就是这跟输入这是呃,这个这个怎么回答?呃,就说是你其实是这样,就是如果你的神经元呃x高维的话,那就意味着呃你的呃你的那个神经网络的第一层的。呃,第一层的那个输入层的那个大小也是很大的,对吗?啊,或者说是你用卷积的话,那第一层的输入大小跟你的神经元的那个数目是是不一,是是是是是是是脱钩的,那就没有关系。呃,这个是另外一个问题。

请问每一次训练都是需要很多 trial 吗?呃,我不知道你在说,不知道你想问什么,我们跳过这个问题。Tubal为什么可以支持高维数据优化啊?这个问题很好。Tubal呢,它是这样子,它是,呃,它是可以,它是相当于,呃,在BO的外面呢加了一层,这层是说我同时优化很多的小的区域。然后每每次优化只优每每次在优化小区的时候,把这小区变小一倍,然后再在一个更小区里面再去优化。那么这样的话呢,其实它没有啊,它在那个细化优化的时候呢。啊,它其实是把这个整个区域的大小变小了,啊,那这样的话呢,其实它其实是就是它做了一项 trade off,它选择了这个区域,然后在这区里面做继续的优化,而不是把很大的一个区域一起做优化,那么这样的话它的效率会变高。

啊,它是这样,但这样它有个牺牲点,这牺牲点就是说,有些区域它一开始放弃了,它以后再也不会回来了。可以再解释一下怎么和 Tube 结合使用吗?这个你可以看代码,代码里面有写。啊,对,就是 Tube 其实是就是放在那个 LMCTS 里面的,啊,是相当于 Tube 用来做局部的一个求解器。然后我们的那个整个算法呢是个大的框架,然后这个框架里面调用它局部求解器,可以得到一个啊更好的呃结果啊这样子。

呃,这个框架下与梯度方向怎么结合啊?先探索空间,然后再使用梯度吗?这可以啊,你可以先探索空间得到一个大致的解,然后从这解出发,你可以跑梯度,这这个没问题,可以做。另外,它是白 noise 情况下表现如何啊?这个我没有试过,哦,你可以试一下。嗯,对,不是特别清楚会怎么样,这可能跟你的核函数的选择有关系。啊,行,那基本上是这些,还有什么问题吗?好,如果没有的话,那就结束吧。嗯,会非常欢迎,非常感谢大家的参与。