大家好,今天很荣幸被邀请到运筹帷幄的直播间,讲述我们最近做的一些工作。我叫田渊栋,是Facebook的研究科学家兼研究经理。今天我将分享如何将神经网络和机器学习应用于组合优化问题,以寻找更好的启发式搜索方法。
我目前在Facebook AI Research(FAIR)工作,这是一个偏纯研究的团队,致力于推动领域发展。我于2008年在卡内基梅隆大学攻读博士,2013年毕业。博士期间主要研究非凸优化及其在计算机视觉中的应用。
毕业后,我先加入Google的无人车组(现Waymo),2015年跳槽至FAIR。此后,我的研究方向从计算机视觉转向强化学习,特别是在游戏中训练更强大的AI,并继续研究非凸优化在神经网络理论机理方面的解释。
在博士期间,我主要研究如何在非凸问题上估计参数并寻找全局最优解。具体问题是:给定一个模板和经过非线性扭曲的图片,寻找它们之间的扭曲参数。若建模为一般非线性优化问题,它是非凸的,梯度下降只能得到局部最优解。
若使用最近邻方法,通过生成大量扭曲图片样本,可以找到较好的解,但这需要大量样本。因此,我的博士工作主要研究如何分布样本,在保持样本数量较少的同时,从理论上保证输出参数与最优参数之间的距离较小。
这项工作发表在《博弈论》期刊的两篇文章中,其中一篇获得了2013年ICCV的马普奖荣誉提名。这些方案降低了样本复杂度,同时保持了优化质量。2013年的文章还提出通过特征化方式进一步降低复杂度,利用图片扭曲的群结构复用样本。
从Google加入Facebook后,我的方向转向强化学习。早期项目Dark Forest(黑暗森林围棋)比Google的AlphaGo/AlphaZero早几个月,MIT Technology Review曾报道。后来OpenAI的AlphaGo加入了价值网络,效果优于仅使用策略搜索的方法。
2018-2019年,我们复现了Google AlphaZero的方法,即无需人类样本即可学习强AI。我们组建团队实现并测试,结果我们的Bot战胜了四位韩国棋手,获得二十连胜。我们仅用一块GPU,每步思考50秒,而棋手拥有无限思考时间。
该文章和代码已公开,许多人使用我们的预训练模型提高棋力。在强化学习框架方面,我致力于开发更高效、节省CPU资源的平台。2017年的ALF工作通过多线程提高效率,近期推出的ReLa版本利用PyTorch C++特性整合环境模拟,提升了速度和代码简洁性。
目前我们使用该框架进行桥牌AI研究。桥牌是四人非完全信息对弈游戏,叫牌时不知对方及队友手牌。目标是通过自学习,不依赖人类数据,自动学习更好的约定或规则,这是一个有趣的研究方向。
言归正传,今天主要讲组合优化。此前文章多为我的主线工作,组合优化方面我作为资深研究员指导他人突破。组合优化是机器学习和优化领域的难题,包含众多子问题,如GPU调度等,旨在高效解决资源分配问题。
过去几十年已有许多方案,现在的新思路是利用深度学习和数据提高组合优化的效率和解的质量。大家可能会问,既然这些问题是NP-hard,为何能用深度学习解决?NP-hard意味着在最坏情况下需要指数级时间,除非P=NP,否则没有通用的高效解法。
但证明中的保证通常是“最坏情况”保证。现实中,虽然问题名义上是NP-hard,但对于特定分布,可能存在更好的启发式搜索方法。通用算法的改进器可能对特定分布无效,因此可以通过机器学习找到针对特定分布的启发式方法,从而更好地解决问题。
这一思路并非首创,已有许多文章着手研究。例如2015年Erasmus等人的Pointer Network,将组合优化视为序列问题,输入问题描述直接输出答案。这在求解点集凸包等简单问题上有效,无需传统搜索。
另一篇有趣的工作由毛宏志等人提出,将作业的CPU和内存使用率铺在二维矩阵中,直接用神经网络预测下一步操作。这听起来像神经网络无需思考就能直觉给出答案。我们想在此基础上再推进一步。
直接端到端输出复杂组合优化的答案较难,训练成本高。更简单的方法是:不要求每步直接得到最终答案,而是从当前解出发,每步通过某种方式改进它,通过迭代获得较好结果。这在组合优化中称为局部搜索方法,从初始简单解开始逐步改进。
我们将局部改进思路转化为神经网络的优化问题,让神经网络代替人工寻找启发式方案。我们提出了Local Rewriting框架:从解S出发,选取子集Omega,用规则U修改子集并放回,重复直到解无法改进。
具体而言,我们需要学习两个策略:一是Region Picker,根据当前状态选择可能产生较好解的区域;二是根据当前区域子解,找到更好的规则进行修改,使解变好。规则U是人工给定的,但何时使用、使用频率由神经网络学习。后续文章还将尝试让神经网络自动学习规则。
这个训练方法的核心思路涉及两个策略的学习。首先使用 Actor-Critic 架构,但为了提高训练速度,需要更准确地学习 Critic 部分。因此,先利用 Q 函数,通过 Tree Search 学习出基础模型,再将其作为 Actor-Critic 中的基线(Baseline),进而学习策略。该方法后来应用于三个不同的领域:作业调度(Job Scheduling)、表达式简化(Expression Simplification)以及车辆路径规划(Vehicle Routing)。
首先介绍在线作业调度。作业调度旨在处理一组需要占据不同资源的事务。例如,作业可能占用红色或蓝色资源,不同作业对资源的偏好不同,且到达时间和持续时间各异。若采用简单的顺序执行策略(如先到先服务),会导致资源冲突,使后续作业等待,产生“减速”时间。这种等待是因为前一个作业占用了所需资源,直到其执行完毕,后续作业才能开始。
通过优化调度顺序,可以显著减少减速时间。例如,若两个作业的资源需求互补(一个多用红色,一个多用蓝色),它们可以在同一时间并行执行,无需等待前一个作业完全结束。这种优化可以通过修改图表示中的箭头指向来改变作业执行顺序,从而找到更高效、更快的调度方案。
为了在神经网络中处理这种图结构,需要将图转换为网络可接受的表示形式,即图的嵌入(Embedding)。早期方法如 Child-Sum LSTM,通过从叶子节点向上遍历树,在父节点处汇聚向量,最终在根节点获得良好的表示。近期则更多使用图卷积网络(GCN),将图视为无向图,通过扩散操作将节点信息传播至全图,以获取更丰富的特征。
给定内容表示后,模型可以预测需要优化的区域及优化方式,例如判断是否交换两个节点或调整作业顺序。经过反复交换优化,可获得较好结果。实验显示,我们的方法(Neural Writer)在不同场景下均表现良好,减速时间极小。与早期作业优先、最短作业优先等启发式方法,以及直接预测调度结果的深度学习方法相比,我们的方法在多数情况下得分更低(表现更好)。
此外,我们还与离线维特比算法进行了比较。离线方法假设已知所有作业的到达时间,相当于“作弊”,但我们的在线方法仍表现更佳。在速度上,我们的方法仅需一步前向传播即可改进解,比传统优化工具更快。当资源种类增多(如二十种资源)时,我们的优势更加明显;而在资源较少时,效果与对比方法相当。
我们还进行了泛化性实验,验证了策略在不同数据分布下的有效性。即使数据分布从均匀变为非均匀,或作业分布变得复杂,该方法仍能找到更优启发式策略,保持良好效果。这表明该启发式方法具有一定的泛化能力,能够适应不同的数据分布情况。
接下来介绍表达式简化(Expression Simplification)。对于复杂的表达式,通过逐步化简可将其转化为永真式。在此过程中,每个子树对应一个区域选择器,我们选择子树并应用各种重写规则进行优化,使其变小或变大。我们利用开源框架 Hellaide 的现有规则,但由计算机自动学习如何应用这些规则,而非人工指定。
实验结果显示,我们的方法效果优于 Z3 定理证明器的简化步骤以及 Hellaide 的启发式搜索。尽管搜索方法耗时较长,但我们的方法通过直接预测修改位置并迭代,速度更快。目前,我们正致力于去除人工指定的规则,让模型自动学习规则种类。该工作已投稿至 ACL 并被接收,代码已公开。
在泛化性测试中,若模型在长度小于 100 的表达式上训练,仍能在长度大于 100 的表达式上取得不错效果,进一步证明了方法的泛化能力。最后,我们将相同方法应用于车辆路径规划(Vehicle Routing),在不同参数设定下均取得了良好效果。这是第一部分的内容。
第二部分介绍与 UCSD 合作的近期工作,即利用相似思路进行反编译(Decompiler)研究。反编译旨在从二进制代码还原为高级语言(如 C 代码)。由于二进制代码丢失了高级结构,恢复过程极具挑战性。传统方法需耗费大量人力编写特定语言的转换规则,成本高昂且难以扩展。
我们的目标是自动生成反编译软件,以加速系统开发。具体思路借鉴了之前的重写方法:首先从汇编代码生成 C 代码的草图(Code Sketch Generation)。这一步由序列模型直接输出目标序列,但生成的代码通常存在错误,无法直接运行。
接下来进行错误修正(Error Correction)。将草图视为初始解,通过局部搜索和局部预测逐一修复其中的问题。经过多次迭代修正,最终得到正确的代码。这一过程与之前的重写方法类似,即从初始状态出发,通过修正逐步优化,直至获得满意结果。我们将此问题分为两个阶段:草图生成和错误修正。
solution最后接近啊。但其实,呃啊,对于code的decompiler这个问题来说呢,啊,这么做呢,其实是并不是特别好,因为首先你生成出来的那个目标的code呢,可能完全没法编译,甚至是错的,啊,这个是一个很大的问题。如果这肯定也也不对。啊,所以呢,其实啊,我们当时是想了一些办法去解决,也许series sequence model不好,那么怎么做呢?其实我们应该用的tree encoder啊,去encode tree,然后去那个用去encode这个啊synthetic tree,然后同时用tree decoder去decode同样的那个高级代码的那个tree,这样的话你能保证这个高级代码那个tree永远是啊consistent,那么这个其实是一个一个思路。所以呢,我们的 encoder 呢是一个 tree encoder 啊,把这些啊 interaction 的那dependency呢全部都 capture 住,然后呢,我们的 decoder 呢其实也是一个能够直接生成出一个 abstract syntax。就是说我不是生成一个sequence,我们能够生成整棵树,然后把整棵树拿出来,它就直接就编译,直接就变成变成一个C加加的code。那么C加加的code里面就是包括比如说括号肯定是对齐的,然后呃就是for loop和while loop这都是完整的啊,这个其实是很重要的一个一个一个点啊。如果你只生成一个token的list的话呢,也许很多的基本的语法都不能保证。啊,所以我们这边呢是用的是AST这个树,然后在这里面呢,我们还加了一个attention mechanism。所以attention mechanism就是说,在一定程度上,我们就我们在翻译的过程中,我们希望就是就是根据呃输入的那个树的一个具体的位置,具体的那个啊某个node可能就是这个node可能就对应到啊输出的那个结果。好,所以呃,这是第一个 step。
那第二个 step 非常简单,就是说我如果有一个 solution,那么这个 solution 也许是不一定是对的啊。我们怎么样去把它 correct 成一个正确的一个 solution?啊,比如说以下是一个例子啊,比如说我输出出来的,因为它输出出来是一个数,所以它的那个 if 啊 else 这些括号肯定是配对的,但里边的那个逻辑的或者变量的名字可能是不对的啊。所以这些怎么样把它 correct 回正常的、正确的那个 program 上去?所以这样的话呢,我们就有用用法叫 iterative error prediction 这样的一个呃算法。那么这个算法其实就跟 Ruby 很像了啊。如果我们啊发现了有一个问题啊,如果我把这个问题拿出来啊,我通过 newtalk predict,然后把 error fix 掉啊,然后再 compile 得到一个新的,如果然后这 compiler 会会会抱怨说有新的问题。啊,有这个新的问题之后啊,或者说你那个 output 是不对的,那么怎么样通过这个 output 和 compiler error message 把这个啊原来的那个那个 C code 改改改成正确的,然后可以 repeat ten times。啊,那么就是这样的一个非常简单的思路。
那么接下来就是怎么样去做实验去验证这个事情是对的。那么对,在篇这篇文章上呢,其实我们是先是做了一些 synthetic experiments,啊,就是做 synthetic program,就通常都比较短啊,然后看就是我们编译完之后,给你编译完之后的代码,我能不能不能把它翻译回编译前的高级代码。啊,那么这里面有两个 metric 啊,一个叫 token accuracy,意思就是说,啊,我看一下就是翻译出来的 C 代码里面跟原来 C 代码相比,啊,有没有相同的啊,是不是有多少 token 是啊是是完全一样的啊?那 program accuracy 就是说啊,就是一个 program 如果 program accuracy 等于一,如果它里面所有 token 都是一样的。啊,这讲这是 program 才是一,所以 program accuracy 它这个要求比 talk accuracy 要求高很多很多啊啊,然后呢,就是我们这边用的是已知的 compiler,就是 C 量,然后用的是那个那个 minus of zero,就是没有 code optimization,不然的话这个 code 会变得非常复杂啊。就目前为止,就是一个比较简单的初步的思路。
啊,那么实验结果呢?其实就是啊,你会首先这个会发现,在第一步的情况下,那个我们用的是那 AST 树,然后再加 attention 的效果呢,要比 sequence sequence 效果要好啊啊,这个是之前我们说的逻辑,就是如果这个 sequence sequence 效果啊 sequence sequence 本身输出的东西并不能有结构啊,但是我们这个输出 AST 树这样的一个想法就是有结构的,那么加了 attention 之后效果会更好一点。然后第二部分呢,就是说你会发现,就是 error correction 是很重要的啊。加了 error correction 之后,啊,就是配以 sequence sequence,呃,配以那个 instance to 啊 act 啊,就是输出那个数。那么这个其实那个它最后的 program accuracy 还是很高的啊。注意这个 program accuracy 其实是包括了啊,就是每个对每个 program 来说,啊,它的值啊,它的它必须每一个通都是对的才是对的。啊,所以这个是一个很大的要求,而且但是这边就是就是有一个比较好的那个思路是,啊。所以最后就是就这样的话,你就可以得到一个呃,compiled compiled完全是neural network based啊,所以叫那个那个,我们就把它名字叫做Coda,就是那个叫Coda Tech。啊,就是行数代码行数就明显变少了,因为我不需要加很多那个自己自己的 specific rule,啊,然后那个 neural network 本身的大小也不是很大,其实一个纯比较小 neural network 就可以了。
啊,所以,那么当然这个是我们认为我们目前能知道的是一个比较呃比较基比较早的,比如 first time 的一个 neural based decompiler 啊啊,但是啊,当然之后我们希望能够再往上改进,能够把它做得啊更好一点啊,甚至 handle 更更复杂的一个 program。那现在这个啊 compiler decompiler 呢还不能 handle 比如说 for loop 或者说更复杂的那个 case 啊,但是嗯,我希望就是之后我们能够做得更好。OK,最后呢,我们还有呃十分钟,我们可以介绍一下下一篇文章。那么这篇文章呢,是另外一篇啊,也是呃。呃,也是相当于在组合优化问题上,怎么找,怎么用 neural network 找到更好的 solution,这样的一个一个一个问题。那么现在的这里 domain 呢,变成了 architecture search,啊,就是怎么样去找到一个更好的 architecture 的,使得它它的那个 performance 在 data 上做的效果会更更好,啊,主要是这样的一个。
那么这个是啊,我的实习生那个林楠啊在做的,啊。那么同时,也是和赛宁合作的这样一个项目。啊,首先就是先讲一下 motivation 啊啊,就是说啊,我们如果我们要做 architecture search,什么叫 architecture search 呢?就是说我们从一个我们怎么样去找到一个 network architecture 的那个结构?啊,使得这个结构最后我在创业的效果上能够做得更好。那么一般来说,我们可能他拍脑袋想出来的思路是这样子,比如说你开始从一个完全空的那个图开始,一点点的往里面加那个 convolution layer 的层数,对吧?你可能加一层,加到比如说不想加了,然后这个图拿出来,然后 evaluate 一下,看看是不是好的,然后再把这个 evolution。啊,用这个 version,然后来去选择啊,我是不是要往这个方向走啊,或者说,我往另外一个方向走,啊。
但是呢,就是这边这个问题是,就是这个 action 呢是固定的,就是我们每一步我要做什么样的 action,比如我要加什么样的 network,我们要加什么样的 layer,那么这个 action 本身呢是一个呃 fixed,是 human labeled 的啊 action,对吧?那么这个 action 呢未必是最优的。啊,那么对于我们来说呢,我们这边想做的一个想法呢,是我们希望这个 action 是能学出来的啊,就是说我们一开始是啊,我们并不是说从一个 empty network 出发,一开始呢,我们就从一个 entire 的 design space 出发,假设你存在一个空间,这个空间里面有所有的可能的 network。啊,这蓝图我拿出来之后啊,我们的 action 就是说啊,我希望呃这个 action 啊,每次把这个 design space 切成两半。切两半之后呢,然后左边呢这个 region 呢是一个好的 region,右边的 region 是坏的 region。然后你把好的 region 一点点切,切到最后呢,呃,我希望最后那个这个 region 是一个非常好的呃 region。然后在里面随便采样一个样本都是很不错 network。啊,希望通过这个方式呢,啊,我们能够得到一个更好的 action space。我们这 action space 天生啊,能够把最好的和最差的那 two 取出来啊。你这样的话呢,我就可以自动学那 two action action,啊,都不需要通过人去嗯 estimate 什么什么样的,或者人去 design 什么样的 action 是对的啊。
那么这样说可能有点抽象啊,接下来我给一个非常具体的例子。来说明这个 idea 呢是有道理的啊!这里有个非常简单的例子,假设呢你有一个非常小的 design space 啊,就是假设你只呃你只考虑就是深度为一二三四五的 network,然后你每个 network 呢啊 channel size 是三十二或六十四啊,这里所有的都是可复用的 network,然后 kernel size 呢三十三或者五乘五,那么这样的话你一定一共会有一千三百六十四个 network,那么这 network 拿出来然后 train 啊,比如 cifar ten。对吧?然后你肯定会发现有一些呢会好,一些呢不好。那不好,那最后呢?那么我们想找到一个更好的,就是希望以最小的代价啊,训练出得到一个更好的architecture出来啊。那么在这个简单 example 下,我们可以考虑两个不同的 action space,对吧?一个是叫 sequential,什么叫 sequential 呢?就是我每次加一层啊,加完这一层之后呢,我把这个 kernel size 和 channel set 完了,然后再加下一层啊,一直加到就是 network 啊完整为止啊。
但是还有一种方法呢,就是说对于人来说,也许我们并不 care 具体 channel 是多少,我们 care 的最重要是这东西有多深啊。因为 network 很深的话呢,我们可以预计这个 performance 一定是好的。啊,那么也许我们第一步呢就应该是做 set depths,啊,把那个深度 set 出来,然后呢我再去 set 所有的那个 kernel,再 set 所有的 channel,啊,这样这样这样一个一个一个一个过程,然后你会发现呢,就是说同样的 search space,但是 action space 不一样呢,它的 search 它的 efficiency 是完全不一样的啊。你看那右边那个图,右边的图呢,啊,那横轴呢是说有多少样本被三步过了,然后啊,纵轴呢是说accuracy有多高,就是说。你给定了,比如说五百个样本,这五百样本里面最高的样本的accuracy是多少?啊,你会发现就是说sequential的这根线呢,长得就比Google这些面要慢。为什么 global 深度偏向会快呢?啊,是因为就是它的 space 比较好,所以它很快能够发现,就是 depths 如果是一或者二的话, performance 非常差,所以它就不会去找这个这个 depths 等一或者二的 network,它会因为花时间去找那个 depths 比如说更深的 network。那么这样的话,你其实把整个 network 的这个 space 呢切了很切切一下子切到很大一块,那么这样的话就更大的概率去找到更更好的那个 solution。啊,其实是这样的一个一个思路。
那么,那么你会发现,就是说,不同的那个 action space,它其实对于那个最后那个 network 最后这个 search efficiency 是会啊有很大的差,有很大的那个差差别的。那么这边我们就会想到,OK,既然这个是对的,那么为什么不能让计算机自动去学啊这个 action space?也许它能学到一个非常复杂的 action space 的一个一个和复杂的那个 network,呃, state space 的一个切法。利用这个切法呢,这个 performance 会越来越好啊。就这就是我们这个 approach,就我们的 approach 是这样,就是我们假设我们有 node,我们有个那个那个 action branches,这个东西 fixed,有一棵完全二叉树,比如深度为六或者深度为七的二叉树就在那儿。那么二叉树里面就是顾名思义,就是你每一层你会分成两部分,对吧?那么这个这个怎么分法呢?啊,是需要学出来的,啊。所以怎么学呢?我们通过一个迭代方法来学啊。
首先就是说,第一个假设你已经分了,你有一个啊比较啊,你有一个比较existing的,就是action space的一个一个一个切分的方案。有了切分方案之后呢,固定切分方案,然后用这个 network,用这个 tree,然后作为啊一个 search 的那个空间的定义,然后用它去搜索啊有什么样的什么样的那个 network 呢?可能是比较好的啊,这个我们用蒙蒙特卡洛树搜索。搜完之后呢,啊,然后这样的话我们就有更多的样本,肯定更多的样本之后呢,我们可以重新去啊划分啊这个action的那个势力范围啊,我们可以重新去啊学习每个action应该怎么分,让啊左边的node啊对应的那个呃network越好,右边的node越越差。啊,通过这个方式来解决这个问题,然后通过不停的迭代呢,你就会发现啊,这 action space 变得越来越好,因为数据变得越来越多了。然后同时呢,Monte Carlo Tree Search 这个搜索的啊,这个偏向度是越来越偏向啊比较好的那个区域,所以得到会会得到一些更好的那个啊,会得到一些更好的那个 node,更好的那个 network structure。
啊,那么为什么用我们叫 tree search 呢?就主要问题是它其实可以 balance 那个啊 exploration and exploitation,就是说一个是利用你现在的搜出来的结果去呃去找那些更好的那个 branch,啊,另外一方面呢就是说我希望能更有更有一些探索啊,也许某个 branch 一开始并不是那么好,但是通过一些那个探索,也许会发现这个 branch 其实还是不错啊,通过这个方式呢可以有效的避开那个 local minimum 的 solution。啊,就主要是这个方式啊。那么,呃,这个是Monticarlo是一个简单的介绍啊。这个我现在就跳过了,我现在大家可以回去看一下啊。那么,怎么样去学这个Action Space呢?啊,这个思路非常非常简单,简单到大家都觉得这个基本上就是呃trivial的,但是其实效果却非常好啊。那么这里呢,其实给一个挺简单的例子啊。假设呢,你我到这个 node,这个 node 我会有很多很多的那个 node,很多很多的那个样本啊。每个样本其实是啊,从一些啊
network的实际属性,比如说深有多深呢,宽有多宽呢?啊,有没有那个非线性啊,什么样的非线性?这些参数,还有连接性怎么样?那么根据这些参数呢,可以去预测啊,我到底要让这个具体样本往左边走还是往右边走啊?那么我们怎么样去学习这个左这个动作右这个动作呢?啊,非常简单,你把这些样本呢放在那个空间里面,然后你去找一个方向,啊,使得这个方向啊,就是这个方向呢跟你这个accuracy或者说performance metric的那个方向增长方向是最大一致化的。
啊,像比如说左边这个图啊,左边这个图你现在有两个,一个是depth,还有一个是feature,你只有两个参数network。然后另外两个参数,对吧?那么对于每个样本点呢,每个参数两个参数combination里面会有一个百分之几,就是accuracy,啊,你会发现就是也许深度越深啊,feature越多,accuracy越好啊,你会发现就是说这些high accuracy的点呢,都集中在这里,low accuracy点呢,集中在这里。
那么那么这样的话,你会发现,你说你可以学出一个很好的方向,沿着这方向走,那么你的performance会越来越好啊。所以呢,就是说我沿这个方向,我可以做投影啊,我可以用一个weights乘上啊,它这些所有的attributes,然后根据这个最后的点击的大小呢,你可以切一刀啊。如果这个点击的大小比某个衰超大,那么我就把它放左边;如果比衰超的小,就把它放右边啊。
然后通过这个方式,你可以学会啊,非常简单啊。你发现这个非常简单的想法呢,其实是得到一个很好的效果啊。这个我们在Neural Net这样的一个search base上是做了这样的一个search,嗯。那么,Neural Space Neural Nets这个测取还是它空间还是比较复杂的啊。你有就是你假设这个network是有很多很多层啊,然后这里每一层里面有个normal cell,然后有reduction reduction cell,再normal cell,这样子通过这个方式把这个东西连起来。
然后每个normal cell或reduction cell呢是由这个七个不同的node组成的。然后这些node呢,其实计算单元啊,所以你在搜索的时候呢,你可以搜索,就是说从零到二啊,这个operation是什么operation?你可以换成不同的operation,你可以either是average或者是max,啊,或者是convolution啊,或者说是separable convolution,那么这些都是通组合优化的一个选择。
然后什么样的选择能够让最后的solution变得更好,啊,就是这样的一个search space。那么我们发现呢,就是说我们用那个我们的方法,我们的方法叫Latent Action,就是粗写叫Line X。那么有用这个Line X方法呢,你会发现就是用很少的样本,我们可以得到非常好的performance。啊,所以这根线呢是我们的。
然后我们比较了很多很多不同的方法,发现我们的方法呢,在呃在用很少样本情况下,就能得到一个比较好的那个一个一个accuracy。啊,那么这里是用那个叫Nice Bench幺零幺来测,那么这个dataset是Google提供的啊,他们就是呃在四百二十四十二万四十二万个model上,就是用他们的计算资源做了训练啊,在在他们上做了训练,训练出来得到一个模型的那个accuracy。
啊,把这accuracy存下来啊,就是就成了一个巨大的表格啊。这表格的左边呢,啊,就是啊这些model的specification,然后右边呢就是model and accuracy。然后就说这个表格拿到手之后呢,我们可以用这个表格,然后去做呃搜索啊,看哪样什么样的搜索算法是最有效率的,然后发现我们这边蓝蓝色搜索效率是比较高的。
啊,同样的同样的样本数呢,我们可以得到很高的accuracy,说明它非常有效的就发现了就是哪些region是有用的,并且在接下来搜索过程中可以发现就是在在深挖这个region,然后得到更好的结果。啊,然后这个是另外一个dataset啊,这个是我们自己做的一个connet六十k,然后发现效果也很不错。
好,然后那个另外一个实验就是说,那个迭代策略也许并不是很重要,也许重要的是我们怎么样能够啊在open domain上得到更好的结果。所谓open domain就是说我们并不限定啊这个network architecture的啊复杂程度啊,或者说我们并不限定network architecture里面有多少network。啊,我们希望这个啊这个search呢在这个在这个无近乎无限大小的空间里面,就能找到更好的solution。
啊,然后我也会发现,就是我们的那个Linus的效果还是不错的啊。然后我们用样本很少啊,这边是我们用了八百多样本呢,就能够得到一个比较好的architecture啊。这个architecture performance的数那个数字呢,就是跟现在的那些new architecture的方法呢,相对来说是比较comparable的。OK,然后这是另外一组实验,就是如果我们限定啊performance,啊限定我们的那个计算的那个flops小于六百m,就flops就是说计算的那个所需要的那个计算的加法和乘法的数目,就数目要小于六百m,这样的话能够在mobile上跑,然后发现就是我们的那个performance也是comparable,真的还不错,嗯。
好啊,那基本上现在就是啊,这次就讲这些工作。那么作为一个总结呢,就是说我们啊给大家总结了一下,就是说啊我们可以啊给大家看到,就是reinforcement或者说machine learning其实可以用来学习啊一个系统或者说一个optimization问题的一个heuristic。啊,那么我们给了很多例子啊,接下来就是这个这些例子就是在这些就是说规规模还不是很大的问题上呢,能看到一些比较好的gain。啊,这个是一个interesting的一个结果。
那么接下来呢,有很大的一空间可以走。比如说,一个很大的问题就是说,你这个方法对于,呃,非常复杂的工业化的问题是不是有效果啊?这application to large scale systems,因为现在有很多工业化的那个啊求解器,那么这求解器它们的效率基本上是百万级。比如说,你有一百万个parameter,或者说一百万个参数、一百万个变量,我还是能够很快的解出来。
那么在这种情况下呢,New AI Talk是不是有帮助啊?如果您有帮助的话呢,那当然是非常好的。那相当于就是整个东西都已经商业工业化了。啊,那么现在目前还是处于实验阶段啊。我们之前之前之前那些实验呢,相对来说都是一个比较脱位的样本谱啊,或者说是呃,大概是处在那一百和到一千的变量和约束的这样的一个一个范围内啊。再再往上走呢,就需要更好的、更efficient的那个啊infrastructure,然后同时需要更多的计算资源去啊去去看到底它能不能有效果啊。
啊,另外一个问题就是说,也许我们可以把啊比较简单的那个decision交给heuristic来做,因为这heuristic一旦执行起来速度非常快,啊,可能几个纳秒就可以执行出来一次,啊,但是把那些相对来说比较繁杂的啊,或者说比较大的那些决策,这个战略决策呢,可以交给交给马先生来做,那这样的话呢,可以兼顾两边的速度的问题。啊,这些都是一些可能的思路。
那么,另外一个可能的思路就是说,啊,这些方法看起来都是非常at hope的方法啊,就是说,啊,neural network穿了,穿完了之后,效果看起来还不错啊,但是它到底有没有一些spherical guarantee啊,这个是另外一个非常难的问题,因为neural network本身就没有太多spherical guarantee啊,你要combine with optimization,可能就是更难,更难。但是我相信以后是有机会能把它做出来的,但是这期待于大家的最后的努力啊。之后的有之后的努力,好,这这就是我的讲座啊。
如果大家有什么问题,可以直接通过啊弹幕啊啊,或者说发给主办方,然后我会在线啊回答这些问题,啊,非常感谢大家啊这次的参与,谢谢。好,呃,现在有一些问题啊,就第一个问题是带有复杂约束的优化问题,比如多阶段资源分配,呃,输出的action不满足约束,怎么进行处理?
啊,这个最简单的方式呢,就是说你在输出的policy上面加一个mask,呃,然后这个mask可能在动态的时候会发生变化,这是一般是可以work的。嗯,对啊,然后你加个must呢,这个结果呢就会呃就会比较好,就是你可以再加你也course可以加soft的那个版本。另外一个方法呢,就是说你可以给那些illegal action加一些。呃啊,呃加一些那个呃penalty,就比如说如果他采样了一个比较错的action的话,那么直接就游戏或者说整个环境终止,然后给他一个负的reward,啊这样会就是让他很快的学会就在什么情况下你认为他不能做这个事情,啊对。
啊,然后第二个问题是,就是对于多阶段优化问题,各阶段的决策会导致决策空间在每个阶段发生变化。啊,对这部分像强化学习那个怎么处理啊?这个其实是一个,就像我们之前说的那样,就是已经有两个。啊,一个是policy的那个,一个是region picker啊,一个是那个最后,比如说有一个rule的picker,对吧?所以这个其实就是跟一般强化学习有点不一样,因为呃呃,整个决策空间可能会发生一些一些变化。
那么这个一般来说就是最简单的方式还是加mask,看它能不能有有那个效果,对吧?有些时候呢,你可能要用那个树结构,然后用树结构,比如说根据你当过去的那个action,你可以知道你现在状态在哪里,你把这个状态呢加到那个state里面去,那那这样的话呢,你就可以啊做决策了。那么这个是一个个啊一个办法啊,当然就是具体问题你要具体分析,到时候肯定有不同的方法来做这个问题啊。
第三个问题是对于决策是连续变量的优化问题,有什么好的强化学习文献和方法可以推荐啊?一般决策连续变量呢。话呢,嗯,其实第一的反应肯定是把它把它变成梯度梯度下降,然后看梯度下降能不能做出来。啊,专家呢,其实有很多的呃,很多的技巧可以让它呃,比如说跳出那个局部极小值,啊,这个是第一个会想到的一个想法。对,那么强化学习现在它比较好的地方是,就是它有些就如果你的决策啊是不连续的,或者说你的那个最终目目标函数是不连续的话呢,那个强化学习呢是。
啊啊,就是比较好的,对啊,因为为什么呢?就是说强化学习就可以就可以把那个那个不不可导的点给跳过去,对吧?通过山坡来得到那个reward。对,但是如果整个决策整个过程都是连续的话呢,我可以先建议是用那个啊,用梯度下降来做。对,然后如果不行的话嘛,再把它那个就就就针对不同情况分析一下,就是因为这个跟背景是有很有关系的。不同问题的背景呢,其实方法是不一样的。
啊,就比如说我刚才举的那第三个例子,对吧?那个关于neural architecture search。那么NS的问题是,就是它的决策过程不重要,重要的是最终结果。所以你这个决策的那个行动空间是可以学出来的,是吧?如果对围棋来说,这就不好不好不好办了,因为学行动空间是固定的。对,所以这个其实是具体问题要具体分析的。
第四个问题是有没有可行域很稀疏的啊?AI做组合优化的呃工作,对,呃这个问题呢是我我倒不是特别清楚,可能需要去查一下。对,我第一反应是这样,就是。像我们之前那个rewriter,就是你需要一开始那个可行域是有比较大,对吧?至少有一个solution是对的,啊,那如果你可行很稀疏的话,你可能有一个呃feasible solution都没有的话,你可能就很难搞。但是你完全可以把它变成一个队友问题嘛,对吧?就是你从队友的,呃问题出发,然后去去把主问题给解了。
那么你队友里面找到的解,也许永远是不feasible的啊。但是你通过不停的优化,你可以接近一个可行那个可行的解。那么这也是一种办法,嗯,对,这也是一个啊,也是一种方案。对,但是我可能没有见过。呃,目前可能我们想不到有什么文章是做这个,嗯,但是就是这个方向是应该非常的呃非常大,就是有很多东西可以做一下,对,啊,W T可以理解为一个解决方案有几个维度吗?我不知道W T是哪一个,啊,对,这个要先跳过,
第六个是说说用了哪些备用的啊heuristic。啊,备用的heuristic就之前第一篇文章我讲的就是,其实那个图过的可能有点快啊。这个heuristic是就是,比如说对job scheduling来说,有很多的地方是用heuristic,就是我们比跟谁比,就是比如说跟那个。呃,最最最最早的那个earliest job first,对吧?就是最早的哪个job我先来,我先做这个,这是一个启发式heuristic。还有就是说shortest job first,比如说哪个job它最短,那我先来,对吧?那这个都是一些heuristic。对,所以这些其实啊都是比过的。
那么,然后我们也跟那个一些求解器其实比过了啊,就是比如说Google的OR Tools,那么这个这个Tools其实是Google内部用传统方法做的,那么也是一个比较强的啊。啊,一个一个一个一个一个一个baseline,然后我们的效果也是也是不错的,对,啊对,然后第七个是那个约束不满足的处理细节啊,我觉得这个那跟之前的问题也差不多,就是说不满足的话,你可以加拉格朗日那个乘子嘛,对吧?然后把它变成一个无约束的问题,但是你可以把那个那些乘子做一些呃。做一些约束,对吧?或者说你可以啊变成对偶的问题,或者把它搞成啊那个啊penalty,就是那种问题,就就比如说binary MSE的,这都可以做,对吧?就可以把它变成一个比较松的问题,就可以。
对,vi VIP制约束时间窗,这个呃,因为这个框架比较general,所以应该是可以的。但是我没有做过实验啊,我们并不清楚啊,呃,行不行?我目前这个做的是一个比较简单的实验,就是啊,带那个容量约束的呃这样的一个车辆的那个routing的问题。对,但是如果你养家是可以加进去的。呃,我再看一下啊,有很多问题我们可以跳着讲一下啊。请问在多智能体路径规划上啊,要跟优化如何结合?
呃,这个要看你怎么样做,就是多智能体的问题是,啊,你其实有很多的可能性,一种是说把它当当成一个大规模的优化问题啊,那当然是嗯,就是说刚才我们说这些方法,也许有有机会用上,对吧?还有一种呢,就是说每个多智能体,每个智能体它希望独立决策。对,所以独立决策呢,那就是说这个就是比较比较有有有有趣了,可能就没有那么容易了,就可能需要另一套框架来做,因为每个生成体需要根据自己手上的那些呃情报,然后获得,然后找到找到一个更好的那个解,那么这个解也许从全局来看不是最优的,但是就是在他的眼睛里面看是最优的。
那么这个其实可能需要更大的、更多的那个research去做这个这个问题,就是关键是还是要看就是具体问题怎么具体问题有什么样结构,对。然后深度学习、强化学习解决VIP优势体验在哪里?啊,这个优势就是一开始我有一个slide说过,就是。呃,因为我们花了很多年的时间去找,就是每个问题的一些呃一些启发式的搜索的方法,那么也许可以用深度学习啊,可以用那个自动发现模式的方案,去找到一些更好的解。啊,比如说是啊,刚才我们之前说的,那么我相信这个方向还只是刚开始啊,有很多的地方可以其实可以做的,对,嗯。
然后工业级的优化器怎么样应对维度灾难呢?这个问题好像非常的大,我不是特别的清楚,是因为这个,呃,有我一个短板,永远是有的。你因为这些问题都是NP hard的问题,所以其实非常的难。就是如果问就问题规模一大的话,一定是指数级的,所以不可能有更快的方法。对,所以一个工业级优化器做的比较好的话,就是啊,它代码的那个它的非常那非常的呃那个optimize,对。对,所以非常的
优化,所以就会有一个比较有趣的,就是说你有可能有一个代码,你写的好,写的不好啊,同样的算法可能就差个十倍的速度,这是非常正常的。所以这个在工程上优化其实还挺重要的。比如说像 SAT solver,SAT solver 其实有很多 trick 啊,像比如说什么 to watch literal 啊这种 trick,还有说 unit propagation。对,那 unit propagation 呢?这种东西做的很好的话,其实很多问题可以很快解决。所以这些其实都是一些 heuristic。你这些 heuristic 怎么样?用的更好,其实是工业级能够真正解决工业优化的很大的问题。
然后还有一个,比如说现在单智能体和多智能体的算法相比效果如何?呃,现在这个是个非常 active 的 research direction,就是说现在有很多单智能体的方法。那么比如说那 Q-learning 啊、Asynchronous 啊,对。那么这些方法放在多智能体上呢,其实啊有些时候还不错,有些时候呢其实是没有那么好。啊,其实是有像我们最近在做桥牌,桥牌其实是多智能体的问题。那么如果你用单智能体的方式来做呢,嗯,会有一个比较好的结果。但是如果再往上走呢,其实还是需要一些更更大的创新。
啊,所以有很多问题就是啊,单智能体没有出现,但多智能体会出现,而且是啊有 fundamental different 啊,对。呃,你们解决组合优化的问题的时候,求解器依赖多吗?啊,求解器,啊,像我们刚才这这个这些,其实因为是还比较小规模的,所以没有特别依赖求解器,那把求解器当成一个 baseline 来做。对,啊,但是呢,啊,呃,但是如果以后就是如果 scale things up,比如说你要解决这个几百万那个变量的问题,那我相信求解器的依赖是非常大的。
对,我相信就是说,比如说那个底层可能用求解器,然后上面那层可能用深度学习,这个是个比较好的方案,啊,对。嗯,目前组合优化问题能解决多大规模的问题?呃,这个问题很大,这个估计是回答不了了。呃,就是不同组合优化问题其实规模是不一样的,啊,因为啊,比如说吧,呃,如果有一个,比如像 SAT solver 这块我看的陪伴比较多啊,就是这一块呢是。呃,SAT solver 现在能解决的问题就是,比如说变量数目就几几百万啊,然后然后那个 constraint 的数目也是这个数,差不多这个数字你可以解决,对。
那么再往大就可能没有那么容易,那么那么容易做。但是这种就代码都是非常高度优化的啊,也可能一个呃一个操作只有几纳秒的时间,或者就几十纳秒时间,然后保证就是这个算法非常快,对,就是你去看他们这些求解器的代码,你发现你很难看懂,因为有很多的高度优化的 trick。啊,所以这个其实是一个啊,大概大概的那个一个一个大小,对,啊,如果你比如说要图片着色什么的,可能就是不一样的数字了,你们可能要去找,可能不同的组合和你是不一样的,啊,嗯。
请问如何处理随机参数下的啊组合优化问题?嗯。其实是这样子,就是说,呃呃,这个问题完全看,比如像 SAT 的话,你如果随机参数,其实有很多随机参数上的一些理论的,所以这些理论呢,其实是啊可以甚至可以预测说有多少大概率你这个随机参数下的问题是不是能够解掉,啊,所以这个可能没有那么,可能还有一些有理论可以放进去,会比较有趣。嗯嗯,但是,一般情况下,如果没有任何理论的话,你还是按照一般的方式来做的。对,有些时候随机参数反而不好做,因为他们没有什么结构。
啊,这个是一个,对,然后 DRL 在 Facebook 有落地产品吗?呃,我相信这个的问题大家很关心啊,其实是有的,只是我现在不能说,呃,但内部是有在用这一个,呃,用一些方方案,就是做一些优化什么的,所以我相信以后会越来越多的,因为不可能什么东西都手调的,啊,什么东西都手调,大家会累啊累死,然后新的东西是那个出来之后。啊,出来之后他的那个你要你要是再让工程师,其实工程师是最贵的嘛,对吗?所以机器相对来说很便宜,所以如果能让机器调,而且让机器调的很好的话,为什么要让工程师去调?所以这个是个大趋势嘛?我想以后肯定就是机器越来越便宜,人工保持原样,然后算法越来越成熟。我想有更多的呃东西可以呃用机器来调。
那么强化强化学习其实是一个很好的方案啊,因为现在为什么不用强化学习?很多时候是因为算法并不成熟。啊,算法如果成熟的,然后啊,我们对算法的理解很深入的话呢,其实什么地方是可以用上的,啊,这也是我们一做研究的一个初衷啊。啊,我看一下啊,还有什么强化学习怎么用在设计 search 的算法中啊?这个就是一个很简单的例子,就是 AlphaGo 对吧?就是说我在 search 的时候,我的 search 的 heuristic。或者 search 的那个 priority 就是用呃那个用 neural network 来来来来来来给你算出来的,对吧?比如说所谓的 policy neural network 就是说我哪一步的呃哪一步的 action,啊可能比较好,那可能先试试看,另外一步 action 不是很好就不用试了。
那么这个其实是一个非常呃简单的一个啊一个一个应用啊,对吧?所以这一块呢,其实我们内部也在做一些相关的工作。啊,就是啊,看起来还是挺有意思的,啊,比如说我们怎么样,就是把强化学习啊,那个放。在 A* 大这种 search 里面,对吧?嗯,对,嗯,然后呢是多目标优化问题,如果求解比较好呢?啊,多目标优化问题是是这样子呢,就是说你的目的可能是要达到一个帕累托的那个帕累托的那个 frontier。啊,但是这个 frontier 一般来说,你是相当于把每个目标通过线性的那个组合组合起来,那么这个线性的组合那个线性系数是可以变的嘛,对吧?所以你可能可以就是说固定一些线性系数,啊,然后呃固定线性系数之后呢,那个然后你解,然后再固定线性系数再解,那么最后就会可以描绘出这样一个一个 boundary 出来。
对吧?然后你就可以用这个帮助你,然后说说解决这个组合优化,这是这是一种办法,啊,就是最近是看到有一些啊文章是啊是是是这样子的,啊,看一下还有什么。对,啊,这个方向除了你还有哪些人和组织的关注呢?啊,其实有很多人很多组在做这个啊。就如果呃大家听过就是像那个 Yoshua Bengio 他们啊做的,他他们他的给的那个 talk,其实你看他们的文章很多时候。呃,他们也在呼唤说啊,我们是就是第一类的系统啊,已经解决的差不多了啊。第一类系统其实是指那个呃呃,比如说我们怎么样这个从 vision 的问题,或者说从那个 raw signal 里面获取信息这个。对 reasoning 去这个怎么 combine symbolic 和那个那个呃和和那个那个啊和啊和和那个人的感知,这个是很大的问题。
那么这部分其实很多人,米拉那边有很多人在做,对吧?那么 Caltech 其实其实有一些文章,像那个呃那个易松有一些文章是其实很早以前就在做 AI 这一块,啊就用做用用那个 reinforcement 或者用其他的 learning 方式,啊去解那个组合优化问题,对吧?然后宋乐呃宋老师那个组也也也有些文章在做啊做这些,啊对啊,这所以还有那个 MIT 那边。啊,像我之前在文章在那个 slides 里面提到那个红字啊,他是啊他是 MIT 的 PhD,他也是在做这个,而且他也做的挺好的,有很多的有意思的工作,啊,然后对这其实有很多的呃呃放有很多人在往这个方向在在在在在走,嗯。
对,对,呃,当然了,就是说有一个这个这个课方有个问题,就是呃,我感觉是我们现在也是只是做一些探索啊,就是因为真正要用的话,那还是希望就是这个东西最后能够,啊,变成比如说能够解决百万或者千万的那个变量级别的啊这样的一个问题,那这样的话就真正落地了。啊,那这就是非常厉害的一个东西。你说,哎呀,说是真的能用了,不是说只打游戏,啊,对。所以,但是现在这个问题很难做,因为 OR 那边呢,其实有很多比较啊成熟的技术,这些技术呢,就是经经过几十年的那个磨练了,已经没有什么问题,大家也不愿意换。
啊,然后那个强化学习这边你只能做几百个 provable 的,那就没有什么,就说对,就是一落地呢,还还有一段的时间啊。但是我相信以后会有机会,啊。呃,如何看待目前 RL 理论和应用研究的 gap?啊,对,这个肯定是有 gap 的。现在而且还早的,因为 RL 特别是 Deep RL,它其实把黑盒子黑盒子拼起来了啊,Deep。已经是个黑盒子,然后啊呀又是个黑盒子,啊,然后这样拼在一起呢就黑中黑中更黑了啊,所以嗯那就非常难去做,所以 gap 肯定是有的,嗯,但是慢慢慢慢我相信会啊慢慢慢慢弥合上,啊,但是现在就是理论这边,嗯,其实重要的是说你能看了这些理论之后,你可以对这这个问题有很更好的、更深的理解啊!如果你只调参数的话呢,你可能就有些感性的认识,好像这个有效,那个没有效。但是为什么啊?如果你看一些理论的话,你可以感觉到啊啊,这个为什么有效,那个也许就根据这些呃那个理解,你可能会有更新的想法。
对,所以我觉得就是说,嗯,理论没有实践是不行的,因为你可能有一千个理论,每个理论只有一个理论是对的,啊,但是如果你只有实践的话,你可能没办法升华到一个更大的一个尺度上去看东西,啊,所以这两边其实都是要关注的,然后两条腿一起走的呢,可能就是将来可能会走得更好一点,对。啊,对,然后我看一下还有什么问题。嗯,RL 解组合优化的组合问题的鲁棒性如何?啊,参数敏感性?哎,我们这边看下来好像还可以,没有特别。的敏感不是说什么一定要这个参数调整它一定 work 啊,就是还是可以,因为这个主要还是 AI 自己的问题。
啊,这跟组组合优化本身可能关系不是特别大,但是我们这边可能就有一些 limited experience 啊,如果你比较大的 experience 的话,呃,可能大家还是要自己实验一下,对。啊,像这边有个例子就是我们最后一个呃篇文章,其实做 Monte Carlo research 的时候呢,就是它有一个那个 hyper parameter,就是我什么我花多长时间去 explore 新的 node 啊,就是这个叫那个 PUCT 这样的一个那个 parameter。就它可以权衡我到底是那个利用我之前的已有的探索结果呢,还是说探索新的没有见过的 node,或者没有没有探索过的 node。你这个数字如果你调的不好呢,确实效果就不怎么样了。所以其实还是有一点,但是就是还没有到就是你差一点点就啊完全不 work 的程度啊,所以还是也可以做的,也可以做的。
呃。对,啊,还有问题是,这里有课什么?每个回合得出来的网络结果怎么快速评价?对,这是很好的问题。啊,对这个问题呢,是因为我们最后一篇文章呢,这个比较大的问题是,就是你每一次啊。你每一次 explore 的时候,你最后得到 network,你必须重新串一遍,对吧?然后得到一个结果,那这个肯定是最慢的,对。所以我们一所以一个办法呢是,就是我们最近刚投了一篇新的文章,在上面做了改进,就是我们怎么样用 win hot win shot 的那个 new net nest 的方法啊,去啊快速评价这个当前的那个网络结构,对吧?这样的话呢,就是或者说你可以训可以训练一个那个是那个 vanilla network 去预测这个网络结构,那么这样的话呢就。就会比较呃,就会就就就会就会比较快,对吧?不然的话,你每次都要串一遍,那你就每次要花很多很多时间,对。那么这个这个其实就是用借用了一些 Facebook 的这个思路嘛,对吧?你可以用 OneNote 去去做,啊,而不是说你从头开始串。
嗯嗯,对。YouTube_search:yuandong 20200223 OR Talk NO 5 Facebook 田渊栋:用深度(强化)学习为组合优化寻找更好的启发式搜索策略好,呃,要不就先这样吧,呃,我那我可以再最后再回答一个问题,我看一下哪个问题比较感觉好回答。这些其实都有讲过啊,有一个是比如说 AI 要如何应对时变环境,快速啊做出反应。嗯,对,这个其实是一个上限力很大的一大的问题,对吧?这个我可能啊,这我可能就牵涉到就是说你怎么样做 safety 的问题。呃,你比如说你在 AI 部署完了,然后发现这个输出的。那个 policy 乱乱搞,他可能一下子把东西调太差,然后整个东西没变就不行了,呃,所以其实是一个呃,就是说这个就是说目前能搞的呢,就是说你可以把 reinforcement learning 这个 policy 放在一个大的壳子里,对这个壳子呢就是个安全壳,如果它这个 action 超过了安全壳的尺度。
啊,那我就啊,那就是说马上呃不用那个 reinforcement learning 得到那个 action,我们换成就是 fallback 成正常的 policy。那么这样的话呢,其实就会啊比较啊比较安全,就。是保证就是 IRL 的,你得到了 IRL 的 benefit,但是你不会啊影响整个系统的那个运作,啊对。那么然后还有就是说训练的时候就是你怎么样去 adapt to it。那么训练的时候是就是这个主要是看这个 replay buffer 有多有有多有多大,对吧?replay buffer 比较大的话,那你可能就是运变就比较慢;replay buffer 比较小的话呢,你运变就比较快。但 replay buffer 也不能太小,太小的话这个 training 不一定很不一定会 stable,可能会不是很 stable。所以这个都是有些吹到,但是这个就是根据问题,看实际情况怎么样去调的啊。
那个调状调状态怎么表达的啊?这个其实我在 slide 里已经说过了啊,就是其实就是说把它变成一个啊那个啊就是一个图,这个图里面的那个边的约束关系就是 a 指向 b,就是指我先做 a 再做 b,啊,就是这种方式来表达。那么这样的话变成一个变成一个图有向无环图。一个有向无关图啊,然后你就可以用它,就是通过调整有向无关图的那个边的那个指向,你就可以调整它的那个,啊,那执行的那个顺序啊,主要是这样子。行,那要不就先这样吧啊。非常感谢大家啊,这次能过来听我啊做讲座。