假设你是「阳光小区」新上任的物业主任。推开档案室的门,几百页住户资料堆成山:谁家养宠物、谁家停车位共享、谁家与邻居有纠纷……每一页都记着一小撮人之间的关系,可谁也说不清整个小区的全貌。你灵机一动,在公告栏上画了一张「网格协作图」:每个圆点代表一户居民(变量),每个方块代表一个协作小组(因子),哪户参与哪个小组,就用一条线连起来。整张图贴出来后,全小区的信息结构一目了然——这就是因子图。 有了这张图,故事就更有意思了:居民们不需要开全体大会,只需要和自己相关的协作小组交换便条(消息),一来一回、层层传递,每个人最终都能算出自己关心的答案——比如“我们家今晚最可能的状态是什么”。这套交换便条的规则,就是消息传递算法;其中最有名的两条,分别是和积算法(算边际概率)和最大积算法(找全局最优组合)。 这篇文章会带你把这张图越画越熟:从怎么建图,到便条怎么传,再到 5G 基站和 WiFi 路由里真实使用的 LDPC 纠错芯片如何靠这套框架工作。学完你就会发现,因子图是概率图模型世界里真正的「通用语言」。

岗位关联

对 AI 从业者而言,因子图把“建模”和“推断”拆成了画图与传消息两件事,能让你在学习贝叶斯网络、马尔可夫随机场乃至大模型推理时,用同一套直觉快速理解各类概率模型的推断过程。

目录
  1. 可视化演示
  2. 因子图概述
  3. 因子图构建
  4. 消息传递基础
  5. 和积算法
  6. 最大积算法
  7. LDPC解码应用
  8. 与其他模型关系
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示因子图二部结构、变量节点与因子节点间的消息传递过程及信念传播收敛,通过节点连线和流动消息直观呈现概率推理框架。

本节配有交互动效(进入视口后自动加载,约 3KB)。

因子图结构 变量节点(圆)与因子节点(方)构成二部图,边表示依赖关系 P(x) = (1/Z) · ∏ f_a(X_a) 概率分布的图分解表示

因子图概述

物业主任在公告栏上贴出第一版网格协作图:圆点是住户,方块是工作小组,线代表“该住户参与该小组”。张大爷看了直点头:“这可比那一摞资料强多了,谁和谁有关系,一眼就清楚。” 在概率世界里,我们面对的“资料堆”是一个包含 n 个随机变量的联合分布,通常复杂到无法直接存储和计算。因子图做的事情和公告栏完全一样:把联合分布拆成多个局部函数(因子)的乘积,每个因子只关心一小撮变量,变量与因子之间构成一张二部图——边只存在于变量节点与因子节点之间,同一类节点之间没有连线。

正式地,设变量集合为 $\mathbf{x} = \{x_1, x_2, \ldots, x_n\}$,因子集合为 $\{f_1, f_2, \ldots, f_m\}$,每个因子 $f_a$ 只依赖一个子集 $\mathbf{x}_a \subseteq \mathbf{x}$。联合分布可以写成:

公告栏让小区事务的结构“显形”,因子图则让高维概率分布的局部依赖结构“显形”。这也是为什么因子图被视为概率图模型中的“通用语言”:无论原始模型长什么样,一旦翻译成因子图,后续的推断就有了统一的处理框架。

p(x1,x2,…,xn)=1Z∏a=1mfa(xa)\displaystyle p(x_1, x_2, \ldots, x_n) = \frac{1}{Z}\prod_{a=1}^{m} f_a(\mathbf{x}_a)
  1. 局部因子乘积左边是 n 个随机变量的联合概率,直接存储需要指数级空间;右边把它拆成 m 个局部函数 $f_a(\mathbf{x}_a)$ 相乘,每个因子只依赖一小撮变量,这正是“复杂问题局部化”的数学表达。
    p(x1,x2,…,xn)=∏a=1mfa(xa)\displaystyle p(x_1, x_2, \ldots, x_n) = \prod_{a=1}^{m} f_a(\mathbf{x}_a)
  2. 归一化常数 Z局部因子相乘后通常不归一,$Z$ 让整个表达式成为合法的概率分布(所有取值之和为 1)。在许多推断任务中 $Z$ 会被约掉,不需要显式计算。
    Z=∑x∏a=1mfa(xa)\displaystyle Z = \sum_{\mathbf{x}} \prod_{a=1}^{m} f_a(\mathbf{x}_a)

因子图构建

一位年轻住户提出疑问:“主任,这张图上哪些家庭要连到哪个小组,是怎么定下来的?”主任翻出工作台账:“垃圾分类组只登记 1、2 号楼住户,停车管理组只管 2、3 号楼……照抄台账连线就行。” 构建因子图同样不需要玄学:给定联合分布的一个分解表达式,每个乘积项就是一个因子,因子中出现的变量就是它的邻居。

以三个变量为例,假设联合分布可以分解为两个因子:

如果给出的是贝叶斯网络,比如 $x_1 \to x_2 \to x_3$,可以把条件概率 $p(x_1)p(x_2 \mid x_1)p(x_3 \mid x_2)$ 中的每一项都看作一个因子,分别对应变量 $\{x_1\}$、$\{x_1, x_2\}$、$\{x_2, x_3\}$。台账怎么写,图就怎么画;公式怎么分解,图就怎么连。掌握了构建规则,任何概率表达式都能变成可交流的网格协作图,为后续的消息传递铺好路。

p(x1,x2,x3)=f1(x1,x2)⋅f2(x2,x3)\displaystyle p(x_1, x_2, x_3) = f_1(x_1, x_2) \cdot f_2(x_2, x_3)
  1. 识别因子作用域第一个因子 $f_1$ 只依赖 $x_1, x_2$,第二个因子 $f_2$ 只依赖 $x_2, x_3$。于是 $x_1$ 只与 $f_1$ 相连,$x_3$ 只与 $f_2$ 相连,$x_2$ 同时连接两个因子——它是两个小组共享的“关键住户”。
    f1:{x1,x2}f2:{x2,x3}\displaystyle f_1: \{x_1, x_2\} \quad f_2: \{x_2, x_3\}
  2. 变量与因子连线每个因子与它作用域内的所有变量连边。谁出现在哪个因子里,谁就和哪个因子节点有一条边,反过来因子节点也只与出现在自己作用域内的变量相连。
    E={(x1,f1),(x2,f1),(x2,f2),(x3,f2)}\displaystyle E = \{(x_1, f_1), (x_2, f_1), (x_2, f_2), (x_3, f_2)\}

消息传递基础

图挂好后,1 号楼的李阿姨想知道 2 号楼小王明晚是否在家。她不能直接串门,于是写了张便条交给停车管理组,请小组转交。这张便条就是一条“消息”。在因子图中,消息是一个函数(或向量),它不说“小王一定在家”,而是说“对于你的每个可能取值,我综合自己掌握的信息后给出多少支持”。消息不武断地给出单一答案,而是给出一份“信任分布”。

消息有两个方向,规则完全不同。变量 $x$ 发给因子 $f$ 的消息,是把 $x$ 从其它因子收到的消息逐点相乘(排除目标因子 $f$):

因子 $f$ 发给变量 $x$ 的消息则复杂一些:先固定 $x$ 的取值,对因子作用域内其余变量的所有可能组合求和(边缘化),并把每个组合对应的因子表值与上游消息相乘:

便条在网格中来回传递,每户人家最终攒齐了所有小组转来的便条,叠在一起就是自己的“综合画像”。消息传递最大的好处是局部性:每一条消息的计算只涉及相邻节点,不需要全局信息,这为大尺度概率模型提供了可扩展的推断方案。

μx→f(x)=∏g∈N(x)∖{f}μg→x(x)\displaystyle \mu_{x \to f}(x) = \prod_{g \in N(x) \setminus \{f\}} \mu_{g \to x}(x)
  1. 固定目标变量 $x$我们要算的是“在 $x$ 取某个值的条件下,因子 $f$ 对它的支持程度”,所以先把 $x$ 钉住,逐个取值讨论。
    f(x,y)\displaystyle f(x, \mathbf{y})
  2. 对其余变量求和$\sum_{\sim x}$ 表示对因子作用域中除 $x$ 外的所有变量 $\mathbf{y}$ 的取值组合求和。这一步把“别的变量具体取什么”这件事消去,只关心它们对 $x$ 的总体影响,这就是边缘化的本质。
    ∑∼x\displaystyle \sum_{\sim x}
  3. 乘以外来消息求和号内先让其它变量 $y$ 各自的上游消息 $\mu_{y \to f}(y)$ 相乘,再乘上因子表值 $f(x, \mathbf{y})$——因子表是小区的“台账”,上游消息是邻居们的便条,二者结合才构成完整证据。
    ∏y∈N(f)∖{x}μy→f(y)\displaystyle \prod_{y \in N(f) \setminus \{x\}} \mu_{y \to f}(y)

和积算法

物业要统计每户的“晚归指数”。如果挨家挨户收集全部联合信息,维度会爆炸;居民们的做法是:每家把便条交给小组,小组把相关便条“求和”(把邻居的所有可能情况都考虑进去)再“求积”(综合多条来源的信息),传回各家。这种“求和 + 求积”的消息传递模式,就是和积算法,也叫信念传播(Belief Propagation)。

当消息传递收敛后,变量 $x_i$ 的边际概率等于所有相邻因子发给它的消息逐点相乘再归一化:

算法的执行流程分三步:第一,初始化所有消息为全 1 向量(即没有任何偏见);第二,从叶子节点开始向内部传递消息,完成一轮“叶子到根”的收集;第三,反向从根向叶子分发消息,让每个变量都能收到全局信息。当因子图是一棵树(无环)时,这一轮收集 + 分发就能得到精确边际概率;如果图中有环,则算法变为循环信念传播,只能得到近似结果,且可能需要多次迭代才能收敛。

整个小区没有开过一场全体大会,靠每户与小组的局部对话,就完成了全局信息融合。这正是分布式推断的精髓,也是和积算法在芯片解码、传感器融合等场景中被广泛使用的原因。

p(xi)∝∏f∈N(xi)μf→xi(xi)\displaystyle p(x_i) \propto \prod_{f \in N(x_i)} \mu_{f \to x_i}(x_i)
  1. 收集所有因子消息$N(x_i)$ 是与 $x_i$ 相连的全部因子。把每个因子发来的消息在 $x_i$ 的每个取值下逐点相乘,相当于把各个小组的“评价”汇总成一份综合报告。
    ∏f∈N(xi)μf→xi(xi)\displaystyle \prod_{f \in N(x_i)} \mu_{f \to x_i}(x_i)
  2. 归一化上面的乘积和不一定等于 1,除以总和后就是合法的边际概率 $p(x_i)$。在实际实现中通常用 $\propto$ 表示“算完再归一化”即可。
    p(xi)=∏f∈N(xi)μf→xi(xi)∑xi∏f∈N(xi)μf→xi(xi)\displaystyle p(x_i) = \frac{\prod_{f \in N(x_i)} \mu_{f \to x_i}(x_i)}{\sum_{x_i}\prod_{f \in N(x_i)} \mu_{f \to x_i}(x_i)}

最大积算法

主任接着问:“哪个组合是全局最可能的?”——比如推断“今晚哪些住户同时在小区”。这和“每户各自最可能的晚归状态”不是一回事:单看每户最可能的状态 A,组合起来可能违反停车位共享约束。这就好比每个学生单科都考第一,但没人能同时考三个人的试卷。最大积算法解决的是联合最大后验(MAP)推断问题:

把和积算法中的“求和”换成“取最大值”,就得到最大积算法。因子 $f$ 发给变量 $x$ 的消息变为:

和积算法是“把每户的完整概率画像都算出来”,最大积算法是“直接锁定全局最合拍的那套安排”。两者的消息规则高度相似,但目标不同:前者擅长回答“变量单独看是什么分布”,后者擅长回答“所有变量一起看最可能的组合是什么”。在实际工程中,最大积算法常用于解码、路径规划等需要输出一个明确决策的场景。

x∗=arg⁡max⁡xp(x)\displaystyle \mathbf{x}^* = \arg\max_{\mathbf{x}} p(\mathbf{x})
  1. 用 max 替换 sum与和积公式的唯一形式差别在于 $\sum_{\sim x}$ 变成了 $\max_{\sim x}$:不再对其它变量的所有组合求和,而是只保留其中使整体概率最大的那个组合。
    max⁡∼x\displaystyle \max_{\sim x}
  2. 保存回溯指针实际实现中,$\max$ 操作会记录“是哪个变量取值组合达到了最大值”,这个记录称为回溯指针。最终在根节点得到全局最大概率后,沿着回溯指针一路还原,就能得到完整的全局最优配置,而不是只得到一个概率数值。
    arg⁡max⁡∼x[f(x,y)∏y∈N(f)∖{x}μy→f(y)]\displaystyle \arg\max_{\sim x} \left[ f(x, \mathbf{y}) \prod_{y \in N(f) \setminus \{x\}} \mu_{y \to f}(y) \right]

LDPC解码应用

后来小区装了一套智能门禁,但电磁干扰偶尔会篡改开门指令。主任发现,只要在门禁系统里预先设计好“校验关系”,收到被涂改的指令时,住户和小组互相核对几轮,就能把原始指令还原。这套思路就是 LDPC(低密度奇偶校验)码,它是 5G、WiFi、卫星通信中广泛使用的前向纠错技术。

LDPC 的校验矩阵 $H$ 天然对应一张因子图,称为 Tanner 图:矩阵的每一列是一个变量节点(对应码字的一个比特),每一行是一个因子节点(对应一个校验方程),矩阵中"1"的位置就是变量与校验因子之间的连边。校验关系写作:

解码时,信道观测作为“证据”注入变量节点(相当于每个住户拿到自己被干扰后的门禁指令),变量节点与校验因子之间迭代交换软信息——也就是对数似然比(LLR)。这个过程本质上就是和积算法在 Tanner 图上的运行:变量节点把“我目前认为这个比特是什么”传给校验因子,校验因子根据方程约束反馈“按我的约束,你应该更可能是这个”,如此迭代数轮后做硬判决,得到最可能的码字。

门禁系统在噪声中能自我修复,靠的正是因子图消息传递。5G 基站的 LDPC 解码芯片每秒钟要完成上千轮这样的消息传递——一个看似抽象的“便条交换”框架,就这样默默守护着你和家人之间的每一通电话、每一条视频。

HxT=0(mod2)\displaystyle H \mathbf{x}^T = \mathbf{0} \pmod{2}
  1. 校验矩阵 H$H$ 是 $m \times n$ 的 0-1 矩阵,每行是一个校验方程,每列是一个码字比特。矩阵“低密度”的意思是矩阵中 1 的个数很少,对应因子图上每个因子只连接少数变量。
    H=[11010111]\displaystyle H = \begin{bmatrix} 1 & 1 & 0 & 1 \\ 0 & 1 & 1 & 1 \end{bmatrix}
  2. 模 2 约束码字 $\mathbf{x}$ 乘以 $H$ 后必须得到全零向量(模 2 意义下),表示每个校验方程中参与校验的比特中"1"的个数为偶数。这个约束本身就是一个硬性因子。
    HxT=0(mod2)\displaystyle H \mathbf{x}^T = \mathbf{0} \pmod{2}

与其他模型关系

主任还发现,不同的管理模式都能画成同一张网格图:老式居委会(贝叶斯网络,有方向的因果关系)、现代物业(马尔可夫随机场,无方向的相互约束)——画法不同,但放到公告栏后,信息交换的方式完全一样。因子图正是概率图模型的“通用语言”。

贝叶斯网络转化为因子图非常直接:把每个条件概率分布 $p(x_i \mid \text{pa}_i)$ 当作一个因子,因子与它涉及的变量连边即可。马尔可夫随机场的转化同样简单:把每个团(clique)的势函数 $\psi_c(\mathbf{x}_c)$ 当作一个因子。转化完成后,推断任务不再依赖原始模型的方向性,统一用消息传递解决:

学会了因子图,你就掌握了一台“万能翻译机”。面试里常见的隐马尔可夫模型(HMM)、条件随机场(CRF)、深度概率编程中的变分推断,几乎都可以在脑中先画成因子图,再用消息传递的直觉去理解——这种“翻译”能力,才是因子图留给 AI 从业者最宝贵的思维资产。

p(x∣e)=1Z∏a=1mfa(xa)\displaystyle p(\mathbf{x} \mid \mathbf{e}) = \frac{1}{Z}\prod_{a=1}^{m} f_a(\mathbf{x}_a)
  1. 证据注入观测到证据 $\mathbf{e}$(比如某些变量已被赋值)后,模型形式不变,只是这些变量对应的消息被固定为“观测值处为 1,其余为 0”,推断照常进行。
    p(x∣e)\displaystyle p(\mathbf{x} \mid \mathbf{e})
  2. 统一框架无论是贝叶斯网络的定向依赖还是马尔可夫随机场的无向约束,翻译成因子图后都变成同一套“局部因子乘积 + 消息传递”流程,不需要为每种模型单独设计推断算法。
    ∏a=1mfa(xa)\displaystyle \prod_{a=1}^{m} f_a(\mathbf{x}_a)

AI 应用场景

5G / WiFi 芯片中的 LDPC 解码

阶段:信号处理与纠错解码

解决的问题:传统 Turbo 码解码延迟高、吞吐量受限;LDPC 码配合因子图消息传递,能以极低复杂度实现接近香农极限的纠错性能。在 5G NR 标准中,LDPC 被选为数据信道的主流编码方案。

具体案例:手机基带芯片中的 LDPC 解码器内置 Tanner 图硬件电路,每次接收一帧包含数百至数千比特的数据,变量节点与校验节点按和积算法迭代交换对数似然比(LLR),迭代 8~15 轮后硬判决输出码字。这张“网格协作图”被固化成了芯片里的并行计算单元。

机器人 SLAM 中的因子图建模

阶段:状态估计与概率推断

解决的问题:传统 SLAM 用扩展卡尔曼滤波,只关注一阶矩,面对大规模地图时协方差矩阵爆炸。因子图把机器人的位姿和路标建模为变量节点,把运动学约束和观测约束建模为因子节点,用最大积(等价于非线性最小二乘)求解全局最优轨迹。

具体案例:扫地机器人一边移动一边用激光雷达观测环境,每个关键帧位姿是一个变量节点,相邻帧间的里程计约束和回环检测约束是因子节点。构建完因子图后运行一次稀疏优化,即可得到全局一致的建图结果——GTSAM、g2o 等主流 SLAM 库的核心数据结构正是因子图。

推荐系统中的贝叶斯概率推断

阶段:用户建模与在线推断

解决的问题:传统协同过滤面对稀疏矩阵时冷启动严重;用因子图把用户偏好、物品属性、交互记录建模为变量和因子,通过消息传递计算用户对未交互物品的边际偏好概率,并给出置信区间。

具体案例:某视频平台用因子图建模“用户—视频—标签”三方关系:用户兴趣变量连接“点击行为因子”和“标签偏好因子”,每次曝光新视频时,只需局部更新相关用户和视频节点的消息,就能在毫秒级得到新的推荐分。

Python 演示

python87 行
from itertools import product  class FactorGraph:    """极简因子图 + 和积算法(迭代信念传播)"""    def __init__(self):        self.vars = {}     # name -> list of states        self.adj = {}      # var -> list of factor names        self.factors = {}  # name -> (scope_list, table)     def add_var(self, name, states):        self.vars[name] = states        self.adj[name] = []     def add_factor(self, name, scope, table):        self.factors[name] = (scope, table)        for v in scope:            self.adj[v].append(name)     def msg_var2fac(self, var, fac, msgs):        msg = {}        for x in self.vars[var]:            prod = 1.0            for g in self.adj[var]:                if g != fac:                    prod *= msgs[(g, var)][x]            msg[x] = prod        return msg     def msg_fac2var(self, fac, var, msgs):        scope, table = self.factors[fac]        others = [v for v in scope if v != var]        msg = {}        for x in self.vars[var]:            total = 0.0            for combo in product(*[self.vars[v] for v in others]):                assign = dict(zip(others, combo))                assign[var] = x                val = table[tuple(assign[v] for v in scope)]                for v in others:                    val *= msgs[(v, fac)][assign[v]]                total += val            msg[x] = total        return msg     def sum_product(self, target, iterations=100):        msgs = {}        for fac, (scope, _) in self.factors.items():            for v in scope:                msgs[(v, fac)] = {x: 1.0 for x in self.vars[v]}                msgs[(fac, v)] = {x: 1.0 for x in self.vars[v]}        for _ in range(iterations):            new_msgs = {}            for v in self.vars:                for f in self.adj[v]:                    new_msgs[(v, f)] = self.msg_var2fac(v, f, msgs)            for f, (scope, _) in self.factors.items():                for v in scope:                    new_msgs[(f, v)] = self.msg_fac2var(f, v, msgs)            msgs = new_msgs        belief = {x: 1.0 for x in self.vars[target]}        for f in self.adj[target]:            for x in self.vars[target]:                belief[x] *= msgs[(f, target)][x]        total = sum(belief.values())        return {x: belief[x] / total for x in self.vars[target]}  def main():    g = FactorGraph()    g.add_var('a', [0, 1])    g.add_var('b', [0, 1])    g.add_var('c', [0, 1])    g.add_factor('f1', ['a', 'b'], {        (0, 0): 0.8, (0, 1): 0.1,        (1, 0): 0.1, (1, 1): 0.6,    })    g.add_factor('f2', ['b', 'c'], {        (0, 0): 0.9, (0, 1): 0.1,        (1, 0): 0.1, (1, 1): 0.9,    })    marginal = g.sum_product('b')    print('P(b):', marginal)    print('较可能的状态:', max(marginal, key=marginal.get)) if __name__ == '__main__':    main()
目的:在一个三变量链式因子图上运行和积算法,求出中间变量 b 的边际概率。
  1. g.add_factor('f1', ['a', 'b'], {...})登记一个因子:作用域是变量 a、b,表值为局部权重。这相当于小区公告栏上的“垃圾分类组台账”。
  2. msgs[(v, f)] = {x: 1.0 for x in self.vars[v]}所有消息初始化为全 1,表示“还没有任何偏见”,等待迭代中逐步携带真实信息。
  3. for combo in product(*[self.vars[v] for v in others])枚举因子作用域内除目标变量外所有变量的取值组合,这是和积算法中“求和”(边缘化)的实现。
  4. val *= msgs[(v, fac)][assign[v]]把其它变量的上游消息乘进因子表值,实现“求积”合并证据。
  5. belief[x] *= msgs[(f, target)][x]边际概率 = 所有邻居因子消息逐点相乘,最后归一化得到 P(b)。

常见误区

误区我之前学贝叶斯网络时已经画过有向图了,为什么还要学因子图?是不是又多了一个新模型要单独记?

正解因子图不是“又一个新模型”,而是更底层的通用表示。贝叶斯网络和马尔可夫随机场都可以无损转化为因子图,转化后统一用消息传递做推断。你可以把贝叶斯网络看作“老式居委会档案”(有方向的因果关系),把因子图看作“网格协作图”(谁和谁有关就连线)——档案能翻译成图,图也能承载档案的全部信息。

为何常见:教材通常先教贝叶斯网络和马尔可夫随机场,因子图作为更抽象的统一框架放在后面,初学者很容易把它误认为“第三种模型”。

误区和积算法的消息就在图上传,传几轮不都一样吗?应该任何图都能算准吧?

正解只有当因子图是树(无环)时,一轮“叶子到根 + 根到叶子”的消息传递才给出精确边际概率。如果图中有环,消息会被重复送回源头,相当于小区里同一张便条绕着圈子传回自己手上,形成“自我强化”。这时算法叫循环信念传播(Loopy BP),结果是近似值,甚至可能不收敛。

为何常见:大多数教材先用链式或树形例子教学,学生没接触过有环图,自然不知道精确性是有前提的。

误区我理解最大积就是把和积里的求和换成最大值,那我先算边际概率再逐变量取最大不就行了?结果差不多吧?

正解两者结果通常完全不同。边际概率最大化是“每个变量单独最可能的状态”,拼接起来可能整体不是全局最优(每个学生单科第一,但没人能同时考出三张卷子的最高总分)。最大积算法在传递最大值的同时必须保存 argmax 回溯指针,最终沿指针还原出完整的联合最优配置。少了回溯指针,就只剩一个数,无法回答“全局最优是哪套组合”。

为何常见:和积与最大积的公式形式只差一个符号,让人误以为它们只是“数值上取最大”的差别,忽略了最大积最关键的构造——回溯路径。

误区LDPC 是不是要用贝叶斯推断,需要给每个比特设定先验概率才能开始解码?

正解不需要额外设定先验。LDPC 的 Tanner 图直接从校验矩阵 H 构建,每个校验方程就是一个硬约束因子;信道观测(接收到的软信息)作为证据注入变量节点,消息传递完全由 H 和观测驱动。所谓“迭代解码”就是和积算法在这个确定结构上的运行。

为何常见:LDPC 教材用“校验矩阵”和“软判决”的术语,因子图教材用“变量节点”和“因子节点”,两套名词让人很难意识到是在讲同一个东西。

误区反正都是消息传来传去,那和积算法和最大积算法应该能互相替代,算出差不多的答案吧?

正解它们的优化目标不同:和积求边际概率 $p(x_i)$(单变量后验分布),最大积求联合 MAP $\arg\max p(\mathbf{x})$(全局最可能配置)。比如门禁系统里,和积能告诉你“第 3 个比特是 1 的概率是 72%”,最大积则给出“这一整帧 256 个比特最可能的组合”。对高维变量,逐变量边际最大化的拼接往往不是全局最优。

为何常见:两者长得很像,消息更新规则只差求和与取最大值,初学者容易忽略它们背后完全不同的推断目标。

面试题

Q1. 因子图的基本结构是什么?

单选题 · easy

  • A.两种节点组成的二部图← 正确答案
  • B.一种节点组成的有向图
  • C.环状结构连接的单向图
  • D.所有节点两两相连的完全图

答案:A。因子图由变量节点和因子节点两类节点组成,边只存在于变量与因子之间,同类型节点之间没有边,因此是二部图。就像小区网格协作图里,住户只连小组,住户之间不直接连线。

Q2. 因子图中的节点类型包括哪些?

多选题 · easy

  • A.变量节点← 正确答案
  • B.因子节点← 正确答案
  • C.隐藏节点
  • D.输出节点

答案:AB。因子图只包含两类节点:变量节点(圆点,代表随机变量)和因子节点(方块,代表局部函数)。“隐藏节点”“输出节点”是神经网络或隐马尔可夫模型中的术语,不是因子图的构成单元。

Q3. 和积算法的核心操作是什么?

单选题 · easy

  • A.求和与取最大
  • B.求和与相乘← 正确答案
  • C.相乘与取最小
  • D.积分与差分

答案:B。和积算法名字本身就点明了两个操作:“和”对应边缘化时对其它变量取值求和,“积”对应把多条消息逐点相乘。取最大是最大积算法的操作,积分与差分则属于随机分析的范畴。

Q4. 变量节点发给因子节点的消息表示什么?

单选题 · mid

  • A.所有邻居消息的求和
  • B.邻居因子约束下的分布
  • C.除目标外其余邻居消息的乘积← 正确答案
  • D.所有因子消息的最大值

答案:C。变量→因子消息的规则是“排除目标因子,把其余邻居的消息逐点相乘”。这样做是为了避免信息重复计数:如果把自己的来源信息也算进去,相当于小区里一张便条绕了一圈又回到自己手上。

Q5. 最大积算法相比和积算法的关键区别是什么?

单选题 · mid

  • A.将求和替换为取最大值← 正确答案
  • B.将乘积替换为求和运算
  • C.迭代次数增加一倍左右
  • D.需要先训练网络参数值

答案:A。两者的消息更新公式只差一个符号:和积用 $\sum$ 对其他变量求和,最大积用 $\max$ 只保留概率最大的路径。最大积还必须额外保存 argmax 回溯指针,用来在最后还原全局最优配置。

Q6. 和积算法能得到精确边际概率的条件是什么?

单选题 · mid

  • A.任意有环的因子图结构
  • B.无环树形结构的因子图← 正确答案
  • C.完全二部图的因子图结构
  • D.稠密连接的因子图结构图

答案:B。当因子图是树(无环)时,一轮叶子到根、根到叶子的消息传递就能精确算出边际概率。有环图上的信念传播是近似算法,可能不收敛,就像便条绕着环传回自己手里造成自我强化一样。

Q7. LDPC 解码的因子图依据什么构建?

单选题 · mid

  • A.神经网络训练的权重
  • B.校验矩阵的结构关系← 正确答案
  • C.大规模训练的数据集
  • D.信道噪声的分布模型

答案:B。LDPC 的因子图(Tanner 图)直接由校验矩阵 H 构建:每列是一个变量节点(码字比特),每行是一个校验因子节点,矩阵中的 1 决定连边。信道观测只作为证据注入,不决定图的拓扑结构。

Q8. 要还原全局最优的完整变量组合,应使用什么?

单选题 · hard

  • A.和积算法求单变量边际
  • B.最大积算法并保留回溯指针← 正确答案
  • C.变量消除法仅求概率值
  • D.蒙特卡洛随机抽样方法

答案:B。最大积算法在传递最大概率的同时保存 argmax 指针,最终沿指针回溯还原完整的最优配置。和积算法只能给出每个变量的边际分布,逐变量取最大拼接起来不一定是全局最优,这正是“每个学生单科第一但没人能同时考出三个状元”的道理。

Q9. 以下哪些模型可以转化为因子图?

多选题 · mid

  • A.贝叶斯网络模型← 正确答案
  • B.马尔可夫随机场← 正确答案
  • C.经典决策树模型
  • D.隐马尔可夫模型← 正确答案

答案:ABD。贝叶斯网络把每个条件概率当作因子即可转化;马尔可夫随机场把每个团的势函数当作因子;隐马尔可夫模型本质是动态贝叶斯网络,也能转化为链状因子图。决策树是判别式规则模型,不包含概率图结构,不能直接转化。

Q10. 关于树形因子图的消息传递时序,正确的是?

多选题 · extreme

  • A.需从叶子节点开始发消息← 正确答案
  • B.因子需收齐邻居消息再发← 正确答案
  • C.叶到根再到叶两轮可完成← 正确答案
  • D.传递顺序完全不影响结果

答案:ABC。树形图上消息传递从叶子节点初始化开始,因子只有收到全部邻居消息后才能计算自己的输出;完整推断只需两轮:叶子→根收集、根→叶子分发。D 错误:消息顺序对树形图数值结果无影响,但对有环图收敛性影响很大,且实际浮点运算中不同顺序也会带来数值精度差异。