想象一个场景:数学试卷发下来了,全班 35 个同学,只有 3 个人知道正确答案。老师不直接公布答案,却给了大家一张“关系网”——谁和谁是同桌、谁和谁住同一个小区、谁和谁是铁哥们。于是,消息开始沿这张网悄悄流动:知道答案的人告诉朋友,朋友再告诉朋友的朋友。几轮之后,全班大多数人都“知道了”答案,虽然有的人消息靠谱,有的人传得七扭八歪,但整体上信息确实扩散开了。这个过程,就是弱监督学习里大名鼎鼎的标注传播。 你手头可能有几千条人工标注的数据,却面对几十万条没有标签的数据——扔掉可惜,全标太贵。标注传播的哲学是:别急着扔,也别急着标,让有标签的样本沿着“相似关系”把信息传染给没标签的邻居。这里的关键问题随之而来:关系网怎么画?消息怎么传?传几轮?谁的消息更可信?传错了怎么办?文章会把这些问题一个个拆开,并用“班里传答案”的故事贯穿始终。

岗位关联

对 AI 从业者而言,标注传播是少样本/弱监督场景下的“扩音器”:用少量标注撬动海量未标注数据,直接降低数据标注成本,是实际业务中性价比极高的工程技巧。

目录
  1. 可视化演示
  2. 问题设定:只有少数人知道答案
  3. 图结构基础:谁和谁说得上话
  4. 标签传播算法:答案沿关系网逐轮扩散
  5. 相似度与近邻:只信身边最亲近的人
  6. 置信度估计:这话有几分可信
  7. 噪声与鲁棒性:传话失真怎么办
  8. 扩展与优化:从班级传到全校
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示标注传播如何将已有标签沿图结构扩散到未标注节点,以及置信度随传播距离衰减的机制。

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

图结构标签传播 已标注节点(蓝/绿)沿边将标签扩散到未标注节点 未标注节点(灰)迭代接收邻居标签信息 置信度随传播距离衰减,阈值过滤控制噪声 Y_i = Σ W_ij * Y_j / Σ W_ij 迭代传播直至标签分配收敛

问题设定:只有少数人知道答案

班里 35 个人,只有小 A、小 B、小 C 知道数学答案。其他同学围在一起干着急:问学霸?学霸不借。抄课本?课本上没有。这时候班主任说了一句:“你们之间不是有同学关系吗?谁跟谁熟,谁坐得近,自己去打听。”——你看,这就是一个典型的弱监督场景:可用的标注(答案)极少,未标注的数据(不知道答案的人)极多。标注传播要解决的,恰恰是“答案不够分”的问题:不靠老师逐人面批,而是让答案沿着人际关系网自己“流”出去。

在机器学习里,这个场景被写成一个形式化的任务:我们有一批带标签样本 $\mathcal{D}_l$ 和一大批不带标签样本 $\mathcal{D}_u$,希望借助样本之间的相似结构,推出这大批样本的标签。这里的“相似结构”就是同学之间“谁信得过谁”的关系——它不来自标注,而来自数据本身的特征。特征长得像,标签也大概率像,这是标注传播最朴素的信仰。

理解了这个设定,你就明白了为什么标注传播那么“省钱”:它不要求你标注大量数据,只需要少量可靠的种子 + 一张靠谱的关系网。关系网这张“图”是接下来的主角——答案要流动,首先得有路。

D={(x1,y1),…,(xl,yl)}∪{xl+1,…,xn}\mathcal{D} = \{(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_l, y_l)\} \cup \{\mathbf{x}_{l+1}, \ldots, \mathbf{x}_{n}\}
整个数据集由“带答案的人”和“没答案的人”两部分组成,标注传播的目标就是给后者补上答案。
  1. 已知标签集合左边大括号收集了 $l$ 个“已经知道答案”的样本,每个样本都有特征 $\mathbf{x}$ 和标签 $y$。
    Dl={(x1,y1),…,(xl,yl)}\mathcal{D}_l = \{(\mathbf{x}_1, y_1), \ldots, (\mathbf{x}_l, y_l)\}
  2. 未知标签集合右边是其余 $n - l$ 个只有特征、没有标签的样本,它们就是等待被“传染”的同学。
    Du={xl+1,…,xn}\mathcal{D}_u = \{\mathbf{x}_{l+1}, \ldots, \mathbf{x}_{n}\}
  3. 合起来看$\mathcal{D}$ 是这两部分的并集,任务则是根据 $\mathcal{D}_l$ 预测 $\mathcal{D}_u$ 的标签 $y_{l+1}, \ldots, y_n$。
    D=Dl∪Du\mathcal{D} = \mathcal{D}_l \cup \mathcal{D}_u

图结构基础:谁和谁说得上话

传答案不是见人就传。小 A 会把答案传给同桌和有微信的铁哥们,但不会传给隔壁班不认识的张三。所以消息传播的第一步,是把“谁和谁能说得上话”画成一张图。在标注传播里,每个数据样本是图的节点,样本之间是否有相似关系是图的边,而这条边有多“亲”,用一个数值表示,叫做边权。图论里管这种结构叫邻接矩阵,它是一张 $n \times n$ 的表,第 $i$ 行第 $j$ 列填的就是 $\mathbf{x}_i$ 和 $\mathbf{x}_j$ 的亲密度。

怎么量化亲密度?最常用的办法是高斯核相似度:两个样本的特征越接近,亲密度越高;越远,亲密度指数级衰减。这就像同学之间传话——同桌耳语,一清二楚;隔了三排传话,得靠喊,还容易听错。高斯核天然把“太远的人”的亲密度压到接近 0,避免八竿子打不着的人也掺和进来。

有了带权重的图,消息就有了“道路”和“路况”。接下来,真正的传播游戏开始了——每一轮,每个同学都会竖起耳朵听邻居说了什么,然后更新自己的答案。

Wij=exp⁡(−∥xi−xj∥22σ2)W_{ij} = \exp\left(-\frac{\|\mathbf{x}_i - \mathbf{x}_j\|^2}{2\sigma^2}\right)
距离越近,权重越接近 1;距离越远,权重指数跌落,很快趋近于 0。"$\sigma$"决定多远算远。
  1. 算特征差的平方把两个样本的特征逐维相减再平方求和,得到一个非负的“距离” $\|\mathbf{x}_i - \mathbf{x}_j\|^2$,距离越大,两人越不熟。
    ∥xi−xj∥2\|\mathbf{x}_i - \mathbf{x}_j\|^2
  2. 用 $\sigma$ 归一化尺度分母 $2\sigma^2$ 决定“多远算远”。$\sigma$ 大,衰减缓慢,稍远的同学也算熟人;$\sigma$ 小,只有贴脸的才算亲近。
    −∥xi−xj∥22σ2-\frac{\|\mathbf{x}_i - \mathbf{x}_j\|^2}{2\sigma^2}
  3. 指数压缩成亲密度$\exp$ 把负数映射到 $(0,1]$ 区间,距离 0 时权重为 1,距离越大权重越接近 0。这样每一条边都有了“可信程度”。
    Wij=exp⁡(−∥xi−xj∥22σ2)W_{ij} = \exp\left(-\frac{\|\mathbf{x}_i - \mathbf{x}_j\|^2}{2\sigma^2}\right)

标签传播算法:答案沿关系网逐轮扩散

消息开始流动了。小 A 把答案低声告诉同桌,同桌再告诉后桌……每一轮,每个同学做的事情其实很简单:把自己听到的所有邻居的消息,按“亲密度”做一个加权平均,然后和自己原来的想法折中一下。在算法里,这个“听到的消息”不是简单的“对/错”二值,而是一个软标签——一个概率分布 $F$,比如“60% 选 A,40% 选 B”。软标签比硬标签聪明得多:它保留了“我其实也不太确定”这个信息。

每次迭代,算法同时做两件事:聚合邻居信息 $SF^{(t)}$,以及拉回初始锚点 $Y$。为什么必须拉回?因为小 A 的答案是最可靠的,如果小 A 也被邻居们七嘴八舌地“平均”掉了,正确答案就被稀释成一杯白开水。所以每一轮都要把已知标签强制恢复到初始值,这就是锚点固定。直觉上,这个迭代就是在“信朋友”和“信原件”之间不断折中,直到全班口径趋于一致。

看到这里你可能会问:如果班里有人是个“社交达人”,认识所有人,他的话是不是会被放大?的确会。所以传播之前,我们要先解决一个问题——怎么让这张图“公平”。

F(t+1)=αSF(t)+(1−α)YF^{(t+1)} = \alpha S F^{(t)} + (1 - \alpha) Y
新一轮的“意见”由两部分组成:来自邻居的传播项 $\alpha SF^{(t)}$,以及来自原始标注的锚点项 $(1-\alpha)Y$。$\alpha$ 越大越信朋友,越小越信初始答案。
  1. 邻居意见汇总$SF^{(t)}$ 里,$S$ 是归一化后的邻接矩阵,乘以 $F^{(t)}$ 相当于每个节点把邻居的软标签按边权加权求和——这就是“听邻居怎么说”。
    SF(t)SF^{(t)}
  2. 传播强度控制$\alpha$ 乘以邻居意见,表示“你愿意在多大程度上相信朋友圈”。$\alpha = 0.8$ 意味着八成看邻居、两成守旧。
    αSF(t)\alpha S F^{(t)}
  3. 锚点强制回收$(1-\alpha)Y$ 把初始标注按比例重新注入,防止原始答案被邻居的平均化浪潮淹没,这就像每轮都提醒大家“别忘了最初的那份标准答案”。
    (1−α)Y(1 - \alpha) Y
  4. 迭代至收敛重复上式直到 $F$ 的变化小于某个阈值(如 $10^{-5}$),此时全班意见稳定,传播结束,取 $F$ 中概率最大的类别作为最终标签。
    lim⁡t→∞F(t)=F(∗)\lim_{t \to \infty} F^{(t)} = F^{(\ast)}

相似度与近邻:只信身边最亲近的人

现实里你不会把全班每个人的话都当回事,你只信同桌、室友、好朋友。如果关系网把所有人都连在一起,那“标签”就会被稀里糊涂地平均掉:本来界限分明的两个类别,会糊成一片。这就是“过度平滑”。所以构建图的时候,大家几乎不会用全连接,而是用K 近邻(KNN)——每个节点只连最像它的 $k$ 个节点。就像你只把答案传给最铁的 $k$ 个朋友,让他们再往下传,而不是拿着一份答案在走廊里大喊。

但光“只信近邻”还不够。假如你认识的 5 个人里,有 3 个人是小 A 那种“消息源头”,你的信息量就特别大;另一个人认识的人很少,听到的消息就少。如果不做处理,社交达人(度数大的节点)会在传播里嗓门特别大。为了公平,算法引入了对称归一化:把每个节点的“度数”(连了多少条边)开方取倒数作为权重,让每个人都按自己“朋友圈规模”打折扣。度数大的人,每条边的影响力自动变小,就像嗓门大的人被老师提醒“小声点”。

图也公平了,消息也开始传了。但你有没有想过一个问题:传话的人,未必都靠谱。有人传回来的答案是“我确定选 A”,有人支支吾吾说“可能是 B 吧”。这两种消息,能同等对待吗?显然不能。这就引出了置信度估计。

S=D−1/2WD−1/2S = D^{-1/2} W D^{-1/2}
$D$ 是度矩阵(对角线上是每个节点的连接数),$D^{-1/2}$ 让连接多的节点权重被压缩。$S$ 就是传播迭代里真正用的“公平版”关系网。
  1. 查朋友圈规模$D$ 是对角矩阵,第 $i$ 个对角元素等于节点 $i$ 的度数 $d_i$,也就是它连了多少条边。
    D=diag(d1,d2,…,dn)D = \mathrm{diag}(d_1, d_2, \ldots, d_n)
  2. 开方取倒数$D^{-1/2}$ 的含义是每个元素 $d_i$ 先开方再取倒数 $\frac{1}{\sqrt{d_i}}$。度数越大,这个系数越小。
    D−1/2=diag(1d1,…,1dn)D^{-1/2} = \mathrm{diag}\left(\frac{1}{\sqrt{d_1}}, \ldots, \frac{1}{\sqrt{d_n}}\right)
  3. 左右夹乘完成归一化$D^{-1/2} W D^{-1/2}$ 从行和列两个方向同时压缩高连接度节点,得到的 $S$ 是归一化后的邻接矩阵,保证传播过程数值稳定。
    Sij=WijdidjS_{ij} = \frac{W_{ij}}{\sqrt{d_i d_j}}

置信度估计:这话有几分可信

班里传话分两种人:小 A 说“答案就是 C,我盯着老师改的”,你立刻信了;同桌说“好像……是 C……吧?”,你心里要打个问号。一个软标签如果输出 $(0.95, 0.03, 0.02)$,信息非常明确;如果输出 $(0.34, 0.33, 0.33)$,那基本等于“我啥也不知道”。前者是高置信度,后者是低置信度。怎么用一个数值把“支支吾吾”量化出来?答案是用信息熵。

熵在信息论里代表“不确定性”:越是均匀分布,熵越大;越是集中在某个类别上,熵越小。所以熵 $\approx 0$ 意味着这个样本对自己的标签非常笃定,熵很大则意味着它在几个类之间反复横跳。在传播过程中,我们可以计算每个未标注节点的熵,熵太高就暂停它的传播,不让他把“不确定”再传染给别人——这就像老师对某同学说:“你先把这道题弄明白再去教别人。”

有了置信度,我们就能做一件关键的事:在噪声杀死传播之前拦住它。毕竟,传话游戏玩到最后往往面目全非——接下来看如何控噪。

H(fi)=−∑k=1Kfiklog⁡fikH(f_i) = -\sum_{k=1}^{K} f_{ik} \log f_{ik}
对样本 $i$ 的软标签 $f_i$ 逐类计算“概率乘以概率的对数”再求和取负。熵越小,置信度越高。
  1. 取每个类别的概率$f_{ik}$ 表示样本 $i$ 属于类别 $k$ 的概率,取值在 0 到 1 之间。$K$ 是类别总数。
    fik∈[0,1],k=1,2,…,Kf_{ik} \in [0, 1], \quad k = 1, 2, \ldots, K
  2. 概率的对数$\log f_{ik}$ 在概率接近 1 时趋近 0,在概率很小时变成绝对值很大的负数,用来放大“罕见事件”的信息量。
    log⁡fik\log f_{ik}
  3. 加权求和并取负先把每个类别的 $f_{ik}\log f_{ik}$ 加起来,再取负。概率越均匀,加和越大,熵越高,说明这个样本越没底气。
    H(fi)=−∑k=1Kfiklog⁡fikH(f_i) = -\sum_{k=1}^{K} f_{ik} \log f_{ik}

噪声与鲁棒性:传话失真怎么办

小时候玩过传话游戏:一句话从队首传到队尾,最后变成了完全不相干的笑话。标注传播也有同样的风险:初始标注本身可能有错,图结构可能不合理,传播过程中低置信度的节点又可能把错误放大。如果放任不管,噪声会像滚雪球一样越滚越大。所以,一个工程上可用的标注传播,必须内置“降噪”机制。

最直接的办法是设阈值:如果一个节点的最大置信度达不到某个门槛(比如 $\tau = 0.7$),就认定它“没传明白”,宁可不标记,也不许它参与下一轮传播。这个思路很像老师检查作业:你连自己的答案都说不清楚,就先别给同学讲题了,去把课本再看一遍。在实际系统中,阈值截断配合锚点固定(每轮强制还原标注样本)、置信度加权(低置信度邻居权重自动降低),构成了传播鲁棒性的三件套。

到这里,标答传播的基本功已经讲完。最后一步,是把它从“班级游戏”升级成“全校规模的工程工具”。

y^i={arg⁡max⁡kfik,max⁡kfik≥τ待复核,max⁡kfik<τ\hat{y}_i = \begin{cases} \arg\max_k f_{ik}, & \max_k f_{ik} \ge \tau \\ \text{待复核}, & \max_k f_{ik} < \tau \end{cases}
只有当某个类别的概率超过阈值 $\tau$ 时才输出预测标签,否则标记为“待复核”,避免可疑标签继续扩散。
  1. 找最大概率$\max_k f_{ik}$ 是样本 $i$ 对各类别概率的最大值,衡量它最相信谁。
    max⁡kfik≥τ\max_k f_{ik} \ge \tau
  2. 高置信才输出达到阈值,则输出最大概率对应的类别 $\arg\max_k f_{ik}$;没达到,则标记为“待复核”,交给人工或另一套模型处理。
    y^i=arg⁡max⁡kfik或待复核\hat{y}_i = \arg\max_k f_{ik} \quad \text{或} \quad \text{待复核}

扩展与优化:从班级传到全校

班里 35 个人,传几轮答案就齐了。可如果消息要在全校几千人、甚至一座城市的社交网络里扩散,逐轮迭代就太慢了。标注传播的实际应用里,数据规模动辄百万、千万级别,图很大,怎么办?第一招是多标签扩展:把二分类的软标签向量 $F$ 扩展成 $n \times K$ 的矩阵,一次传播同时搞定多类问题——这就像班级里同时有几个学科的答案在传,互不干扰。第二招是大规模并行:把大图切成块,分到不同机器上并行迭代,再汇总传播结果。第三招则更漂亮——直接把迭代公式解出闭式解,一步算出收敛结果。

闭式解的推导思路很直接:在收敛时,$F^{(t+1)} = F^{(t)} = F^{(\ast)}$,于是迭代方程变成了一个关于 $F^{(\ast)}$ 的线性方程,移项求逆即可。这就像传话传到最后,全班口径已经稳定,你不需要再一轮一轮模拟,直接测出“最终版本”是多少。数学上这一个矩阵求逆,工程上常常被近似算法替代,但理解它,就理解了传播的本质:标签最终是初始标注与图结构之间的一个平衡点。

从班级到全校,标注传播的精髓始终没变:画一张关系网,让答案沿着边流动,用置信度分辨流言的成色,用锚点和阈值防止传话失真。这就是“标注数据会传染”的全部秘密——不是靠超能力,而是靠一张设计得当的图。

F(∗)=(1−α)(I−αS)−1YF^{(\ast)} = (1 - \alpha) (I - \alpha S)^{-1} Y
收敛后的软标签可以直接由初始标注 $Y$、传播系数 $\alpha$、归一化图 $S$ 一次性算出。不需要迭代,一步到位。
  1. 单位矩阵登场$I$ 是单位矩阵,相当于“原始的自己”。$I - \alpha S$ 表示“把图结构从自身里扣除一部分”。
    I−αSI - \alpha S
  2. 求逆矩阵$(I - \alpha S)^{-1}$ 是这一表达式的逆矩阵,它把邻居之间无穷多轮的间接影响(二阶、三阶……邻居)全部累加进来,等价于“无穷轮迭代的总和”。
    (I−αS)−1(I - \alpha S)^{-1}
  3. 整体缩放乘以 $(1-\alpha)$ 保证最后结果仍是标签的加权组合,且行和为 1,不会出现数值爆炸。
    F(∗)=(1−α)(I−αS)−1YF^{(\ast)} = (1 - \alpha) (I - \alpha S)^{-1} Y

AI 应用场景

电商评论的情感弱监督标注

阶段:数据标注与管理 / 弱监督数据构建

解决的问题:电商平台每月产生百万级售后评论,人工标注情感标签的成本高、耗时长。传统做法是雇标注团队逐条打标,预算有限时只能放弃大部分数据。标注传播可以把少量高质量种子标注自动扩展到全量评论,大幅压低标注成本。

具体案例:某电商 NLP 团队先用规则和人工标出 2 万条“满意/不满”种子评论,然后用预训练模型把评论编码成向量,构建 KNN 图,在图上运行标签传播,将情感标签扩散到 100 万条评论。抽检 5000 条,发现与人工标注一致率达 85%,而标注成本只有原来的 1/10。

自动驾驶视频的半自动标注工具

阶段:数据标注管理 / 半自动标注流水线

解决的问题:自动驾驶需要逐帧标出车辆、行人、车道线,纯人工标注一帧要几十秒,一段 30 秒视频就要标几百帧。标注传播利用帧间的特征相似性,把人工标注的帧传播到相邻帧,再由人工只修正低置信度帧。

具体案例:某自动驾驶数据服务商对一段行车视频只人工标注第 1 帧和第 30 帧,用视觉特征向量构建帧间相似图,将检测框标签传播到中间 28 帧。系统计算每帧置信度熵,只把熵高的 5 帧送人工复核,整体标注效率提升 4 倍。

社交网络异常账号检测

阶段:模型应用 / 图挖掘

解决的问题:风控平台每天新注册账号数以万计,人工标注“水军/正常”严重滞后。标注传播把少量已知水军账号作为锚点,让异常标签沿关注关系图传播,自动圈出可疑社区。

具体案例:某社交平台风控团队标注了 500 个确定的水军账号,构造 1 亿节点的关注关系子图,用标签传播算法得到 12 万个疑似异常账号。这些账号按置信度排序后,前 2 万名的人工复核命中率达到 72%,而此前全靠随机抽检命中率不足 5%。

Python 演示

python42 行
import numpy as npfrom sklearn.datasets import make_moonsfrom sklearn.metrics import accuracy_scorefrom sklearn.neighbors import kneighbors_graph  def build_graph(X, k=5):    """用 KNN 构建邻接矩阵,并做对称归一化,返回矩阵 S。"""    A = kneighbors_graph(X, n_neighbors=k, mode='connectivity').toarray()    np.fill_diagonal(A, 0.0)                  # 自己连自己,权重置零    D = np.diag(A.sum(axis=1) ** -0.5)       # 度矩阵开方取逆    S = D @ A @ D                             # 对称归一化 S = D^-1/2 A D^-1/2    return S  def label_propagation(X, y_labeled, labeled_idx, alpha=0.5,                      max_iter=200, tol=1e-5):    """软标签传播:F_new = alpha * S @ F + (1-alpha) * Y0"""    S = build_graph(X)    n, k = X.shape[0], len(np.unique(y_labeled))    F = np.zeros((n, k))    F[labeled_idx, y_labeled] = 1.0           # 锚点转 one-hot    Y0 = F.copy()    for _ in range(max_iter):        F_new = alpha * (S @ F) + (1.0 - alpha) * Y0        F_new[labeled_idx] = F[labeled_idx]   # 固定锚点,防止漂移        if np.abs(F_new - F).max() < tol:            break        F = F_new    return np.argmax(F, axis=1)  if __name__ == '__main__':    X, y = make_moons(n_samples=300, noise=0.08, random_state=42)    rng = np.random.RandomState(42)    labeled_idx = rng.choice(X.shape[0], 12, replace=False)    y_pred = label_propagation(X, y, labeled_idx)    unlabeled = [i for i in range(X.shape[0]) if i not in labeled_idx]    acc = accuracy_score(y[unlabeled], y_pred[unlabeled])    print('Labeled samples :', len(labeled_idx))    print('Unlabeled samples:', len(unlabeled))    print('Test accuracy    :', round(acc, 4))
目的:在月牙形二分类数据上,只用 12 个带标签样本,通过标签传播给其余 288 个样本自动补标签,并打印在未标注样本上的准确率。
  1. A = kneighbors_graph(X, n_neighbors=k, mode='connectivity').toarray()找出每个样本的 k 个最近邻居,把图结构存成邻接矩阵。
  2. np.fill_diagonal(A, 0.0)去掉自己的边,消息不能只在自己耳边循环。
  3. D = np.diag(A.sum(axis=1) ** -0.5)计算度矩阵并开方取逆,平抑“社交达人”的话语权。
  4. S = D @ A @ D对称归一化,得到传播用的标准图矩阵。
  5. F[labeled_idx, y_labeled] = 1.0把 12 个锚点标签转成 one-hot 软标签。
  6. F_new = alpha * (S @ F) + (1.0 - alpha) * Y0核心迭代:邻居消息乘以 $\alpha$,原始锚点乘以 $(1-\alpha)$。
  7. F_new[labeled_idx] = F[labeled_idx]每轮强制还原锚点,这是防止标签漂移的关键一步。

常见误区

误区“标注传播就是把已知标签直接复制给附近的样本,传完就结束了,不需要管概率和置信度。”

正解传播传来的不是一个“确定的答案”,而是一个“概率分布”。同样说选 A,有人是 99% 确定,有人是 51% 蒙的。复制粘贴是硬标签思维,会丢掉“这个样本其实很可疑”这个重要信号。工程上要用软标签 + 置信度,才能决定哪些样本值得继续传播、哪些需要人工复核。

为何常见:很多教材示意图把标签画成“从 1 变成 1”的流动动画,让人误以为传播只是沿边复制,忽略了软标签这个核心载体。

误区“为了不遗漏任何潜在关系,把两个样本之间全都连上边,这样消息传得才全面。”

正解全连接图会导致过度平滑——每个节点的标签都是所有节点的平均值,类别边界被彻底抹平。K 近邻和 ε 邻域存在的意义就是限制“谁影响谁”,保留局部结构。全连接等同听全班 35 个人的噪音,不如只听 5 个好朋友的靠谱意见。

为何常见:直觉认为“信息越多越好”,忽略了图结构里的边不仅传信息,也传噪声;边太多会让信噪比急剧下降。

误区“传播算法多跑几千轮,精度一定比几十轮更高,反正迭代不花钱。”

正解标签传播是求解一个不动点,收敛后信息量不再增加,轮数再多也不会超越那个解。真正危险的反而是“锚点漂移”——如果每轮不把已知标签强制还原,初始标注会被邻居反复平均而削弱。比起增加轮数,更重要的是正确固定锚点。

为何常见:大家习惯了深度学习里“训练越久效果越好”的直觉,忘了标签传播的迭代是数值求解,不是参数学习。

误区“$\alpha=0.5$ 和 $\alpha=0.9$ 差别不大,$k$ 随便设个 5 就行,反正最后都能收敛。”

正解$\alpha$ 控制邻居信息和初始锚点的比重,标注越少越要调小 $\alpha$,否则少得可怜的原始信号会被图结构淹没;$k$ 决定传播半径,$k$ 太大易平滑,太小易断裂。实际项目中,$\alpha$ 和 $k$ 对精度的影响常常超过模型选择本身。

为何常见:因为传播算法收敛曲线看起来都平稳,导致误以为参数不敏感;但收敛值本身完全不同,只是你看动画时没注意最终颜色分布的差异。

面试题

Q1. 标注传播最像下面哪种生活中的行为?

单选题 · easy

  • A.全班传阅一份标准答案
  • B.消息沿朋友圈逐层扩散← 正确答案
  • C.老师逐人亲自讲解题目
  • D.每人猜测正确答案编号

答案:B。标注传播的核心是标签沿着样本间的关系网络逐轮扩散,与“消息沿朋友圈逐层扩散”结构一致。A 是单点广播,C 是监督学习,D 是随机猜测,都没有利用图结构。

Q2. 标注传播适用的典型数据场景是?

单选题 · easy

  • A.大量标注数据加少量未标注数据
  • B.少量标注数据加大量未标注数据← 正确答案
  • C.全部数据均已人工标注完毕
  • D.完全没有标签数据的冷启动

答案:B。标注传播是弱监督方法,正是为“只有少量标注、大量未标注”设计的。大量已有标注时直接训练监督模型即可;完全无标签时没有传播起点,冷启动需要另想办法。

Q3. 图结构中边的权重主要表示什么?

单选题 · mid

  • A.两个样本的相似程度← 正确答案
  • B.两个样本的编号差距
  • C.两个样本的采集时间差
  • D.两个样本的内存地址差

答案:A。边权衡量的是两个样本在特征空间里的亲密程度,越相似权重越高。编号、采集时间、内存地址这些跟样本内容无关,无法承载标签传播所需的相似性信息。

Q4. 下列哪些是构建传播图常用的方式?

多选题 · mid

  • A.K近邻图连接← 正确答案
  • B.高斯核函数加权← 正确答案
  • C.全连接稠密图← 正确答案
  • D.临时随机丢节点

答案:ABC。K近邻图和高斯核加权都是标准建图方式,全连接图虽不推荐但也是一种极端建图方式。随机丢弃节点会破坏图结构,不是构建图的方法,而是噪声模拟手段。

Q5. 软标签区别于硬标签的关键是?

单选题 · mid

  • A.软标签输出的是概率分布← 正确答案
  • B.软标签一定是整数向量
  • C.软标签无需任何置信信息
  • D.软标签只针对二分类任务

答案:A。软标签每个类别一个概率值,比如 (0.7, 0.2, 0.1),隐含了置信度;硬标签只有一个整数类别,丢了“不确定”的信息。软标签支持多分类,并非只适用于二分类。

Q6. 下列哪些策略能抑制传播中的噪声?

多选题 · mid

  • A.对低置信度样本延迟传播← 正确答案
  • B.用置信度对邻居加权← 正确答案
  • C.完全忽略初始标签锚点
  • D.设置标签更新的阈值← 正确答案

答案:ABD。低置信度样本暂停传播、按置信度加权、设置阈值拒绝模糊标签,都是控噪手段。忽略锚点会让初始标注被稀释,反而放大噪声,属于错误做法。

Q7. 迭代更新后必须把锚点标签恢复原值是因为?

单选题 · single

  • A.防止标签信息随轮次漂移← 正确答案
  • B.加快每次迭代的运行速度
  • C.减少内存和显存的占用
  • D.让图结构变得更稀疏一些

答案:A。锚点是唯一可信的“标准答案”,如果不强制还原,它的标签会被邻居反复平均而改变,传播就会像传话游戏一样越传越歪。恢复锚点不改变速度、内存或图结构,纯粹是为了保真。

Q8. 传播迭代式 $F=\alpha SF+(1-\alpha)Y$ 中 $\alpha\approx1$ 的含义是?

单选题 · hard

  • A.几乎完全相信邻居的标签← 正确答案
  • B.几乎完全忽略邻居信息
  • C.每一轮都不更新任何标签
  • D.每轮随机翻转部分标签

答案:A。$\alpha$ 越大,$SF$ 邻居聚合项占比越高,$Y$ 锚点项占比越低,算法几乎完全听邻居的。这样在标注较少时容易过度平滑,因此低标注率场景应该调小 $\alpha$。

Q9. 关于置信度熵的描述正确的是?

多选题 · hard

  • A.熵值越大标签越不确定← 正确答案
  • B.熵值接近于零表示确定← 正确答案
  • C.熵值可用于停止传播决策← 正确答案
  • D.熵值只与迭代次数有关

答案:ABC。熵是“不确定性的度量”,概率越均匀熵越大,越集中熵越小。系统可以用熵判断哪些样本可靠、哪些需要复核,从而决定是否让它继续传播。熵由概率分布决定,与迭代次数无直接关系。

Q10. 极端低标注率环境下传播最有效的策略是?

单选题 · extreme

  • A.成倍增加迭代总轮数
  • B.用更高阶路径增强连接← 正确答案
  • C.把所有锚点权重调为零
  • D.放弃图结构改用规则

答案:B。标注极少时,直接邻居路径里的信息太稀疏,用高阶路径(朋友的邻居、二跳关系)能显著扩大信息覆盖面。增加迭代轮数不能创造新信息;调零锚点相当于放弃唯一可靠信号;改用规则则完全脱离了标注传播框架。