斯坦福-CS264-超越最坏情况分析笔记-全-

斯坦福 CS264 超越最坏情况分析笔记(全)

001:引言与动机示例

在本节课中,我们将学习为什么需要超越传统的“最坏情况分析”来评估算法性能。我们将通过三个具体的例子来展示最坏情况分析的局限性,并介绍一个重要的新概念——“实例最优性”。

课程概述与动机

大家好,欢迎来到CS264课程。这是一门关于“超越最坏情况分析”的高级或硕士级别的算法课程。今天,我们将从几个动机示例开始,回顾我们为什么使用最坏情况分析,以及为什么有时需要替代方案。然后,我将介绍本课程的第一个核心概念:实例最优性。

示例一:缓存问题

首先,我们来讨论缓存问题。这是一个你可能在算法或系统课程中见过的问题。系统有两种内存:缓存(小而快)和主内存(大而慢)。程序请求数据时,如果数据在缓存中,可以直接读取;如果不在,则会发生“缺页”或“缓存未命中”,此时需要从缓存中驱逐一个页面,并将请求的页面调入缓存。

这里的关键算法问题是:当需要驱逐页面时,应该驱逐哪一个?

考虑一个能容纳4个页面的缓存。假设请求序列的前四个页面是A、B、C、D。它们被调入缓存。随后,程序再次请求B和A,这些页面已在缓存中,没有问题。但当请求一个新页面E时,缓存已满,必须从A、B、C、D中驱逐一个。如果接下来请求F,则需要再次驱逐一个页面。

如果我们能预知未来,最优策略是驱逐未来最晚被请求的页面。这是一个经典的最优贪心算法。然而,在实际中,我们无法预知未来,因此需要启发式算法。

以下是两种常见的启发式算法:

  • 先进先出:驱逐最早进入缓存的页面。在上面的例子中,当E到达时,FIFO会驱逐A。
  • 最近最少使用:驱逐最近一次使用时间最早的页面。在上面的例子中,当E到达时,LRU会驱逐B。

那么,哪个算法更好呢?这取决于未来的请求序列。如果接下来请求A,你会后悔使用了FIFO;如果接下来请求C,你会后悔使用了LRU。

在实践中,LRU通常是黄金标准,因为它基于一个合理的直觉:最近被访问过的数据,很可能很快再次被访问。LRU模拟了“假设未来与近期过去相似”的最优算法。

然而,从理论角度解释为什么LRU在实践中优于FIFO是具有挑战性的。这需要我们对真实数据的特性(如局部性)进行建模,而这在传统的、不关心数据特性的最坏情况分析框架中是做不到的。我们将在后续课程中探讨如何建立这样的理论。

示例二:线性规划问题

第二个例子来自线性规划。线性规划问题是在一个由线性不等式定义的可行域(例如高维空间中的多面体)内,最大化一个线性目标函数。

在实践中,求解线性规划的黄金标准算法是单纯形法。它在处理各种实际数据集时,运行时间通常接近线性时间(与变量维度相关),非常高效。

然而,最坏情况分析对单纯形法的评价如何呢?Klee和Minty在1970年证明,对于某些精心构造的线性规划问题,单纯形法的最坏情况运行时间是指数级的。这与其实践中接近线性的表现相去甚远,预测完全错误。

更糟糕的是,存在一些在最坏情况下具有多项式时间复杂度的算法(如椭球法),但它们在实践中的表现远不如单纯形法。

因此,我们面临双重问题:

  1. 最坏情况分析对单纯形法的性能给出了灾难性的悲观预测。
  2. 如果严格遵循最坏情况分析的结论,我们会选择错误的算法(椭球法而非单纯形法)。

这促使我们发展新的理论(如平滑分析)来解释单纯形法在“几乎所有”实际输入上的优异表现。我们将在课程中后期详细讨论。

示例三:聚类问题

第三个例子是聚类(或无监督学习)问题。目标是从未标记的数据中发现有意义的组别,例如将图片分为“猫”和“狗”。

通常,人们通过定义目标函数(如K均值或K中心点)并将其优化来形式化聚类问题。

理论(最坏情况分析)告诉我们,对于这些标准的目标函数,找到最优聚类是NP难问题。

然而在实践中,人们使用快速算法通常能得到有意义的结果,可以成功区分出不同的类别。

这里的不匹配在于:聚类问题之所以困难,似乎只出现在那些本身就没有清晰、有意义的聚类结构的实例上。而对于我们真正关心的、存在有意义聚类的实例,问题应该更容易解决。我们希望理论能够区分这些情况,并证明算法在“重要”的实例上表现更好。这是近年来一个热门的研究方向。

数学分析算法的目标

在深入探讨替代方案之前,让我们明确一下对算法进行数学分析的目标。主要有三个不同的目标:

  1. 预测或解释经验性能:为一个已有的算法提供其实际表现的理论预测或解释。例如,解释为什么单纯形法如此快速。
  2. 为算法排序:比较不同算法的性能,指导实践者选择最佳算法。例如,在最短路径问题中推荐Dijkstra算法。
  3. 指导新算法的设计:提供一个衡量标准(如最坏情况时间复杂度),激励人们设计出具有更好理论保证的新算法。

最坏情况分析在目标3上取得了巨大成功,催生了大量新算法和数据结构。在目标2上,它有时能给出好建议(如排序算法),有时则不能(如缓存和线性规划)。对于目标1,最坏情况分析本质上并非为此设计,其预测可能极不准确。

最坏情况分析的优缺点

最坏情况分析总结算法A的性能时,只关注其在所有大小为n的输入Z上的最差成本(如运行时间):
cost_worstcase(A) = max_{Z: |Z|=n} cost(A, Z)

优点:

  1. 强大的保证:如果算法具有良好的最坏情况上界,那么它在任何输入上表现都好。
  2. 易于分析:许多经典算法的最坏情况分析相对简单明了。
  3. 无需领域知识:算法保证适用于所有输入,无需对数据做任何假设。

缺点:

  1. 过于悲观:可能导致对算法经验性能的严重误判(如单纯形法)。
  2. 可能导致错误排序:基于悲观分析可能推荐实践中更差的算法。
  3. 缺乏数据建模:其“Murphy定律”模型(总出现最坏输入)无法体现真实数据的特性(如局部性),而这些特性对于理解某些算法的优越性(如LRU缓存)至关重要。

实例最优性简介

最后,我们介绍一个旨在更好地实现目标2(算法排序)的概念:实例最优性

如果我们想无可争议地说明算法A优于算法B,最理想的情况是A每一个输入Z上的成本都不高于B
cost(A, Z) <= cost(B, Z) 对所有Z成立

由此引申,算法A被称为实例最优,如果它支配其他所有算法,即对于所有算法B和所有输入Z,上述不等式都成立。

这是一个非常强的定义。实际上,对于非平凡的问题,很难找到严格满足此定义的算法。因此,我们需要两个合理的放松条件:

  1. 允许常数因子:允许AB稍差一些,但差距不超过一个常数倍(如2倍)。
    cost(A, Z) <= c * cost(B, Z) 对所有Z成立
  2. 限制算法类别:只要求A支配所有“自然”的算法,排除那些通过“记忆”特定输入答案来作弊的不合理算法。

在本周三的课程中,我们将看到一个来自计算几何(寻找点集的最大值点)的经典分治算法,它正是这种放松意义上的实例最优算法。家庭作业也将引导你探索另一个实例最优算法的例子。

总结

本节课我们一起学习了超越最坏情况分析的动机。通过缓存、线性规划和聚类三个例子,我们看到了最坏情况分析在预测性能、指导实践方面的局限性。我们明确了算法数学分析的三个不同目标,并分析了最坏情况分析在达成这些目标上的表现。最后,我们引入了实例最优性这一概念,作为在无需权衡不同输入的情况下,强有力地声明一个算法“最优”的途径。在接下来的课程中,我们将深入探讨包括实例最优性在内的多种替代分析框架。

002:实例最优几何算法 🧮

在本节课中,我们将学习一个称为“实例最优性”的强大概念。我们将通过一个具体的几何问题——二维最大值问题——来探索这个概念。我们将分析一个优雅的分治算法,并证明它在一种非常强的意义上是最优的:对于每一个可能的输入,该算法的性能都几乎与任何其他“自然”算法一样好。


问题定义:二维最大值问题

我们首先来定义要解决的问题。这是一个计算几何中的经典问题。

输入:平面上的 N 个点。为简单起见,假设所有点的 x 坐标和 y 坐标均不相同(即没有平局)。

输出:所有“未被支配”的点,也称为“最大值点”。

支配的定义:一个点 Y 支配另一个点 X,当且仅当 Y 的 x 坐标和 y 坐标都严格大于 X 的相应坐标。你可以将其想象为 Y 位于 X 的东北方向。

最大值点:一个点如果没有被输入中的任何其他点支配,那么它就是一个最大值点。从几何上看,这些点构成了点集的“东北边界”或“阶梯”。

目标:给定所有点,识别出所有的最大值点。


算法介绍:Kirkpatrick-Seidel 算法 (1985)

我们将要分析的算法是 Kirkpatrick 和 Seidel 在 1985 年提出的一个优雅的分治算法,简称 KS 算法。

该算法的核心思想是递归地处理点集,并在每一步识别并输出一个最大值点,同时“修剪”掉被该点支配的所有其他点。

以下是算法的伪代码描述:

def KS_2D_Maxima(points):
    if len(points) <= 1:
        return points  # 单点自然是最大值点

    # 1. 根据 x 坐标的中位数将点集分为左右两部分
    median_x = find_median_x(points)
    left = [p for p in points if p.x < median_x]
    right = [p for p in points if p.x >= median_x]

    # 2. 在右侧点集中找到 y 坐标最大的点 Q
    Q = point_with_max_y(right)

    # 3. 将 Q 加入输出结果(它是一个最大值点)
    output = [Q]

    # 4. 删除 Q 以及所有被 Q 支配的点(这些点不可能成为最大值点)
    remaining_points = [p for p in points if not (p.x <= Q.x and p.y <= Q.y)]

    # 5. 对剩余的点集(包括左半部分和右半部分未被删除的点)进行递归
    output += KS_2D_Maxima(remaining_points)
    return output

算法正确性简要说明

  • 在右侧找到的具有最大 y 坐标的点 Q,其 x 坐标大于等于左侧所有点,且 y 坐标大于等于右侧所有点,因此它不可能被任何点支配,是一个确定的最大值点。
  • 删除被 Q 支配的点是安全的,因为它们不可能成为最大值点。
  • 递归处理剩余点时,可以证明,左侧剩余的点由于其 y 坐标都高于 Q(否则已被删除),因此也不会被右侧的任何点支配。递归的正确性得以保持。

运行时间分析:从粗略到精细

上一节我们介绍了 KS 算法的基本框架。本节中,我们来看看如何深入分析它的运行时间。我们主要关心算法执行的比较次数(比较 x 或 y 坐标)。

初始观察:最坏情况 O(N log N)

很容易看出,该算法在最坏情况下的运行时间为 O(N log N)。递归树最多有 O(log N) 层,每层处理所有点所需的工作量是线性的(找中位数和修剪都是线性时间)。这与归并排序的递归式类似。

第一次改进:输出敏感分析 O(N log H)

我们可以得到一个更精细的界限,其中 H 是输出中最大值点的数量。

直观理解:算法的每个递归调用都会识别并输出一个最大值点。如果总共只有 H 个最大值点,那么递归树的深度不可能超过 O(log H)。结合每层 O(N) 的工作量,总时间上界为 O(N log H)。当 H 很小时(例如只有一个最大值点),这个界限远优于 O(N log N)。

第二次改进:基于“合法划分”的精细上界

然而,O(N log H) 仍然不是最紧的。存在一些点集,其 H 很大,但 KS 算法仍然运行得很快。为了捕捉这一点,我们需要一个更精细的参数化分析。

核心定义:合法划分
给定点集 S,一个合法划分将其分成若干组 S₁, S₂, ..., S_k,满足:每组要么是单个点,要么该组中的所有点可以被一个完全位于“阶梯”(即最大值点构成的边界)之下的矩形框所包围。

直观理解:如果一个组能被这样一个框包围,意味着存在一个最大值点(框的东北角)可以一次性“消灭”(支配)该组中的所有点。因此,包含大组的划分对应于“简单”的输入,因为算法可以通过少数几次识别就修剪掉大量点。

定理(精细上界)
对于任意点集 S,KS 算法所需的比较次数最多为:

O( min{ Σ_{i=1 to k} |S_i| * log (N / |S_i|) } )

其中,最小值取遍所有可能的合法划分 {S₁, ..., S_k}

这个公式意味着什么?

  • |S_i| 是第 i 组的大小。
  • log (N / |S_i|) 项可以理解为:对于一个大组(|S_i| 接近 N),这项很小,该组对整个时间复杂度的贡献就小。
  • 求和项 Σ |S_i| * log (N / |S_i|) 衡量了该划分下算法的“工作量”。
  • 取最小值意味着我们考虑的是能最紧密地描述点集结构(即最容易修剪)的那个划分。

如何证明这个上界?
证明的关键思路是跟踪每个组 S_i 中的点随着递归深入是如何被逐步修剪掉的。

  1. 两个上界:在递归的第 j 层,S_i 中剩余的点数最多为 min( |S_i|, N / 2^j )。第一个界限 |S_i| 是平凡的;第二个界限 N / 2^j 源于算法递归地根据 x 坐标中位数进行分割的性质。
  2. 求和:对递归的所有层 j 求和,S_i 贡献的总比较次数约为 |S_i| * log (N / |S_i|)
  3. 总计:对所有组 S_i 求和,即得到定理中的表达式。

这个上界比 O(N log H) 更紧,因为它考虑了点的聚集程度,而不仅仅是输出数量。


实例最优性:匹配下界

上一节我们得到了 KS 算法非常精细的上界。本节中,我们来看看为什么这个算法在某种意义上是最优的。我们想要证明,对于每一个输入,任何其他“合理”的算法都不会比 KS 算法做得更好(至多相差一个常数因子)。

挑战:记忆化算法的诡计

一个天真的想法是宣称:对于每个输入 Z,任何正确算法所需的比较次数都是 Ω( KS_算法在Z上的时间 )。但这不正确。考虑一个“记忆化”算法:它预先硬编码了某个特定输入 Z₀ 的答案。当实际输入恰好是 Z₀ 时,它可以在线性时间内输出答案,而 KS 算法在 Z₀ 上可能需要 O(N log N) 时间。这打破了上述下界断言。

解决方案:关注“顺序无关”算法

问题的关键在于,记忆化算法严重依赖于输入点的呈现顺序。而 KS 算法的分析(以及我们给出的精细上界)完全只依赖于点的无序集合本身,与输入顺序无关。

核心定义(非正式):如果一个算法的(最坏情况)运行时间分析仅依赖于输入点的无序集合,而不依赖于这些点被给出的顺序,则称其为“顺序无关”的。

定理(实例最优性下界)
对于任何(可能是不自然的)算法 A,考虑它在某个点集 S(无序)上的最坏情况运行时间(即,遍历所有 N! 种输入顺序,取最慢的那个)。那么,这个最坏情况运行时间至少是 Ω( min{ Σ |S_i| * log (N / |S_i|) } ),其中最小值同样取遍所有合法划分。

这意味着什么?

  • 即使对手以最坏的顺序向你提供点,任何算法也至少需要这么多比较次数才能解决问题。
  • KS 算法的精细上界与这个下界匹配(至多常数因子)。
  • 因此,KS 算法是实例最优的:对于每一个无序点集 S,在最坏输入顺序下,它的性能与任何其他算法(无论是否自然)一样好。

下界证明思路简介
证明主要基于两种方法:

  1. 计数论证:任何正确算法都必须为每个被删除的非最大值点提供一个“见证点”(支配它的点)。所有见证关系的编码长度存在一个信息论下界,这个下界与我们定义的合法划分的复杂度相关联。
  2. 对手论证:对手可以动态地决定点的揭示顺序。每当算法进行一次比较时,对手就以一种尽可能隐藏最大值点信息、迫使算法进行更多比较的方式来回答。

总结与启示

本节课我们一起学习了“实例最优性”这一强大概念,并通过二维最大值问题进行了深入探讨。

核心要点总结

  1. 问题:二维最大值问题,寻找平面点集中的东北边界点。
  2. 算法:Kirkpatrick-Seidel 分治算法,通过递归找中位数、识别最大值点并修剪来解决问题。
  3. 精细分析:我们得到了算法运行时间的一个非常精细的上界,该上界由点集的一个称为“合法划分”的结构特性所参数化:O( min Σ |S_i| * log (N / |S_i|) )
  4. 实例最优性:我们了解到,存在一个匹配的下界,表明任何算法(在最坏的输入顺序下)都需要至少这么多比较次数。因此,KS 算法是实例最优的(在顺序无关的意义上)。
  5. 意义:这个结果令人惊讶,因为它表明对于一个基础问题,存在一个算法在每一个输入实例上都几乎是最优的。这超越了传统的最坏情况或平均情况分析。

实例最优性是一个很高的标准,通常难以达到。二维最大值问题因其结构特性(如支配关系的传递性和基于比较的模型)而成为展示这一概念的完美例子。在后续课程中,我们将探索更多参数化分析和超越最坏情况分析的技巧。

003:在线分页与资源增强

在本节课中,我们将要学习在线分页(或缓存)问题,并探讨传统最坏情况分析的局限性。我们将介绍两种分析技术:资源增强和宽松竞争性分析,它们旨在提供更有意义的最坏情况性能保证。

课程概述与背景

上一讲我们介绍了算法分析的不同目标。本节中,我们来看看如何将这些目标应用于一个具体问题——在线分页。

首先,让我们明确一下本课程在整个计算机科学教育中的定位。本科算法课程主要关注算法设计,为学生提供一个工具箱。而本课程则侧重于算法分析的工具箱。我们将学习多种分析框架,没有一种方法是万能的,但掌握多种工具能帮助我们更好地理解算法性能。

在线算法领域诞生于20世纪80年代中期。“在线”一词在此特指数据随时间到达,算法必须在不知道未来的情况下做出不可撤销的决策,就像我们周一讨论的分页问题一样。

在线分页问题与竞争比

让我们快速回顾一下分页(或缓存)问题。你有一个小型快速内存(缓存),可以容纳K个页面。有请求随时间到达,请求页面序列。如果请求的页面已在缓存中(命中),则可以直接访问。如果不在缓存中(缺页),则必须将其调入缓存,并驱逐另一个页面。这就是算法需要解决的问题:设计缓存策略,决定在缺页时驱逐哪个页面。

我们关注的性能指标是算法在请求序列Z上产生的缺页次数

分析在线算法的传统主导范式是竞争比。其定义如下:

给定一个在线算法A和一个输入序列Z,我们查看算法A产生的成本(即缺页次数)。然后,我们将其与针对该序列Z的最优离线算法(即拥有未来全部知识的算法)产生的最优成本进行比较。对于分页问题,最优离线算法就是“最远将来”算法。

竞争比就是这个比值在最坏情况输入Z上的最大值:

竞争比(A) = max_Z [ 成本(A, Z) / 成本(OPT, Z) ]

这个比值总是至少为1。越接近1,说明在线算法越能模拟最优离线算法。竞争比将算法的整个性能概况压缩成一个数字,其优点是可以明确地对算法进行排序。

值得注意的是,竞争比的定义与我们上周讨论的实例最优性密切相关。如果一个算法的竞争比至多为α,那么它就是以近似比α实例最优的。实际上,竞争比的要求更强,因为它要求算法在线,却要与最优离线算法比较。

竞争分析在分页问题中的应用

接下来,我们将竞争分析应用于分页问题,并看看结果如何。在此过程中,请记住我们分析算法的三个目标:

  1. 提供对观测性能的良好数学模型或预测。
  2. 获得对算法的良好序数排名。
  3. 提供一个基准,以鼓励设计新算法。

首先,我们看看能证明什么。由于竞争比的要求非常强,下界应该很容易得到。

定理:每个确定的在线分页算法的竞争比至少为K,其中K是缓存大小。

证明思路
假设世界上总共只有K+1个不同的页面。对于任何确定的算法A,对手可以构造一个请求序列:在每一步,都请求当前不在A缓存中的那个页面。这将导致A在每一步都发生缺页。
然而,最优离线算法(最远将来)可以做得更好。由于只有K+1个页面,每次缺页后,它都可以驱逐一个在未来最久不会被请求的页面,从而在接下来的K-1步内都不会再发生缺页。
因此,对于长度为T的序列,A的缺页次数约为T,而OPT的缺页次数至多为T/K。所以竞争比至少为K。

这个结果意味着什么?

  • 在性能预测方面:这个下界(例如,K可能很大)并不能准确反映像LRU这样在实践中表现良好的算法的实际性能。
  • 在定性建议方面:它似乎暗示增加缓存大小无助于改善性能(因为下界随K线性增长),这显然与系统设计的常识不符。

那么,是否有算法能达到匹配的上界呢?这里有看似好消息的结果。

定理:LRU(最近最少使用)算法的竞争比恰好为K。

证明思路
固定一个请求序列σ。为了分析,我们将序列分解成“块”。从序列开始扫描,一个块是满足以下条件的最大连续子序列:只包含K个不同的页面请求。

  1. LRU的上界:在任何一个块内,LRU最多发生K次缺页。因为LRU对同一个块内的每个不同页面最多缺页一次。
  2. OPT的下界:考虑“偏移块”(从第i块的第二个请求开始,到第i+1块的第一个请求结束)。在任何这样的偏移块中,OPT都至少会发生一次缺页,因为其中包含了K+1个不同的页面请求。
    假设序列被分解成B个块,那么LRU的缺页数 ≤ K * B,OPT的缺页数 ≥ B-1。因此,竞争比 ≤ K * B / (B-1) ≈ K。

所以,在竞争分析的意义上,LRU是一种最优的在线确定性算法,没有其他算法能有严格更小的竞争比。这似乎很好地实现了我们的第二个目标(算法排序)。

然而,问题出现了。考虑另一个算法“满则清空”:每当缓存已满且发生缺页时,就清空整个缓存。上述证明中的上界分析对“满则清空”算法同样成立!因此,它的竞争比也是K。但显然,在实践中LRU远优于“满则清空”。这表明竞争分析在区分不同算法方面粒度不够细。

总结竞争分析对分页问题的“成绩单”:

  • 问题一:性能预测不准确,且关于缓存大小的隐含建议不具意义。
  • 问题二:无法有效区分不同算法(如LRU和满则清空)。
    本节课将主要深入探讨第一个问题,后续课程将关注第二个问题。

资源增强

资源增强是一个巧妙的想法,旨在获得更有意义的性能保证。其核心思想是:削弱我们的竞争对手。在分页的语境下,资源就是缓存大小。

我们不再比较算法A(如LRU)与拥有相同缓存大小K的最优离线算法OPT,而是比较:

  • 拥有更大缓存(大小为K)的算法A
  • 与拥有较小缓存(大小为H < K)的最优离线算法OPT

或者等价地,比较拥有原始缓存大小K的A与拥有更小缓存的OPT。这相当于给OPT戴上了“镣铐”。

为什么这样做?我们之前对LRU的分析可以轻松扩展,得到这种不对称比较下的保证。

回顾之前的证明,我们有过:

  • LRU(缓存大小K)在每个块内最多K次缺页。
  • OPT(缓存大小K)在每个偏移块内至少1次缺页。

如果OPT的缓存大小只有H < K,那么在每个偏移块内,OPT至少会有 K - (H-1) 次缺页。因为在一个偏移块中,有K个不同于当前页面的请求,而OPT的小缓存最多只能容纳H-1个其他页面,剩下的都会导致缺页。

因此,我们得到资源增强下的保证:

成本( LRU with cache K ) ≤ K * 成本( OPT with cache H ) / (K - H + 1)

例如,如果我们的算法拥有两倍于OPT的缓存(即K ≈ 2H),那么竞争比约为2,而不再是K。性能预测变得与缓存大小K无关,这是一个显著的改进。

但是,这种比较似乎是“苹果与橘子”——一边是拥有大缓存但无预知能力的算法,另一边是拥有预知能力但缓存较小的算法。我们如何解释这种保证呢?

有两种解释:

  1. 系统设计启示:它提供了一种模块化的系统设计思路。首先,假设你能预知未来(运行OPT),确定满足性能目标(如缺页率低于0.01%)所需的缓存大小。然后,在实际使用LRU时,只需将缓存大小翻倍,你仍然能满足性能目标。这解释了为什么更大的缓存是有益的。
  2. 推导出公平比较下的保证:更酷的是,资源增强保证可以自动转化为算法在相同缓存大小下进行比较时的非平凡保证。这就是Neil Young在90年代末证明的精彩结果。

Young定理:从资源增强到公平比较

Young定理的核心是:即使资源增强看起来是不对称的比较,但它能推导出关于LRU在大多数缓存大小下表现“非常好”的结论。

非正式表述:对于大多数缓存大小K,LRU要么是常数竞争比的,要么其缺页率极低。

这里有两个关键技巧来规避之前那个K的下界:

  1. 两种“好”的标准:我们不仅接受小的竞争比(接近1)作为“好”,也接受极低的绝对缺页率(例如ε)作为“好”。如果几乎不缺页,那么竞争比大一点也无所谓。
  2. 允许少数“倒霉”的缓存大小:我们只对大多数缓存大小做出保证,允许一小部分(δ比例)的缓存大小K表现不佳。这很合理,因为我们不希望请求序列是专门针对某个特定缓存大小K精心设计的。

证明思路(简述)
固定一个请求序列σ。考虑给LRU增加B个额外的缓存页(总大小K+B),并与缓存大小为K的OPT比较,我们有资源增强不等式。
对于某个缓存大小K,如果给LRU增加B页能使其性能大幅改善(例如缺页数减半),我们称K为“坏”的缓存大小。否则为“好”。

  • 对于“好”的K,我们可以利用资源增强不等式推导出,即使在与缓存大小相同的OPT比较时,LRU也具有常数竞争比。
  • 对于“坏”的K,如果存在很多这样的K,那么通过将它们串联起来,我们会发现:当缓存大到一定程度时,LRU的缺页数会变得极其少(指数级小),即缺页率低于ε。
    因此,对于每个序列σ,要么大多数缓存大小下LRU是常数竞争的,要么在那些缓存大小下LRU的缺页率极低。

Young定理形式化表述
对于任意选择的ε, δ > 0,以及任意缓存大小上界N,对于所有请求序列σ,除了最多δ比例的缓存大小k ∈ {1, ..., N},以下两者至少有一个成立:

  1. LRU相对于OPT(相同缓存大小k)的竞争比为常数(具体为O(1/δ * log(1/ε)))。
  2. LRU的缺页率至多为ε(即缺页数 ≤ ε * |σ|)。

这个定理参数众多,但算法(LRU)是固定的。我们可以根据需要选择ε和δ来获得不同的保证。

总结

本节课中,我们一起学习了在线分页问题以及传统竞争分析的局限性。我们看到,纯粹的竞争分析会给出过于悲观且无法区分算法的保证。

为了获得更有意义的性能预测,我们引入了资源增强技术,通过让在线算法拥有比离线对手更多的资源来进行比较。这种方法不仅产生了更合理的量化保证,还能通过Young定理推导出在公平比较(相同缓存大小)下,LRU在大多数缓存大小上要么是常数竞争的,要么具有极低的缺页率。

这解决了我们关于性能预测的第一个主要关切。然而,它仍然没有解决区分不同算法(如LRU与FIFO)的问题。在下一讲中,我们将通过更精细地数据建模(例如,考虑数据局部性)来尝试解决这个问题。

004:在线分页的参数化分析 🧠

在本节课中,我们将学习参数化分析,并将其应用于我们周一讨论过的在线分页问题。我们将探讨如何通过数据的局部性来参数化缓存算法的性能,从而最终能够严谨地说明最近最少使用策略优于其他策略,如先进先出。

概述

上一节我们介绍了资源增强的概念,它通过改变基准(与拥有更小缓存的离线最优解比较)来提供更有意义的性能保证。然而,它并未在区分不同算法(如LRU和FIFO)方面取得进展。本节中,我们将通过参数化分析来解决这个问题。

参数化分析的核心思想是,根据某种衡量输入“难易程度”的参数来对算法性能进行更精细的分析。对于分页问题,这个参数将量化请求序列的局部性。

什么是参数化分析?📊

参数化分析是一种以可分析的粒度来思考算法性能的方法。其步骤如下:

  1. 自然参数化:为所有可能的输入找到一个自然的参数。直观上,这个参数应能衡量特定输入的“难易”程度。例如,我们希望分页序列在具有更多局部性时变得更“容易”。
  2. 连接参数与性能:将输入的“容易”程度与算法的性能联系起来。我们希望算法的性能(如缺页次数、运行时间)可以表示为该参数的函数。理想情况下,随着输入变得更容易,算法的性能会越来越好。

我们已经在上一周的Kirkpatrick-Seidel算法中看到了一个很好的例子。我们首先用输入规模 n 参数化,得到 O(n log n) 的界限;然后加入输出规模 h,得到 O(n log h);最后,我们使用了一个更精细的参数(所有合法划分的最小熵和),从而精确刻画了算法的运行时间。

为何要进行参数化分析?

进行参数化分析主要有两个动机:

  • 指导算法选择:如果你已经实现了一个算法,精细的性能分析可以告诉你它在什么条件下(即参数值如何时)会表现良好,从而帮助你决定是否在特定场景中使用它。
  • 解释实证性能:如果一个算法在实践中表现良好,参数化分析可以提供理论解释。具体分为两步:
    1. 证明该算法在“容易”的输入(即参数值较小)上表现良好。
    2. 论证现实世界的实例通常具有较小的参数值(即属于“容易”的输入)。

应用于分页问题 🔍

现在,让我们将参数化分析具体应用到在线分页问题上。

参数化选择:工作集模型

我们需要一种方法来量化页面请求序列的局部性。一个经典且自然的方法是工作集模型。我们通过一个从自然数到自然数的函数 F 来参数化局部性。

定义:一个页面序列 σ 符合函数 F,如果对于所有窗口长度 w 和所有大小为 w 的窗口(即序列中连续的 w 个请求),其中出现的不同页面的数量最多为 F(w)

换句话说,F(w) 限制了在任意 w 个连续请求中,你能看到的不同页面的最大数量。局部性越强,重复请求就越多,F(w) 相对于 w 就越小。

示例

  • 如果 F 是恒等函数(即 F(w) = w),则对序列没有限制。
  • 如果 F(w) = √w,则表示在长度为100的窗口中,你最多只会看到10个不同的页面。
  • 如果 F(w) = log w,则表示在长度为1000的窗口中,你最多只会看到约10个不同的页面。

直观上,F 越小,对序列的限制越强,意味着局部性越高,序列越“容易”。

核心定理陈述 🎯

我们不再使用竞争比(与离线最优解比较),而是关注缺页率(缺页次数除以序列长度)。这是本分析的第二个关键思想。

以下是本节的主要定理(分为三部分):

定理

  1. 下界(对任何确定性在线算法):对于所有凹函数 F 和所有缓存大小 k,任何确定性在线算法在最坏情况(即所有符合 F 的序列 σ 上)的缺页率至少为 α_F(k)
  2. LRU 的最优性:对于所有凹函数 F 和所有缓存大小 k,LRU 算法在最坏情况(所有符合 F 的序列 σ 上)的缺页率至多为 α_F(k)
  3. 分离结果:存在一个凹函数 F 和缓存大小 k,使得 FIFO 算法在最坏情况下的缺页率严格大于 α_F(k)

其中,α_F(k) 的定义为:
α_F(k) = (k - 1) / (F^{-1}(k+1) - 2)

这里,F^{-1}(p) 定义为使得 F(n) = p 的最小 n(即首次达到值 p 的窗口长度)。凹性意味着函数 F 的增长速度逐渐变慢。

定理的意义

  • 部分 A 和 B 共同表明,对于每一个局部性函数 F 和缓存大小 k,LRU 都达到了可能的最佳缺页率上界。
  • 部分 C 则首次在严格的理论框架下,将 LRU 与 FIFO 等算法区分开来,证实了我们的经验直觉:LRU 因能更好地利用局部性而更优。

理解 α_F(k)

让我们通过几个例子来感受 α_F(k)

  • F(w) = w(无局部性)F^{-1}(k+1) = k+1,所以 α_F(k) = (k-1)/((k+1)-2) = 1。这意味着缺页率可能高达100%,这与我们已知的最坏情况一致。
  • F(w) = √w:对于较大的 kF^{-1}(k+1) ≈ (k+1)^2,所以 α_F(k) ≈ (k-1)/(k^2) ≈ 1/k。缺页率随缓存大小 k 成反比下降,这是一个很有吸引力的保证。
  • F(w) = log wF^{-1}(k+1) ≈ 2^{k+1},所以 α_F(k) ≈ (k-1)/(2^{k+1})。即使 k=10,缺页率也大约只有0.1%,这对应于极强的局部性。

这些例子表明,一旦引入合理的局部性假设,我们就能得到非常具有实际意义的性能保证。

定理证明(概要)🔨

部分 A:下界证明

思路:构造一个符合给定函数 F 的“坏”序列,迫使任何确定性在线算法达到较高的缺页率。

构造:固定算法 A、缓存大小 k 和函数 F。假设总页面数为 k+1。序列由多个阶段重复组成。每个阶段如下构建:

  1. 进行 M_2 次对页面 P_1 的请求(P_1 是当前不在 A 缓存中的页面)。
  2. 进行 M_3 次对页面 P_2 的请求(P_2 是随后被 A 换出的页面)。
  3. ...
  4. 进行 M_k 次对页面 P_{k-1} 的请求。

其中,M_j 是使得 F(n) = jn 的个数(即函数值为 j 的连续输入长度)。通过重复请求同一页面,我们确保序列符合 F

分析:在每个阶段中,算法 A 恰好产生 k-1 次缺页。阶段的总长度是 M_2 + M_3 + ... + M_k。通过定义,M_1 + M_2 + ... + M_k = F^{-1}(k+1) - 1。由于 M_1 = 1(否则序列将是常数),阶段长度等于 F^{-1}(k+1) - 2。因此,缺页率为 (k-1) / (F^{-1}(k+1) - 2) = α_F(k)

部分 B:LRU 上界证明

思路:将符合 F 的任意序列 σ 进行分块,并证明 LRU 在每个块中的缺页率受到控制。

分块:根据 LRU 的缺页点将序列 σ 划分为多个阶段。每个阶段从一次缺页开始,并包含恰好 k-1 次缺页(在即将发生第 k 次缺页前结束)。

关键断言:考虑任意一个阶段,以及紧接在该阶段之前和之后的两次请求。在这个子序列中,至少请求了 k+1 个不同的页面。

断言证明:设 P 是阶段前的请求页面。考虑阶段内的 k-1 次缺页和阶段后的第 k 次缺页。我们分析三种情况:

  1. 所有 k 次缺页都发生在不同于 P 且彼此互异的页面上。那么连同 P,我们有 k+1 个不同页面。
  2. k 次缺页中有两次发生在同一个页面 QQ ≠ P)上。由于使用 LRU,在两次对 Q 的缺页之间,必须请求了至少 k 个不同的其他页面(才能将 Q 再次换出)。这提供了 k 个不同页面,加上 P 又是 k+1 个。
  3. k 次缺页中至少有一次发生在页面 P 上。由于 P 在阶段开始前刚被请求过(使用 LRU),在它被换出之前,必须请求了至少 k 个不同的其他页面。这提供了 k 个不同页面,加上 P 本身又是 k+1 个。

完成证明:根据断言,包含阶段及前后请求的窗口至少请求了 k+1 个不同页面。根据 F 的定义,该窗口的长度至少为 F^{-1}(k+1)。由于我们额外添加了两次请求,阶段本身的长度至少为 F^{-1}(k+1) - 2。每个阶段有 k-1 次缺页,因此缺页率不超过 (k-1) / (F^{-1}(k+1) - 2) = α_F(k)

注意:在情况3的论证中,我们关键地使用了 LRU 的特性:对 P 的命中会重置其“最近使用”时间。这对于 FIFO 不成立,因此该证明不能直接应用于 FIFO。

部分 C:分离结果证明(示例)

我们需要展示存在 Fk,使得 FIFO 的缺页率严格大于 α_F(k)

示例:取 k = 4(缓存大小),总共有5个页面 {0,1,2,3,4}。定义局部性函数 F 如下:

  • F(1)=1, F(2)=2, F(3)=3, F(4)=3, F(5)=4, F(6)=4, F(7)=5, ...
    这意味着在长度不超过3的窗口中,最多只能有3个不同页面;首次能出现5个不同页面的窗口长度是7。

计算 α_F(4)

  • 分子:k-1 = 3
  • 分母:F^{-1}(5) - 2 = 7 - 2 = 5
  • 所以 α_F(4) = 3/5 = 60%

构造序列:考虑重复的请求块:[1, 0, 2, 0, 3, 0, 4, 0]

分析

  • LRU:在这个序列上,页面 0 被频繁访问,LRU 会将其保留在缓存中,缺页率低于60%(实际上,经过初始阶段后,0 几乎不会缺页)。
  • FIFO:模拟 FIFO 在这个序列上的行为(从空缓存开始)会发现,由于 FIFO 不会因命中而重置页面的进入顺序,页面 0 最终会被换出。详细分析表明,在每个8个请求的块中,FIFO 会发生5次缺页,缺页率为 5/8 = 62.5%,这严格大于 α_F(4) = 60%

这个具体的反例证明了 FIFO 在最坏情况下无法达到 LRU 所能保证的缺页率上界。

总结

在本节课中,我们一起学习了参数化分析如何应用于在线分页问题:

  1. 我们引入了工作集模型,通过函数 F 来参数化请求序列的局部性。
  2. 我们陈述并证明了一个核心定理,该定理将算法的缺页率与局部性参数 F 和缓存大小 k 联系起来。
  3. 定理表明,LRU 对于每一个局部性函数 F 都是最优的,其缺页率上界为 α_F(k)
  4. 更重要的是,定理首次在严格的理论框架下将 LRU 与 FIFO 等算法区分开来,证明了存在某些局部性模式下,FIFO 的性能严格更差。
  5. 通过计算 α_F(k) 在不同 F 下的值,我们看到一旦引入合理的局部性假设,理论保证会变得非常具有实际意义(例如缺页率 ~1/k 或 ~1/2^k)。

这实现了我们本节的两个目标:获得了更易于解释的性能保证,并在算法比较中识别出了真正最优的算法(LRU)。参数化分析为我们提供了一种强大的语言,将关于数据特性的直觉(如局部性)转化为严谨的算法性能定理。

005:计算独立集的参数化分析

在本节课中,我们将学习参数化分析的最后一个完整案例研究:计算图中的最大权重独立集问题。我们将看到,通过一个称为“可恢复值”的参数化视角,可以设计出比简单启发式算法性能更优的新算法。

概述:参数化分析回顾

上一节我们介绍了参数化分析的基本思想,即通过一个数值度量来描述输入的“难易”程度,并以此参数化算法的性能。我们已经在二维极值点和页面置换算法中看到了例子。本节中,我们将把这一思想应用于一个基础但非常困难的问题:计算最大权重独立集。

参数化分析之所以有益,主要有以下几个原因:

  • 提供更精细的信息:它提供了比单纯基于输入规模的最坏情况分析更强的数学陈述。
  • 指导算法选择:它能告诉我们算法在何种类型的输入上表现良好。
  • 解释实证成功:它提供了一个两步走的框架来解释为何最坏情况很差的算法在实践中却表现良好。
  • 启发算法设计:新颖的参数化视角自然引导我们去思考如何设计性能更优的新算法。

问题定义:最大权重独立集

输入是一个无向图 G=(V, E),每个顶点 v 有一个非负权重 w_v。目标是找到一个独立集 S ⊆ V,使得 S 中任意两个顶点都不相邻,并且总权重 ∑_{v∈S} w_v 最大。

在未加权(所有权重为1)的特殊情况下,问题简化为寻找最大规模的独立集。

这是一个众所周知的NP难问题。更糟糕的是,从近似算法的角度看,它也是极其困难的。除非P=NP,否则不存在任何多项式时间算法能在最坏情况下给出优于 O(n^{1-ε}) 的近似比。这意味着对于最坏情况分析,多项式时间算法几乎束手无策。

第一次尝试:基于最大度的参数化

为了突破这一僵局,我们尝试进行参数化分析。第一个自然的想法是使用图的一个简单参数:最大度 Δ。直觉是,当顶点度数较小时,算法犯错的代价(即错误地选择一个顶点会阻止选择的邻居数量)也较小。

我们考虑一个简单的算法:随机贪心算法

  1. 将顶点按均匀随机顺序排列。
  2. 按此顺序遍历顶点,维护一个独立集 S(初始为空)。
  3. 对于当前顶点 v,如果 v 的所有邻居都不在 S 中,则将 v 加入 S;否则跳过。

该算法的分析基于一个关键引理:对于任意顶点 v,其被包含在最终输出 S 中的概率至少为 1 / (deg(v) + 1)。这是因为,如果 v 在其自身及其所有邻居的随机排序中排在第一位,那么它一定会被加入 S

根据期望的线性性,算法输出解的期望权重至少为 ∑_{v∈V} w_v / (deg(v) + 1)。由于最优解的最大权重不超过所有顶点权重之和,我们得到该算法的近似比至多为 Δ + 1

结论:随机贪心算法在最大度 Δ 较小的图上表现良好。这是一个参数化分析的成功案例。

局限性:然而,最大度 Δ 是一个“脆弱”的参数。例如,在一个低度图中添加一个连接到所有顶点的高权重顶点,会急剧增大 Δ,导致我们的理论保证变得极差,尽管最优解和算法实际性能可能变化不大。这表明我们需要一个更稳健的参数。

更稳健的参数化:基于最优解结构的参数

上一节我们看到了基于输入最大度参数的局限性。本节中,我们来看看一个更巧妙的参数化思路:基于最优解(或近似最优解)的结构

关键的观察是:我们真正关心的是与最优解竞争。如果存在一个权重很高的独立集 I,并且 I 中所有顶点的度数都很小,那么随机贪心算法实际上能获得 I1/(Δ+1) 比例的权重。即使图中存在一些高度数顶点,只要它们不在这个高质量的独立集 I 中,就不会影响这个保证。

因此,我们可以将参数从“图的最大度”改为“某个高质量独立集中顶点的最大度”。更形式化地说,对于任何独立集 I,随机贪心算法输出解的期望权重满足:
E[weight(RG)] ≥ ∑_{v∈I} w_v / (deg(v) + 1)

这个保证比之前基于全图顶点求和的保证更弱,但它直接关联到我们想逼近的独立集 I 的质量。如果存在一个权重高且顶点度数低的独立集 I,那么这个保证就很有力。

设计更好的算法:可恢复值框架

上述分析不仅解释了随机贪心算法何时有效,还启发了我们设计更好的算法。我们问:能否改进公式中的常数“1”?能否设计一个算法,使其对于任何独立集 I,都能获得 ∑_{v∈I} w_v / (deg(v) + 1)c 倍,且 c > 1

这个目标被称为最大化可恢复值。对于加权独立集问题,常数 c 不能超过4(否则将能在三次图上精确求解独立集,从而推出P=NP)。那么,我们能否达到 c=2 呢?

答案是肯定的。Friggstad 和 Rezvan 提出了一个巧妙的算法,其期望权重至少为 2 * ∑_{v∈I} w_v / (deg(v) + 1)

以下是该算法:

  1. 随机排序:将顶点按均匀随机顺序排列。
  2. 宽松选择:按此顺序遍历顶点,维护集合 T(初始为空)。对于当前顶点 v,如果在其之前被遍历的邻居数量至多为1个,则将 v 加入 T
    注意:T 可能不是独立集。
  3. 精确求解:在 T 诱导的子图 G[T] 中,精确计算一个最大权重独立集 S,并输出 S

算法分析

  • 运行时间:关键引理是,无论随机排序结果如何,T 诱导的子图 G[T] 总是一个森林(无环图)。这是因为任何环中最后被遍历的顶点,其两个邻居都已被遍历过,因此该顶点不会被加入 T。在森林(树)上,最大权重独立集可以通过动态规划在线性时间内精确求解。因此整个算法是多项式时间的。
  • 性能保证:固定任意独立集 I。算法在第三步输出的 SG[T] 上的最优解,因此其权重至少是 I ∩ T 的权重。一个顶点 v ∈ I 被加入 T 的条件是:在 v 及其所有邻居的随机排序中,v 排在前两位。这个概率是 2 / (deg(v) + 1)。通过期望的线性性,可得 E[weight(S)] ≥ ∑_{v∈I} [2 * w_v / (deg(v) + 1)]。这就证明了 c=2 的保证。

这个算法展示了参数化分析如何直接引导出新颖且有效的算法设计。

总结与拓展

本节课我们一起学习了参数化分析在图独立集问题上的应用。我们首先用最大度参数分析了一个简单的随机贪心算法,然后转向一个更稳健的、基于最优解结构的参数化视角。最后,在这个新视角的指导下,我们设计并分析了一个性能更优的算法,该算法通过一个“宽松选择+精确求解”的两阶段策略,将性能保证常数从1提高到了2。

参数化分析的核心在于选择有意义的参数来捕捉实例的“易处理性”。参数可以基于输入特性(如最大度、维数),也可以基于输出/解的特性(如解的大小、结构)。选择哪种参数取决于我们的目标:是解释现有算法的表现,还是比较不同算法,还是设计新的算法。

在后续课程中,特别是在讨论平滑分析和聚类问题时,我们将继续看到参数化思想的重要应用。对于有兴趣深入学习的同学,还有许多标准且强大的参数化概念值得探索,例如:对于几何数据的“低维”概念,对于图数据的“树宽”概念,以及参数化复杂度中“小解大小”的概念等。这些概念为解决NP难问题提供了重要的理论和实用工具。

006:近似稳定实例中的聚类 🎯

在本节课中,我们将学习如何在具有“近似稳定性”的实例中进行聚类。我们将从一个动机问题开始,探讨如何找到有意义的聚类,并研究当实例中存在有意义的聚类结构时,如何设计新算法来利用这种结构。

概述

我们将在一个度量空间中工作,其中包含一组点和一个定义点之间距离的函数。我们的计算目标是:给定一个度量空间,我们希望找到一个有意义的聚类。然而,与传统的优化问题不同,聚类的目标通常是定性的——我们希望得到连贯的、有意义的点分组,而不是单纯地优化某个数值目标函数。

为了形式化这个想法,我们引入一个关键假设:存在一个我们不知道的“目标聚类”或“真实情况”。我们的目标是设计一个多项式时间算法,能够近似地恢复这个目标聚类。为了使算法有成功的希望,输入数据中必须包含关于目标聚类的线索。因此,我们需要在输入数据和目标聚类之间建立一种形式化的联系。

核心定义:C-ε 稳定性

以下是连接数值近似和结构近似的核心定义。

我们假设存在一个目标聚类。我们说这个目标聚类是 C-ε 稳定 的,如果满足以下条件:对于该度量空间和给定的 K-中位数目标函数,每一个 C-近似 的 K-聚类(即目标函数值不超过最优值 C 倍的解),都与目标聚类在 至少 (1-ε) 比例的点上保持一致。

公式化描述

  • 设度量空间为 (X, d),目标聚类为 C*
  • 设 K-中位数目标函数的最优值为 OPT
  • 如果对于每一个满足 cost(C) ≤ C * OPT 的聚类 C,都存在一个聚类间的匹配,使得 CC* 对至少 (1-ε)*|X| 个点的分类一致,则称目标聚类是 C-ε 稳定的。

这个定义的含义是:如果某个聚类在数值目标上(C-近似)接近最优,那么它在结构上也必须(ε-近似)接近目标聚类。这排除了存在与目标聚类结构迥异但数值目标却同样优秀的替代方案的可能性。

稳定性带来的结构性质

上一节我们介绍了稳定性的定义,本节中我们来看看这个假设会为输入度量空间带来哪些可被算法利用的结构性质。

我们假设目标聚类就是 K-中位数目标的最优解,其目标值为 OPT。为了使分析更清晰,我们令 C = 1 + α(α ≥ 0)。我们还将假设每个目标簇都足够大(具体大小稍后定义)。在这些假设下,稳定性条件可以推导出关于最优聚类中点与中心之间距离的两个关键性质。

以下是关于“好点”(同时满足两个性质的点的两个重要结论:

  1. 大多数点靠近其中心:在最优聚类中,大多数点与其所属簇的中心距离不远。具体来说,至多有 (5ε/α)*n 个点与其中心的距离超过 (α/(5ε)) * (OPT/n)
  2. 大多数点与其最近中心和第二近中心显著分离:在最优聚类中,大多数点与其最近中心(所属簇中心)的距离,远小于其与第二近中心(其他簇中心)的距离。具体来说,至多有 ε*n 个点不满足:d(x, second_closest_center) - d(x, closest_center) > (5/2) * τ,其中 τ 是一个与 OPT 相关的阈值(τ = (2α/(5ε)) * (OPT/n))。

结合这两个性质,我们可以定义“坏点”为那些不满足至少一个性质的点。坏点的总数 B 最多为 (5ε/α + ε) * n。其余的点则称为“好点”。

算法步骤一:构建邻接图

基于上述分析,我们现在可以开始设计算法了。算法的第一步是基于距离阈值构建一个图,以揭示隐藏的聚类结构。

我们设置一个距离阈值 τ(其理想值为 (2α/(5ε)) * (OPT/n))。然后,我们构建一个无向图 G = (V, E),其中顶点 V 是度量空间中的所有点,边 E 连接所有距离不超过 τ 的点对:E = {(x, y) | d(x, y) ≤ τ}

关于参数 τ 的说明:算法实际上不知道 OPTαε。一个标准的处理技巧是尝试 O(n²) 个可能的 τ 值(即所有点对间的距离),并观察在哪个阈值下会出现我们期望的图结构。这可以通过类似二分搜索或顺序尝试的方法实现。

这个图 G 具有以下重要性质(由稳定性推导得出):

  • 性质 1(簇内形成团):属于同一个目标簇 C*_i 的所有好点,在 G 中两两相连,形成一个团(Clique)。
  • 性质 2(簇间路径较长):属于不同目标簇 C*_iC*_j 的两个好点 xy,在 G 中的最短路径长度至少为 3。

这些性质意味着,在第一步之后,我们得到的图 G 中,每个目标簇的好点形成了一个稠密的团,而不同团之间仅通过较长的、可能包含坏点的路径相连。

算法步骤二:基于共同邻居过滤边

虽然第一步后的图 G 已经揭示了聚类结构,但不同簇的团之间仍然可能存在连接。第二步的目标是切断这些连接,使各个团成为独立的连通分量。

我们定义一个新图 H,其顶点集与 G 相同,但边集是 G 的一个子集。我们只保留那些端点拥有足够多共同邻居的边。具体规则如下:

对于 G 中的一条边 (x, y),只有当 xyG 中的共同邻居数量至少为 B(即我们之前定义的坏点数量上界)时,这条边才会被保留在 H 中。

代码描述过滤过程

def filter_edges(G, B):
    H = Graph(vertices=G.vertices)
    for edge (x, y) in G.edges:
        common_neighbors = set(G.neighbors(x)) & set(G.neighbors(y))
        if len(common_neighbors) >= B:
            H.add_edge(x, y)
    return H

这一步过滤的效果非常显著:

  • 团被保留:每个目标簇中好点构成的团,由于其规模大(假设每个簇至少有 B+2 个好点),团内每条边的两个端点都至少有 B 个共同邻居(团内的其他好点),因此整个团在 H 中被完整保留。
  • 簇间连接被切断:考虑连接两个不同簇的好点的任何路径。根据性质2,最短路径至少为3。可以证明,在这样的路径上,至少存在一条两个端点都是坏点的边。这两个坏点的共同邻居只能是其他坏点,而坏点总数至多为 B,除去它们自身,共同邻居数最多为 B-2,小于阈值 B。因此,这条边在过滤时会被删除,从而切断了连接两个团的路径。

经过第二步,图 H 将恰好包含 K 个大的连通分量,每个分量对应一个目标簇中好点的团(大小至少为 B+2)。此外,可能还有一些只包含坏点的小连通分量,但其大小不超过 B

算法步骤三:基于中值距离的重新分类(可选)

经过前两步,我们可以通过找出 H 中最大的 K 个连通分量来得到一个初始聚类。这个聚类能正确分类所有好点,但可能错误分类所有坏点,因此其准确率约为 1 - (B/n)。根据 B 的定义,这大约是 1 - O(ε/α),可能比我们期望的 1 - ε 要差。

为了将准确率提升到 1 - ε,我们可以执行一个简单而巧妙的第三步:基于中值距离重新分类所有点。

具体操作如下:

  1. 将第二步得到的 K 个大连通分量作为初始聚类 Ĉ_1, ..., Ĉ_K
  2. 对于每一个点 x(并行处理):
    • 计算 x 到每个聚类 Ĉ_i 的“距离”,定义为 xĈ_i 中所有点距离的中位数
    • x 重新分配到与之“距离”最小的那个聚类中。

直观解释:对于大多数“好点”和那些虽然是“坏点”(不靠近其中心)但“分离性”很好的点(即离其正确中心很远,离错误中心更远),这个中值距离度量能将其拉回正确的簇。分析表明,经过这一步,最终被错误分类的点数将降至约 ε*n,从而实现了我们期望的 (1-ε) 准确率。

总结

本节课中我们一起学习了如何在满足 C-ε 稳定性条件的实例中进行聚类。我们首先形式化地定义了“有意义的聚类”问题,并引入了“目标聚类”和“稳定性”的核心概念。稳定性假设保证了数值上接近最优的聚类在结构上也接近目标。

基于这个假设,我们推导出了度量空间中点与中心距离的关键性质,从而将隐藏的聚类结构转化为图中可检测的模式(团和长路径)。我们的算法分为三个步骤:

  1. 构建邻接图:通过距离阈值构建图,使每个簇的好点形成团。
  2. 过滤边:基于共同邻居数过滤边,切断不同簇之间的连接,使各团成为独立的连通分量。
  3. 重新分类:利用中值距离度量进行最终调整,达到高精度。

这个算法展示了如何通过明确定义数据可能具有的(但不可验证的)结构属性,来引导设计出能超越最坏情况近似比的全新算法。对于 K-中位数问题,即使 C 非常接近 1(例如 1.1),该算法也能成功恢复目标聚类,而通用的最坏情况近似算法存在常数下界(约 1.74),无法做到这一点。

007:扰动稳定性与Single-Link++

在本节课中,我们将学习一种新的聚类稳定性模型——扰动稳定性。我们将看到,当输入数据满足这种稳定性时,一个简单而巧妙的算法——Single-Link++,就能高效地找到K-中位数问题的最优解。

回顾与引入

上一节我们介绍了基于近似比的稳定性模型。本节中,我们来看看另一种不同的稳定性概念:扰动稳定性。

我们继续研究K-中位数聚类问题。输入是一个有限的度量空间,包含n个点X和一个距离函数d。距离函数满足三角不等式。目标是选择K个中心点,使得所有点到其最近中心的距离之和最小。

扰动稳定性模型

我们假设存在一个目标聚类(即最优解),并且这个最优解在输入距离发生扰动时依然保持最优。

定义(γ-扰动):对于一个距离函数d,一个γ-扰动是指,对于每一对点(x, y),我们将其距离d(x, y)乘以一个因子σ,其中σ ∈ [1, γ]。扰动后的距离函数可能不再满足三角不等式,这没有问题。

定义(γ-稳定性):如果一个K-中位数实例的最优解C*在所有可能的γ-扰动下都保持最优,则称该实例是γ-稳定的。

随着γ增大,稳定性条件的要求越来越严格,满足的实例越来越少,因此计算问题理论上应该变得更容易。我们的目标是找到一个γ的阈值,使得在此阈值之上,K-中位数问题可以从NP难变为多项式时间可解。

动机

在现实应用中,距离函数d通常是启发式定义的(例如,用于衡量图像、文档或蛋白质之间的差异)。因此,我们自然希望聚类结果对距离函数的小幅扰动具有鲁棒性。扰动稳定性模型正是将这种直觉形式化。

经典算法及其局限性

在证明稳定性如何带来可解性之前,我们先看一个简单而著名的聚类算法:单链接聚类。

算法(单链接聚类)

  1. 将度量空间视为完全图,点作为节点,距离作为边权重。
  2. 运行Kruskal最小生成树算法,按边权重从小到大排序并依次添加,避免形成环。
  3. 当图中恰好剩下K个连通分量时停止。

然而,单链接算法在稳定实例上可能失败。考虑以下反例:

  • 假设K=3。
  • 有四个点群:三个“大城市”(各有M个点,M很大),一个“小镇”(有10个点)。群内距离≈0。
  • 群间距离:左群与小镇距离为2,小镇与右群距离为1,左右群距离为10。
  • 最优解是将三个“大城市”各自设为中心,小镇分配到距离为2的中心,目标函数值≈20。
  • 单链接算法会先合并距离为1的边(右群与小镇),再合并距离为2的边(左群与小镇),最终将两个“大城市”合并到一个簇中,导致目标函数值高达≈M,远非最优。

这个反例可以构造为对任意大γ都稳定的实例。因此,原始的单链接算法不足以解决稳定实例。

我们需要对单链接算法进行改进。核心思想是:运行完整的Kruskal算法得到一棵最小生成树,这棵树自然地定义了一个层次聚类结构,然后我们从中优化选择K个簇。

层次聚类树

运行完整的Kruskal算法会得到一棵最小生成树T。我们可以将其转化为一棵有根二叉树H(层次聚类树):

  • H的n个叶子节点对应原始n个点。
  • H的n-1个内部节点对应Kruskal算法添加的n-1条边,节点权重即为该边距离。
  • H的任意子树对应Kruskal算法执行过程中出现过的某个连通分量。

K-剪枝

一个K-剪枝是指从树H的顶部开始,删除K-1个内部节点(要求删除集合是向上封闭的,即若一个节点被删除,其父节点也必须被删除)。这将把叶子节点划分为恰好K个不相交的子树,每个子树对应一个候选簇。

算法(Single-Link++)

  1. 对输入度量空间运行完整的Kruskal算法,构建层次聚类树H。
  2. 计算最优的K-剪枝,即在所有可能的K-剪枝中,选择能产生最小K-中位数目标函数值(并为每个簇最优选择中心点)的那个剪枝方式。

计算最优K-剪枝可以通过动态规划在多项式时间内完成。在之前的反例中,Single-Link++会考虑两种可能的3-剪枝,并选择正确的那一个,从而找到最优解。

主要定理

定理:对于所有γ ≥ 3的γ-稳定K-中位数实例,Single-Link++算法都能计算出最优解。

分析表明,对于此算法,γ=3是紧的边界。存在改进算法能将γ下界降至1+√2,并且已知当γ<2时,问题是NP难的。

定理证明思路

证明分为三步,旨在将稳定性条件与算法成功的充分条件联系起来。

步骤一:推导充分条件

首先,我们分析Single-Link++成功的充分条件。

条件1:算法成功,当且仅当最优解的每一个簇C*_i,都曾经作为Kruskal算法执行过程中的某个连通分量出现。

条件2(充分条件):对于最优解的每一个簇C_i,以及其任意一个真子集A,离A最近的点(不在A中)必须位于C_i内部,而不是其他簇中。

可以证明,条件2 ⇒ 条件1。因为Kruskal算法按距离递增顺序加边,条件2保证了在C_i的任何真子集A与外部点连接之前,A会先与C_i内的剩余点连接,从而最终整个C*_i会作为一个连通分量出现。

因此,我们只需证明在γ≥3的稳定实例中,条件2必然成立。

步骤二:利用稳定性推导结构性质

假设实例是3-稳定的。我们可以推导出最优解必须具有“内紧外疏”的结构。

性质1(靠近本簇中心):对于任意点x ∈ C_i,以及任意其他簇中心c_j (j≠i),有 d(x, c_j) ≥ 3 * d(x, c_i)。
证明思路:通过将簇C
_i内部所有距离放大3倍,并利用稳定性(最优解不变)得出。

性质2(不同簇点距离远):对于任意点x ∈ C_i 和 y ∈ C_j (i≠j),有 d(x, y) ≥ 2 * max{ d(x, c_i), d(y, c_j) }。
证明思路:结合性质1和三角不等式进行推导。

步骤三:验证充分条件成立

现在利用性质1和2来证明条件2成立。采用反证法。

假设条件2不成立:存在最优簇C_i及其真子集A,使得离A最近的点y位于另一个簇C_j中。

  • 设x是A中离y最近的点。
  • 设z是C*_i \ A中的任意一点(我们希望它才是离A最近的点)。
  • 设c_i和c_j分别是簇C_i和C_j的中心。

我们分情况讨论:

  1. 如果中心c_i不在A中,那么根据性质2,c_i到A中点的距离已经小于任何外部点到A的距离,矛盾。
  2. 如果中心c_i在A中(较复杂的情况):
    • 根据性质1,z到c_j的距离应至少是z到c_i距离的3倍:d(z, c_j) ≥ 3 d(z, c_i)。
    • 另一方面,我们可以构造一条从z到c_j的路径:z → c_i → x → y → c_j。利用三角不等式和性质2,可以得到这条路径长度的上界。
    • 关键点:由于y被假设为离A最近的外部点,所以距离d(x, y) ≤ d(z, c_i)(因为c_i在A中)。
    • 将上述不等式组合起来,最终会推导出d(z, c_j) < 3 d(z, c_i),这与性质1矛盾。

因此,假设不成立,条件2必须成立。这就完成了定理的证明。

总结

本节课中我们一起学习了:

  1. 扰动稳定性模型:要求最优聚类对距离函数的扰动具有鲁棒性。
  2. Single-Link++算法:通过构建层次聚类树并优化选择K-剪枝,对经典单链接算法进行了改进。
  3. 理论保证:证明了对于γ ≥ 3的稳定实例,Single-Link++能够找到精确最优解。
  4. 证明技巧:通过将稳定性条件转化为最优解的结构性质(内紧外疏),再验证该结构能保证算法成功。

本节课与上一节共同表明,尽管形式不同,但不同的稳定性模型都倾向于导出相似的数据结构(紧密且分离良好的簇),并为设计高效算法或分析现有算法提供了理论基础。这增强了我们对“在实际常见的聚类实例中,问题可能本质上是容易的”这一观点的信心。

008:稳定割实例中的精确恢复 🎯

在本节课中,我们将学习“精确恢复”这一概念,并探讨线性规划算法在解决图割问题时的表现。我们将从简单的S-T最小割问题入手,然后将其推广到更复杂的NP难问题——多路割,并研究在稳定性条件下,线性规划如何能精确恢复最优解。


概述 📋

精确恢复的核心问题是:对于一个给定的算法,确定它在哪些输入上能够正确无误地解决问题。本节课我们将聚焦于图割问题,并探究线性规划算法在何种条件下能精确恢复NP难图割问题的最优解。

上一讲我们介绍了聚类问题中的精确恢复,本节我们将视角转向图割问题,并重点分析线性规划这一强大工具。


S-T最小割问题回顾 🔍

首先,我们回顾一个经典问题:S-T最小割。给定一个无向图,每条边有正的成本(或容量),以及一个源点S和一个汇点T。目标是找到一个割,将顶点集划分为包含S的集合A和包含T的集合B,使得被割边(即一端在A、一端在B的边)的总成本最小。

问题定义

  • 输入:无向图 G=(V, E),边成本 c_e > 0,源点 s,汇点 t
  • 目标:找到分割 (A, B),其中 s ∈ A, t ∈ B,最小化割边总成本 ∑_{e∈E(A,B)} c_e

这是一个可以在多项式时间内解决的问题(例如通过最大流算法)。但我们将展示,通过一个精心设计的线性规划,其最优解会自动呈现出我们想要的整数解(即一个具体的割)。


最小割的线性规划建模 📐

我们为最小割问题构建一个线性规划。其思想是为每个决策创建变量。

变量

  • 对每个顶点 v,变量 d_v。语义:d_v = 0 表示 v 在源点侧(A),d_v = 1 表示在汇点侧(B)。
  • 对每条边 e=(u,v),变量 x_e。语义:x_e = 1 表示边 e 被割,x_e = 0 表示未被割。

约束

  1. 固定源点和汇点:d_s = 0, d_t = 1
  2. 对于每条边 e=(u,v),确保如果顶点在不同侧,则边必须被标记为割:
    • x_e ≥ d_u - d_v
    • x_e ≥ d_v - d_u
      (这等价于 x_e ≥ |d_u - d_v|,强制当 d_u ≠ d_vx_e ≥ 1。由于目标是最小化,x_e 在最优解中会被推到尽可能小,即0或1。)
  3. 变量范围:0 ≤ d_v ≤ 1, 0 ≤ x_e ≤ 1

目标函数:最小化割的总成本 ∑_{e∈E} c_e * x_e

这个线性规划是原最小割问题的一个“松弛”,因为它允许 d_vx_e[0,1] 之间的分数值,而不仅仅是0或1。因此,其最优解值可能小于真正的最小割成本。


关键定理与证明思路 💡

定理:对于上述最小割线性规划,其最优解是整数解,并且恰好对应图上的一个最小S-T割。

证明的核心思路是构造一个随机舍入算法。该算法以线性规划的最优(可能为分数)解 (x̂, d̂) 作为输入,输出一个随机的S-T割 C,并满足以下引理性质:

引理:存在一个随机算法,对于每条边 e,其输出的随机割 C 满足:
P[C 割开边 e] = x̂_e

也就是说,边被割的概率恰好等于线性规划中该边的分数值。

以下是证明该定理的逻辑链条:

  1. 利用引理计算期望:设 C* 为唯一的最优最小割(我们假设唯一性以简化论述)。计算随机割 C 相对于 C* 的“额外成本”的期望值。
  2. 期望值的推导:通过线性期望和引理,可以证明这个期望值等于线性规划解 相对于 C* 的“优势值”(记作 Δ(x̂))。
  3. 比较优势:由于 是线性规划的最优解,而 C* 对应一个可行的整数解,因此 Δ(x̂) ≤ 0,即 的目标函数值不差于 C*
  4. 得出结论:随机算法输出的割 C,其平均表现至少和最优割 C* 一样好。但已知 C* 是唯一最优的,任何其他割都严格更差。因此,唯一的可能性是:随机算法以概率1输出 C*。这意味着 必须是一个整数解(否则算法会有不同的输出)。

随机舍入算法:气球膨胀法 🎈

现在我们来描述证明引理的关键——随机舍入算法。它非常直观,被称为“气球膨胀法”。

算法步骤

  1. 输入线性规划最优解中的顶点值 {d̂_v}
  2. (0, 1) 区间内均匀随机选择一个半径 R
  3. 定义割 (A, B) 如下:
    • A = { v ∈ V | d̂_v ≤ R } (即所有 d 值不超过 R 的顶点)
    • B = V \ A

算法解释:想象以 d 值作为坐标,从源点侧(d=0)开始吹一个气球。当气球半径达到 R 时,所有被气球包裹的顶点(d ≤ R)归入源点侧,其余顶点归入汇点侧。由于 d_s=0, d_t=1,且 0 < R < 1,这总是一个有效的S-T割。

性质验证:对于任意边 e=(u,v),设 d̂_u ≤ d̂_v。该边被割开,当且仅当随机半径 R 落在区间 (d̂_u, d̂_v] 内。这个区间的长度正好是 d̂_v - d̂_u。根据线性规划约束,x̂_e ≥ d̂_v - d̂_u,并且由于目标是最小化,在最优解中 x̂_e 会被压至恰好等于 |d̂_u - d̂_v|。因此,边 e 被割的概率 P[R ∈ (d̂_u, d̂_v]] = (d̂_v - d̂_u) = x̂_e。这就证明了引理。


推广:多路割问题与稳定性条件 ⚙️

现在我们将目光转向一个更一般且是NP难的问题:多路割

问题定义

  • 输入:无向图 G=(V, E),边成本 c_e > 0,以及 k 个终端顶点 t_1, t_2, ..., t_kk ≥ 3)。
  • 目标:将顶点集划分为 k 个集合 S_1, ..., S_k,使得 t_i ∈ S_i,并最小化所有连接不同集合的边的总成本。

k=2 时,这就是S-T最小割问题。但当 k≥3 时,问题变为NP难。因此,我们不能指望一个通用的线性规划总能给出整数最优解。

为了获得精确恢复的保证,我们需要引入稳定性条件。这与我们在周一课程中为K-中值问题引入的条件精神一致。

γ-稳定性:一个多路割实例是γ-稳定的,如果其最优解 C* 在允许将任意边的成本乘以 [1, γ] 区间内任意因子的所有扰动下,始终保持为唯一最优解。

直观上,这意味着最优解 C* 足够“明显”,即使我们恶意地将其割边的成本放大(最多γ倍)以惩罚它,它仍然比其他任何割都要好。


多路割的线性规划与主要定理 🏆

我们可以为多路割设计一个自然的线性规划松弛。

变量

  • 对每个顶点 v 和每个组别 i (1 to k),变量 d_v^i。语义:在整数解中,d_v^i=1 表示 v 属于组 i,否则为0。
  • 对每条边 e=(u,v),变量 x_e 表示边是否被割。

约束

  1. 每个终端固定:d_{t_i}^i = 1,且对于 j≠id_{t_i}^j = 0
  2. 每个顶点属于各组的程度之和为1:∑_{i=1}^k d_v^i = 1
  3. 边割约束(确保如果顶点在不同组,边需被割):
    • x_e ≥ 1/2 * ∑_{i=1}^k |d_u^i - d_v^i|
      (在整数解中,若 u, v 在不同组,右边和为2,故 x_e ≥ 1;若在同组,和为0,x_e ≥ 0。)
  4. 变量范围:0 ≤ d_v^i ≤ 1, 0 ≤ x_e ≤ 1

目标函数:最小化 ∑_{e∈E} c_e * x_e

定理(Makarychev, Makarychev, Vijayaraghavan 2014):对于任何 γ > 4 稳定的多路割实例,上述线性规划的最优解是整数解,并且恰好就是该稳定实例的最优多路割。

这个定理非常有力:对于一个NP难问题,在合理的稳定性假设下,我们只需将其输入一个线性规划求解器,就能直接得到精确的最优解,无需复杂的后续处理。


定理证明思路 🔬

证明结构与最小割情况类似,但更加精细,需要利用 γ > 4 的稳定性条件。

  1. 定义差异度量:定义整数割 C 相对于最优割 C* 的“代价差” Δ(C)。在稳定性条件下,对于任何 C ≠ C*,有 Δ(C) > 0。同样,为线性规划分数解 定义 Δ(x̂),由于 是最优的,有 Δ(x̂) ≤ 0
  2. 关键引理(弱化版舍入):存在一个随机舍入算法,输入LP解 (x̂, d̂),输出一个多路割 C,满足以下两个性质(而非精确相等):
    • P[C 割开边 e] ≤ 2 * x̂_e
    • P[C 未割开边 e] ≥ (1 - x̂_e) / 2
  3. 利用引理完成证明:计算随机输出 C 的期望代价差 E[Δ(C)]。通过代入引理中的两个不等式,并利用 γ=4 的系数,可以推导出 E[Δ(C)] ≤ 2 * Δ(x̂) ≤ 0。这意味着随机算法的平均输出不差于最优割 C*。结合稳定性条件(任何其他割都严格更差),可推出算法必须以概率1输出 C*,从而证明LP解 必为整数解。

多路割的随机舍入算法 🔄

以下是用于证明关键引理的随机舍入算法(比气球膨胀法更复杂):

算法步骤

  1. 初始化所有顶点为“未分配”。
  2. 循环,直到所有顶点都被分配到某个组:
    a. 均匀随机选择一个组别 i ∈ {1, ..., k}
    b. 均匀随机选择一个阈值 R ∈ [0, 1]
    c. 对于所有仍未分配的顶点 v,如果其LP值 d̂_v^i ≥ R,则将其分配到组 i

算法直觉:算法分多轮进行。在每一轮,它随机聚焦于一个组别 i,并将那些“倾向于”组 i(即 d̂_v^i 值高)的未分配顶点,以一定的概率(由阈值 R 控制)分配进去。经过多轮后,所有顶点都会被分配。可以证明,这个算法满足前述引理中的两个概率界限。


总结 📝

本节课我们一起学习了“精确恢复”在图割问题中的应用,重点探讨了线性规划的作用。

  • 我们首先回顾了S-T最小割问题,并展示了其线性规划松弛具有整数最优解的性质,通过“气球膨胀”随机舍入算法巧妙地证明了这一点。
  • 接着,我们将问题推广到NP难的多路割问题。为了在这种情况下也能保证线性规划的精确恢复,我们引入了γ-稳定性条件。
  • 我们介绍了多路割的线性规划松弛,并陈述了核心定理:对于 γ > 4 的稳定实例,该线性规划能精确恢复最优整数解。
  • 定理的证明沿用了与最小割情形相似的框架,但使用了更复杂的随机舍入算法和稳定性条件来弥补因问题变难而带来的分析差距。

本节课的核心启示是:对于许多难解问题,在合理的、面向实际应用的输入假设(如稳定性)下,简单而强大的现成工具(如线性规划)可能就足以提供完美的解决方案。这为我们理解和应用算法提供了超越最坏情况分析的宝贵视角。

009:压缩感知初探 🎯

在本节课中,我们将学习“压缩感知”这一主题。我们将探讨如何在线性系统欠定(方程少于未知数)的情况下,通过额外的稀疏性假设,利用线性规划算法精确地恢复出原始信号。我们将了解其背后的核心思想、应用场景以及理论保证。


线性系统与稀疏性

上一节我们介绍了在稳定实例下,启发式算法可以找到最优解的主题。本节中,我们来看看如何将这个思想应用到求解线性方程组上。

考虑一个线性系统:给定矩阵 A 和向量 b,我们希望求解 x,使得 Ax = b。这里,A 是一个实数矩阵。如果 A 的行数少于列数,那么这个系统是欠定的。这意味着,如果存在解,那么解的数量将是无穷多个。

一个启发式的理解是:矩阵 A 的每一行提供了关于向量 x 的一个“信息”。如果 x 有 n 个自由度,我们需要 n 个约束才能唯一确定它。当约束少于 n 个时,解空间是一个维度为 n-m 的子空间。

在压缩感知中,我们关注的是“稀疏”解。我们称一个向量 xk-稀疏 的,如果它最多只有 k 个非零元素。我们用 supp(x) 表示 x 的支撑集(即非零坐标的集合)。因此,k-稀疏意味着 |supp(x)| ≤ k

在许多实际应用中,稀疏解被认为是更有意义的。虽然实际中可能存在近似稀疏或在其他基下稀疏的情况,但为了简化,本教程只讨论在标准基下的精确稀疏性。


问题定义与动机

我们考虑的计算问题是精确恢复:假设存在一个未知的 k-稀疏的“真实”向量 ,我们观测到 Ab(其中 b = A x̂)。我们的目标是,能否从 Ab 中恢复出

为什么这个问题有趣?传统的思路是,如果我们想唯一确定一个 n 维向量,我们需要 n 个线性测量(即 A 是 n×n 的可逆矩阵)。压缩感知的核心思想是:如果我们对未知信号 x 的结构(即稀疏性)做出额外假设,我们或许可以用远少于 n 个的测量值(即 A 的行数 m 远小于 n)来恢复它。

以下是压缩感知的一些应用场景:

  • 单像素相机:自然图像通常在某种变换基(如小波基)下是稀疏的。与其先采集大量像素再压缩,不如直接采集少量精心设计的线性测量值,后期再重建图像。
  • 磁共振成像:测量次数直接对应扫描时间。减少测量次数可以显著缩短扫描时间,提升患者体验。

这引出了两个核心问题:

  1. 从信息论角度,m 需要多小,才能保证理论上存在唯一的 k-稀疏解?
  2. 从算法角度,我们能否找到一个高效算法来找出这个稀疏解?

算法:L1 最小化

直接在所有满足 Ax = b 的解中,寻找非零元素最少的解(即 L0 最小化)是一个 NP 难问题。我们采用一个启发式方法:L1 最小化。我们可以将其表述为一个线性规划问题,从而高效求解。

我们求解以下线性规划:

最小化 Σ y_i
约束条件:
    A x = b
    y_i ≥ x_i,  对于所有 i
    y_i ≥ -x_i, 对于所有 i

这个目标函数 Σ y_i 等价于最小化向量 x 的 L1 范数 ||x||_1 = Σ |x_i|

从直觉上看,L1 范数最小化倾向于产生许多接近零的分量,但它并没有直接优化非零项的数量。令人惊讶的是,在特定条件下,这个松弛方法确实能精确恢复出真正的稀疏解。


主要定理与充分条件

主要定理:如果测量矩阵 A 的大小为 m × n,其中 m = O(k log n),并且 A 是随机生成的(例如,每个元素独立服从高斯分布或 ±1 分布),那么以高概率,对于所有 k-稀疏向量 ,上述 L1 最小化线性规划的唯一解正是

我们不会完整证明这个定理,而是专注于证明一个充分条件:如果矩阵 A 满足某个“良好”性质,那么 L1 最小化算法就能成功。然后我们指出,随机矩阵 A 以高概率满足这个性质。

首先,我们需要一些关于向量范数的预备知识。

L1 范数与 L2 范数

  • L1 范数:||x||_1 = Σ |x_i|
  • L2 范数:||x||_2 = sqrt(Σ x_i^2)
    对于任意向量 x,有 ||x||_1 ≥ ||x||_2。当 x 是基向量时取等号;当 x 的所有分量相等时,比值 ||x||_1 / ||x||_2 达到最大,为 sqrt(n)

我们定义一个向量 xC-散布 的,如果它满足:

||x||_1 ≤ (C / sqrt(n)) * ||x||_2

这意味着 x 的 L1 范数相对于其 L2 范数较小,直观上表示其质量没有集中在少数坐标上,而是相对均匀地散布开来。C 的取值范围在 1(完全均匀)到 sqrt(n)(集中于单一坐标)之间。

关键引理:如果一个向量 x 是 C-散布的,那么对于任意坐标子集 I,有:

||x_I||_1 ≤ (C * sqrt(|I|) / sqrt(n)) * ||x||_1

这个引理表明,对于一个散布的向量,其任何一小部分坐标所承载的 L1 范数只占整体的一小部分。


“良好”矩阵与证明思路

现在我们可以定义“良好”的测量矩阵 A

定义:我们称矩阵 AC-良好 的,如果其零空间(即满足 A y = 0 的所有向量 y)中的每一个非零向量 y 都是 C-散布的。

事实:当 m = O(k log n) 时,随机矩阵 A 以高概率是 (1/4)*sqrt(n/k)-良好的。

基于这个事实,我们只需证明:如果一个矩阵 A(1/4)*sqrt(n/k)-良好的,那么对于任何 k-稀疏的 ,L1 最小化线性规划的唯一解就是

证明思路
是真实的 k-稀疏解(b = A x̂)。设 w 是任意另一个满足 A w = b 的解。我们需要证明 ||w||_1 > ||x̂||_1,这样 就是唯一的最小 L1 范数解。

  1. 由于 A w = A x̂,它们的差 y = w - x̂A 的零空间中,即 A y = 0
  2. 根据“良好”性质,y 是散布的。
  3. I 的支撑集(大小至多为 k),J 为其余坐标。
  4. 我们可以将 ||w||_1 分解为在 IJ 上的贡献之和,并利用三角不等式进行放缩。
  5. 关键步骤是利用 y 的散布性(通过上述关键引理),证明 y 在小的集合 I 上的范数 ||y_I||_1 至多是 (1/2) * ||y||_1
  6. 通过代数推导,最终可以得到 ||w||_1 ≥ ||x̂||_1 + (1/2)||y_J||_1。只要 w 不等于 (即 y 非零),就有 ||w||_1 > ||x̂||_1

这就完成了证明:在“良好”矩阵 A 的条件下,任何不同于 的可行解都具有更大的 L1 范数,因此 是线性规划的唯一最优解。


总结

本节课中我们一起学习了压缩感知的核心思想。我们了解到,对于欠定线性系统,如果未知解具有稀疏性,那么我们可以利用远比传统方法更少的测量值来恢复它。关键的算法是将 NP 难的 L0 最小化问题松弛为可高效求解的 L1 最小化线性规划。我们证明了,当测量矩阵 A 满足其零空间中所有向量都是“散布”的这一充分条件时,该算法能保证精确恢复。最后,我们指出随机生成的测量矩阵以高概率满足该条件,这为压缩感知的实际应用奠定了理论基础。

010:植入与半随机图模型 🧩

在本节课中,我们将学习一种新的精确恢复方法。我们将回到第6、7、8讲的精神,研究NP难问题,通过假设额外的结构,展示我们如何用多项式时间算法找到最优解。之前的讲座侧重于不同的稳定性属性,而本节将回到图问题,研究具有稳定性条件风格但技术上截然不同的随机模型。我们将探讨图上的生成分布,并论证在高概率下,是否存在多项式时间算法来解决NP难问题,如寻找最大团或最小平分。


为什么需要新模型?🤔

我们试图通过这些模型实现的目标是,找到一种不同的方式来推理图算法。回想一下,如果我们不施加任何条件,只讨论近似比,所有算法都有很差的近似比,无法区分它们。因此,我们提出一个问题:能否有一个不同的输入模型,使我们能够对算法进行更具信息量的分析,并可能建议使用一种算法而非另一种?

我们将考虑图上的分布,某种意义上这是一种平均情况分析。要讨论图的分布,必须从Erdős–Rényi模型开始。虽然我们最终不会使用这些模型,但理解它们是什么以及为什么它们不足以区分不同算法是很重要的。


Erdős–Rényi 模型及其局限性 🎲

当人们谈论G(n, p)模型时,它有两个参数:n是顶点数,p是边的概率或期望的边密度。有n个顶点,这是确定的。对于所有可能的边,每一条边都以概率p独立地出现。如果p等于1/2,这实际上是世界上所有无向图上的均匀分布。

对于某些计算问题,你可以对Erdős–Rényi图说一些有趣的事情。但我会展示两个例子,说明它并不是一个非常有帮助的模型,因为它无法区分不同的算法。这对于许多NP难问题都是成立的。

示例一:最小平分问题

最小平分问题要求找到一个图的最小割,同时要求割的两边大小相等,各有一半的节点。输入是偶数个顶点的无向图,输出是一个大小相等的平分,目标是使割边的数量最小化。

为什么这在算法研究上不是一个有趣的模型?原因在于,如果你取一个来自G(n, p)的随机图,那么高概率下,所有的平分都大致相同。每个平分大约切割 n²/4 * p 条边。这是因为对于一个固定的平分,期望的割边数就是这个值,并且这些随机变量高度集中。

假设你有不同的最小平分启发式算法,并想说明哪个更好。但在这个模型中,即使是计算最大平分的算法,其效果也和其他启发式算法一样好。因此,在这个模型下,真的没有办法讨论不同的算法。

示例二:最大团问题

最大团问题是独立集问题的补集。给定一个无向图,团是一组两两相连的节点,目标是找到图中最大的团。在Erdős–Rényi图中,这个问题更容易,但研究它并不能启发我们设计有趣的算法。

以p=1/2为例。启发式计算表明,最大团的期望大小大约是 2 * log₂(n)。实际上,随着n增大,最大团的大小以压倒性概率落在这个数的向下取整或向上取整。因此,如果你在Erdős–Rényi图上运行最大团算法,无论算法聪明与否,所有算法都只能得到大约 log₂(n) 的性能。这令人沮丧,因为所有算法都表现得一样。


植入模型:引入明确的最优解 🌱

既然Erdős–Rényi模型不够好,我们如何改变它以获得更有趣的算法?接下来,我们将讨论植入模型。其核心思想是:在问题实例中“植入”一个明确的最优解,然后要求多项式时间算法能够恢复它。这非常符合之前关于稳定性假设讲座的精神。

让我展示最小平分和最大团问题的植入版本。

植入平分模型

这个模型早在80年代中期就被研究过。我们按以下方式生成一个实例:

  1. 首先将顶点集V划分为大小相等的S1和S2。这是我们的目标划分。
  2. 为了确保这是明确的最优解,我们偏置边的分布,使得S1或S2内部的边出现的概率p,高于S1和S2之间的边出现的概率q(q < p)。这样,这个平分切割的边数将少于其他任何平分。

算法不会看到像图中这样清晰的划分,所有节点是打乱的。问题是:即使我告诉你存在一个稀疏的平分,你能快速找到它吗?理论问题是:p和q之间的差距需要多大,才能保证多项式时间算法实现精确恢复?显然,p和q的差距越大,问题越简单。如果它们相同,就不是一个有趣的问题;如果差距非常大,那么简单的算法就能工作。所以问题是:精确恢复所需的p和q的最小差距是多少?

植入团模型

植入团问题实际上是一个非常引人入胜的问题。其生成方式如下:

  1. 有一个参数k。
  2. 你“植入”一个大小为k的团:从n个顶点中选取一个大小为k的子集C,并使其成为一个完全子图(团)。
  3. 对于团C之外的每一条边,以概率p(例如p=1/2)独立地包含它。

这样,你就有了一个埋在相当稠密的背景图中的团,你的任务是找到它。显然,k越大,问题越容易。如果k太小(比如小于log n),它就会完全隐藏在随机图中。所以问题是:k需要多大,才存在一个算法能以高概率实现精确恢复?


半随机模型:引入对抗性 🔄

接下来,我想谈谈半随机模型。这是本课程反复出现的主题之一——寻找平均情况分析和最坏情况分析之间的巧妙混合。我们可以将植入问题视为平均情况分析,而我们引入的分布是具有植入结构的非均匀分布。半随机模型的目标是驱使我们设计更稳健、更有趣的算法,并且在这方面已经取得了相当的成功。

这个模型同时涉及“自然”和一个“对手”,对手试图为你的算法设计一个坏输入。自然首先行动,生成一个随机的植入实例(可以是团或平分)。然后自然将其样本交给对手。对手可以改变自然开始的输入,但不能任意改变,否则它可以直接丢弃自然的样本,给你一个最坏情况的实例。因此,对手必须以某种方式部分尊重自然样本的随机性。

对手可以做什么?这听起来可能有点奇怪:对手可以使密集区域更密集,或使稀疏区域更稀疏。在平分模型中,对手可以在S1或S2内部添加更多边,或者可以移除跨越平分的边。在团模型中,对手不能破坏团本身,但可以删除团之外的任何边。

为什么这样设计?首先,一个简单的观察是:对手能改变最优解吗?不能,它实际上使最优解更加明显。这听起来很奇怪,为什么称之为“对手”,如果它只是在帮你?关键在于,也许有些算法在纯植入模型中有效,但在有对手的半随机模型中无效。事实上,一个简单的例子是:选取度数最高的k个节点的算法在团问题中不再有效。即使团的规模接近线性大小,使用这个算法也可能无法找到植入的团。

因此,这个模型允许我们区分算法。直观上感觉像是在“作弊”的算法,因为它过度依赖于输入分布的详细统计特性,因此是一种脆弱的解决方案。半随机模型提供了一种方式来说明:不,那不是一个足够稳健的算法。例如,如果一个对手以直觉上有帮助的方式调整输入,这个算法突然就失效了。我们真正想要的是稳健的算法。

稳健性在这里意味着什么? 它意味着算法的成功应该相对于输入的“容易程度”具有单调性。这就是我们所说的。只有稳健的算法才能在这种模型下存活下来。


针对最小平分的半正定规划方法 🧮

我想利用最小平分问题,介绍一种称为半正定规划的关键工具,它是许多最先进精确恢复技术的核心。

半正定规划可以看作是线性规划的推广。它允许你解决更多问题,并且仍然是多项式时间的,尽管在理论和实践上效率不如线性规划高,但对于解决规模适中的问题来说是可行的。

让我通过平分问题来展示如何将其表述为一个半正定规划松弛。

问题编码与松弛

对于一个有偶数个节点的图,考虑一个特定的平分 (S, S̄)。我们可以用一个 ±1 向量 z 来编码它,其中 z_i = +1 表示顶点i在S中,z_i = -1 表示在S̄中。

现在,定义变量 X_ij = z_i * z_j。对于所有顶点对 (i, j)X_ij 也是 ±1。我们可以将所有这些 X_ij 看作一个矩阵 X,它实际上是向量 z 的外积:X = z * z^T

我们的目标是最小化割边的数量。一条边 (i, j) 被切割当且仅当它的端点在不同侧,即当且仅当 X_ij = -1。因此,目标函数可以写成:

最小化 (1/2) * Σ_{(i,j)∈E} (1 - X_ij)

现在,我们列出任何平分对应的 X 矩阵满足的约束:

  1. 对角线约束X_ii = 1,对于所有i(因为 z_i^2 = 1)。
  2. 平衡约束:所有 X_ij 的和为0(因为 z 中有相等数量的+1和-1)。
  3. 结构约束X 矩阵是对称且半正定的。X 是半正定的意味着它可以表示为若干外积的和,而不仅仅是单个外积 z*z^T,这比我们需要的条件更宽松。

我们定义半正定规划为在上述约束(1-3)下最小化目标函数((1/2) * Σ_{(i,j)∈E} (1 - X_ij))。这个集合是凸的,因此可以在多项式时间内求解到任意精度。

关键点:任何平分解都映射到这个半正定规划的一个可行解。因此,我们最小化这个规划时,得到的最优目标函数值至多等于实际最小平分的割边数。这是一个松弛。

精确恢复的关键引理

现在,回到我们的植入平分模型(暂时没有对手)。假设p和q是常数,且它们的差距至少为 C * sqrt(log n / n)。Frieze和Kannan证明了一个关键引理:在这个植入模型中,高概率下,上述半正定规划松弛是精确的。也就是说,松弛的最优值 H(G) 恰好等于实际最小平分值 B(G)

证明思路涉及构造半正定规划的对偶解,并验证其对偶可行性,这需要一些技术性计算,我们在此不展开。

扩展到半随机模型

现在,考虑半随机模型,其中对手可以在自然生成植入实例后,添加内部边或删除交叉边。我们希望证明,在上述相同的p和q差距条件下,半正定规划在高概率下仍然是精确的。

这基于一个简单但关键的观察(可作为习题):如果图 G' 是通过向图 G 添加一条边得到的,那么半正定规划的最优值 H(G') 满足 H(G) ≤ H(G') ≤ H(G) + 1。如果是从 G 删除一条边,那么 H(G) - 1 ≤ H(G') ≤ H(G)

推论证明(归纳法)

  1. 基础:从随机的植入实例开始,根据引理,此时 H(G) = B(G)
  2. 归纳步骤:对手每次修改一条边。
    • 情况一:添加一条边(到密集区域)。添加后,实际的最小平分值 B(G) 不变(因为边加在了内部)。根据观察,H(G) 最多增加1。但由于 H(G) 始终是 B(G) 的下界(松弛性质),它不能超过 B(G)。因此,H(G) 必须保持不变,仍有 H(G) = B(G)
    • 情况二:删除一条边(从交叉区域)。删除后,实际的最小平分值 B(G) 减少1(因为从割集中移除了一条边)。根据观察,H(G) 最多减少1。同样,由于 H(G)B(G) 的下界,它不能少于新的 B(G)。因此,H(G) 也必须恰好减少1,从而仍有 H(G) = B(G)

通过归纳,无论对手进行多少次此类修改,半正定规划始终保持精确。


算法与后处理 ⚙️

这个半正定规划给了我们什么?它成功地计算出了最小平分的。你求解这个SDP,如果它输出127,那么最小平分值就是127。

然而,还有一个问题:如何提取出这个平分本身?这需要一些额外的后处理步骤。幸运的是,在给定合适提示的情况下,这个后处理过程并不困难,可以从SDP的解中恢复出植入的平分。


总结 📚

本节课我们一起学习了超越经典最坏情况分析的另一种途径——植入与半随机图模型。

  • 我们首先指出了经典的Erdős–Rényi随机图模型在区分算法性能方面的局限性,特别是在最小平分和最大团问题上。
  • 接着,我们引入了植入模型,通过在实例中预先埋入一个最优解(如稀疏的平分或大型的团),并研究在何种条件下算法能恢复该解。这为算法分析提供了新的角度。
  • 然后,我们探讨了半随机模型,它在植入模型的基础上引入了一个受限的对手。这个对手只能“帮助”凸显最优解(使密集处更密,稀疏处更稀),旨在筛选出那些不依赖于分布特定细节的、更稳健的算法。
  • 针对最小平分问题,我们介绍了一个强大的工具——半正定规划松弛。我们看到了如何将问题编码为SDP,并了解到在植入模型中,只要簇内与簇间边概率 pq 的差距超过 Ω(√(log n / n)),该松弛高概率下是精确的。
  • 更重要的是,我们通过一个简洁的归纳论证,证明了SDP的精确性可以自然地扩展到半随机模型,这体现了SDP方法所具有的我们期望的“单调性”稳健属性。

这些模型和SDP技术为我们分析和设计针对困难组合优化问题的算法提供了强大的框架,特别是在我们寻求对算法性能提供更细致、更稳健的理论保证时。

011:LP解码教程

在本节课中,我们将要学习线性规划解码。这是一种用于纠错码解码的算法,它通过求解一个线性规划问题来恢复被噪声破坏的原始信息。我们将从纠错码的基本概念开始,逐步介绍如何用图来构造编码,以及如何利用图的扩展性质来保证解码的成功。最后,我们将详细探讨线性规划解码的整数规划形式、其线性松弛,并证明在特定条件下,该线性规划的解是精确的。

纠错码基础

上一节我们介绍了课程的整体结构,本节中我们来看看纠错码的基本概念。纠错码的目标是以一种对错误(如比特翻转)具有鲁棒性的方式编码信息。我们今天只讨论二进制码,即字母表为 {0, 1} 的码。

以下是几个核心概念:

  • 汉明距离:两个向量之间不同的坐标数量。
  • 码的距离:一个码中任意两个码字之间的最小汉明距离。

例如,考虑一个码,它包含所有具有偶数奇偶性的二进制 n 维向量(即“1”的个数为偶数)。这个码的距离是 2。如果翻转一个比特,得到的向量将不再是码字(因为“1”的个数变为奇数);但翻转两个比特,则可能得到另一个码字。

码的距离 D 允许我们检测最多 D-1 个错误,并纠正少于 D/2 个错误。本讲座的重点是研究一个计算问题:给定一个被破坏的码字,如何高效地重构出离它最近的码字。

用图构造编码:LDPC 码

上一节我们了解了纠错码的基本参数,本节中我们来看看如何用图来自然地构造编码。这个想法源于 Gallagher,后来在 Sipser 和 Spielman 的工作中得到了广泛应用。

其核心思想是使用一个二分图 G。图的左侧是变量节点,共有 n 个,对应码字的 n 个坐标。图的右侧是校验节点,每个节点代表一个奇偶校验约束。图中的边连接变量节点和校验节点。

对于一个给定的二进制向量 x(即对每个变量节点赋予 0 或 1 的值),我们说 x 满足第 j 个校验,当且仅当在 x 中,与该校验节点 j 相连的所有变量节点的值之和为偶数。

码字正是那些满足所有奇偶校验约束的向量。因此,任何二分图(无需额外假设)都定义了一个码。

为了得到一个“好”的码,我们需要对图 G 施加一些充分条件。我们关注的码族通常称为低密度奇偶校验码。LDPC 码的条件如下:

  1. 左侧正则性:每个变量节点参与恰好 d 个奇偶校验约束(d 为常数,例如 10)。
  2. 右侧有界度:每个奇偶校验节点涉及的变量节点数为常数(例如 20)。
  3. 扩展性条件:存在一个常数 Δ(与 n 无关),使得对于任意大小不超过 Δn 的变量节点子集 S,其邻居集合 N(S) 的大小至少为 d|S| 的 75%。换句话说,小集合拥有几乎最大可能数量的不同邻居。

扩展性条件非常强,但可以通过概率方法证明随机图以高概率满足该条件。因此,我们可以通过随机选择来获得具有所需性质的图。

扩展性确保大距离

上一节我们定义了“好”的图应具备的性质,本节中我们来看看这些性质如何保证编码本身具有大的最小距离。

命题:满足上述三个条件的图所定义的码,其最小距离至少为 Δn。

证明思路:假设 x 是一个码字,z 是一个与 x 汉明距离小于 Δn 的向量。我们需要证明 z 不是一个码字。设 S 是 x 与 z 不同的坐标集合。由于 |S| < Δn,扩展性条件适用于 S。根据扩展性,在从 S 出发的 d|S| 条边中,至少有 (3/4)d|S| 条边指向不同的校验节点。这意味着最多只有 (1/4)d|S| 条边可能是“重复”边。因此,至少存在一个校验节点 j,它在 S 中恰好有一个邻居。由于 x 满足所有校验,而 z 在该校验涉及的变量中恰好翻转了一个比特,因此 z 必定不满足该校验,故 z 不是码字。这就证明了最小距离的下界。

这个结论是信息论意义上的:如果错误数少于 Δn/2,则最近的码字就是原始发送的码字。然而,这并未提供高效的解码算法。

整数规划与线性规划松弛

上一节我们证明了信息论上的可解码性,本节中我们来看看如何将其形式化为一个计算问题,并通过线性规划来求解。

给定接收到的(可能被破坏的)向量 z,我们希望找到离 z 最近的码字 x。这可以表述为一个优化问题。

首先,我们将其表述为一个整数规划。定义决策变量 x_i ∈ {0, 1} 表示要寻找的码字。目标函数是最小化汉明距离,可以简化为:
minimize Σ_{i: z_i=0} x_i - Σ_{i: z_i=1} x_i
(忽略了一个常数项)。

为了编码“x 是码字”这一约束,我们引入辅助变量。对于每个校验节点 j,令 A_j 为所有满足该校验的局部赋值(即对 j 的邻居变量赋 0/1 值,且“1”的个数为偶数)的集合。对于每个 j 和每个 a ∈ A_j,我们引入变量 y_{j,a} ∈ {0, 1},其含义为:如果码字在 j 的邻居上的取值恰好是 a,则 y_{j,a}=1,否则为 0。

整数规划的约束如下:

  1. 局部满足性:对于每个校验节点 j,Σ_{a ∈ A_j} y_{j,a} = 1。这强制每个校验必须选择一种令其满足的局部赋值。
  2. 全局一致性:对于每条边 (i, j)(即变量 i 参与校验 j),有 x_i = Σ_{a ∈ A_j: a_i=1} y_{j,a}。这确保了不同校验节点对同一变量 i 的“看法”必须一致,并且与全局变量 x_i 一致。

整数规划的可行解与码字一一对应。因此,求解该整数规划等价于寻找最近码字。然而,该整数规划是 NP 难的。

我们转而考虑其线性规划松弛:将变量 x_i 和 y_{j,a} 的取值范围松弛到 [0, 1],并保持所有约束不变。只要每个校验节点的度是常数,这个线性规划的规模就是多项式级别的。

主要定理与证明策略

上一节我们得到了一个多项式时间可解的线性规划松弛,本节中我们来看看在什么条件下这个松弛是精确的。

定理:如果图 G 满足前述的三个条件(左侧 d-正则,右侧有界度,具有参数 Δ 的扩展性),并且接收到的向量 z 遭受了不超过 Δ’ n 个错误(其中 Δ’ 是一个略小于 Δ 的常数),那么上述线性规划松弛是精确的。即,其最优解就是离 z 最近的码字。

证明将分为两个引理。通过一个平移变换,我们可以将问题简化为一个特殊情况:假设离 z 最近的码字是全零向量。在这种情况下,我们需要证明线性规划的唯一最优解是 x=0。

引理 1(对偶证书):如果存在一组赋予图 G 各条边的权重 w_{ij},满足以下三个“可行性”条件,那么 x=0 是线性规划的唯一最优解。

  1. 对于每个满足 z_i = 0 的变量节点 i(未出错),其关联边的权重和 Σ_{j ∈ N(i)} w_{ij} ≤ 1
  2. 对于每个满足 z_i = 1 的变量节点 i(出错),其关联边的权重和 Σ_{j ∈ N(i)} w_{ij} ≤ -1
  3. 对于每个校验节点 j 以及任意两个与其相邻的变量节点 i, i’,有 w_{ij} + w_{i’j} ≥ 0

直观上,这组权重 w 充当了一个“对偶证书”。条件 1 和 2 利用权重和目标函数中的系数(+1 或 -1)相关联。条件 3 则利用了校验节点的局部结构。证明通过将目标函数值用权重和线性规划变量 y_{j,a} 重新表示,并利用上述三个条件,最终证明任何可行解的目标函数值都非负,且仅在 x=0 时为零。

引理 2(权重的存在性):在定理的条件下(错误数不超过 Δ’ n),我们可以构造出一组满足引理 1 条件的可行权重 w。构造思想是自适应地分配权重,利用图的扩展性质来避免不同出错变量在同一个校验节点上产生“冲突”(即违反条件 3)。这部分的详细构造将在下节课完成。

总结

本节课中我们一起学习了线性规划解码的基本框架。我们从纠错码和图编码的基础出发,介绍了低密度奇偶校验码及其依赖的图扩展性质。我们展示了如何将最近码字解码问题形式化为一个整数规划,并自然地松弛为线性规划。最后,我们探讨了证明该线性规划精确性的核心策略,即构造一个满足特定条件的对偶证书(边权重)。这为下一节课完成整个定理的证明奠定了基础。

012:LP解码与平滑分析简介 🧩

在本节课中,我们将完成对LP解码证明的讨论,并介绍一种名为“平滑分析”的新分析框架。我们将首先回顾并完成上一讲中关于低密度奇偶校验码线性规划解码的证明。随后,我们将转向平滑分析,探讨其核心思想、动机以及它如何帮助我们理解像单纯形法这样在实践高效但在最坏情况下表现不佳的算法。


完成LP解码的证明 🔍

上一讲我们介绍了低密度奇偶校验码,并开始证明一个定理:如果一个由二分图定义的码满足一定的扩展性条件,并且接收到的码字错误数量足够少,那么一个特定的线性规划就能精确地恢复出原始码字。

我们已将定理的证明归结为:在上述假设下,我们能否为二分图的每条边分配一组权重,使其满足特定的“可行权重”条件。本节中,我们将具体构造这组权重。

回顾可行权重条件

我们需要为二分图的每条边 (i, j) 分配一个权重 w_ij。设 I 为未出错的坐标(对应发送的零码字),J 为出错的坐标(对应翻转的比特)。我们需要满足以下条件:

  1. 条件A(未出错变量):对于所有 i ∈ I,其所有关联边的权重之和 ∑_j w_ij ≤ 1
  2. 条件B(出错变量):对于所有 i ∈ J,其所有关联边的权重之和 ∑_j w_ij ≤ -1
  3. 条件C(成对约束):对于任意奇偶校验节点 j 及其关联的任意两个变量节点 i1i2,有 w_{i1, j} + w_{i2, j} ≥ 0。这保证了所有偶数大小集合的权重和非负。

构造权重的第一步:定义集合K

我们首先扩展出错坐标集 J,定义一个集合 K,它包含那些“本身未出错,但其关联的奇偶校验中至少有一半包含出错变量”的坐标。形式化定义为:
K = { i ∈ I | 至少50%的邻居(奇偶校验)与 J 相交 }

关键断言:集合 J ∪ K 的大小不超过 Δn(其中 Δ 是扩展性条件中定义的常数)。这个断言可以通过反证法并利用图的扩展性来证明:如果 |J ∪ K| > Δn,我们可以找到一个大小为 Δn 的子集 S,其邻居数量少于 0.75 * D * |S|,这与扩展性条件矛盾。

构造权重本身

现在,我们为每条边分配权重。每个奇偶校验节点 j 需要选择一个“最喜爱的”变量节点 v(j)。我们要求:对于所有属于 JK 的变量节点 i,至少有 0.75 * D 个关联的奇偶校验节点选择 i 作为最喜爱的变量(D 是左侧节点的度)。利用霍尔定理和图的扩展性,可以证明这样的选择是存在的。

权重的具体赋值规则如下:

  • 情况1:奇偶校验 j 选择的最喜爱变量 v(j) 属于 J(即出错的)
    • (v(j), j) 的权重设为 -2/D - εε 是一个任意小的正数)。
    • 奇偶校验 j 关联的其他所有边 (i, j)(其中 i ≠ v(j))的权重设为 2/D - ε
  • 情况2:奇偶校验 j 选择的最喜爱变量 v(j) 不属于 J(即未出错的,无论其是否属于 K
    • 奇偶校验 j 关联的所有边 (i, j) 的权重都设为 0

验证权重条件

接下来,我们验证这样定义的权重满足条件A、B和C。

  • 验证条件C:根据构造,对于任何奇偶校验 j,其关联的边权重要么全为0,要么包含一个负权重 (-2/D - ε) 和多个正权重 (2/D - ε)。因此,任意两条边的权重之和显然非负,条件C自动满足。

  • 验证条件B(出错变量 i ∈ J

    • 对于出错变量 i,其关联边的权重可能是负值(当 i 被选为最喜爱变量时)、正值(当同一次校验中另一个出错变量被选中时)或0(当同一次校验中一个未出错变量被选中时)。
    • 最坏情况是 i 仅被 0.75 * D 个校验选为最爱(得到负权重),而在剩下的 0.25 * D 个校验中,其他出错变量被选中(导致 i 得到正权重)。
    • 计算权重和的上界:(0.75D)*(-2/D - ε) + (0.25D)*(2/D - ε) = -1 - Dε
    • 由于 ε > 0,该和严格小于 -1,满足条件B。
  • 验证条件A(未出错变量 i ∈ I:这需要分两种情况讨论:

    • 情况A1:i ∈ K(“出错变量的朋友”)
      • 根据定义,i 的权重不可能为负(因为只有出错变量能获得负权重)。它可能为0(当 i 被选为最爱时)或正值(当同一次校验中一个出错变量被选中时)。
      • 由于 i 至少被 0.75 * D 个校验选为最爱(得到0权重),在最坏情况下,剩余 0.25 * D 个校验给出正权重。
      • 权重和上界:(0.75D)*0 + (0.25D)*(2/D - ε) = 0.5 - 0.25Dε,当 ε 足够小时,该值小于1。
    • 情况A2:i ∉ J ∪ K(与出错变量“保持距离”的变量)
      • 由于 i 不属于 K,意味着超过一半(>50%)的关联校验中不包含任何出错变量。这些校验必然选择一个未出错变量作为最爱,因此 i 在这些校验上的权重为0。
      • 在最坏情况下,假设刚好有50%的校验是“干净”的(权重0),另外50%的校验包含出错变量(给出正权重)。
      • 权重和上界:(0.5D)*0 + (0.5D)*(2/D - ε) = 1 - 0.5Dε,当 ε 足够小时,该值小于等于1。

至此,我们成功构造了满足所有条件的可行权重。结合上一讲的弱对偶论证,这就完成了LP解码精确性的证明。这意味着,在扩展性良好的LDPC码且错误数有限的情况下,线性规划可以高效且准确地解码。


引入平滑分析 🌊

在完成了对LP解码的讨论后,我们将转向本课程的一个新部分:鲁棒的分布分析。我们的目标是找到一种分析框架,能够同时结合最坏情况分析的鲁棒性和平均情况分析的精确性。

混合分析框架

考虑一个算法 A 在输入 z 上的代价 cost(A, z)(例如运行时间、解的质量)。

  • 最坏情况分析:考察所有可能输入上的最大代价:max_z cost(A, z)
  • 平均情况分析:在某个特定的输入分布 D 上考察期望代价:E_{z∼D}[cost(A, z)]

混合模型试图在这两者之间取得平衡。其思想是:我们承认输入可能来自某个分布,但并不确信具体是哪一个。因此,我们考虑一个分布集合 C,并希望算法在所有这些可能分布上都表现良好。算法的“鲁棒-平均”代价定义为:
max_{D ∈ C} E_{z∼D}[cost(A, z)]

通过调整集合 C 的大小和性质,我们可以在这个谱系上移动:

  • C 只包含一个分布时,退化为平均情况分析。
  • C 包含所有可能的点质量分布(即确定性输入)时,退化为最坏情况分析。

平滑分析:一个具体的混合模型

平滑分析是此类混合模型中最著名、研究最深入的一个。它的核心思想如下:

  1. 对手选择输入:首先,一个对手可以选择一个任意的、可能很“病态”的输入 z(例如,一个使单纯形法运行极慢的线性规划)。
  2. 自然进行扰动:然后,对这个输入施加一个小的随机扰动。例如,给输入数据的每个分量加上一个独立的高斯噪声 N(0, σ²),其中 σ 是扰动幅度。
  3. 分析扰动后的期望性能:我们分析算法在扰动后的输入 z + 扰动 上的期望代价。

平滑复杂度定义为:
max_z E_{扰动}[ cost(A, z + 扰动) ]

我们希望证明,对于某些算法,这个量是输入规模 n1/σ 的多项式。

平滑分析的动机与适用场景

平滑分析在以下情况特别有用:

  • 避免病态输入:许多算法(如单纯形法)的坏例子非常脆弱,像“刀锋”一样精确。一个微小的随机扰动就极有可能使其脱离坏情况。
  • 为实际数据建模:在实际应用中,数据往往来自测量,本身就带有噪声或舍入误差。平滑分析恰好捕捉了“输入是真实值加小噪声”这一特性。
  • 解释经验成功:它为那些在最坏情况下理论性能差、但对任何特定分布又不是最优、却在实践中广泛奏效的通用算法(如单纯形法)提供了理论解释。
  • 启发新算法设计:新的分析框架可能引导我们设计出具有更好平滑复杂度的新算法。

平滑分析主要适用于运行时间分析,并且要求算法的坏输入是脆弱的。对于那些坏输入在扰动下依然保持“坏”的特性(例如某些近似算法的最坏情况实例),平滑分析可能不适用。


平滑分析的起源:单纯形法 🚀

平滑分析最早由Spielman和Teng在2001年提出,其核心应用和驱动力就是解释单纯形法的经验性能。

结果陈述

他们证明了,尽管单纯形法在最坏情况下具有指数级运行时间,但其**平滑复杂度是多

013:局部搜索的平滑分析 🧭

在本节课中,我们将深入学习平滑分析,并探讨如何将其应用于局部搜索算法,特别是针对旅行商问题的2-opt邻域搜索。我们将看到,尽管局部搜索在最坏情况下可能需要指数级迭代次数,但在平滑分析框架下,其期望运行时间是多项式级别的。

平滑分析回顾

上一节我们介绍了混合分析模型的概念。本节中,我们来看看平滑分析这一特定模型。

平滑分析结合了最坏情况分析和平均情况分析的优点。它从一个最坏情况的输入开始,然后引入一个小的随机扰动。

  • 最坏情况方面:一个对手选择一个初始输入,意图是针对你的算法选择最坏的输入。
  • 平均情况方面:然后,“自然”对这个输入施加一个随机扰动。

扰动的大小在两种模型之间进行插值:当扰动趋近于0时,我们回到最坏情况分析;当扰动变大时,我们接近平均情况分析。

平滑分析通常在算法的最坏情况实例显得非常“脆弱”时特别有用。这些坏例子通常结构复杂,在随机扰动下很容易被破坏。在算法的各种成本度量中,运行时间通常是最容易出现这种非鲁棒性病态输入的度量,这也是平滑分析最主要的应用领域。

局部搜索与平滑分析

现在,让我们将焦点转向局部搜索算法。

在高层次上,局部搜索的过程是:你有一个优化问题,维持一个可行解,定义一组允许的局部移动操作,然后迭代地执行能改进当前解的局部移动,直到无法进一步改进为止,此时算法停止于一个局部最优解。

那么,为什么局部搜索特别适合用平滑分析呢?

  • 理论上的病态输入:局部搜索算法在理论上经常遭受病态输入的影响,导致在最坏情况下需要指数级的改进步数才能收敛。
  • 实践中的高效表现:然而,在实际运行中,我们几乎从未观察到这种指数级行为,通常观察到的运行时间是二次方甚至更好的。
  • 实例的脆弱性:如果你仔细检查那些最坏情况的构造,会发现它们非常脆弱,显然在微小扰动下就会崩溃。

这种理论与实践的脱节,是平滑分析可以大显身手的典型场景。

案例研究:旅行商问题

为了具体说明,我们选择一个基础问题作为案例研究:旅行商问题

我们将关注TSP的一个特例:

  • 输入:平面单位正方形内的n个点。
  • 目标:计算一个访问每个点恰好一次并回到起点的环路(旅行路线),使得总旅行距离最小。
  • 距离度量:为了简化分析,我们使用L1范数(曼哈顿距离)来衡量两点之间的距离。distance((x1, y1), (x2, y2)) = |x1 - x2| + |y1 - y2|

虽然这个特例也是NP难的,但实践中人们常使用启发式算法,局部搜索就是其中一种主要方法。

2-opt邻域局部搜索

局部搜索的行为由“邻域”定义。我们采用一种经典且简单的方法:2-opt邻域

算法维护一个旅行路线。在每次迭代中:

  1. 查看当前路线中的两条边(例如,连接点U-V和X-Y的边)。
  2. “移除”这两条边。
  3. 以唯一能形成新旅行路线的方式重新连接这些点:连接V-X和U-Y。
  4. 如果这个“交换”操作能减少总路线长度,就执行它。

算法持续执行任意能改进的局部移动,直到没有改进移动存在为止。每次迭代可以在多项式时间内实现(例如O(n³)),核心问题是:需要多少次迭代才能收敛?

关于这个算法,已知两个关键结果:

  1. 最坏情况结果:即使对于平面上的点和使用L1度量,2-opt局部搜索在最坏情况下也可能需要指数级的迭代次数才能停止。这个构造非常精巧但脆弱。
  2. 平滑分析结果:另一方面,在平滑分析框架下,2-opt局部搜索具有多项式平滑复杂度。即使从一个最坏情况的例子开始,只要稍加扰动,局部搜索就能快速运行。

本节课剩余部分的目标,就是证明第二个(积极的)结果。

新的扰动模型

首先,我们以一种更简洁的方式重新表述扰动模型。

我们将对手选择初始输入和自然施加扰动这两个步骤合并。现在,对手不再选择一个确定的输入,而是被迫选择一个分布。我们要求这些分布不能“太尖锐”。

具体来说:

  • 对手为每个点Pi选择一个在单位正方形上的概率密度函数fi。
  • 不同点的选择是独立的。
  • 关键限制:每个密度函数在任何点的值都有上界:fi(x) ≤ 1/σ

这里,σ是一个参数,衡量扰动的“大小”。

  • 当σ → 0时,密度上界趋于无穷,对手可以(近似)确定性地选择一个点,接近最坏情况分析。
  • 当σ = 1时,最大的可能密度是1,这要求分布至少均匀分布在面积为1的区域上(即整个单位正方形),接近平均情况分析。

直观上,这迫使每个点的分布支撑集的面积至少为σ。我们的目标是证明:无论对手选择何种符合该上界(即“不太尖锐”)的分布,局部搜索的期望迭代次数都是n和1/σ的多项式。

证明计划与关键引理

证明计划分为两步,这兑现了我们之前在参数化分析中做出的承诺:

  1. 参数化上界:对于任何输入,我们根据某个“条件数”参数,给出局部搜索迭代次数的参数化上界。这一步通常较容易。
  2. 平滑分析:利用我们正在进行平滑分析的事实,证明由于扰动的存在,第一步中识别的参数值不可能太糟糕。

对于局部搜索,一个关键参数是“坏交换”的最小改进量。定义一次交换为 ε-坏 的,如果它改进目标函数,但改进量小于ε。也就是说,如果交换操作将边(U,V)和(X,Y)替换为(U,Y)和(V,X),那么改进量Δ为:
Δ = (|U-V| + |X-Y|) - (|U-Y| + |V-X|)
0 < Δ < ε 时,该交换是ε-坏的。

算法的条件数可以看作是使得ε-坏交换存在的最小ε。如果没有改进量很小的交换(即所有改进都至少是某个ε),那么我们从初始上界(最多O(n))开始,最多只需要 O(n/ε) 次迭代就能收敛。

整个证明的核心是以下关键引理:

关键引理:对于任意ε > 0,在随机输入下,存在一个ε-坏交换的概率至多是 O( (ε/σ) * n⁴ )

忽略n⁴这个多项式因子,概率上界大致是ε/σ。这很直观:扰动强度σ越大(分布越分散),出现坏交换的概率越低;坏交换的阈值ε越小,出现这种微妙情况的概率也越低。

如果这个引理成立,我们可以完成证明。设M为迭代次数随机变量。迭代次数超过M的必要条件是存在一个改进量小于 2n/M 的坏交换。利用关键引理和期望公式,经过推导(涉及调和级数求和),可以得出期望迭代次数 E[M] = O( σ⁻¹ * n⁶ log n )。这是一个关于n和1/σ的多项式,证毕。

因此,剩下的任务就是证明这个关键引理。

关键引理的证明

证明的关键思路是:先固定一个具体的交换(涉及四个点U, V, X, Y)。总共有O(n⁴)种可能的交换。我们将证明,对于一个固定的交换,其改进量Δ落在(0, ε)区间内的概率是 O(ε/σ)。然后利用联合界(Union Bound)乘以O(n⁴),就得到引理中的界。

现在分析固定交换的概率。Δ的表达式是L1范数之和:
Δ = (|U₁-V₁| + |X₁-Y₁|) - (|U₁-Y₁| + |V₁-X₁|) + (在第二坐标上相同的表达式)

绝对值符号处理起来比较麻烦。技巧是:考虑四个点在第一坐标上的所有可能排序(4!种),以及在第二坐标上的所有可能排序。对于每一种排序组合,每个绝对值表达式都根据谁大谁小简化为一个线性项。因此,在每种具体的排序下,Δ表达式简化为这八个坐标变量(U₁, V₁, X₁, Y₁, U₂, V₂, X₂, Y₂)的一个整数系数线性组合

原始的Δ落在(0, ε)内,意味着至少存在一种排序组合(总共4! × 4!种,即常数种),使得对应的那个整数系数线性组合L也落在(0, ε)内。这是一个必要条件。

因此,我们转而证明:对于任何一个这样的(非零)整数系数线性组合L,其值落在(0, ε)内的概率是 O(ε/σ)

证明最后一步使用“延迟决策原则”:

  1. 在L的整数系数中,至少有一个非零系数。设对应的变量为Z。
  2. 我们条件于其他七个变量的取值。此时,L的表达式形式为:L = λ + α * Z,其中λ是一个常数(由其他七个变量决定),α是一个非零整数。
  3. 现在,唯一的随机性是Z。根据模型,Z的密度函数有界:f_Z(z) ≤ 1/σ
  4. 事件 0 < λ + αZ < ε 等价于Z落在某个长度为 ε/|α| 的区间内。由于 |α| ≥ 1,这个区间长度至多为ε。
  5. 概率上界 = 区间长度 × 最大密度 ≤ ε * (1/σ) = ε/σ

这就完成了对单个线性组合的证明。乘以常数种可能的排序组合,再乘以O(n⁴)种可能的交换,就证明了关键引理。

这个证明体现了平滑分析的典型风格:通过延迟决策,留下足够的随机性来证明某个条件数(这里是坏交换的最小改进量)以高概率不会太小。

开放问题与总结

本节课我们一起学习了如何将平滑分析应用于局部搜索算法,特别是TSP的2-opt启发式算法。我们证明了尽管存在指数级的最坏情况,但在平滑模型下,期望运行时间是多项式级别的。

局部搜索中还有许多开放问题适合用平滑分析探索:

  • 更多问题的平滑上界:为其他基础问题的局部搜索算法证明多项式平滑复杂度。
  • 最大割问题的挑战:对于一般图上的最大割问题,其翻转邻域局部搜索是否具有多项式平滑复杂度?这是一个未解决的问题,目前只知道拟多项式上界。
  • 更一般的猜想:是否所有属于PLS复杂度类的局部搜索问题,都存在某个版本的多项式时间算法具有多项式平滑复杂度?这是一个更宏大、更吸引人的猜想。

平滑分析成功地将指数级最坏情况转化为多项式期望情况,帮助我们弥合理论与实践的鸿沟。虽然获得紧确的多项式指数仍然非常困难,但它为我们理解为何许多算法在实际中表现良好提供了强大的理论工具。

014:帕累托曲线的平滑分析 🧮

在本节课中,我们将要学习平滑分析的一个具体应用:分析帕累托曲线的期望大小。我们将从一个经典的NP完全问题——背包问题入手,介绍一种不依赖于动态规划的算法,其运行时间由帕累托曲线的大小决定。然后,我们将证明,在平滑的输入模型下,帕累托曲线的期望大小仅为输入规模的二次方,这意味着该算法在平滑模型下具有多项式期望运行时间。


背包问题与帕累托曲线 🎒

首先,让我们回顾一下背包问题。输入包含 n 个物品,每个物品 i 有两个正参数:价值 v_i 和重量 w_i。此外,还有一个背包容量 W。目标是选择一个物品子集 S,在总重量不超过 W 的前提下,最大化总价值 ∑_{i∈S} v_i

接下来,我们引入帕累托曲线的概念。考虑两个不同的物品子集 ST。我们说 S 支配 T,如果 S 的总价值高于 T,并且 S 的总重量不超过 T。换句话说,S 在价值和重量两个指标上都优于 T

帕累托曲线 就是所有非支配解的集合。如果我们将总重量画在x轴,总价值画在y轴,那么一个解被支配意味着存在一个位于其“西北方向”(即价值更高、重量更轻)的点。帕累托曲线上的点就是那些没有其他点在其西北方向的点。


基于帕累托曲线的背包算法 ⚙️

上一节我们介绍了帕累托曲线的概念,本节中我们来看看一种基于此的背包算法。该算法不显式使用动态规划,其步骤如下:

  1. 生成帕累托曲线:枚举所有非支配解(即帕累托最优解)。
  2. 选择最优解:在帕累托曲线中,找出所有总重量不超过背包容量 W 的解,并返回其中价值最高的那个。

这个算法的正确性是显然的:由于被支配的解不可能是最优解,因此只考虑帕累托最优解不会遗漏全局最优解。

算法的运行时间取决于帕累托曲线的大小。实现时,我们可以按顺序考虑物品,逐步构建前缀物品集的帕累托曲线。以下是实现的核心思路:

  • PC_i 表示前 i 个物品的帕累托曲线。
  • PC_0(空集)开始。
  • 为了从 PC_i 计算出 PC_{i+1},我们可以考虑第 i+1 个物品的两种选择(包含或不包含),然后合并两个已按重量排序的帕累托曲线列表。这可以在 O(|PC_i| + |PC_{i+1}|) 时间内完成。

因此,算法的总运行时间为 O(∑_{i=0}^{n} |PC_i|)


算法性能分析 📊

我们已经看到算法的运行时间与帕累托曲线的大小紧密相关。现在我们来分析这个大小。

最坏情况下,帕累托曲线的大小可以达到 2^n(指数级)。然而,在平滑模型下,我们将证明其期望大小仅为 O(n^2 / σ),其中 σ 是扰动程度的参数。

为了建立直观理解,我们先考虑一些乐观的情况。假设物品重量是整数,且最大重量为 W_max。由于帕累托曲线中每个不同的总重量最多对应一个解(否则价值较低的那个会被支配),因此曲线大小最多为 n * W_max。类似地,如果物品价值是整数且最大价值为 V_max,曲线大小最多为 n * V_max。值得注意的是,我们上面描述的同一个算法,无需任何修改,就能自动在这两种整数假设下都达到良好的运行时间上界。


平滑模型与主要定理 🎯

上一节我们讨论了算法在特定整数假设下的性能,本节我们将在更一般的平滑模型下分析其期望性能。

我们采用与上一讲(TSP的平滑分析)类似的平滑模型:

  • 物品价值 v_i 和背包容量 W 由对手任意选择(最坏情况)。
  • 每个物品的重量 w_i 是随机扰动的,服从某个定义在 [0, 1] 区间上的概率分布。我们只假设该分布的密度函数在任何点的值都不超过 1/σ(即分布不能太“尖峰”)。σ 衡量了扰动的“扩散”程度。

主要定理:在上述平滑模型中,帕累托曲线的期望大小 E[N] 满足:
E[N] = O(n^2 / σ)

根据期望的线性性,这意味着我们算法的期望运行时间为 O(n^3 / σ)。这是一个非常有趣的结果:它为一个NP完全问题提供了一个在平滑模型下具有多项式期望时间的算法。


定理证明思路(热身版) 🔍

证明的核心思想是将复杂的帕累托曲线计数问题,分解为许多简单的小事件,使得每个小事件都能方便地应用“权重是随机扰动”的假设。

我们首先将重量范围 [0, n] 划分为许多宽度为 ε 的小切片,并选择 ε 足够小,使得几乎不可能有两个帕累托最优解落在同一个切片内。这样,帕累托曲线的点数就近似等于被占用的切片数。

对于每个切片边界 T,我们定义:

  • P_T:在 T 左侧(重量 ≤ T)的帕累托最优解中,价值最高的那个。
  • S_T:在 T 右侧(重量 > T)的帕累托最优解中,满足其价值大于 P_T 的价值,且重量最小的那个。
  • N_T:指示 S_T 是否恰好落在紧邻 T 右侧的切片 [T, T+ε] 中的随机变量(是为1,否为0)。

可以论证,每个帕累托最优解都会被其左侧切片边界 T 对应的 N_T 计数到。因此,帕累托曲线的总点数 N 满足 N ≤ ∑_{T} N_T

然而,直接分析 Pr[N_T = 1] 仍然困难,因为 S_T 可能是众多候选解中的任何一个。


定理的完整证明 🛠️

为了最终能应用平滑假设,我们需要对上述分解进行更精巧的改造。

我们不仅对切片边界 T 参数化,还对物品 i 参数化。对于每一对 (i, T),我们定义:

  • P_{i,T}:在 T 左侧(重量 ≤ T)且不包含物品 i 的解中,价值最高的那个。
  • S_{i,T}:在 T 右侧(重量 > T)的解中,满足其价值大于 P_{i,T} 的价值,且必须包含物品 i,同时重量最小的那个。
  • N_{i,T}:指示 S_{i,T} 是否落在切片 [T, T+ε] 中的随机变量。

关键的计数引理是:帕累托曲线的总点数 N 满足 N ≤ ∑_{i} ∑_{T} N_{i,T}。也就是说,每个帕累托最优解 S 都可以被某个特定的 (i, T) 对“认领”,使得 S = S_{i,T}N_{i,T} = 1。这里 TS 左侧最近的边界,而 i 是任意一个在 S 中但不在 P_TT 左侧的帕累托最优解)中的物品。

现在,分析的重点转向计算 Pr[N_{i,T} = 1]。我们固定一对 (i, T),并条件于所有其他物品 j ≠ i 的重量。此时,只有物品 i 的重量 w_i 是随机的。

在这个条件下,神奇的事情发生了:

  1. P_{i,T} 是确定的(因为它排除了随机的物品 i)。
  2. S_{i,T} 所对应的物品集合也是确定的!因为我们需要包含 i,且价值必须超过一个确定阈值 V_{i,T},同时要重量最小。由于除了 i 之外所有物品重量已固定,包含 i 的各个解之间的重量排序也是确定的。
  3. 因此,S_{i,T} 的总重量可以写为 X + w_i,其中 XS_{i,T} 中除 i 外其他物品的重量之和,这是一个确定的常数。

于是,事件 N_{i,T} = 1(即 S_{i,T} 的重量落在 [T, T+ε] 内)等价于事件 w_i ∈ [T - X, T - X + ε]。这是一个长度为 ε 的区间。

根据平滑假设,w_i 的密度函数值处处不超过 1/σ。因此,w_i 落在这个固定区间内的概率至多为 ε * (1/σ) = ε/σ

最后,我们对所有 i(共 n 个)和所有切片边界 T(共约 n/ε 个)求和。根据期望的线性性,帕累托曲线的期望大小上界为:
E[N] ≤ ∑_{i} ∑_{T} Pr[N_{i,T}=1] ≤ n * (n/ε) * (ε/σ) = O(n^2 / σ)

证毕。


总结与延伸 🚀

本节课中我们一起学习了:

  1. 帕累托曲线在多目标优化中的概念,以及如何将其应用于背包问题。
  2. 一种不基于动态规划的背包算法,其运行时间由帕累托曲线大小决定。
  3. 平滑分析模型下,我们证明了帕累托曲线的期望大小仅为 O(n^2 / σ),从而为该NP完全问题提供了一个多项式期望时间的算法。
  4. 证明的核心是巧妙的计数分解,将复杂事件归结为只涉及单个随机变量的简单事件,从而干净利落地应用了平滑性假设。

这个结果展示了平滑分析如何能揭示计算问题本身的内在性质,而不仅仅是分析特定算法。近年来,该结果已被推广到更高维的帕累托曲线(即多于两个优化目标的情况),得到了形如 O(n^{2d} / σ^d) 的界限,这基本上是紧的。

在下一讲(也是平滑分析部分的最后一讲)中,我们将看到一个更一般的定理,它将在“伪多项式时间可解”与“具有多项式平滑复杂度”之间建立一种等价关系。

015:平滑复杂度与伪多项式时间算法 😊

在本节课中,我们将学习如何通过平滑分析的视角来理解计算问题本身,而不仅仅是算法。我们将探讨一类特定的二元优化问题,并揭示一个核心结论:一个问题的平滑复杂度是多项式的,当且仅当其最坏情况复杂度是伪多项式的。我们将通过证明两个方向来深入理解这一等价关系。

概述

我们将研究形式为 max_{x ∈ F} v^T x 的二元优化问题,其中 xn 维0/1向量,F 是可行解集合,v 是权重向量。我们将探讨在何种条件下,存在一个算法,其在对权重 v 进行微小随机扰动后的期望运行时间是多项式级别的。核心结论是:存在多项式平滑复杂度算法 当且仅当 存在(随机化)伪多项式时间最坏情况算法


从平滑复杂度到伪多项式时间

上一节我们概述了核心定理。本节中,我们首先证明定理的“仅当”部分:如果一个二元优化问题具有多项式平滑复杂度,那么它可以在伪多项式时间内求解。

证明思路

假设我们有一个算法 A,对于平滑实例(即权重 v_i 从密度上界为 1/σ 的分布中独立抽取),其期望运行时间是 poly(n, 1/σ)

现在,给定一个最坏情况实例,其权重 v_i 为整数。我们的目标是利用算法 A 构造一个针对原问题的随机化伪多项式时间算法。

  1. 缩放:首先,将所有权重 v_i 除以最大值 V_max,使其落入 [0, 1] 区间。此时,最优解与次优解的目标函数值之差至少为 1 / V_max
  2. 扰动:主动对每个缩放后的权重 v_i 施加一个随机扰动 δ_iδ_i[0, 1/(2n V_max)] 上均匀分布。得到扰动后的权重 v_i' = v_i + δ_i
  3. 调用算法:在扰动后的实例上运行平滑算法 A
  4. 输出结果:返回算法 A 给出的解。

正确性与运行时间分析

  • 正确性:由于每个坐标的扰动幅度不超过 1/(2n V_max),且解 x 是0/1向量,因此任何解的目标函数值变化不超过 n * [1/(2n V_max)] = 1/(2 V_max)。而原问题最优解与次优解的差距至少为 1 / V_max。因此,扰动后实例的最优解必然是原实例的最优解之一。
  • 运行时间:算法 A 的期望运行时间是 poly(n, 1/σ)。在我们的扰动中,分布支撑区间长度为 1/(2n V_max),因此密度上界 1/σ = 2n V_max。代入得期望运行时间为 poly(n, V_max),这正是伪多项式时间。

过渡:以上我们证明了,多项式平滑复杂度隐含着伪多项式时间可解性。这个方向的证明相对直接,其更重要的应用在于逆否命题:如果一个问题是强NP难的(即不存在伪多项式时间算法,除非P=NP),那么它也不可能有多项式平滑复杂度。这为理解哪些NP难问题无法通过平滑分析“变易”提供了理论依据。


隔离引理:平滑实例中的“胜者差距”

在证明定理的另一个方向(从伪多项式时间到平滑复杂度)之前,我们需要一个关键的分析工具——隔离引理。它描述了在平滑随机实例中,最优解相对于其他解有多么“孤立”。

定义与陈述

考虑一个平滑实例。对于参数 ε > 0,我们称一个变量索引 iε-坏的,如果强制 x_i = 0 时的最优解值,与强制 x_i = 1 时的最优解值,两者相差不超过 ε

隔离引理指出:在平滑实例中,存在至少一个 ε-坏索引的概率至多为 ε n / σ

证明概要

  1. 固定一个索引 i,并条件依赖于所有其他权重 v_j (j ≠ i)
  2. 在此条件下,强制 x_i = 0 的最优解 S_- 及其值 V_- 是确定的。
  3. 强制 x_i = 1 的最优解 S_+ 的身份(即哪些变量为1)也是确定的,但其值形式为 X + v_i,其中 X 是固定部分,v_i 是随机的。
  4. 索引 i 是 ε-坏的,当且仅当随机变量 v_i 落入一个长度为 的特定区间内。
  5. 由于 v_i 的密度处处不超过 1/σ,该事件概率至多为 2ε / σ
  6. n 个索引取并集,即得引理结论。

过渡:隔离引理是一个强大的概率工具。它的一个直接推论关乎我们关心的“胜者差距”——最优解与次优解的目标值之差。

推论:胜者差距下界

由隔离引理可以推导:在平滑实例中,胜者差距小于等于 ε 的概率也至多为 ε n / σ

证明思路:如果胜者差距很小,那么最优解 S1 和某个次优解 S2 必然在至少一个变量上取值不同(例如,在索引 i 处,S1 为0而 S2 为1)。那么,S1 就是 x_i=0 约束下的最优解,S2x_i=1 约束下的最优解(或至少是候选者之一),且两者值相差很小。这就证明了索引 i 是 ε-坏的。因此,小胜者差距的事件被 ε-坏索引的存在所包含,其概率上界相同。

这个结论是反直觉的:尽管可能有指数级多的解被压缩在值域 [0, n] 内,但顶部的解(最优解)却以高概率与其它解显著分离。这为设计算法创造了有利条件。


从伪多项式时间到平滑复杂度

现在我们来证明定理的“当”部分:如果一个二元优化问题存在伪多项式时间最坏情况算法,那么它就具有多项式平滑复杂度。这里我们需要主动设计一个算法来利用平滑实例的特性。

算法设计:逐位确定法

假设我们有一个确定性的伪多项式时间算法 A,能在时间 poly(n, M) 内精确求解问题,其中 M 是输入数值的幅度(或等价地,其二进制编码长度)。

给定一个平滑实例(v_i ∈ [0,1]),我们设计如下算法:

  1. 初始化:令 b = 1
  2. 截断:令 v_i^hatv_i 的最高 b 位二进制表示。例如,b=1 时,v_i^hat 表示 v_i 是否 ≥ 0.5。
  3. 求解截断问题:使用算法 A 求解以 v^hat 为权重的实例,得到最优解 x^hat
  4. 构造最坏情况权重:根据当前解 x^hat 定义一个新的权重向量 v^bar
    • x^hat_i = 1,则令 v^bar_i = v_i^hat(即后续位全补0,这是对该项价值最悲观的估计)。
    • x^hat_i = 0,则令 v^bar_i = v_i^hat + 2^{-b}(即后续位全补1,这是对该项价值最乐观的估计)。
  5. 验证:再次使用算法 A 求解以 v^bar 为权重的实例,得到最优解 x^bar
  6. 停止条件:如果 x^bar = x^hat,则停止并返回 x^hat。否则,令 b = b + 1,返回步骤2。

算法原理与运行时间分析

  • 正确性v^bar 的设计使得真实的权重向量 v 满足:对于所有 iv_i 介于 v_i^hatv_i^bar 之间(或等于其中之一)。因此,真实目标函数 v^T x(v^hat)^T x(v^bar)^T x 的差异,对任何解 x 都不超过 n * 2^{-b}。如果算法在某个 b 停止,意味着 x^hat 同时是 v^hatv^bar 下的最优解。由于 v 介于两者之间,可以证明 x^hat 也必然是真实权重 v 下的最优解。
  • 关键引理:算法会在 胜者差距 > 2n * 2^{-b} 时停止。因为当最优解与次优解的真实差距大于这个扰动范围时,无论是用 v^hat 还是 v^bar 计算,排名都不会改变。
  • 与平滑性结合:根据隔离引理的推论,对于任意 δ > 0,当 b ≥ log( n / (σ δ) ) 时,胜者差距 ≤ 2n * 2^{-b} 的概率至多为 δ
  • 运行时间:在迭代 b 中,算法 A 的运行时间是 poly(n, 2^b)(因为处理的数值有 b 位)。结合上一点,算法在 b = O(log(n/(σδ))) 时以至少 1-δ 的概率停止。因此,期望运行时间是 ∑_{b} poly(n, 2^b) * Pr(算法在第b轮停止)。通过适当求和,可以证明此期望值为 poly(n, 1/σ)

过渡:这个算法巧妙地利用了平滑实例中胜者差距很可能较大的特性。它无需知道所有权重的全部精度,只需逐步揭示高位,直到能在扰动误差范围内确定唯一的最优解为止。伪多项式时间算法 A 被用作一个精确求解“低精度”版本问题的子程序。


总结

本节课中,我们一起学习了如何用平滑分析来刻画计算问题本身的复杂性。

  1. 核心定理:对于一类广泛的二元优化问题,其具有多项式平滑复杂度当且仅当其具有伪多项式时间最坏情况算法。
  2. 第一个方向(平滑 → 伪多项式):通过主动添加微小扰动,可将平滑算法转化为最坏情况下的随机化伪多项式时间算法。其逆否命题可用于证明某些强NP难问题不存在多项式平滑复杂度算法。
  3. 关键工具:我们证明了隔离引理,它表明在平滑实例中,最优解以高概率显著优于其他解(即存在较大的“胜者差距”)。
  4. 第二个方向(伪多项式 → 平滑):我们设计了逐位确定算法。该算法利用伪多项式时间子程序,逐步提高输入数值的精度,并利用隔离引理保证算法会很快(在精度达到对数级别时)收敛到正确解,从而实现了多项式平滑复杂度。

这个理论框架将平滑分析、伪多项式时间算法和完全多项式时间近似方案(FPTAS)等概念深刻地联系了起来,帮助我们识别和理解那些“在实践中最容易处理的”NP难问题。

016:伪随机数据与通用哈希 🧮

在本节课中,我们将探讨一个关于算法的经验性事实:在实践中,哈希函数的表现几乎与完全随机的函数一样好,尽管在最坏情况的理论分析中并非总是如此。我们将寻求一种理论来解释为何简单的哈希函数在实践中表现如此出色。我们提出的解决方案与平滑分析的精神相似:我们将假设数据中至少包含一点随机性。在此假设下,我们将看到,简单的通用哈希函数确实能保证达到与完全随机哈希函数相同的性能。

哈希与线性探测回顾

首先,让我们回顾一下哈希的基本概念以及我们将要使用的具体应用场景——线性探测。

哈希函数

我们考虑一个很大的集合 N(例如,可能非常大,甚至超过宇宙中的原子数量)。哈希函数的作用是压缩这个集合,为 N 中的每个元素分配一个“昵称”,这个昵称位于一个更小的集合 M 中。这就是哈希函数的作用:将大集合 N 中的元素映射到小集合 M 中。

由于我们是将一个大集合映射到一个小集合,根据鸽巢原理,不可避免地会发生碰撞:N 中不同的元素会被映射到 M 中的同一个元素。在数据结构(例如哈希表)中,我们需要处理这些碰撞。

碰撞处理:链地址法与开放寻址法

在本科课程中,通常强调的是一种较简单的方法:链地址法。在这种方法中,每个桶(bucket)中都有一个链表,所有哈希到同一位置的元素都被连接在该桶的链表中。

然而,我们今天讨论的动机示例将是一种不同的碰撞解决策略:开放寻址法。在这种方法中,我们维持一个不变式:哈希表中每个桶只存储一个项目。这意味着负载因子(已插入元素数量 / 桶数量)必须小于1。

当你要插入一个元素时,如果其哈希值对应的桶已满,你需要寻找其他空桶来放置这个元素。根据你搜索空桶方式的不同,开放寻址法有多种变体。

线性探测

我们将使用一种特定的探测序列作为动机示例,这种方法称为线性探测,可能是你能想到的最简单的方法。

具体操作如下:给定元素 xN,你应用哈希函数 h 将其映射到 M。如果该槽位已满,你只需顺序搜索后续槽位,直到找到一个空槽,并将元素放入找到的第一个空槽中(必要时从数组开头回绕)。

  • 插入操作:从 h(x) 开始,向前查找直到找到空槽,然后将元素放入。
  • 查找操作:从 h(x) 开始查找。如果找到该元素,则返回。如果找到一个空槽,则断定该元素不存在(查找失败)。

线性探测的优缺点

线性探测的优点是简单,并且在实践中,除了简单性之外,其主要优势在于它主要是对磁盘或数据结构的顺序访问,而非随机访问。这对于内存层次结构、预取等机制非常友好,因此在实践中通常能获得相当好的性能。

然而,线性探测也存在一个直观的担忧:它容易形成。一旦连续几个桶被占用,新元素插入时就更可能“延长”这个簇,导致簇越来越大。平均查找时间会随着簇的增大而恶化,因为你可能从簇的中间开始搜索,需要遍历半个簇。

完全随机哈希函数的理想情况

有一个经典结果(由 Don Knuth 得出)指出,在完全随机哈希函数的理想情况下(即每个 h(x) 都是独立均匀随机的),第 t 次插入的期望时间仅是关于负载因子 α 的函数。

具体公式为:期望时间 ≈ 1 / (1 - α)²,其中 α = t / M(t 是已插入元素数量,M 是桶数量)。

这个结果的妙处在于,性能仅取决于负载因子 α,而与数据集的分布无关。这意味着,只要你根据要存储的元素数量按比例调整哈希表的大小,你就能控制期望插入时间。

现实挑战与理论目标

然而,在实践中,我们无法使用完全随机的哈希函数,因为那需要存储一个巨大的查找表。同时,我们通常也不能假设数据是完全随机的。

因此,我们希望证明:简单的哈希函数(即我们可以用少量空间存储并能快速求值的函数)能表现得和完全随机哈希函数一样好。

通用哈希函数

在本讲中,我们将使用一个大家应该已经从本科算法课程中了解的定义:通用哈希

定义:一个哈希函数族 H(所有函数都将域 N 映射到范围 M)被称为是通用的,如果对于 N 中任意两个不同的元素 xy,在从 H 中随机均匀选择一个哈希函数 h 时,碰撞概率至多为 1 / |M|。即:
对于所有 x ≠ y ∈ N,有 Pr_{h ∈ H} [h(x) = h(y)] ≤ 1 / |M|

这个性质意味着,对于任意一对元素,其碰撞概率与完全随机哈希函数所设定的“黄金标准”一样低。存在许多可以存储在少量空间中并能快速求值的通用哈希函数族构造。

通用哈希的性能保证

对于使用链地址法的哈希表,仅凭通用性这一性质就足以证明:在常数负载因子下,期望的(不成功)查找时间是常数。也就是说,对于链地址法,通用哈希函数的表现与完全随机哈希函数一样好。

然而,对于某些开放寻址策略,特别是线性探测,情况就复杂了。大约五年前的一个结果表明:仅凭通用性,并不能保证线性探测的期望插入时间上界仅为负载因子 α 的函数。存在通用的哈希函数族和特定的最坏情况数据集,使得即使负载因子固定,期望插入时间也会随着数据集大小 t 的增长而增长。

但这与经验观察相矛盾。在实践中,通用哈希函数的表现与随机哈希函数几乎没有什么区别。

平滑分析思路:数据中的少量随机性

为了解释这种理论与实践的差距,我们借鉴平滑分析的精神。我们假设数据中至少包含一点随机性。在这种假设下,我们将看到,通用哈希函数确实能保证达到与完全随机哈希函数相同的性能。

以下是我们的目标定理:足够随机的数据加上任意的通用哈希函数,能给出与完全随机哈希函数一样好的性能

在证明任何定理之前,我们需要明确几个缺失的定义。

定义1:分布的“接近”程度

我们希望说一个分布“几乎”是均匀的。由于我们想证明任何基于完全随机假设的分析都能自动转化到我们的设定下,我们采用以下定义:

定义:定义在同一个有限集合 Ω 上的两个分布 D₁D₂ε-接近 的,如果对于 Ω 的任意子集(事件)S,都有:
| Pr_{D₁}[S] - Pr_{D₂}[S] | ≤ ε

这意味着,任何事件在两个分布下的概率相差不超过 ε。可以证明,这个定义等价于两个分布作为向量的 L1 距离至多为

定义2:“轻度随机”的数据

我们需要定义单个数据元素的“随机性”程度。

思路一(最大概率上界):随机变量 X 取任何特定值的概率至多为某个参数 Δ。这类似于平滑分析中对概率密度函数的上界约束。

思路二(碰撞概率上界):我们采用一个更弱且更容易处理的定义:考虑两个独立同分布的 X 的副本,它们取值相同的概率(即碰撞概率)至多为 Δ。即:
CollisionProb(X) = Σ_{i} Pr[X = i]² ≤ Δ

如果思路一成立(最大概率 ≤ Δ),那么思路二也成立(碰撞概率 ≤ Δ)。因此,思路二是更弱的假设,基于它证明的正向结果更强。

典型例子:如果 X 是在一个大小为 K 的子集上均匀分布,那么其碰撞概率恰好是 1/KK 越大,数据越随机。

定义3:足够随机的数据集(块源)

我们将单个数据元素的随机性概念扩展到整个数据集。

定义(块源):一个取值于 N 的随机变量序列 X₁, X₂, ..., X_t 被称为一个熵为 K 的块源,如果对于所有的 i,在任意给定 X₁, ..., X_{i-1} 的条件下,X_i 的碰撞概率至多为 1/K

这意味着,即使知道了之前插入的所有元素,下一个要插入的元素仍然具有足够的随机性(碰撞概率小)。

主要定理及其解释

现在,我们可以陈述并解释我们的主要定理了。

定理:设 X₁, ..., X_t 是一个熵为 K 的块源。设 H 是一个通用哈希函数族。那么,哈希函数 h(从 H 中均匀随机选取)与哈希值 h(X₁), ..., h(X_t) 的联合分布,与在空间 H × M^t 上的均匀分布是 ε-接近 的,其中:
ε ≤ (t/2) * √(M / K)

参数解释

  • t:插入哈希表的元素数量。
  • M:哈希表的桶数量。在开放寻址中,通常 t ≤ M,考虑最坏情况可设 t ≈ M
  • K:衡量输入数据随机性的参数。K 越大,数据越随机,ε 越小。
  • ε:接近均匀分布的程度。

为了达到 ε-接近,我们需要 K ≥ (M * t²) / (4ε²)。当 t ≈ M 时,这要求 K ≥ O(M³),或者说数据所需的熵(log K)至少约为 3 log M

定理的两种解读方式

  1. 所需随机性的量(熵)仅约为明显下界(log M)的三倍,这是一个相当好的常数倍关系。
  2. 想象对手先秘密选择一个大小为至少 的子集,然后自然从这个子集中均匀选取元素插入。无论对手选择哪个子集,只要其大小足够,通用哈希函数都会自动将结果“平滑”成在桶上的近似均匀分布。由于原始域 N 非常巨大(例如所有可能的文本),而 相对较小,这意味着有海量不同的子集选择,但哈希函数能同时处理好所有这些情况。

这个定理为实践中观察到的优秀性能提供了一个令人信服的解释。

定理证明概要

该定理的证明几乎直接源于理论密码学中一个著名结果——剩余哈希引理,并由归纳法扩展得到。

剩余哈希引理:设 X 是一个碰撞概率至多为 1/K 的随机变量,H 是一个通用哈希函数族。那么,随机对 (h, h(X)) 的分布(其中 hH 中均匀随机选取)与在 H × M 上的均匀分布是 (1/2) * √(M / K)-接近的。

这正是我们主定理在 t = 1 时的特例。主定理的证明通过对 t 进行归纳完成,在作业中会要求大家完成这个归纳步骤。

剩余哈希引理证明思路(三步)

  1. 计算目标分布的碰撞概率:利用 X 的低碰撞概率假设和哈希函数的通用性,计算联合变量 (h, h(X)) 的碰撞概率的上界。
  2. 从低碰撞概率推导 L2 接近均匀:证明如果一个分布具有低碰撞概率,那么它在 L2 范数意义下必然接近均匀分布。通过计算 L2 距离的平方,可以将其表达为目标分布碰撞概率与均匀分布碰撞概率(即 1/|Ω|)之差。
  3. 从 L2 接近推导 L1 接近:利用向量范数关系(对于 D 维向量,L1 范数 ≤ √D * L2 范数),将 L2 距离的界转化为最终所需的 L1 距离(即 ε-接近)的界。

通过这三步,即可证明剩余哈希引理,进而通过归纳证明主定理。

总结

在本节课中,我们一起学习了如何用“数据包含少量随机性”的假设来解释哈希函数在实践中表现优异的现象。我们回顾了线性探测哈希表及其潜在问题,以及在完全随机哈希函数下的理想性能。我们指出了仅使用通用哈希函数在最坏情况数据下的理论局限性。为了弥合理论与实践的鸿沟,我们引入了块源 模型来形式化“轻度随机”的数据,并证明了核心定理:对于熵足够高的块源数据,配合任意通用哈希函数,其产生的哈希值分布与完全随机哈希函数的效果几乎无法区分。这个结论为实践中简单哈希函数的卓越表现提供了坚实的理论依据,是平滑分析思想在离散算法领域的一个成功应用。

017:自改进算法 🧠

在本节课中,我们将要学习一种名为“自改进算法”的新概念。这类算法能够通过观察来自同一未知分布的多个输入样本,自适应地学习该分布的特性,并最终达到接近已知分布情况下的最优性能。


模型与目标 🎯

上一节我们介绍了自改进算法的基本思想,本节中我们来看看具体在排序问题上的应用模型。

我们考虑一个排序模型:

  • 数组长度 n 是固定的。
  • 数组中的每个元素 Xi 是从某个独立分布 Di 中抽取的实数。我们事先并不知道这些分布 Di 是什么。
  • 我们工作在比较模型下,即算法只能通过比较两个元素的大小来获取信息。
  • 我们能够观察到从同一组分布 {Di} 中独立同分布抽取的多个数组样本。

我们的目标是设计一个排序算法,使其在经过一定数量的“训练”样本后,其期望比较次数能够收敛到最优值。这个最优值由以下定理定义:

定理(性能下界):对于任何正确的比较排序算法,其期望比较次数的下界是 Ω(n + H(π)),其中 H(π) 是由分布 {Di}n 个元素上诱导出的排列分布 π 的熵。

这个下界源于信息论:对排列进行编码所需的最小期望比特数就是其熵 H(π),而任何正确的比较排序算法本质上都定义了一种对排列的编码方案。


核心思路:桶排序框架 🪣

为了达到接近下界的性能,我们采用一个基于桶排序的算法框架。其核心思想是:利用初始的一些样本来学习如何将元素高效地分到若干个“桶”中,使得每个桶的期望大小很小,从而可以在桶内用简单方法(如插入排序)快速完成排序。

以下是算法的主要步骤:

步骤一:确定桶的边界

  1. 对前 λ = O(log n) 个输入数组,使用归并排序(O(n log n))进行排序,并输出结果。
  2. 同时,将这 λ 个数组的所有 个元素合并成一个有序的“主列表”。
  3. 从这个主列表中,每隔 λ 个元素选取一个作为“分割点”,共得到 n 个分割点 V。这些分割点将实数轴划分为 n+1 个桶。

引理1(桶的有效性):以高概率(相对于训练样本),对于后续任意的新输入数组,每个桶中期望的元素数量为 O(1),且期望的元素数量的平方也为 O(1)

这意味着,只要我们能把元素正确地分到这些桶里,那么在每个桶内进行插入排序的期望总时间就是 O(n)


关键挑战:高效元素分类 🧩

上一节我们建立了有效的桶结构,本节中我们来看看如何将元素高效地分到正确的桶中。直接对每个元素进行二分查找需要 O(n log n) 时间,这在我们追求 o(n log n) 的目标下是不可接受的。

假设我们已知每个元素 Xi 的分布 Di,那么最优策略是为每个 Xi 构建一棵最优二叉搜索树 Ti,用于在分割点集 V 中查找 Xi 所属的桶。根据香农定理,这棵树的期望搜索代价(即比较次数)约为 H(Bi),其中 BiXi 的桶分布的熵。

现在,我们需要证明,即使强制使用这个桶排序框架,我们也不会损失太多性能。

引理2(框架的近似最优性):如果对每个 Xi 使用其最优搜索树 Ti 进行分类,那么总的期望比较次数为 Σ_i H(Bi) = O(n + H(π))

证明概要:我们构造一个编码方案来上界 Σ_i H(Bi)

  1. 首先,用最优方式编码 X1...Xn 诱导出的排列,期望长度约为 H(π)
  2. 获得排列后,我们就知道了元素的排序顺序。将这份有序列表与有序的分割点列表 V 进行合并。合并过程需要 O(n) 次比较,并同时能确定每个元素所在的桶。
    因此,编码“所有元素的桶信息”的期望长度不超过 n + H(π)。根据香农定理,其熵 Σ_i H(Bi) 也不会超过这个值。

这个引理表明,桶排序框架本身是足够强大的,只要我们能为每个元素实现近似最优的搜索树,就能接近全局下界。


实现自改进:学习近似最优树 🌱

然而,我们并不知道分布 Di,因此无法直接构建最优树 Ti。关键的洞察在于:我们不需要完整的 Ti,只需要其最顶上的 ε log n 层(ε 是一个小常数)。

原因:如果一棵搜索树很深,在 ε log n 层之后还未找到桶,那么后续无论采用什么策略(即使是二分查找),所需的比较次数也至少是 Ω(log n)。因此,只构建树顶部分,并在“失配”时回退到二分查找,整体代价只会增加一个常数因子(1/ε)。

而一棵深度为 ε log n 的树,最多有 2^(ε log n) = n^ε 个节点。这意味着我们只需要关注每个 Xin^ε 个“最可能”落入的桶。

以下是具体的学习步骤:

步骤二:学习频繁桶并构建搜索树

  1. 在额外的 O(n^ε log n) 个训练样本中,为每个元素 Xi 统计它落入每个桶的经验频率
  2. 对于每个 Xi,记录下那些经验频率超过 1/n^ε 的桶(即“频繁桶”)。根据切尔诺夫界限,以高概率,所有真实概率显著大于 1/n^ε 的桶都会被识别出来。
  3. 对于每个 Xi,使用动态规划算法,为其频繁桶集合构建一棵静态最优二叉搜索树。由于频繁桶数量最多为 n^ε,构建每棵树的时间为 O(n^(3ε)),总构建时间为 O(n^(1+3ε))

步骤三:运行阶段
对于训练阶段之后的新输入数组:

  1. 对于每个元素 Xi,使用为其定制的搜索树进行查找。
  2. 如果搜索树成功返回一个桶,则将该元素放入该桶。
  3. 如果查找在树中“失配”(即未能在树顶部分确定桶),则回退到标准的二分查找来确定其桶。
  4. 所有元素分桶完成后,在每个桶内运行插入排序,最后按序连接所有桶。

算法总结报告卡 📊

本节课中我们一起学习了自改进排序算法的设计与分析。以下是该算法的性能总结:

  • 样本复杂度:需要 O(n^ε log n) 个训练样本。
  • 空间复杂度O(n^(1+ε)),主要用于存储为每个元素定制的搜索树。
  • 训练阶段时间复杂度:处理前 O(n^ε log n) 个样本时,每个样本花费 O(n log n) 时间(使用归并排序)。
  • 构造搜索树时间:一次性的 O(n^(1+3ε)) 时间。
  • 运行阶段时间复杂度:训练完成后,对于新样本,期望比较次数为 O(n + H(π)),达到了信息论下界。

这个算法展示了如何通过观察来自未知分布的多个样本,让算法“自我改进”,最终获得接近已知分布情况下最优排序器的性能。其核心在于巧妙地利用样本学习每个元素的近似最优分类策略,并将问题约化到可管理的规模。

018:未知分布下的定价

在本节课中,我们将学习一个简单的定价问题。我们将假设买家的估值来自一个未知的分布,但我们可以获得该分布的独立同分布样本。我们的目标是设计一个算法,利用这些样本设定一个价格,使其期望收益尽可能接近我们预先知道分布时所能获得的最优收益。


未知分布下的定价问题

设想你有一个商品或服务要出售,并且已经确定了一位潜在买家。你不知道买家愿意为商品或服务支付多少。这个意愿支付值或估值记为 V

如果你知道 V,问题就很简单:只需将价格 P 设定为 V。但 V 是未知的。你设定一个价格 P,买家可以选择接受(支付 P)或拒绝(离开)。

  • 如果 P > V,买家离开,你的收益为 0。
  • 如果 P ≤ V,交易以价格 P 达成,你的收益为 P

这里存在一个直观的权衡:价格 P 越高,单次交易的收益越高,但交易达成的可能性似乎越低。为了严谨地分析这个问题,我们需要引入分布假设。


已知分布下的最优定价

首先,我们进行一个思想实验:假设卖家的估值 V 来自一个已知的分布 FF 是累积分布函数,F(x) 表示 V ≤ x 的概率。

如果卖家设定价格 P,其期望收益为:
收益(P) = P × (1 - F(P))
其中,P 是单次收益,(1 - F(P)) 是交易达成的概率。

最优价格 P* 就是最大化上述表达式的价格,通常称为 垄断价格

示例1:均匀分布
假设 V 在 [0, 1] 上均匀分布,则 F(x) = x。期望收益为 P × (1 - P)。求导并令其为零,可得最优价格 P = 0.5*,最大期望收益为 0.25

示例2:指数分布
假设 V 服从参数为1的指数分布,则 F(x) = 1 - e^{-x}。可以计算出最优价格 P = 1*,对应的销售概率为 1/e,最大期望收益也为 1/e

然而,在我们的模型中,分布 F 是未知的。我们只能获得来自 FM 个独立同分布样本 V1, V2, ..., VM。我们的目标是:利用这些样本设定一个价格 P,使得其期望收益尽可能接近垄断价格 P* 下的收益。


面临的挑战与第一个假设:有界估值

一个直接的挑战是:对于任何固定的样本数量 M,都存在一个分布使得我们无法接近最优收益。

反例:考虑一个分布,其中 V 以极小的概率(例如 1/M^2)取一个非常大的值 M^3,否则为 0。最优价格是 M^3,期望收益约为 M。然而,在 M 个样本中,我们几乎只能看到 0。基于这些样本,我们几乎不可能猜出接近 M^3 的高价,因此收益会远低于最优值。

这表明,我们需要对分布 F 做一些温和的假设才能得到有意义的结果。本节课我们将介绍两种可行的假设。

第一个假设:有界估值
我们假设 F 的支撑集包含在 [1, H] 区间内,其中 H 是一个已知的参数。我们不知道 F 的其他任何信息。在这个假设下,我们可以回答之前提出的问题。


关键概念:价格与分位数

为了设计算法,我们需要一种思考价格和销售概率关系的方式。这引出了 分位数 的概念。

  • 给定价格 P,其对应的 分位数 Q 定义为销售概率:Q(P) = 1 - F(P)
  • 反之,给定一个分位数 Q(一个介于0和1之间的数),其对应的 价格 P(Q) 是满足 1 - F(P) = QP,即 P(Q) = F^{-1}(1 - Q)

利用分位数,期望收益可以重写为:收益 = P × Q

现在,我们来确定需要从分布 F 中了解哪些“关键统计量”才能找到接近最优的价格。

关键主张1:一组有限的分位数足够好
定义一组分位数 Q1, Q2, ..., Qs,其中:
Q1 = 1/H, Q{i+1} = Qi × (1 + ε),直到 Qs = 1
这里 s ≈ log(H)/ε

主张:如果我们知道对应于这 s 个分位数的价格 P(Q1), P(Q2), ..., P(Qs),那么这些价格中最好的一个(即 P(Qi) × Qi 最大者)所提供的期望收益,至少是最优垄断收益的 1/(1+ε) 倍。

证明思路

  1. 首先证明,在支撑集有界的假设下,垄断价格对应的销售概率 Q* 至少为 1/H
  2. 在我们的分位数集合中,存在一个 Q_L,满足 Q/(1+ε) ≤ Q_L ≤ Q
  3. 由于 Q_L ≤ Q,对应价格 P(Q_L) ≥ P
  4. 因此,使用价格 P(Q_L) 的收益为:P(Q_L) × Q_L ≥ P* × (Q*/(1+ε)) = 最优收益 / (1+ε)
  5. 选择所有 s 个价格中收益最高的一个,结果只会更好。

这个主张告诉我们,我们不需要知道整个分布 F,只需要准确估计 log(H)/ε 个关键价格即可。


算法设计与分析

上一节我们介绍了,只需要估计一组关键价格就能接近最优收益。本节中,我们来看看如何利用样本实现这些估计。

一个自然的想法是:对于每个样本值 V_i,用样本中不小于 V_i 的比例来估计其销售概率(即分位数)。然后,选择那个“估计收益”最大的样本值作为我们的定价。

算法描述

  1. 输入:M 个样本 V1, V2, ..., VM
  2. 对于每个样本 V_i,计算其 经验分位数 Q_hat(V_i)
    Q_hat(V_i) = (样本中 ≥ V_i 的数量) / M
  3. 计算每个样本的 估计收益V_i × Q_hat(V_i)
  4. 输出:使估计收益最大的那个 V_i 作为定价 P

这个算法非常直观:它假设经验分布就是真实分布,并据此选择最优价格。

关键主张2:算法的性能保证
假设样本数量 M ≥ C × (H / ε^2) × log(H/ε),其中 C 是一个足够大的常数。那么,以高概率成立:

  1. (覆盖性)对于任意介于 1/H1 之间的真实分位数 T,都存在某个样本 V_i,其真实分位数 Q(V_i) 落在 [T/(1+ε), T] 区间内。
  2. (估计准确性)对于所有相关样本(其真实分位数不太小),其经验分位数 Q_hat(V_i) 都在真实分位数 Q(V_i)(1±ε) 因子范围内。因此,其估计收益也在真实收益的 (1±ε) 因子范围内。

结合主张1和主张2,可以得出结论:当样本数量 M 满足上述条件时,该算法能以高概率实现 (1 - O(ε)) 近似的最优收益。

证明思路:主张2中的两个性质可以通过切尔诺夫界等标准集中不等式来证明。它们确保了算法满足主张1(及其对估计误差的鲁棒性版本)的前提条件。

样本复杂度Ω(H/ε^2) 的样本量不仅是该算法所需的,也是任何算法要达到 (1-ε) 近似所必需的(信息论下界)。因此,我们的算法在样本复杂度上是最优的(忽略对数因子)。


第二个假设:凹收益曲线与单样本算法

上一节我们在有界估值假设下,讨论了需要一定数量样本才能获得接近最优的收益。本节中,我们来看看在另一种假设下,即使只有一个样本,也能获得有竞争力的结果。

我们放弃有界估值假设,转而假设分布 F收益曲线 R(Q) = P(Q) × Q凹的。许多常见分布(如指数分布、对数正态分布)满足此性质。

惊人的结论:在收益曲线凹的假设下,即使我们只有一个样本 (M=1),也能获得 1/2 近似的最优收益。

算法:简单地将得到的唯一样本 V 作为定价 P

证明思路(几何图示)

  1. 将收益 R 视为分位数 Q 的函数 R(Q),这是一个凹函数。
  2. 垄断价格对应分位数 Q* 和最大收益 R(Q*) = OPT
  3. 考虑随机定价策略:从分布 F 中随机抽取一个价格。这等价于从 [0,1] 中均匀随机抽取一个分位数 Q,然后使用价格 P(Q)
  4. 该随机策略的期望收益是收益曲线下的面积:E[收益] = ∫_{0}^{1} R(Q) dQ
  5. 由于 R(Q) 是凹函数,其图像在点 (0, R(0))(Q, R(Q)) 之间的弦位于函数图像下方,从而与坐标轴形成一个三角形。
  6. 这个三角形的底为 Q,高为 **R(Q) = OPT*,面积为 (1/2) × Q × OPT
  7. 因为 R(Q) 是凹的,曲线下的面积(随机策略收益)至少等于该三角形面积。
  8. 同时,垄断收益 OPT 等于矩形面积 Q × OPT*。
  9. 因此,随机策略的期望收益至少为 (1/2) × OPT

由于我们的单样本算法等价于从 F 中随机抽取一个价格,因此其期望收益也至少为最优收益的一半。


总结

本节课中,我们一起学习了未知分布下的定价问题。

  1. 我们首先形式化了问题:买家估值来自未知分布 F,我们可获得 M 个样本,目标是设定价格以最大化期望收益。
  2. 为了得到可证明的保证,我们引入了两种分布假设。
  3. 有界估值 假设下,我们展示了一个自然算法:用经验分布估计收益并选择最优价格。我们证明了当样本数 M ~ O(H/ε^2 log(H/ε)) 时,该算法能以高概率获得 (1-ε) 近似的最优收益,且样本复杂度是最优的。
  4. 凹收益曲线 假设下,我们证明了一个令人惊讶的结果:即使只有一个样本 (M=1),简单地使用该样本作为价格,也能保证获得至少 1/2 的最优收益。这凸显了即使只有极少数据,也能设计出有理论保障的算法。

这些结果为数据驱动的定价和机制设计提供了基础的理论见解。

019:在线算法与随机排列

在本节课中,我们将学习在线算法在网络设计问题中的应用,并探讨如何通过引入分布假设来超越最坏情况分析的局限性。我们还将介绍随机排列模型,并了解其在经典“秘书问题”及其推广中的应用。


在线斯坦纳树问题

上一节我们介绍了在线算法的基本概念。本节中,我们来看看一个具体的网络设计问题:在线斯坦纳树问题。

问题定义

  • 给定一个图 G=(V, E),每条边 e 有非负成本 c(e),以及一个根节点 r
  • 终端节点 s1, s2, ..., sT 在线到达(即一次一个,且未来未知)。
  • 每当一个终端到达时,算法必须不可撤销地选择一些边,使得当前所有已到达的终端和根节点 r 保持连通。
  • 目标:最小化所选边的总成本。

与最小生成树的区别

  1. 斯坦纳树:只需连接指定的终端节点(和根节点),可以利用图中的其他非终端节点(斯坦纳点)作为“中转站”以降低成本。
  2. 在线性:终端节点是依次到达的,算法必须在不知道未来终端的情况下做出决策。

最坏情况分析

在探讨替代模型之前,我们先通过最坏情况分析来校准预期。

贪婪算法
当终端 si 到达时,将其通过最短路径连接到当前已构建的树(包含根节点和之前的所有终端)。

分析结果

  • 下界:存在图族(如菱形图),使得任何确定性在线算法的竞争比至少为 Ω(log n),其中 n 是图的顶点数。
  • 上界:贪婪算法可以达到 O(log T) 的竞争比,T 是终端数量。

这意味着在最坏情况下,在线算法可能比离线最优解差一个对数因子。虽然这比我们在分页问题中看到的无界竞争比要好,但仍然不理想,促使我们寻求更强的性能保证。


基于分布的模型

为了获得更好的性能保证,我们引入一个更强的假设:终端节点是从一个固定但未知的分布 π 中独立同分布地抽取的。

模型设定

  1. 存在一个顶点上的分布 π
  2. 终端序列 s1, ..., sT 是从 π 中独立同分布抽取的。
  3. 算法可以访问 T 个来自同一分布 π 的样本 q1, ..., qT(例如,来自历史数据)。
  4. 目标:设计一个在线算法,使其期望成本最多是离线最优解期望成本的常数倍。

为什么需要样本?

  1. 信息瓶颈:在实际中,我们可能只有关于分布的粗略信息(如历史样本)。
  2. 计算瓶颈:即使完全知道分布 π,计算最优的在线策略在计算上可能是不可行的(可能是指数级或 PSPACE 完全的)。使用样本的简单启发式算法可以近似最优策略。

增强贪婪算法

我们之前看到,标准贪婪算法在分布模型下仍然可能表现不佳。因此,我们需要一个能利用样本信息的新算法。

算法描述(两阶段)

阶段一:预处理(使用样本)

  1. 给定样本 q1, ..., qT
  2. 在根节点 r 和所有样本上,使用 Prim 算法构建一棵斯坦纳树(即,从 r 开始,反复将距离当前树最近的样本通过最短路径加入)。

阶段二:在线处理(处理真实终端)

  1. 当真实终端 si 到达时,将其通过最短路径连接到当前已构建的树(该树现在包含了根节点、所有样本以及之前到达的真实终端)。
  2. si 加入已连接终端集合。

算法直观:预处理阶段利用样本作为“基础设施投资”,提前构建通往可能“热门”区域的连接,从而降低后续连接真实终端的成本。


性能分析

定理:该增强贪婪算法是一个 4-近似 算法。即,其期望成本最多是最优离线斯坦纳树期望成本的 4 倍。

证明思路(两步骤)

  1. 步骤一(作业):证明仅使用样本构建的树(阶段一)的成本期望,最多是连接这些样本的最优斯坦纳树成本期望的 2 倍。这本质上是经典 MST 启发式算法是 2-近似的证明。
  2. 步骤二(关键步骤):证明阶段二(连接真实终端)的期望成本不超过阶段一的期望成本。
    • 核心观察:在阶段一的每次迭代中,连接一个样本 qi 的成本至少是 qi 到集合 {r} ∪ (其他所有样本) 的最短距离。
    • 这个距离的期望值等于:从一个随机样本到 {r} ∪ (T-1个其他随机样本) 的最短距离的期望值。
    • 在阶段二的每次迭代中,连接一个真实终端 si 的成本至多是 si{r} ∪ (所有T个样本) 的最短距离。
    • 由于 si 和样本都来自同一分布 π,且阶段二的连接目标集(包含所有样本)比阶段一评估时使用的集合更大,因此这个最近邻距离的期望值更小。

因此,阶段二的总期望成本 ≤ 阶段一的总期望成本 ≤ 2 × OPT(样本上的期望)。结合两阶段,总成本 ≤ 4 × OPT(真实终端上的期望)。


随机排列模型

现在,我们转向一个更稳健的“半随机”模型——随机排列模型,它特别适用于在线算法分析。

模型设定

  1. 对手 选择一个任意的元素集合(例如,一组数字、一组候选人)。
  2. 自然 将这个集合以均匀随机顺序呈现给算法。
  3. 算法在线处理每个元素,并必须做出不可撤销的决策。

这个模型可以看作是平滑分析或伪随机性思想的一种体现:我们只假设输入具有足够的随机性(顺序随机),而不对其内容做任何假设。


秘书问题及其推广

随机排列模型中的典型问题是 秘书问题

问题描述

  • n 个候选人,对手为他们分配任意数值(代表能力)。
  • 候选人以随机顺序面试。
  • 每次面试后,你必须立即决定是否雇佣此人。一旦决定雇佣,过程停止。
  • 目标:最大化选中最高能力候选人的概率。

经典策略与结果

  1. 面试前 n/e 个候选人作为“样本”,但不雇佣他们。
  2. 之后,雇佣第一个比之前所有样本都优秀的候选人。
  3. 该策略以概率 1/e ≈ 37% 选中最佳候选人,并且这是渐进最优的。

拟阵秘书问题

秘书问题的一个自然推广是 拟阵秘书问题

拟阵定义
一个集合系统 (U, I) 是拟阵,如果满足:

  1. 遗传性:若 S ∈ IT ⊆ S,则 T ∈ I
  2. 交换性:若 A, B ∈ I|A| < |B|,则存在 x ∈ B \ A,使得 A ∪ {x} ∈ I

例子

  • 均匀拟阵:可行集是大小不超过 k 的子集。k=1 时即为经典秘书问题。
  • 图拟阵:元素是图的边,可行集是无圈子图(森林)。
  • 横截拟阵:元素是二分图一侧的点,可行集是能被匹配到另一侧的点集。

拟阵秘书问题

  • 元素(候选人)带有权重,并以随机顺序呈现。
  • 算法必须在线选择一个可行子集。
  • 目标:使所选集合的总权重尽可能接近最优可行集的最大可能权重。

未解猜想
对于任何拟阵,是否存在一个常数竞争比的在线算法?(即,期望权重至少是离线最优解的常数倍)。目前已知对一些特殊拟阵(如图拟阵)存在常数竞争比算法,也有 O(log log rank) 的通用算法,但是否存在通用常数竞争比算法仍是一个重要开放问题


总结

本节课中我们一起学习了:

  1. 在线斯坦纳树问题 在最坏情况下的对数竞争比界限。
  2. 如何通过引入 独立同分布假设样本信息,设计出性能更好的增强贪婪算法,并获得常数近似比。
  3. 更稳健的 随机排列模型 及其经典应用——秘书问题
  4. 秘书问题在 拟阵约束 下的推广,以及当前理论界面临的开放性问题。

这些内容展示了如何结合不同的分析框架(分布模型、半随机模型)和问题领域(网络设计、在线决策)来获得超越最坏情况的、更有意义的算法性能保证。

020:从未知输入分布到实例最优性

在本节课中,我们将学习如何将之前讨论的“未知输入分布”概念与我们课程最初探讨的“实例最优性”概念联系起来。我们将看到,思考未知分布可以为我们定义“合理的”竞争算法集合提供一个原则性的方法,从而为证明强大的实例最优性保证铺平道路。我们将通过一个具体的在线决策问题来展示这一方法的威力。


概述:连接两个核心概念

在之前的课程中,我们探讨了当输入来自某个未知分布时,如何设计表现良好的算法。另一方面,在课程开始时,我们介绍了“实例最优性”这一概念,它要求一个算法在每个单独的输入上,其性能都与任何其他算法(或某一类算法)在该输入上的性能相媲美。本节课的目标是揭示这两个概念之间的深刻联系:我们可以利用关于输入分布的“思想实验”来定义一个自然的竞争算法类,然后追求针对这个算法类的实例最优性。这种联系不仅优雅,而且非常实用,能够引导我们设计出强大的算法。

回顾实例最优性及其松弛

首先,让我们简要回顾一下实例最优性的定义。对于一个给定的成本度量,如果算法 Aα-实例最优 的,那么对于每一个算法 B每一个输入 Z,算法 AZ 上的成本最多是算法 BZ 上成本的 α 倍。这是一个极其强大的保证,因为它要求算法在每一个输入上都接近最优。

然而,如此强的要求通常难以满足。因此,我们讨论过一些松弛方案。其中一个关键的松弛是:我们不再要求算法 A 优于所有其他算法,而是只要求它优于一个合理的自然的算法子类 C 中的所有算法。这就引出了一个核心问题:我们如何定义这个“合理”的算法类 C

上一节我们介绍了实例最优性的概念及其面临的挑战,本节中我们来看看如何通过分布的思想实验来定义这个合理的算法类 C

通过分布思想实验定义算法类 C

我们暂时假设输入是从某个分布族 D 中抽取的。这个分布族 D 代表了我们关于现实世界可能如何生成输入的先验知识(例如,在平滑分析中,D 可能是轻微扰动的分布;在自改进算法中,D 可能是具有独立性的分布)。请注意,这只是一个思想实验,我们并不会真的假设输入来自某个特定分布来进行平均情况分析。

基于这个思想实验,我们可以定义对应的算法类 C_D 如下:

C_D 包含了所有这样的算法:对于分布族 D 中的每一个分布 F,将 F 下期望成本最小化的那个(最优)算法。

换句话说,我们遍历 D 中的每一个可能分布 F,问自己:“如果输入真的来自 F,最优算法是什么?” 然后把所有这些“针对特定分布的最优算法”收集起来,就构成了我们的竞争算法类 C_D

这样,我们就把“选择竞争算法类 C”的问题,转化为了“选择我们认为合理的输入分布族 D”的问题。后者通常更容易凭直觉或领域知识来设定。

实例最优性与分布最优性的形式化联系

现在,我们来看一个关键的形式化联系。假设我们有一个算法 A,它对于上面定义的算法类 C_Dα-实例最优的。那么,我们可以得出以下结论:

对于分布族 D 中的每一个分布 F,算法 AF 下的期望成本,最多是最优算法(专为 F 设计)在 F 下期望成本的 α 倍。

用公式表示,即对于所有 F ∈ D
E_{Z∼F}[ cost_A(Z) ] ≤ α * E_{Z∼F}[ cost_{OPT(F)}(Z) ]

这里,OPT(F) 是专门为分布 F 设计的最优算法。这个不等式的精妙之处在于:左边的算法 A独立于特定分布 F 的(它不知道 F 是什么),而右边我们比较的对象却是完全依赖于 F 的最优算法。这就意味着,算法 A 能够以“一敌百”,在面对任何可能的 D 中的分布时,都保持接近最优的性能。

这个证明是直接的,因为实例最优性保证了在每个输入上都有优势,那么对任何分布取期望,这个优势自然保留。

我们已经建立了利用分布定义竞争算法类并证明实例最优性的理论框架,接下来,我们通过一个经典问题——在线决策——来具体看看如何应用这个框架。

案例研究:在线决策问题

问题设定

考虑一个在线决策问题:

  • n 个可选动作(例如,买入或卖出股票)。
  • 游戏进行 T 轮。
  • 在每一轮 t
    1. 算法(玩家)首先选择一个动作 a_t
    2. 然后,对手(或环境)揭示一个成本向量 c_t,其中每个分量代表选择对应动作会产生的成本(假设成本在 [0, 1] 区间)。
  • 算法的目标是最小化其 T 轮的总成本:∑_{t=1}^{T} c_t(a_t)

这是一个典型的信息不对称问题:算法必须先行动,对手后行动。显然,我们无法与“事后诸葛亮”(即已知所有成本向量后选择的最佳动作序列)竞争,因为对手可以针对任何确定性算法构造使其表现很差的成本序列。

应用框架:定义分布族 D 和算法类 C_D

现在,我们应用前面的框架。我们进行一个分布思想实验:

假设每一轮的成本向量都是独立同分布地从一个固定但未知的分布 F 中抽取的。如果我们知道 F,最优策略是什么?答案是:在每一轮都选择期望成本最小的那个动作。因为分布是独立同分布的,所以最优动作不会随时间改变。

因此,如果我们定义分布族 D所有可能的独立同分布,那么对应的最优算法类 C_D 就是:所有始终播放同一个固定动作的算法。如果共有 n 个动作,那么 C_D 中就只包含 n 个这样的算法。

实例最优性的目标

现在,我们的目标变得非常具体:设计一个在线算法 A,使得对于任意成本向量序列(由对手选择),算法 A 的总成本都接近 C_D 中某个算法(即某个固定动作)在该序列上的总成本。换句话说,我们希望算法 A 的表现在每个输入序列上,都不比“始终选择动作 1”、“始终选择动作 2”……“始终选择动作 n”这些简单策略中最优的那个差太多。

这恰恰是在线学习领域中“无悔算法”的概念。接下来,我们将展示如何设计这样一个算法。

一个简单的算法及其理论保证

一个非常自然的想法是“跟随领导者”:每一轮选择历史上累积成本最低的动作。然而,这个确定性算法在对抗性输入下表现很差。

我们需要一个随机化的算法。下面介绍一个巧妙且分析简洁的算法:带扰动的跟随领导者

算法描述:Perturbed Follow-The-Leader (PFTL)

  1. 预处理:在游戏开始前,为每个动作 a 独立地生成一个随机扰动 x_ax_a 服从参数为 ε 的几何分布(即进行一系列成功概率为 ε 的伯努利试验,x_a 表示首次成功所需的试验次数)。ε 是一个稍后将设置的参数。
  2. 在线决策:在第 t 轮,算法选择动作 a_t,使得下式最小:
    a_t = argmin_{a} [ x_a + ∑_{s=1}^{t-1} c_s(a) ]
    也就是说,算法选择的是“历史累积成本”加上“随机扰动”之后最小的那个动作。

这个算法的直觉是:随机扰动 x_a 就像给每个动作一个随机的“起步优势”,这打破了确定性,使得对手难以针对算法。

理论保证

定理:存在参数 ε 的设置,使得 Perturbed Follow-The-Leader 算法满足:对于任何成本向量序列(c_1, ..., c_T),算法的期望总成本最多比 C_D 中最佳固定动作的总成本高出 O(√(T log n))

用公式表示,即:
E[ cost_{PFTL} ] ≤ min_{固定动作 a*} ( ∑_{t=1}^{T} c_t(a*) ) + O(√(T log n))

解读

  • O(√(T log n)) 这个附加损失相对于总成本 T 来说是次线性的。
  • 平均到每一轮,算法的“悔恨”(即每轮平均比最佳固定动作多付出的成本)为 O(√((log n)/T)),随着轮数 T 的增加,这个平均悔恨趋于零。这就是“无悔”特性。
  • 这个保证在 Tn 的依赖关系上是最优的。

证明思路(概要)

证明非常精巧,核心是构造一个虚拟算法 A 作为分析的桥梁。

  1. 虚拟算法 A:在第 t 轮,它“作弊”地使用当前轮的成本向量 c_t 来做决策,即最小化 x_a + ∑_{s=1}^{t} c_s(a)。显然我们无法实现它。
  2. 三个核心引理
    • 引理1:虚拟算法 A 的悔恨(与其最佳固定动作相比)几乎肯定不超过最大的随机扰动 max_a x_a
    • 引理2:真实算法 PFTL 与虚拟算法 A 在每一轮选择不同动作的概率至多为 ε。因此,它们的期望总成本相差不超过 εT
    • 引理3n 个独立几何分布随机变量的最大值,其期望为 O((log n)/ε)
  3. 综合:结合三个引理,PFTL 的期望悔恨上界为 εT + O((log n)/ε)。通过选择 ε = √((log n)/T) 来平衡两项,即得到 O(√(T log n)) 的界。

引理2的证明尤其巧妙,它利用了“延迟决策原则”,分析了在随机扰动下,算法连续两轮选择不同动作的概率很低。

总结

在本节课中,我们一起学习了如何将“未知输入分布”的思想与“实例最优性”的概念联系起来。关键步骤如下:

  1. 思想实验:通过假设一个合理的输入分布族 D,我们定义了一个与之对应的竞争算法类 C_D,该类包含了针对 D 中每个分布的最优算法。
  2. 强大保证:如果一个算法对 C_D 是实例最优的,那么它就自动保证了在面对 D 中任何分布时,其期望性能都接近该分布下的最优算法。这是一种非常鲁棒的优良性能。
  3. 实例应用:我们将此框架应用于在线决策问题。通过定义 D 为所有独立同分布,C_D 简化为所有固定动作策略。我们进而介绍了 Perturbed Follow-The-Leader 算法,并证明了它对于 C_D 是近似实例最优的(即具有无悔保证)。这个分析展示了该理论框架如何引导我们设计并分析出强大的算法。

本节课的核心在于,它为我们提供了一种原则性的方法,将关于现实世界的温和假设(通过分布族 D 表达)转化为对算法性能的严格且强大的保证(实例最优性),从而架起了统计学习思想与最坏情况算法分析之间的桥梁。

posted @ 2026-03-29 09:46  布客飞龙III  阅读(10)  评论(0)    收藏  举报