背景

如今机器学习在视觉、自然语言处理、语音、推荐等领域的应用已非常广泛,相关的讨论也非常多。与这些热门领域相比,关于机器学习在组合优化中的应用相对还没那么泛滥。今天我们就来聊一下这个有意思的话题。值得一提的是,近几年热度升温的GNN和RL(《GNN、RL强势崛起,CNN初现疲态?这是ICLR 2021最全论文主题分析》)都是这个方向里的常规方法。在实际工程中,有一类优化问题需要我们从集合的所有组合中找出一个最优方案。这类离散空间中的优化问题就称为组合优化问题(Combinatorial Optimization Problems ,COP)。组合优化问题在交通运输,管理,生产,航天,经济等领域有着非常广泛的应用,因此也是运筹学的主要研究对象之一。从航班和工厂的调度,金融资产配置,仓库货物存储到运输路线的设计,很多都可以建模成组合优化问题。但是,这类问题由于需要考虑的情况大多是随着问题规模指数增长的,因此其中有不少是NP-complete的。也就是说目前还找不到多项式时间复杂度的算法。NP-complete问题有很多,如经典的satisfiability(SAT)问题,minimum vertex cover(MVC)问题,max cut(MC)问题等等。它们之间可以在多项式复杂度内相互归约,也就是说其中一个被证明有多项式复杂度解法的话,所有的都有多项式复杂度解法。

NP-complete问题中最有名的经典问题之一要算是旅行商问题(Traveling Salesman Problem,TSP)了,它是车辆路径问题(Vehicle Routing Problem, VRP)的一个特例。它的迷人之处可能就在于看描述很简单,日常生活中可能还常用到,但想要找到通用的高效解法却发现非常难。暴力求解复杂度O(n!)O(n!)O(n!)。简单地说,问题就是由n个城市组成的完全图,两个城市间有整数代价。有一个旅行商要走遍所有城市,每个城市只走一次且最后回到原点(即汉米尔顿回路),且该路径的代价和最小。很多时候对于中大规模TSP,算法找不到最优解。它能找到的最好的解与真正最优解的距离称为optimality gap。这也是评估很多TSP算法的重要指标,用来说明它的解接近最优的程度。自被提出后的几十年里,该问题在组合优化领域被反复地研究,从而衍生出基于精确算法、近似算法,启发式算法几大类成熟的方法。我们暂且称它们为传统方法。

而近年来随着人工智能的第三次复兴,深度神经网络(Deep Neural Network, DNN)成为了机器学习的主流方法。除了常见的视觉、语音、自然语言处理和推荐等领域,人们也将之引入了组合优化领域,发现它确实能带来一些看起来不错的结果。围棋就是组合优化问题,著名的AlphaGo正是通过理论与工程的完美结合证明了机器可以在这类问题上战胜人类的经验。我们知道,AlphaGo背后的主要技术之一是深度强化学习(Deep Reinforcement Learning,DRL)。因此,深度强化学习也是在基于机器学习解决组合优化方法中的常客。业界相关的工作有很多,如滴滴2018年的论文《Efficient Large-Scale Fleet Management via Multi-Agent Deep Reinforcement Learning》和《Large-Scale Order Dispatch in On-Demand Ride-Hailing Platforms: A Learning and Planning Approach》在共享出行中的车辆管理和派单问题上的应用,2017年Google的论文《Device Placement Optimization with Reinforcement Learning》中在计算图设备分配上的应用,2017年菜鸟网络的论文《Solving a New 3D Bin Packing Problem with Deep Reinforcement Learning Method》中在三维装箱问题中的应用,2019年MIT与清华大学的论文《Learning Scheduling Algorithms for Data Processing Clusters》中在分布式集群任务调度中的应用,以及最近2020年论文《Chip Placement with Deep Reinforcement Learning》中Google又将之应用到芯片布局设计中。这些本质上都是通过机器学习的方式解决实际中的组合优化问题。

本文主要简单聊一下基于机器学习来解决组合优化问题这个方向的发展历程与一些核心思想。TSP问题由于其经典的地位在很多的工作中被用来评估和比较算法效果,因此会被多次提及。让我们来看下这个旅行商在与机器学习结合后能焕发出怎样的新生。

传统方法

在进入主题前,我们先简要地回顾下像TSP这类NP-complete组合优化问题的传统解法。一般来说,可以大致分为以下几类。几乎每一类都是一门宠大的学科,所以这里也只能简单罗列下。

  • 精确算法(Exact algorithm)

顾名思义,就是搜索整个解空间,能够保证找到最优解。当然由于搜索空间太大,实际当中会通过剪枝等方法来减小搜索空间。常见的做法是建模成整数规划(Integer programming,IP)或混合整数规划问题(Mixed-integer programming,MIP)。分支限界法(Branch-and-bound)、分支剪界法(Branch-and-cut)和约束规划(Constraint programming)可用于求解。Branch and bound本质上就是将搜索空间构造成树的形式,通过不断地选取和分裂节点,配合剪枝来有效地找寻最优解。至于如何挑选节点和如何对其赋值对于找到解的速度有很大影响,是门很大的学问,因此衍生出不少启发(Heuristic)。对于TSP,SOTA的算法如Held-Karp algorithm,它基于动态规划的思想,时间复杂度为O(2nn2)O(2^n n^2)O(2nn2)。此外,业界还沉淀有不少成熟的求解软件,如CPLEX,Gurobi,以及为TSP专门优化的Concorde。显而易见,因为它需要找到最优解,同时根据NP-complete的性质,这类方法不太适合处理大规模问题。

  • 近似算法(Approximation algorithm)

这类算法找的不是最优解,而是找次优(Sub-optimal)解,或者说近优(Near-optimal)解,但它的优点是会有某种程度上的最优性保证。具体地,它能保证最坏情况下给出的解不次于最优解的一定倍数,这个倍数称为近似比(approximation ratio)。虽然求最优解没有多项式复杂度的算法,但求近优解还是有不少多项式复杂度的算法的。这类方法也是一个很大的家庭,包含如greedy algorithm,sequential algorithm,dynamic programming,primal-dual method,randomized method等方法。对于TSP问题,这类方法中典型的如Christofides algorithm,它通过计算最小生成树和最小权完全匹配求解。时间复杂度为多项式的,即O(n3)O(n^3)O(n3)。它的近似比为1.5,前提是TSP符合三角不等式(Triangle inequality)。

  • 启发式算法(Heuristic algorithm)

它本质上也是找一个近似解,但它与上面的近似算法相比,差别在于它没有最优性的理论保证,即不能保证解的质量。但一般来说,它比上面的近似算法能找到更好的解。这类方法玩法也是很丰富的。如一种是可以根据问题相关的heuristic构造解,如最近邻,或者最小生成树;另一种是local search,即根据heuristic来对中间解进行局部修改,以迭代的方式在解空间中进行搜索;还有一类是应用元启发式搜索框架,咱们耳熟能详的比如genetic algorithm,simulated annealing,tabu search,particle swarm optimization等。这类方法中针对TSP的SOTA算法为Lin-Kernighan-Helsgaun (LKH)。它可解决的TSP规模可以达到上万级别。

注意它们之间的界线并不是很清晰,一方面是因为有些算法可能同时属于两类。另一方面实际中常常会结合使用。如用近似算法的解作为初始值,再用启发式搜索找更优的解。

机器学习方法

将机器学习方法引入组合优化问题是近几年的一个快速发展的趋势。与传统方法相比,它具有多项潜力,如良好的伸缩性,泛化能力,通用性等。这里先给一个草图粗糙地列下部分业界的相关工作。

如果以基于机器学习的组合优化为主线的话,我们会发现它的发展伴随着机器学习的发展,机器学习方法被不断引入,前后引入了RNN,注意力机制,Transformer,GNN等,从而发展成今天所看到的众多分支。

早期研究

正如其它的很多领域,其实很多前沿的方向早在很久就已有尝试和萌芽,用机器学习方法来解决组合优化问题也不例外。早在1985年,Hopfield和Tank的论文《“Neural” computation of decisions in optimization problems》就尝试用机器学习的方法(具体地,Hopfield-network)解决小型的TSP实例。它将N城问题转为NxN的图,图中每个节点vijv_{ij}vij是一个二值变量,表示城市i是否为第j个访问。它的缺点是对超参和参数初始化敏感。之后很多相关工作也相继涌现,早期神经网络用于CO问题的survey可见1999年的《Neural Networks for Combinatorial Optimization: A Review of More Than a Decade of Research》。现代基于机器学习的组合优化方法中主流方法之一的强化学习,早在1995年Zhang和Dietterich在论文《A Reinforcement Learning Approach to Job-Shop Scheduling》中就将之应用到NP-hard的job shop调度问题。

但是,有时一个方向能否大量开花结果,时机也很重要。鉴于当时机器学习的局限,这些尝试大多都只限于研究探索,因为没有展现出比传统算法更优异的效果。

与DNN结缘

2013年深度神经网络一战成名,名声大噪,从而奠定了其在现代机器学习学科中的主流地位。之后的几年,大家都紧跟潮流,将之应用到各个领域,很多都取得了相当亮眼的结果。而与组合优化领域的结缘逃不开的一篇论文是2015年Google和UC Berkeley的《Pointer Networks》。它的主要意义在于将深度神经网络与组合优化问题很好地结合起来,因此引用率相当高。那它主要解决的矛盾点是什么呢?我们知道,组合优化中很多问题的特征是每一步的输出的维度是取决于输入的长度的,而这个长度是变化的。还是拿TSP为例,它的输出是输入的排列,而对于每个问题实例而言,其输入的数量,即城市的数量是不一样的。在机器学习方面,在当时,于2014年Google论文《Sequence to sequence learning with neural networks》中基于LSTM提出的sequence-to-sequence(Seq2Seq)模型因其优良的效果已成为像翻译、聊天机器人等处理序列数据任务的流行方法。构建Seq2Seq一般采用encoder-decoder架构。在这种架构中,encoder网络将输入序列编码成一个固定长的向量,然后由decoder网络将之解码成输出的目标序列。由于输入是变长的,这个固定长的向量就可能成为信息瓶颈。2014年论文《Neural Machine Translation By Jointly Learning To Align and Translate》中介绍的注意力机制(Attention mechanism)克服了该不足,它使得decoder可以使用encoder的任意状态,并且让每一步的注意力放在之前输入的相关子集上。注意力机制本质上是将之前输入状态按其与当前输入的相关度为权重进行加权累加,构成上下文向量(Context vector)。这个上下文向量会和decoder中当前的状态进行组合,用于预测当前的输出。直觉上,很多组合优化也是输入序列输出序列的问题。对于n个城市的TSP,逐个加入旅途中城市的过程可用条件概率的链式法则p(C∣P;θ)=∏i=1np(Ci∣C1,...,Ci−1,P)p(C|P; \theta) = \prod^{n}_{i=1}p(C_i|C_1,..., C_{i-1}, P)p(CP;θ)=i=1np(CiC1,...,Ci1,P)表示,那Seq2Seq模型就可以用于对其建模。但以上模型不适合直接用于解决组合优化问题,主要是因为它要求输出维度是固定的。为了解决该矛盾,Pointer Network(Ptr-Net)结合了以上元素,其点睛之笔是改动了注意力机制。原注意力机制中得到的attention mask是作为权重用于计算上下文向量。这里把后面的计算拿掉,将attention mask直接用于指示当前输出的节点。由于这个mask是经过用softmax归一化,可以看作一个分布,逻辑上就像一个指针指向输入中的某个节点。这应该也是Pointer Network的名字由来。这个mask的维度与输入维度是一样的,因此很好地适用于TSP这类问题。由于它会输出非法解,而且规模越大越明显。因此在推理时,beam search算法中需要过滤掉这些非法的解。文中实验部分将该方法用在Convex Hull,Delaunay triangulation和TSP三个问题上。由于当时处于早期,处理的问题规模不是很大,在解的质量上与传统的方法也没有太大优势。但它为后面业界的工作奠定了很好的基础,很多后面的工作都是基于它来展开的。训练方式采用的是常用的以cross-entropy为损失函数的监督学习。

对于有些问题,其不定长的输入与输出无法比较自然地表达为序列。如给定一些数要求对其进行排序,那理想中它的输入应该是一个集合,与顺序无关。2015年Google的论文《Order Matters: Sequence to sequence for sets》正是关注那些输入和输出数据中的顺序对于学习模型很重要的场景,并将其试验于排序和估计未知图模型中联合概率分布的问题。其核心问题是当顺序还不能确定时,我们如何表达输入和输出。对于经典的Seq2Seq模型,如果将输入和输出变换顺序对于训练效果会有影响。如在convex hull计算中,先对数据做些预处理(比如按角度排序),训练会更快和更好。受Neural Turing Machine和Memory Network等外部存储相关工作的启发,文章将Seq2Seq模型进行了扩展,使之可以处理输入和输出为集合的场景。具体来说,就是交换任意元素顺序不能改变其编码。对于无序输入数据,文中提出了Read-Process-and-Write架构。它由三个网络组成。开始的Read部分是一个神经网络将输入进行嵌入得到对应的memory vector;接下来,Process部分是一个没有输入或输出的LSTM,它用前面的memory vector通过注意力机制进行一定步数的计算,得到相对于输入permutation invariant的隐状态;最后,Writer部分是一个LSTM Pointer Network,它的输入为Process部分输出的隐状态,以及Read部分输出的memory vector,产生最终的输出。这里相对于原始的Pointer Network,在pointer部分前加了一个额外的注意力机制(因为原来的注意力机制被用来输出结果了),称为glimpse机制。对于无序输出数据,文中提出一种高效的训练算法,它在训练和推理时搜索所有可能的顺序。对于像TSP和triangulation等问题,其解中存在大量的等价类。对于这些等价类做一些约束,有利于更快地收敛。如对于TSP,可以从输入的第一个元素开始,然后按逆时针顺序输出,准确率能有所提高。

引入强化学习

前面提到采用的主要是监督学习的方法,这成为了一个比较大的局限,因为我们知道对于监督学习来说算法质量很大程度上取决于训练集的质量。这意味着要训练这个网络,我们还得先求解出训练集中问题的高质量解。对于像视觉领域中物体检测,图片分类还好,分分钟可以人肉搞定。但如果训练集中一个样本就是一个TSP问题,那要求它的解,哪怕不是最优解也够呛。。。为了克服监督学习的局限,于是强化学习被引入了进来。我们知道,强化学习与监督学习不同,它不需要显式的带标签的数据集,而是通过与环境不断交互中的反馈信号来学习。2016年Google的的论文《Neural Combinatorial Optimization with Reinforcement Learning》提出了Neural Combinatorial Optimization(NCO)。在神经网络模型方面,它使用前面提到的Ptr-Net架构作为策略模型,然后使用基于梯度的强化学习方法(REINFORCE算法)来学习策略模型的参数。它将每个问题实例作为一个训练样本。对于TSP问题来说,训练的目标函数是给定一个图的期望旅途长度。基于梯度的强化学习用于减少方差的一个常用方法是引入一个baseline function。文中引入了另一个RNN网络作为这个baseline function,它估计给定输入序列下的的期望旅途长度。该网络以MSE为目标函数并使用SGD来优化。另外,文中指出结合推理时搜索还能进一步改善效果。由于评估一条旅途的长度只需很小计算量,因此可以让模型输出很多候选,然后在里边找最优的。这样就可以衍生出Sampling和Active Search两种策略。前者通过采样得到大量候选解,然后找到其中的最优解。后者针对给定的问题实例,在推理时对策略模型参数进行refine,以最小化该问题实例下的期望旅途长度。这两种策略还可以与强化学习的预训练模型结合。实验部分该方法被应用于TSP和KNAPSACK问题。TSP问题考虑的规模为20, 50和100个城市。结合推理时优化,TSP的解可以胜于Christofides algorithm以及OR Tools(通过local search与LK heuristic提升Christofides’ solution)。

2018年理海大学的论文《Reinforcement Learning for Solving the Vehicle Routing Problem》将前面的方法拓展到VRP(Vehicle routing problem)。VRP的一般形式是有一些客户分别有各自的货物需求,一些有容量限制的车辆需要从配送中心出发向这些客户运送货物且回到配送中心,求行车路线使得一定的目标(如总路径最少)最优。容易看出,TSP是其一个特例。且和TSP一样,VRP也是NP-hard问题。这篇文章的基本思路与前面类似,也是基于强化学习,模型也是基于Ptr-Net。但对于VRP,它的难点在于其问题输入是动态变化的。如当一个客户访问后,其需求可能就会被清零。因此如果直接使用Ptr-Net是不行的。本文指出RNN encoder只对于像翻译这种输入顺序有关的才会比较有帮助,而对于像TSP,排序任务之类输入顺序无关的情况则并无必要。于是它去掉了encoder部分,只保留了decoder部分。它将Ptr-Net中的LSTM encoder替换为对当前步所有输入的embedding。这样使得模型的输出和输入的顺序无关。在Ptr-Net中,每个节点只会输入一次,而这里每个节点在每一步中都会被输入一次,因此它能处理动态的环境。整个网络主要包含两部分,一部分是基于静态(坐标)与动态(需求)两部分状态的embedding;另一部分为decoder,它在每一步中指向输入节点。Decoder采用了带glimpse的基于上下文的注意力机制。模型训练采用了经典的policy gradient方法。另外,为了加速训练和产生可行解,它用了masking scheme会将不可行解的logprob高为负无穷。后处理有两种:Greedy与Beam search。对于新的问题实例,只要它是来自于同一问题实例分布,则无需重新训练。在中等规模VRP(50,100个客户)中,该方法在解的质量上相较经典heuristic方法(Clarke-Wright savings heuristic,Sweep heuristic)以及Google OR Tools有一定优势。在结合beam search后,对比OR Tools有60%以上的胜率。

Transformer的启发

2017年Google的论文《Attention Is All You Need》引起了业界的巨大反响。对于序列化数据的建模当时的SOTA多是基于RNN,LSTM或者CNN。而这篇文章提出了Transformer模型,仅仅使用了注意力机制(这也是文章名字的由来)。而且该模型除了准确率更高,还更易并行,且训练也更快。 Transformer延续了encoder-decoder架构,其encoder和decoder网络均由层叠的self-attention和point-wise fully connected层组成(原论文图1)。这里的注意力机制和以前Seq2Seq模型中的注意力机制有所不同,这是称为Multi-Head Attention(MHA)的Self-Attention机制(原论文图2)。具体不说了,网上铺天盖地的介绍。2018年巴黎综合理工学院等机构的论文《Learning Heuristics for the TSP by Policy Gradient》基于前面NCO的主要思想,即基于强化学习来解决TSP。还是基于Ptr-Net的结构输出,但其网络结构汲取了Transformer的精华。Encoder部分基于Transformer中的结构将所有城市坐标编码成对应数量的action vector。Decoder部分基于最近三步的动作(访问的城市)得到query vector,该向量与encoder输出的action vector一起通过Pointing机制得到结果,即输入序列中的位置(具体结构原论文附录图1和2)。另外它提到对数据通过PCA进行预处理使结果对空间旋转无关。实验部分中它与Christofides算法,OR tools等业界方案做了对比,并在解的质量与运行时间方面表现相当。它将TSP50上训练的模型直接用于TSP100表现也不错,说明了其泛化能力。另外,当结合了local search(2-opt heuristic)后还可以快速提升效果,展现出了机器学习与传统运筹学结合的好处。

2019年阿姆斯特丹大学的论文《Attention: Learn to solve routing problems!》也是基于Transformer模型。与原Transformer模型相比,encoder部分中没有用positional encoding,这样便使node embedding与输入顺序无关。其它部分基本沿用了Transformer架构中层叠的multi-head attention(MHA)和feed-forward(FF)结构来得到每个城市对应的node embedding。node embedding的平均作为graph embedding。这个embedding会输出给decoder。Decoder采用了经典的autoregressive模式,在每一步中,基于encoder的embedding和之前步的输出,得到当前步的输出。Decoder网络两样基于注意力机制,与前面工作一大区别在于它引入了context node来表征解码时的上下文,它包含了graph embedding,以及第一个节点(它是起点也是终点)与前一个输出节点的embedding。这个context node加上其它的embedding信息通过MHA层(与encoder中的MHA相比,这里为了高效没有skip-connection, BN和FF子层)得到输出向量。最后,decoder结构有一个single attention head(即M=1的MHA),通过softmax输出即为当前步的输出。训练使用的仍是经典的REINFORCE算法,这里有些区别的是baseline function是通过rollout的方法得到的,即基于当前最好的策略模型进行deterministic greedy rollout得到。实验部分主要考虑了多种路径问题,如TSP和VRP的多种变体(如SDVRP, PCTSP, SPCTSP)。在很多case中,与构造类heuristic(Nearest, Random and Farthest Insertion和Nearest Neighbor),OR Tools,Christofides+2-OPT local search以及其它基于机器学习的方法相比能得到更优的解。

Graph Embedding与GNN

我们知道,数据的表征学习,即抽取输入数据优质的特征对于机器学习的算法有着非常重要的影响。另一方面,引入机器学习的期望之一是提高其泛化能力,即最好是训练完的模型可以有效地应用于未曾见过的问题实例。为了提高泛化能力,通常需要能够抽取数据中的有效特征。在很多领域中,我们会做一个常规操作叫嵌入(Embedding),如NLP中的word2vec。它用于获得数据的低维、稠密的向量表示。这样不仅可以更好的表达数据间的语义关系,还可以简化后续模型,以及提高复用性。对于图这种非欧几里得数据来说,其embedding方法就称为图嵌入(Graph embedding,GE)。它通过低维的向量来表征图的节点及拓扑结构等信息,继而可以作为后面机器学习算法的输入。与graph embedding密切相关的一个方向是图神经网络(Graph neural network,GNN)。GNN是将深度神经网络模型应用于解决图相关任务的方法。到今天它仍是各大机器学习顶会上最火热的话题之一,并在推荐、金融、生物、物理等领域中有广泛研究。GE与GNN是两个维度的概念,前者指一种任务,后者指完成很多任务的一类模型。但由于它们之间关系紧密,所以放在一起讨论。

GE与GNN经过几年的快速发展,包含的内容已经非常丰富,其自身就可以成一门课或者一本书了,这里不再展开。这里主要关注它在基于机器学习的组合优化问题中的应用。一个相对早些的将GE引入的工作是2017年佐治亚理工学院的论文《Learning Combinatorial Optimization Algorithms over Graphs》,它也成为了后面很多新方法的对标对象。对于组合优化问题,一个困境是对于同样类型,但数据不同的问题,我们常常需要一遍遍地重新去解决。因此文中比较正式的提出了灵魂拷问:给定一个图优化问题和一个问题实例的分布,有没有办法可以让heuristic泛化到那些不曾见过的问题实例。它还指出之前很多基于机器学习的组合优化算法都是通用的,因此没有充分挖掘图这种特殊的结构。为了解决,它将GE与RL进行了结合,提出了S2V-DQN算法。这里的GE用的是他们在2016年论文《Discriminative embeddings of latent variable models for structured data》中的structure2vec(S2V)方法。强化学习部分考虑前面工作普遍采用的policy gradient样本效率不高,因而使用了Q-learning。该方法基于贪心算法框架,每一步中,基于当前的部分解,选取使评估函数最大的节点。可以看到,这里评估函数非常重要,它需要能够提取和表达图中的各种信息。为了做到这一点,structure2vec被用来做图嵌入以及参数化评估函数。为了优化评估函数中的参数,该评估函数可以作为Q-learning中的Q函数,然后进行训练。与前面的模型相比,该模型中没有使用单独的encoder和decoder,而是一个基于GE的单个模型。实验部分在Minimum Vertex Cover,Maximum Cut和TSP上与NCO,以及每种问题相关的heuristic方法进行了对比,并在optimality gap指标上得到了更优的解(尤其是对于像MVC这种图结构信息更重要的问题)。对于MVC和TSP规模分别达到500和300左右。另外GE使得训练好的模型应用到更大的图上。实现中拿在50-100节点的问题上训练的模型应用到更大规模的问题(最大到1200)取得了很小的approximation ratio。

GNN中重要的一种就是结合了卷积的图卷积网络(Graph Convolutional Network,GCN)。它在很多解关于图的组合优化的工作中都有用到。2019年德里印度理工学院与加州大学圣巴巴拉分校的论文《Learning Heuristics over Large Graphs via Deep Reinforcement Learning》 提出一种称为GCOMB的深度强化学习框架用于学习大规模图下的组合优化问题。与前面的文章目的类似,它的目的也是让算法能解决来自与训练集中同分布的但未见的问题实例,但它将之扩展到更大规模的问题(百万级节点)。整个算法包含训练与推理两个阶段。训练阶段又分两个子阶段:第一步用GCN作为embedding,通过监督学习的方式学习GCN中的参数。它本质上是让embedding能反映每个节点对于解的重要程度;第二步基于Q-learning用于形成解集。将回报设定为加入某节点后的边际收益,然后进行训练。在推理阶段,对于给定的图,先用训练好的GCN进行embedding,然后通过Q-learning学习的Q函数迭代地计算解。即用贪心算法以增量方式构造解。

2017年纽约大学的论文《A Note on Learning Algorithms for Quadratic Assignment with Graph Neural Networks》引入了GNN来解决二次分配问题(Quadratic assignment problem,QAP)这个NP-hard问题。TSP可看作是QAP的一种特例因此也被提及。该文以监督学习的方式训练GNN,并直接以邻接矩阵的形式输出解,然后通过beam search找到可行解。相比前面挨个输出解中元素,也就是autoregressive的方式,这种是一下子输出解的方式称为non-autoregressive的方法。但在TSP上似乎效果不如Ptr-Net和Christofides算法,原因可能是由于监督学习下解的质量依赖于ground truth,而ground truth又来自于heuristic(LK Heuristic)。

2019年南洋理工大学和洛约拉马利蒙特大学的论文《An Efficient Graph Convolutional Network Technique for the Travelling Salesman Problem》基于《Residual Gated Graph Convnets》中的Graph ConvNets和beam search算法来解决TSP。对于50和100个节点的TSP它将optimality gap缩减到0.01%和1.39%,超越了当时其它基于深度学习的方法。首先,该模型以TSP的图为输入,通过Graph ConvNet进行表征学习,然后edge embedding经过MLP得到概率矩阵。如果将TSP解中旅途表示成邻接矩阵的话,那该输出的概率矩阵就可以看作邻接矩阵的heat map。这种以non-autoregressive的方式输出邻接矩阵与上一篇论文中是类似的。然后,该模型使用监督学习进行训练,训练集中的解通过Concorde求解器得到。在推理时,基于模型得到的邻接矩阵可以通过beam search算法转为合法的旅途,即TSP的解。对于Graph ConvNet和beam search,都可以被并行化通过GPU加速,因此在性能上可以有一定优势。同时,文中也指出与autoregressive模型相比,该模型的泛化能力较差。另外,因为是基于监督学习,意味着它处理的问题规模会有瓶颈。

2018年剑桥大学等机构的论文《Graph Attention Networks》提出Graph attention networks(GAT)。它将注意力机制的思想引入到GNN,即可以让节点将注意力放到某些邻接节点上。它成为了近几年中图相关问题网络模型主流方法之一。2020年康奈尔大学和哥伦比亚大学的论文《Learning to Solve Combinatorial Optimization Problems on Real-World Graphs in Linear Time》就是应用了GAT,并提出一种针对图结构组合优化问题的框架。它在一个训练集上使用强化学习训练GNN,训练好的神经网络可以对于一个新的图实例输出近似解。该框架比较有特色的是引入了edge-to-vertex line graph(原图中的每条边对应这个图中的节点)用于那些需要选取边的问题(如MST)。GNN用来学习图的表征并输出选取节点的策略。这个GNN基于经典的encoder-decoder架构。Encoder部分基于GAT,decoder使用了注意力机制。整个网络的计算保持在线性复杂度。该方法通过不同的目标函数可以适用于多种基于图的组合优化问题。它在解的质量(optimality gap接近于1)与运行性能(线性执行时间)上都有好的表现。

搜索与后处理

前面的介绍可以看到,基于深度学习的方法已经在组合优化问题中达到还不错的成绩。另一方面,我们也可以看到,这些方法大多数还是需要结合一些后处理的。比如不少工作中对于机器学习模型表示概率的输出,需要经过一些后处理算法得到最终的解。如常用的包括: 1)Greedy:每次选取输出概率最高的节点。2)Beam search:本质上是宽度受限的广度优先搜索。3)Sampling:采样一定数量的解,取最优。

还有些工作是结合了像2-OPT算法来进一步提高解的质量。与前面几种方法不同,像2-OPT,3-OPT这种是对一个完整的解进行局部修改来试图改进它,称为perturbative search。那么问题来了,这些搜索过程在整个算法中的影响如何?我们又如何评估机器学习部分的算法能力呢?2019年蒙特利尔综合理工学院等机构的论文《How to Evaluate Machine Learning Approaches for Combinatorial Optimization: Application to the Travelling Salesman Problem》就是主要针对该问题。它指出常用的评估指标optimality gap同时针对机器学习和搜索部分,因而无法准确评估机器学习部分算法。为此它提出了一种新的测度,称为ratio of optimal decision(ROD)。其优点是可以排除搜索部分带来的影响,只评估机器学习部分的效果。它的主要思想是将问题看作序列化问题,并关注每一步决策的质量。这样那些大多数步里做了最优的决策,但因一步之差导致optimality gap不理想的情况就不至于得分很低。另外,通过实验它还说明了搜索过程对于机器学习方法的影响巨大。一些基于机器学习的方法得到的解在经过如2-OPT,3-OPT和LK等方法refine后其optimality gap能够显著降低。

以往的很多工作中基本是以增量的方式构造解,每当一步决策后,它们通常不会再重新考虑之前所做的决定。而2019年牛津大学等机构的论文《Exploratory Combinatorial Optimization with Reinforcement Learning》则是在推理时进行探索以获取更优的解。本文提出exploratory combinatorial optimization(ECO-DQN)方法,适用于定义于图结构上的组合问题。概括来说,ECO-DQN可以归结为S2V-DQN+RevAct + ObsTun+IntRew。其中的S2V-DQN指前面《Learning Combinatorial Optimization Algorithms over Graphs》提出的方法。RevAct(Reversible Actions)指允许flip一个节点多次。ObsTun(Observation Tuning)指状态包含7个观察,分别基于vertex state等。它们提供了多方面的信息,用于确定选取动作的价值,提供历史信息避免过短环路,保证外部和内部回报符合马尔可夫特性,以及有限步的episode。IntRew(Intermediate Rewards)指通过reward reshaping,当达到新的局部最优解时,给一个小的中间回报,作为内部回报。这样主要为了克服回报稀疏的问题。在Maximum Cut Problem上,它的表现性于SOTA的强化学习方法。另外,该算法可以从任意的解开始。因此,可以与其它的搜索方法结合进一步提升。

2018年Intel Labs和香港科技大学的论文《Combinatorial Optimization with Graph Convolutional Networks and Guided Tree Search》结合了图卷积网络与树搜索来解决组合优化问题。它主要思想是基于图卷积网络输出节点属于最优解的概率,然后用它引导树搜索。这个图卷积神经网络模型通过监督学习来训练,因此它需要大量预先解好的问题实例。算法的流程分几步:首先,输入的图经过一个预处理,即graph reduction进行简化,然后喂给图卷积神经网络,输出多个概率图表示每个节点属于最优解的似然。至于为什么是多张概率图是有讲究的,文中提到最优解可能有多个,而一个节点可能出现在多个最优解当中,换言之,该概率分布是多峰的。另一方面,这样做可以生成很多候选解,有利于后面树搜索中更好的探索。接下来,这些概率图就用来在树搜索中以迭代的方式构造解。最后还会用local search(2-improvement local search算法)看看能不能改善解。实验中基于MIS,MVC,MC,SAT等多个NP-hard问题与S2V-DQN,Z3,ReduMIS,Gurobi等方法做了比较,在数据上优于这些方法,且对于问题类型和数据集的泛化能力强。另外,树搜索是容易并行加速的,因为可以将部分解的扩展放到多个线程运行。

2019年东京大学与RIKEN的论文《Solving NP-Hard Problems on Graphs by Reinforcement Learning without Domain Knowledge》融合了AlphaGo Zero思想,将之从围棋拓展到组合优化问题,提出了CombOpt Zero框架。我们知道,蒙特卡洛树搜索(Monte Carlo Tree Search,MCTS)在历代AlphaGo中都有占有重要的角色,它分为selection,expansion,evaluation和backup四步。这里在训练和推理中都用到了MCTS。在训练中它可以促进探索,增强泛化能力;在推理时它可以改进效果,增强稳定性。一般的组合优化问题与围棋相比有两点不同。一是状态由不同大小的图表示,这点可以通过GNN解决;二是回报的值域不固定,这点文中提出回报归一化(Reward normalization)技术来解决。原先的价值函数用归一化的回报代替,它语义上代表与随机挑选动作相比回报能好多少。它还在网络模型中尝试多种GNN(如Graph Isomorphism Network,Invariant Graph Network),发现对于不同问题最优的GNN也不同。实验在MVC,MaxCut和MaximumClique问题上,与S2V-DQN以及其它的传统算法做了对比实验,说明了其优势,以及与S2V-DQN相比有更好的泛化能力。

2019年UC Berkeley和Facebook的论文《Learning to Perform Local Rewriting for Combinatorial Optimization》提出了一种结合机器学习的基于搜索的方法。对于组合优化问题,传统的搜索通常依赖于启发,而在不同的场景中调优这个启发往往非常耗时。本文提出NeuRewriter方法来学习策略来重写当前解的局部组件,并以迭代的方式不断改进解直到收敛,优化问题被看作是重写问题,策略分为两部分组件:即region-picking策略和rule-picking策略。前者用于根据当前状态(每个解就是一个状态)选取要改的区域;后者选取重写的规则。这些网络模型通过神经网络来表示并用强化学习中的AC方法来训练。之前一些基于机器学习的方法很多是逐个节点添加构造解(即auto-regressive),而该方法是从一个可行解出发改进它找到更优解。实验中,NeuRewirter方法在expression simplification上超越了Z3,online job scheduling上超越了DeepRM与OR tools,CVRP上分别超越了一些基于机器学习的方法以及OR tools。

与传统方法的结合

将机器学习引入用于解决组合优化问题,上面提到的方法主要是end-to-end的方式,而另一种重要的方式是与传统的OR方法相结合。这方面业界的尝试也是挺丰富的。

如文章前面提到的,解决组合优化传统方法中比较经典的就是建模成混合精度规划问题,然后用branch-and-bound方法解决。这个过程会将解空间递归地切分,形成搜索树,期间会计算边界值并裁剪掉肯定不包含最优值的子树。这里边比较麻烦的就是扩展搜索树中的启发策略很讲究。一方面要得到好的启发很耗时,另一方面对于不同的问题或者同一问题的不同阶段最好的启发还不一样。业界提出一些方法来优化这个搜索过程。如2013年的论文《Dash: Dynamic approach for switching heuristics》提出Dynamic Approach for Switching Heuristics(DASH)方法,它针对搜索过程中的子问题动态切换并选取最合适的启发算法。而这个思路也给进一步引入机器学习方法提供了非常好的机会,这样不仅能够有机器学习方法的优点,同时还有传统方法最优性保证的优点,因此业界相关的工作近年也有不少。

2014年来自马里兰大学和约翰斯·霍普金斯大学的论文《Learning to Search in Branch and Bound Algorithms》就尝试引入模仿学习,以监督学习的方式得到自适应的节点搜索策略,并且在与业界竞品SCIP和Gurobi的比较中展现出性能的优势。具体地,对于给定训练集(即一些包含解的问题集合),基于《A Reduction of Imitation Learning and Structured Prediction to No-Regret Online Learning》中的Dagger算法学习branch-and-bound算法中树搜索时的节点选取策略和节点裁剪策略。

2019年Mila等机构的论文《Exact Combinatorial Optimization with Graph Convolutional Neural Networks》也是采用类似的思路,使用模仿学习来学习branch-and-bound算法中的变量选取策略,同时它还结合了图卷积神经网络。branch-and-bound求解过程需要不断地进行节点选取和变量选取,这可以看作是一个序列化决策问题。传统的方式是通过专家设计的启发来最小化求解时间。这是我们希望通过机器学习替代的部分。对于节点选取问题,strong branching是一种较为理想的启发,它可以产生很简单的搜索树,但缺点是计算量非常大,以至于不可能应用于所有节点。为了解决该决策过程的编码和难以泛化的问题,文中采用图卷积神经网络来建模,输入为二分图状态。图卷积神经网络有对输入规模伸缩性好,计算复杂度仅和密度相关(善于处理稀疏结构)和permutation-invariant的优点。模型的训练通过模仿学习和近似strong branching。该方法使得学习的策略有好的泛化能力,即在训练中学习到的策略可以用于更大规模的问题实例中。实验部分将之用set covering等四个NP-hard问题,说明在大规模问题中比SOTA solver中的专家设计启发有优势。

2018年蒙特利尔综合理工学院等机构的论文《Improving Optimization Bounds Using Machine Learning: Decision Diagrams Meet Deep Reinforcement Learning》提出一种利用深度强化学习来确定变量顺序的方法。在组合优化中,找到最优解的紧确界对于问题的求解通常非常重要。决策图(Decision diagram,DD)是一种分层的有向无环图,它被用于得到比传统方法更好的上界和与界,但界的质量又依赖于构建决策图过程中变量的选取顺序。遗憾的是,要找到最优的顺序是NP-hard问题。这篇文章提出用强化学习(具体地,neural fitted Q-learning)来确定这个变量顺序。实验数据表明在绝大多数情况下比线性规划松弛的界,随机顺序和其它三种顺序启发更优。

2020年蒙特利尔综合理工学院等机构的论文《Combining Reinforcement Learning and Constraint Programming for Combinatorial Optimization》结合了深度强化学习和约束规划来解决组合优化问题。深度强化学习的缺点是问题通用性不足和无法提供最优解,而约束规划虽然通用且能保证最优性,但它在搜索解空间时的分支决策并不容易。因此,这篇文章提出的方法试图结合这两者,从而克服两者的局限。为了联接这两类方法,对于一个组合优化问题,先用动态规划建模,然后编码成深度强化学习和约束规划。强化学习中的网络使用了GAT和set transformer来做图嵌入。文中考虑了三种约束规划搜索策略-branch-and-bound(BaB),iterative limited discrepancy search(ILDS)和restart based search(RBS)和两种强化学习算法-DQN和PPO。这样就有了多种组合关系,如BaB-DQN,ILDS-DQN和RBS-PPO。以BaB-DQN为例,首先DQN以找到可行的最优解为目标进行训练,然后这个模型用于在约束规划求解器的搜索过程中提供搜索策略(value selection)的启发。另外,由于一些相似状态会被多次访问,它使用了caching机制来避免重复的网络推理。实验基于TSP with time windows(TSPTW)和4-moments portfolio optimization problem(PORT)问题(规模100及以内),体现了该方法与传统约束规划求解器,强化学习方法与业界的求解器比较有一定优势。

结语

这几年将机器学习方法用于组合优化中的相关工作呈井喷之势,相关的survey也非常多。如2018年的Yoshua Bengio等人的《Machine Learning for Combinatorial Optimization: a Methodological Tour d’Horizon》介绍了机器学习与组合优化的结合。比较新的如2020年的《Reinforcement learning for combinatorial optimization: A survey》和《A Survey on Reinforcement Learning for Combinatorial Optimization》主要针对强化学习在组合优化中的应用,同样是2020年的《Learning Combinatorial Optimization on Graphs: A Survey with Applications to Networking》主要偏向基于图的组合优化。它们中都有对近年来业界相关工作的非常好的整理。

将机器学习用于组合优化相比传统解法,是一种全新的”数据驱动“的求解方式。它有几个优点,或者说潜力:

  • 泛化能力:上面提到的传统方法对于一个新问题大多需要从头开始,机器学习让算法具有学习能力,通过分析和解决一些问题,从而在给定一个新问题时能够有效获得解。
  • 伸缩性:有可能将时间复杂度降低到线性。再结合成熟的并行加速能力,可以使其应用于大规模问题。
  • 通用性:即一个学习好的模型可以适用于不同的问题,而无需为每个问题设计新的heuristic。这样就避免了领域相关的专家知识。

当然,既然是基于深度学习,那自然也继承了深度学习的缺点,就是缺少理论基础。在组合优化问题中,也缺乏optimality ratio的保证。为了结合两者的优点,传统方法与机器学习方法结合的方式也是比较丰富的。既可以以end-to-end的方式用机器学习直接根据给定问题输出解(辅以相应的后处理),又可以将机器学习与传统的算法相结合,比如使用机器学习帮助选取参数或者heuristic。今天,我们可以看到一些工作中,基于机器学习的方法已经能在一些case中与传统的SOTA算法比肩。从其发展历程可以看出,这个方向正随着机器学习的蓬勃发展而快速演进。相信将来随着更多的想法被吸收和融入到组合优化中,它会成为传统算法的有力补充甚至会完全替代传统算法。

奔跑吧,旅行商 - 当机器学习遇上组合优化相关推荐

  1. 干货!机器学习遇上运筹优化,助力企业降本增效:一种双层优化方法

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 运筹帷幄,决胜千里.运筹优化(Operations Research)作为数学.计算机科学.管理学的交叉学科,如今广泛应用在企业的生产. ...

  2. 秒懂机器学习---当机器学习遇上决策树....

    秒懂机器学习---当机器学习遇上决策树.... 一.总结 一句话总结: 多多看图,图的直观效果很好,很多时候文字实在表达不清 1.决策树(Decision Tree)中的各个节点表示什么意思? 每一个 ...

  3. 机器人之旅:当Arduino遇上Android

    原文地址::http://blog.knownsec.com/2012/02/%E6%9C%BA%E5%99%A8%E4%BA%BA%E4%B9%8B%E6%97%85%EF%BC%9A%E5%BD% ...

  4. 【ML4CO论文精读】用于组合优化的机器学习:方法论之旅(Yoshua Bengio, 2021)

    Machine learning for combinatorial optimization: A methodological tour d'horizon 论文:Bengio Y, Lodi A ...

  5. [当人工智能遇上安全] 7.基于机器学习的安全数据集总结

    您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...

  6. [当人工智能遇上安全] 6.基于机器学习的入侵检测和攻击识别——以KDD CUP99数据集为例

    您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...

  7. [当人工智能遇上安全] 3.安全领域中的机器学习及机器学习恶意请求识别案例分享

    您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...

  8. [当人工智能遇上安全] 5.基于机器学习算法的主机恶意代码识别研究

    您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...

  9. MQTT通信之旅—当A7670C遇上A7670E

    小明在深圳,他有一个A7670C:小红在巴黎,她有一个A7670E.小明心想用他的A7670C能否给小红的A7670E发信息,想了很久没有很好的法子,结果一天晚上,做了一个梦:在MQTT的帮助下:A7 ...

  10. “直男变暖男”—— 当推荐系统遇上知识图谱

    本文转载自文旅记,详情可以扫描下方二维码: 作为一个文科生,深知文化娱乐.旅游休闲.市场营销等领域正在迎接推荐算法的洗礼,传统的分析.内容生产,势必会发生改变.因此笔者一直关注技术领域,斥巨资(狗头保 ...

最新文章

  1. Win7旗舰版系统右键菜单响应速度很慢会延迟一段时间
  2. struts2 标签问题----escape=false 这个属性
  3. JavaScript的特殊函数
  4. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(于)
  5. 基于Docker的Mysql主从复制搭建_mysql5.7.x
  6. 计算机应用基础(高起专)答案,东北师范大学14秋《计算机应用基础(高起专)》14秋在线作业1答案...
  7. Excel向数据库插入数据(执行一次只需连接一次)-batch简单使用
  8. WebService工具类调用远程接口服务时java.io.IOException: Server returned HTTP response code: 500 for URL XXX
  9. centOS7安装nodejs(8.4.0)(详细步骤)
  10. Mac电脑的12个神奇隐藏功能
  11. choices参数 MTV与MVC ajax contentType 序列化组件 自定义分页器...
  12. Maven打jar发布包的常用配置
  13. (转) Lua使用心得一
  14. UTF-8 without BOM
  15. 算法与数据结构——百度笔试题(一)
  16. tf.flags.DEFINE解释
  17. SDN开源框架:蝇量级选手Dragonflow究竟解决了什么问题
  18. 计算机图像相关应用研究,计算机图像处理技术的应用探讨.pdf
  19. 【闲得无聊】写个web版功德无量附代码+静态资源
  20. api日常总结:前端常用js函数和CSS常用技巧

热门文章

  1. (转)工业机器人用什么语言编程的?
  2. S7-200SMART案例分析——伺服接线
  3. 优酷KUX1080转码工具如何将KUX视频转换成MP4格式 1
  4. 沪江快速手机打字软件下载
  5. MD5加密算法(C语言实现,已编译,亲试可用~)
  6. php运行方式isapi,PHP_WINDOWS 2000下使用ISAPI方式安装PHP,使用ISAPI方式安装PHP。 下载连 - phpStudy...
  7. c++ 实现四阶龙格库塔方法
  8. js采集图片批量下载
  9. html5音乐播放器网页底部,jQuery+html5网页底部固定mp3音乐播放器代码
  10. spark学习之sparksql语法优化