多目标优化入门:从加权和到非支配排序

2,400 阅读11分钟

Multi-objective Optimization: basic concept

首先在常规语境中,优化算法指的是对于一个目标,考虑已知的或已知部分信息的目标函数,即由多个决策变量(decision variables)/参数(parameters)作为输入计算目标函数值的表达式/函数,针对这个目标函数以及实际问题伴随的一些约束条件(constraints),尽可能地寻找一组决策变量能取得最小的(最大的亦不失一般性)目标函数值,这一组决策变量就是最终找到的最优解(往往不是理想最优解,如果要求理想的最优解就相当于精确优化,就涉及运筹优化了)。 多目标优化则在这个基础上扩展,优化问题的目标不止一个,可能是两个、三个,甚至于10到15个。在单目标优化中,只需要关系每个决策变量对唯一的目标产生的影响,而多目标优化中,问题的复杂度指数化增长了,一些在单目标优化中发挥良好的优化技术或算法可能不再适用。多目标优化最大的困难在于,由于问题原生地存在多个目标需要同时优化,这意味着这几个目标本身很难寻找到再对他们建模为一个统一目标的方法(像加权和优化那样就完全是将每个目标“元启发”了),甚至在实践中很容易发现优化的尽头是再想优化某一个目标可能会造成其他很多目标的退化,而且很可能是难以接受的退化。因此,不管是单目标化的多目标方法还是基于非支配的多目标优化方法,都是致力于需求多目标之间的“trade-off”。多目标优化问题的另一个难点体现在结果上面,由于目标有多个,许多算法的最终优化结果可能是一个集合,而除非是单目标化的方案(即使是单目标化,这种方法本事最大的挑战也是如何保证单目标化过程本身是可靠的),完全没有一个完美的方法能进一步评估这些结果中哪一个更好。一些应用情景中可能需要决策者(decision maker)主观挑选一个solution,以此衍生出基于“专家”(expert)的评估方法,但总之多目标优化在结果上是缺乏确定评估手段的。

本文从几个基本概念和算法入手,介绍多目标优化的基础理论,可以作为多目标优化算法学习的101。在此强烈推荐的是,本文的参考书目是 MIT Press 在2019年的开源书籍"Algorithms for optimization" (by Mykel J. Kochenderfer & Tim A. Wheeler) Algorithms for Optimization (algorithmsbook.com),这本书不如《凸优化》有名,但是对(启发式)优化算法的入门学习十分友好,语言简单精炼,全书包含数不胜数的优化算法,从一个又一个算法来讲述优化算法的各种理论和概念,包含了从基于梯度的传统单个体算法,到基于群体的进化算法,再到代理模型等较新的优化算法。公式不多,每个算法只讲要点,没有事无巨细但很适合初步了解各种算法,作为各种优化算法的索引学习工具书非常合适。包含了很多代码和可视化图来直观学习,作者选择Julia这一门非常适合算法设计和学习的语言,Julia学习也是异常简单,基本上看完作者在书末提供的10页教材就可以无障碍读懂书中几乎全部的算法代码。本文主要基于作者在 Chapter 12 Multi-objective Optimization 中的内容,加上个人学习的思考来完成。

Single-objective Transforming-based vs Pareto Fronts-based

书中第一节就直接介绍 Pareto Optimality (帕累托最优化),但其实作者在本章的引言就首先说明了,多目标优化目前有两种主要思路:一是将多目标函数转型为单目标函数,即基于单目标化,其中以加权和优化为代表;二是不考虑收敛到一个具体点,而是得到一个在每个目标都表现良好的解集合,具体来说就是基于 Pareto fronts (帕累托前沿)或者说基于 Nondomination (非支配),其中以非支配排序的优化算法如NSGA-II为代表。总得来说,基于单目标化是最简单而高效的,但实践中确定权重等”优先级信息“存在很大困难;基于帕累托前沿则相对妥协了,即不再最求多目标的极致平衡,而是利用非支配的评价逻辑将多目标问题简化了,同时基于帕累托前沿的算法往往要求优化算法重新设计,最终得到的算法相对就复杂了一些。

Domination & Pareto Fronts

按照书本的顺序,首先要说一下支配(domination)和帕累托前沿(Pareto fronts)两个关键概念,其实加权和等方法和概念更简单,但是这里作者可能考虑的是将帕累托前沿作为一个可视化的多目标优化指标先介绍比较好。

Domination

首先是支配(domination),这里花一大段讲一下它的提出动机,同时顺便引出基于单目标化方法的难题。在多目标优化中,除非多目标函数在每个目标维度上的梯度分布及其简单,否则解空间中几乎不可能存在 solution 在每一个目标维度上同时做到”最优“,而要知道几乎所有的优化算法都是围绕目标函数展开的,而对不同 solution 求解目标函数值并比较是最为基础的一个操作,而扩展到多目标后,如何比较多个目标?以二维目标空间为例,最清晰的情况是其中一个 solution 在两个维度上同时 better,而另一种情况是,一个 solution 在维度A的目标上 better,而另一个在维度B上 better。也许你会想,比较两个 solution 在各自擅长的维度上的”领先度“,即比较fA(x2)fA(x1)f_A(x_2) - f_A(x_1)fB(x1)fB(x2)f_B(x_1) - f_B(x_2),但这样合理吗?如果优化问题在目标维度A上尺度为10510^510710^7,而维度B上尺度为10310^{-3}10110^{-1},那么毫无疑问在维度A上占优的 solution 具备压倒性优势,多目标优化几乎变成单目标优化。当然很容易想到对目标函数值进行标准化,但是标准化只是在数学形式上进行的标准化(其实也和加权和是同理的),作为优化者,你如何肯定你的标准化做到了多个目标之间的 trade-off ?其实上述问题,就是后续要介绍到的基于单目标化的方法普遍面临的问题。一番折腾会发现,要确定一种完全确定的多目标评价方式,最终总会回归到多目标之间的平衡难题,解决方法基本只能通过问题本身入手,利用先验信息、专家经验等等额外手段启发式解决。 那么支配是怎么样的?支配的提出,即不再执着于在两个 solution 进行完全确定的”优“或”劣“的判断(在连续目标函数中,相等的情况可以忽略),而是在每一个单独目标的比较上,在评估能力上做出妥协:如果一个 solution 在所有目标上都不劣于另一个 solution 而且可以在至少某一个目标上 better,则该 solution ”支配“ 另一个 solution:

fi(x)fi(x)for all i in {1,..,m}andfi(x)<fi(x)for some i\begin{split} &f_i(x) \le f_i(x^{\prime}) \quad for \ all \ i \ in \ \{1,..,m\} \\ and \quad &f_i(x) < f_i(x^{\prime}) \quad for \ some \ i \end{split}

稍加思考上面的定义会发现,比起单目标的”优于“,”支配“的条件更苛刻,而另一个关键在于,有很多 solution 之间是”非支配的“,但”非支配的“的概念和”劣于“是完全不同的,”非支配的“即没有谁能完全超过谁,或者说各有长处,无法比较!

Pareto Fronts

利用支配的概念,对于一个群体中的所有 solution 个体,可以首先筛选出一个 set,其中的每个个体无法被 set 外的任何一个个体所支配,而这个 set 就是当前群体的帕累托前沿(Pareto fronts),如图1所示(注意横轴和纵轴都是目标函数因变量):

Multi-obj Opt - Fig 1 - Pareto fronts.png

在不使用单目标化方法的条件下,帕累托前沿就是最大限度能确定的”最优点集合“,集合中的点已经无法在进一步比较。围绕帕累托前沿的概念,衍生出一众算法旨在获取出帕累托前沿。需注意的是,解空间的帕累托前沿是理想化的概念,即考虑使用无限制的算力对整个解空间寻优得到的集合,而且决策变量是连续的情况下,集合中 solution 个数无法确定。实践中,求得的集合最多只是帕累托前沿中一部分有限的 points,甚至集合一些 point 并不是真正的帕累托最优点,但在讨论中我们假设算法得到的集合可以代表帕累托前沿。

12.1.3 介绍的就是最朴素的一种基于帕累托前沿的优化算法,但是显然这太浪费计算性能了,但所有的基于帕累托前沿的优化算法都确实遵循同样的逻辑:在每一次迭代中计算当前群体(基于帕累托前沿的优化算法天然地适合用群体优化算法来实现)的帕累托前沿,同时它将代表原始的单目标优化算法中的当前全局最优解的概念。

12.2.1 介绍的 constraint method 其实也是在帕累托前沿的基础上进行的,因为它没有为算法提供评估 solution 的多目标价值方法,只是提供了一种进一步缩小帕累托前沿范围的方法。它的原理也异常简单:为每个目标设立一个”容忍值“,只有每一个目标都低于容忍值的 solution 才被认为是 feasible。这种方法的优势就是简单易实现,但同加权和方法面临的难题类似,它也需要”专家“分析每个目标的需求并预设容忍值超参数甚至可能有必要进行调参。

Single-objective Transforming and Classical Weight Sum Methods

接下来正式开始介绍单目标化(Single-objective Transforming),在这一类方法中,几乎所有方法的原理都非常简单,但又都很难经受实践的考验,我们主要还是关注最经典的加权和方法(Weight Sum Methods),它是最常见的多目标优化方法,也是单目标化方法中比较靠谱的一个,但也同样面临所有单目标化方法的共同困境。

Lexicographic Method

Lexicographic Method (词典法)可以用原文中的一句短句概况:ranks the objectives in order of importance 。而词典法的原理的贡献是引出单目标化方法普遍需要确定的一个要素即目标优先级(objective priority)。

Multi-obj Opt - Fig 2 - Lexicographic Method.png

词典法依照目标优先级来对单个目标逐一优化,每个目标优化终止后对下一个优先级的目标进行优化,同时在随后的优化中增加该目标值的容忍值,直到所有目标完成优化。 之前我们说了,多目标优化的梯度信息复杂度相比单目标优化是指数级增长的,词典法的优化过程可以说是一种在”目标空间的“伪梯度下降。但实际上,词典法的最大问题是,它要求低优先级的单目标优化必须服从高优先级的目标在优化后确定的容忍值,也就是在完成高优先级的目标优化后,其他目标维度进行优化时,不允许在这个高优先级的目标维度上做到 worse,要知道梯度下降没有这样的限制,这简直是对低优先级目标的压迫( :( )!此外,词典法将问题分为MM(多目标优化的目标个数)个单目标优化,在MM维的目标空间上来看,词典法相当于在这些维度上依次走了MM次直线,这实在是显得有些笨拙了。 当多目标优化问题确实存在明确的优先级关系时,词典法确实是很吸引人的,至于”优先级压迫“问题,可以通过放宽高优先级目标优化结果的约束条件来解决(如增加一个容忍值增量,允许部分个体忽略这个约束进行等等)。然而需认识到,实际场景中目标优先级的确定并不容易。由于大量的优化算法是基于迭代过程的,很容易想到的另一种方案是,将每次单目标优化的迭代进程缩短,特别地如果每个目标只进行一代优化,依次完成每个目标的一代优化后,再重新从最高优先级开始循环这一过程。但这样做之后,优先级的意义已经逐渐褪去了(每轮的迭代次数越小,越是如此)。

Advantage of Lexicographic Method

  • 对目标优先级明确且优先级差异大的多目标优化很实用;
  • 简单易行。

Disadvantage of Lexicographic Method

  • 目标优先级带来的高优先级目标函数容忍度约束太强,限制了低优先级目标的搜索范围;
  • 分解为了多个单目标优化问题,在目标空间上目标向量的移动显得太”笨拙“。

Weighted Method

Weighted Sum Method

Weighted Sum Method 加权和方法如同所有其他单目标化方法一样具备简单、简单、非常简单的特征:

fws(x)=wTf(x)=iMwifi(x)whereiMwi=1f_{ws}(\textbf{x}) = \textbf{w}^T\textbf{f}(\textbf{x}) = \sum_{i}^{M}w_if_i(\textbf{x}) \\ where \quad \sum_{i}^{M}w_i = 1

和其他所有加权方法一样,加权和方法的核心就是一组”神奇“的权重系数向量w\textbf{w},它指明每一个目标在整体问题中的重要性并以量化的权重表示。不同于词典法的强制性优先级策略,加权方法认同每一个目标的价值,只是每个目标的价值各有高低。 需注意,每个子目标函数需要预先进行标准化处理,如果没有,可以去除iMwi=1\sum_{i}^{M}w_i = 1d的条件,利用权重来顺便完成子目标标准化。

加权和方法的诱人之处在于,每一个目标赋予了一个明确的重要度量化值——权重,同时多目标优化顺利地转变为纯粹的单目标优化。想象一下,假设实际多目标优化问题的 truth 就是多个子目标的线性和(当然也可能并不是这么简单的模型),如果能确定出那一组”神奇“的权重,就得到了该多目标优化的完美解决。权重,就相当于多目标空间世界通向这个多目标优化问题 truth 的桥梁,在后续的讨论中,我们会看到,加权和方法和加权方法就是寻找各种方法来确定出这样的权重向量,而权重向量确定困难的问题,或者或调参困难,就是加权方法同时也是其他大多数单目标化方法面临的最主要难题。不同于帕累托前沿方法需要在帕累托前沿集合中选择最终 solution 的烦恼,加权和方法的烦恼是,你怎么就知道最终得到的这个 point (也可能是少数几个 point是)就真的是最好的?换言之,你预设的这一组权重向量就是”答案“了吗?

Weighted Exponential Sum Method

和后面的 Goal Programming (目标规划)类似,只是加权指数和同时采用 goal point 和目标权重:

f(x)=i=1mwi(fi(x)yigoal)pf(\mathbf{x}) = \sum_{i=1}^{m}w_i\left(f_{i}\left(\mathbf{x}\right) - y_i^{goal}\right)^{p}

Weighted Min-Max Method

不做加权和!相当于采用了一种目标维度上的”贪心策略“,只关心所有目标维度中取最大值的维度,当然随着优化的进行,这个维度会动态变换。这种方法相对地弱化了对权重的调参需求,但是重点强调了每个目标函数的预先标准化/归一化的质量(增加的 goal point 也是用来完成这个任务),并且其实权重的设置也对此有影响,如果做不好的话,很容易发现优化时几乎只是对某一个目标优化。加权最小化最大值方法最好是能够在优化时实现频繁地切换(maxi\max_i中的ii一直在变),和词典法相比,优化过程的实施其实依然是多目标的(在算法上没有将问题分解为单目标优化,依旧可以同时在多个目标维度同时移动)。

f(x)=maxi[wi(fi(x)yigoal)]f(\mathbf{x}) = \max_i \left[w_i\left(f_{i}\left(\mathbf{x}\right) - y_i^{goal}\right)\right]

Exponential Weighted Criterion

旨在解决加权和不能得到非凸部分的帕累托前沿的问题。

Multi-obj Opt - Fig 3 - Weighted Sum Method canot obtain nonconvex Pareto fronts.png
f(x)=i=1m(epwi1)epfi(x)f(\mathbf{x}) = \sum_{i=1}^{m}(e^{p w_i} - 1)e^{p f_i(\mathbf{x})}

函数形式对目标函数的标准化/归一化同样提出了要求,pp参数的预设需要更加谨慎。

Advantage of Weighted Method

  • 多目标函数直接地转变为单目标函数,可以继承在单目标优化上的优化算法;
  • 在理想情况下,算法上限很高;
  • 可以得到单一或少数的 solution point ,对 decision maker 的要求更低。

Disadvantage of Weighted Method

  • 每一个目标都需要预设权重值,decision maker 变成了 weighted designer;
  • 即使最终得到了 solution point ,依然没有给出有效的评估依据,即无法用确定的方式判断当前使用的权重得到了最好的 solution,这是多目标优化问题的天然困境;
  • 要求对每个目标维度进行合理的标准化;
  • 部分加权方法增加了 goal point 和 pp 参数,增加了调参负担。

subpopulation single-objective: vector evaluated genetic algorithm

在从单目标化方法过渡到帕累托前沿方法之前,最后介绍一种特殊的单目标化方法:vector evaluated genetic algorithm(愿称之为objective partition-based multi-population GA),随后我们会了解到,群体优化算法天然地适合帕累托前沿方法,而 vector evaluated genetic algorithm 则是利用多群体的概念实现了另一种单目标化,即分别地、并行地完成每个目标维度的优化。算法的原理基本上就是由下图展示,每次迭代首先划分群体为mm个子群,每个子群负责一个目标维度(可以等比划分,也可以预设划分比,就像加权方法那样);在 Selection 中每个子群按照它们负责的目标维度完成选择操作,并 shuffle (洗牌)变回一个整体群体并完成后续的 Crossover 和 Mutation。

function vector_evaluated_genetic_algorithm(f, population, k_max, S, C, M)
    m = length(f(population[1]))      # Number of objectives
    m_pop = length(population)         # Population size
    m_subpop = m_pop ÷ m              # Number of individuals per subpopulation

    for k in 1 : k_max
        ys = f.(population)           # Evaluate the population using the objective functions
        # Selection: Select individuals based on some criteria (S) from the population
        parents = select(S, [y[1] for y in ys])[1:m_subpop]
        # Iterate over the remaining objectives and select individuals for them
        for i in 2 : m
            subpop = select(S, [y[i] for y in ys])[1:m_subpop]
            append!(parents, subpop)   # Append selected individuals to the parents list
        end

        # Randomly shuffle the indices
        p = randperm(2m_pop)
        # Define a function p_ind to map the shuffled indices to selected individuals
        p_ind = i -> parents[mod(p[i] - 1, m_pop) + 1][(p[i] - 1) ÷ m_pop + 1]
        # Create pairs of parents for crossover
        parents = [[p_ind(i), p_ind(i + 1)] for i in 1 : 2 : 2m_pop]
        # Perform crossover (C) on the selected parent pairs to create children
        children = [crossover(C, population[p[1]], population[p[2]]) for p in parents]
        # Mutate (M) the children to introduce genetic diversity
        population = [mutate(M, c) for c in children]
    end
    return population
end

vector evaluated genetic algorithm 很有意思,首先不需要预设权重也可以执行,整体的优化逻辑基本和原始的遗传算法是一致的,由于只有 Selection 步骤需要关系个体的适应度,在 Selection 介绍后重新洗牌不再分群,这也意味着以往在 Crossover 和 Mutation 操作上实现的创新都可以继承。算法的原理有点像无优先级的”交叉式“词典法,即使需要引入优先级,也可以通过改变子目标子群的比例来实现。 但算法依然很容易呈现将多目标拆解为单目标的方法常见的结果,在可视化上, solution 可能偏爱垂直于目标空间的区域:

Multi-obj Opt - Fig 4 - Vector Evaluated Genetic Algorithm Gen 4.png

Goal Programming

插一段 Goal Programming ,它相当于 Weighted Exponential Sum 的源算法,只不过没有引入权重,但事实上它是利用 goal point 来完成权重的任务(同时也可能一样需要进行一些标准化和归一化),LpL_p范数也只是提供了多种选择来计算到 goal point 的距离。有关 goal point 的预设,首先它当然是一个”优解“,可以是 infeasible 也可以是 feasible ,通过在各个目标维度上调整 goal point ,其实就是调整优先级权重的另一种形式。

Nondomination Method

Nondomination Ranking

首先回顾之前的帕累托前沿概念,对于一个群体或一个 solution set,通过 Nondomination 判断可以确定出群体的帕累托前沿,那么将这些 solutions 剔除再确定帕累托前沿,循环如此,最终可以形成多个 level 的帕累托前沿。在可视化上,群体被绘制为一个”洋葱“,每一层拥有相同的 level。

Multi-obj Opt - Fig 5 - Nondomination levels.png

Nondomination Ranking 提供了多目标的一种离散评估方式,且不像加权和目标函数与权重之间的”不信任“(加权和目标函数可以确定的评估所有目标向量,但这是在对权重的完全信任基础上才成立的),Nondomination Levels 的不同 level 之间是确定的优劣关系,而代价是,同一 level 之间无法进一步比较。好消息是,优化算法更多关系 better solution,而群体优化可以通过增加群体规模来增长 level 层数,减少 帕累托/总群 比例(越小说明筛优能力越好)。还有一个问题是,Nondomination Levels 是”迭代动态的“,即上一次迭代的 level n 和本次迭代的 level n 可能不可比较,因此 level 的量化能力只在本次迭代中有效力。

当群体优化进入多目标优化世界,一个在单目标优化中的概念——多样性——发生了一些变化。单目标优化中,多样性即 solution 在解空间的分散度,提升多样性有利于充分搜索(exploration)整个解空间,并挖掘未涉及子区域的优化潜力。而多目标优化中,解空间的多样性同样主要,但额外地,同时更重要地,需要关注目标空间的多样性。而多目标优化的目标空间有一个特点,相当于解空间的可行域可以由约束条件显示确定,目标空间可行域的确定需要约束条件和多种 solution (多种 solution 可能会得到同样或近似的目标向量)经过目标函数计算才能确定,所以目标空间的可行域是难以确定的(expensive)。在可视化上,当你期望算法能填补目标空间的一处空白时,你还需要考虑这一片空白区域到底是不是可以达到的。

Pareto Filters

帕累托过滤器,设计了一个过滤器的概念来存放每一次迭代后的帕累托前沿,迭代并更新了群体后后,非支配个体加入其中,被支配个体被淘汰踢出,此外还设计了机制处理过滤器超载的情况。帕累托过滤器就像是基于非支配的精英策略(Elitist Strategy),过滤器中的个体同样也是会参与群体迭代(具体方式书中没有说明,但有*"Individuals from the Pareto filter can be injected into the population, thereby reducing the chance that portions of the Pareto frontier are lost between generations."*一句,详情可阅读原论文)。

Niche Techniques

这一节介绍了 Niche 的概念,其实就是目标空间的多样性。介绍了一些保证目标空间多样性的手段,同时 Niche 也用来进一步评估同 level 的互相非支配解,常用于筛选已知集合,剔除集合中和其他解在目标空间上挨得过近的解。这种逻辑在于,多目标优化问题本身已经不能在评估这些解了,而相互紧凑的解在 set 中缺乏不可替代性,删除它们从而鼓励了帕累托前沿的分散度,拔高优化器的”目标空间搜索能力“。但是这带来一个问题,一个解和其他解在目标空间上紧凑,但是可能在解空间上,这个解和其他解距离很远,所以它在解空间上是有价值的。

Niche 的用处很多,可以用于集合超载时筛选解元素,用于保持帕累托前沿的目标空间多样性。特别地,在遗传算法的 Selection 中,可以规定不去选择那些在目标空间上靠的太近的解,还可以规定只选择非支配解个体。

Determinate Weighted by Expert: Preference Elicitation

最后,Preference Elicitation 为前面的加权方法画上一个相对完美的句号。既然加权方法有那样的潜力,探索权重搜索技术变成了一个新话题。讨论的基础依然建立在本身的多目标优化问题缺乏目标优先级的相关信息,当然也更不可能再寻找可靠的建模来对多目标函数降维(再强调一下,如果可以的化,这个问题本身就不应该被分析、建模为多目标优化问题)。所以话题的答案就是”专家“(Expert),就是”人“,利用专家的主观判断,来对无法再通过支配评估的一对目标向量给出偏好。人类自然不如机器高效,所以一些方法用来让专家只需要做出有限的判断,就能获取丰富的专家偏好信息,利用这些信息来确定权重向量。