想象一下这样的场景:有两个学生——小明和小红——在互相学习。小明每天都在做练习题,做完之后会拿去给小红的答案对答案。但奇怪的是,小红并没有一本“标准答案”书,她只是比小明多学了一段时间,回答问题更稳定、更靠谱一些。小明不需要知道“正确答案”是什么,他只需要不断地把自己的答案往小红的参考答案上靠。久而久之,小明自己也变成了一个高水平的学生。更重要的是,小明从头到尾都没有遇到过一个“错误答案”——他不需要老师告诉他哪些选项是错的,只需要一个靠谱的参考答案就够了。 这就是 BYOL(Bootstrap Your Own Latent)的核心思想。在自监督学习的世界里,我们有一大批“练习题”(无标注的图像数据),但没有人告诉我们“标准答案”是什么。传统的对比学习(比如 SimCLR)会这样做:拿两张相似的图片,再拿一堆不同的图片,告诉模型“这张像、这张不像”。但 BYOL 却说:我根本不需要“不像”的样本。我只让两个网络互相参照、互相学习,就能学会识别图像中的深层特征。这就好比小明只需要跟小红对答案,完全不需要去看其他学生的错误答案,也能学会知识。

岗位关联

理解 BYOL 的无负样本设计,是掌握自监督学习从“对比范式”走向“范式转变”的关键一步——它意味着我们不再依赖大量负样本堆砌,而是用架构设计本身解决表示退化问题。这项能力是从事大模型预训练、视觉表征学习、多模态对齐等工作的重要基础。

目录
  1. 可视化演示
  2. 自监督背景
  3. 对比学习困境
  4. BYOL架构
  5. 在线与目标网络
  6. 关键机制
  7. 无负样本原理
  8. 超越SimCLR
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

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

BYOL架构:在线网络 + 目标网络 x (View 1)BYOL架构要点2. 目标网络:f\u03be(encoder only), EMA更新,不参与反向传播\u2192 所有输出=常数目标网络=常数靶标x (View 1)

自监督背景

如果说今天的 AI 是一个勤奋好学的孩子,那么“标注数据”就像是老师提前批改好的标准答案——珍贵、稀少、费钱。过去十年,AI 的进步很大程度上依赖人类手工标注的海量数据:一张图片里是猫还是狗,一句话是正面还是负面情绪。但这样的学习方式有一个致命瓶颈:世界上绝大多数数据都没有标注。互联网上有数万亿张图片、数万亿段文字,其中被人类标注过的不到万分之一。

自监督学习(Self-Supervised Learning)就是来解决这个问题的。它的思路是:不需要人类标注,直接把数据本身当作“考题”。比如把一张图片剪掉一块,让模型猜缺了哪块;或者把一句话中某个词挖掉,让模型猜是什么词。模型在做这些任务的过程中,被迫理解数据的深层结构——它学到的东西,就是“表征”(representation)。这些表征可以迁移到下游任务(如图像分类、目标检测)中,效果甚至可以超过用标注数据训练的传统方法。

在这个大背景下,BYOL 是自监督学习在视觉领域的一个巅峰之作。它用一个极其优雅的方式回答了一个根本性问题:如果没有任何标签,模型如何知道“什么样的表征是好的”? 答案是:不需要外部评判,两个网络互相成就。

对比学习困境

在 BYOL 出现之前,主流的自监督方法是“对比学习”(Contrastive Learning),代表作品是 SimCLR。对比学习的思路特别直观:拿一张图片,做两次不同方式的增强(比如调色、裁剪),得到“正样本对”;再拿一堆其他图片作为“负样本”。模型要学习的是:让正样本对的表征靠得近,让负样本对的表征离得远。

这个思路本身没毛病,但它有一个巨大的工程痛点:负样本要足够多、足够多样,学习效果才好。SimCLR 论文里使用了高达 8192 的 batch size——也就是说,每次训练要同时处理 8192 张图,从中构造大量负样本。这就好比小明做题时必须同时对比 8000 个其他学生的错误答案,才能确定自己的答案是对的。这不仅对 GPU 显存提出了极高要求,而且负样本之间的采样偏差也可能让模型学到次优表征。

更深层的问题是:为什么一定要靠“推开”才能学会? 我们人类学习概念的时候,比如认识“苹果”,并不需要看到 8000 个“不是苹果”的东西才能确认苹果是什么。大多数情况下,只需要有人指着一个苹果说“这是苹果”,就够了。

对比学习的困境不仅仅在于工程代价。在理论上,“负样本”到底取多少合适、取哪些合适,都是需要大量调参的。而且当 batch size 太大时,数据加载、传输、存储都成为瓶颈。BYOL 的研究者正是意识到这个问题,开始反思:负样本真的必要吗?

BYOL架构

BYOL 的全称是 “Bootstrap Your Own Latent“,直译是”启动你自己的潜在表示“。名字里的”Bootstrap“有自举、自生成的意思——就像一个人拽着自己的鞋带把自己提起来(虽然现实中不可能,但在数学上可以)。BYOL 的架构设计正是这种”自举”思想的体现。

整个架构由四个组件构成:两个 Encoder(在线网络 f_θ 和目标网络 f_ξ)、一个 Predictor(预测头 q_θ)、以及一个 EMA 更新机制。训练过程如下:给同一张输入图像 x 做两种不同的随机增强,得到两个视图 v1 和 v2。v1 送入在线网络得到表征 y_θ,再经过预测头得到预测 z_θ(v1);v2 送入目标网络得到表征 y_ξ。然后让预测 z_θ(v1) 去拟合目标 y_ξ(v2)。反过来,v2 进在线网络,v1 进目标网络,再做一遍对称的拟合。

这里的核心关系是:在线网络是“学生”,目标网络是“老师”。学生拿自己的答案去拟合老师的答案,但老师并不会停下来等学生,而是用“指数滑动平均”(EMA)的方式缓慢更新自己——老师的知识是学生长期表现的平滑版本。这样学生和老师就形成了一个“教学相长”的正反馈循环。

LBYOL=∥qθ(zθ)‾−yξ‾∥22=2−2⋅⟨qθ(zθ),yξ⟩∥qθ(zθ)∥2⋅∥yξ∥2L_{\text{BYOL}} = \left\| \overline{q_\theta(z_\theta)} - \overline{y_\xi} \right\|_2^2 = 2 - 2 \cdot \frac{\langle q_\theta(z_\theta), y_\xi \rangle}{\| q_\theta(z_\theta) \|_2 \cdot \| y_\xi \|_2}
这个公式的意思:计算在线网络预测结果和目标网络输出之间的“余弦相似度”损失。目标是让两者方向尽量一致。注意这里只有“拉近”,没有任何“推远”,这就是“无负样本”的本质。
  1. 符号设定定义在线网络的输出经过预测头后为 $q_\theta(z_\theta)$,目标网络的输出为 $y_\xi$,两者都是高维向量。
    L=∥qθ(zθ)‾−yξ‾∥22L = \left\| \overline{q_\theta(z_\theta)} - \overline{y_\xi} \right\|_2^2
  2. L2范数展开L2 距离的平方展开为各项之和,结果可以化简为与余弦相似度相关的表达式。
    ∥a−b∥22=∥a∥2+∥b∥2−2⟨a,b⟩\left\| a - b \right\|_2^2 = \|a\|^2 + \|b\|^2 - 2\langle a, b \rangle
  3. 归一化处理对两个向量做 L2 归一化(写作 $\overline{\cdot}$),使得模长都为 1,上式简化为 $2 - 2\cos(a,b)$。
    a‾=a∥a∥2,b‾=b∥b∥2\overline{a} = \frac{a}{\|a\|_2}, \quad \overline{b} = \frac{b}{\|b\|_2}
  4. 损失化简最小化 L 等价于最大化余弦相似度,即让两个表征方向对齐。
    min⁡L  ⟺  max⁡cos⁡(a,b)\min L \iff \max \cos(a, b)

在线与目标网络

在线网络和目标网络的分工,就像小明和小红的关系——一个激进、一个稳健。

在线网络(Online Network)是真正被训练、被使用的那个模型。它在每一个训练步都通过反向传播更新参数,它的“样子”会随着训练快速变化。这就像一个热情洋溢的新手,吸收新知识的速度极快,但也很容易波动、摇摆。

目标网络(Target Network)的参数不是直接通过梯度更新来的,而是由在线网络的参数经过 EMA 平滑后拷贝过来的。具体来说,每个训练步都会执行:

其中 ξ 是目标网络参数,θ 是在线网络参数,τ 是动量系数,通常取 0.99 或 0.999。当 τ 接近 1 时,目标网络的变化非常缓慢,几乎就是在线网络在较长时间内的“平均形象”。这就是小红——她比小明学得早、学得慢,但一步一步走得稳。

这种设计的精妙之处在于:如果两个网络完全同步更新(比如参数直接相等),那么训练信号就失去了意义——模型等于自己跟自己玩,很快就会坍缩成一个常数。但如果目标网络完全不更新,它又无法提供有价值的学习信号。EMA 恰好取了一个中间值,既让目标网络有足够的稳定性,又能逐步跟上在线网络的进步。

ξ←τξ+(1−τ)θ\xi \leftarrow \tau \xi + (1 - \tau) \theta
类比:小红的“平均意见”不能太远——如果她一直停留在十年前的水平,小明早就超过她了;但也不能太近——如果她每一秒都同步小明的想法,那她就不算一个独立的“参考者”了。

关键机制

如果把 BYOL 比作一台精心设计的机器,那么“停止梯度”(stop-gradient)、“预测头”(predictor)、“EMA 更新”就是这台机器上三个不可拆卸的齿轮。任何一个齿轮缺失,机器都会立刻停摆。

第一个齿轮是 stop-gradient。在训练时,目标网络输出的梯度被强制截断,不参与反向传播。也就是说,损失函数的梯度只会更新在线网络,而不会通过目标网络流回去。这样做的目的是防止两个网络“串通”成一个输出恒定向量的退化解。如果不加这个操作,训练会迅速崩溃——模型直接输出全零向量,损失变成 0,但什么也没学到。

第二个齿轮是预测头。它是在线网络末端额外加的一个小型 MLP 结构。预测头的存在使得在线网络的输出先经过一次“变换”,再去拟合目标网络的输出。这种“不对称”设计也非常关键:它打破了两个网络之间的对称性,让在线网络不能简单地“复制”目标网络,而必须学习到更深层的模式。

第三个齿轮是 EMA 更新。如前所述,它保证了目标网络提供稳定、平滑的回归目标。它的更新方式是:

在论文实验中,研究者逐一去掉这三个组件:去掉 stop-gradient,模型崩溃;去掉预测头,模型大大退化;去掉 EMA(改成随机初始化不动),模型完全学不到东西。这说明它们是 BYOL 能够“无负样本”工作的三大基石。

θtarget←τθtarget+(1−τ)θonline,τ∈[0.99,0.999]\theta_{\text{target}} \leftarrow \tau \theta_{\text{target}} + (1 - \tau) \theta_{\text{online}}, \quad \tau \in [0.99, 0.999]
类比:这三个齿轮就像一个稳定的学习三角关系——小明(在线)负责激进探索,小红(目标)负责稳定参照,而"stop-gradient"就是他们之间的一道玻璃墙:小明能看到小红的答案,但永远碰不到她。

无负样本原理

为什么 BYOL 不需要负样本也能避免表示坍缩?这是本文最核心、也最深刻的问题。我们从三个层面来理解。

经验层面。Google 的论文实验显示,BYOL 在 ImageNet 上的 top-1 准确率达到了 74.3%,超过了 SimCLR 的 69.3%——而且是在没有负样本、没有超大 batch size 的情况下。这已经足够说明问题:在实践中,无负样本设计不仅可行,而且效果更好。

直觉层面。负样本在对比学习中扮演的角色,是充当“推力”,防止模型把所有的输入都映射到同一个点。而 BYOL 用架构设计替代了这个“推力”:目标网络的 EMA 更新让它天然不会和在线网络“同流合污”;预测头造成的不对称性,让在线网络无法简单地复制目标;stop-gradient 防止了两个网络互相追逐导致坍缩。这些机制组合起来,就像一个“虚拟的负样本力”,在不引入真实负样本的情况下,达到了类似的防坍缩效果。

理论层面。2021 年的一篇理论分析(“Towards Understanding the BYOL“)指出,BYOL 的动态过程可以近似为一个常微分方程。在适当的条件下,该动力系统有唯一的全局稳定平衡点,并且这个平衡点捕获了数据的真实低维结构。也就是说,BYOL 的损失函数天然存在一个”避免坍缩“的隐式正则化项——它不靠”推远”来避免坍缩,而是通过网络结构本身把坍缩解排斥出去。

dθt=−∇θL(θt,ξt)dt,dξt=λ−1(θt−ξt)dtd\theta_t = -\nabla_\theta L(\theta_t, \xi_t) dt, \quad d\xi_t = \lambda^{-1}(\theta_t - \xi_t) dt
类比:小明和小红在没有标准答案的情况下学习,之所以不会一起变成“复读机”(把每道题都回答成“不知道”),是因为小红本身就是小明过去记忆的“平滑版”——有一层时滞存在。这个时滞就像一个阻尼器,让系统保持在有意义的轨道上。

超越SimCLR

SimCLR 和 BYOL 的对比,是两种学习范式的碰撞。SimCLR 信奉“远近亲疏”:正样本拉近、负样本推远。而 BYOL 信奉“教学相长”:只需要一个稳定的参考对象,就能持续进步。

从工程角度看,BYOL 有多项优势:不需要构造负样本队列(省内存)、不需要极大的 batch size(省显存)、不需要 MemoryBank(省实现复杂度)。SimCLR 需要 8192 的 batch size 才能达到最优效果,BYOL 在 256 的 batch size 下就能超过它。

从效果角度看,BYOL 在多个基准上都刷新了 SOTA:在 ImageNet 线性评估(把预训练表征直接接一个线性分类器)上达到 74.3%;在目标检测的下游任务中,BYOL 的预训练表征也显著优于 SimCLR。

但 BYOL 也不是没有代价:EMA 系数 τ 是一个需要精细调节的超参数,过大的 τ 导致目标网络更新过慢、训练初期不稳定;过小的 τ 又会让目标网络失去“稳定性”,导致训练崩溃。这就像小红的状态——如果她的记忆衰减太快,就和小明没什么区别了;如果她永不变通,就只会成为一本“老黄历”。

| 方面 | SimCLR | BYOL |

|------|--------|------|

| 负样本 | 必须有大量负样本 | 完全不需要 |

| batch size | 8192 | 256 |

| 额外组件 | 无 | EMA + 预测头 + 停止梯度 |

| ImageNet Top-1 | 69.3% | 74.3% |

| 工程复杂度 | 中 | 中高(EMA 微调) |

AI 应用场景

场景一:大规模图像预训练

阶段:数据预处理与预训练

解决的问题:很多企业有海量的无标注图像数据(比如电商平台的商品图、社交媒体的用户图片、医疗影像片库),人工标注成本极高且难以规模化。传统监督学习需要大量标注;SimCLR 等对比学习方法需要构造大量负样本,内存开销巨大,难以在大规模数据上快速训练。

具体案例:某电商平台有 5 亿张商品图片,没有标注。算法团队使用 BYOL 在这些图片上进行自监督预训练,提取通用的视觉表征。预训练完成后,下游的类别预测、商品检索等任务只需要少量标注就能达到理想的准确率。由于 BYOL 不需要负样本和超大 batch size,训练成本比 SimCLR 降低了约 60%。

场景二:小样本下游任务迁移

阶段:模型微调与下游适配

解决的问题:医疗 AI 公司往往只有几千张标注的 X 光片,直接训练深度网络容易过拟合。BYOL 提供了一个很好的预训练起点——先在大型无标注医疗影像数据集上自监督预训练,再在少量标注数据上微调。

具体案例:某医疗影像公司使用 BYOL 在 100 万张无标注胸部 X 光片上预训练,然后只用 3000 张带标签的 X 光片微调出一个肺炎分类器。相比从零开始训练(准确率约 82%),BYOL 预训练 + 微调达到了 91% 的准确率,逼近使用全量 5 万张标注训练的效果。

Python 演示

python112 行
import torchimport torch.nn as nnimport torch.nn.functional as F  class MLP(nn.Module):    """两层全连接网络,用于预测头或投影头。"""     def __init__(self, in_dim, hidden_dim, out_dim):        super().__init__()        self.fc1 = nn.Linear(in_dim, hidden_dim)        self.fc2 = nn.Linear(hidden_dim, out_dim)     def forward(self, x):        x = F.relu(self.fc1(x))        return self.fc2(x)  class BYOL(nn.Module):    """最小化 BYOL 实现。     在线网络 = backbone + projector + predictor    目标网络 = backbone + projector(无 predictor)    """     def __init__(self, backbone, in_dim=512, hidden_dim=256, out_dim=256,                 tau=0.99):        super().__init__()        self.tau = tau        # 在线网络        self.online_backbone = backbone        self.online_projector = MLP(in_dim, hidden_dim, out_dim)        self.online_predictor = MLP(out_dim, hidden_dim, out_dim)        # 目标网络(深拷贝在线网络的初始化权重)        self.target_backbone = backbone        self.target_projector = MLP(in_dim, hidden_dim, out_dim)        self._initialize_target_network()     def _initialize_target_network(self):        for p_target, p_online in zip(                self.target_projector.parameters(),                self.online_projector.parameters()):            p_target.data.copy_(p_online.data)        for p_target, p_online in zip(                self.target_backbone.parameters(),                self.online_backbone.parameters()):            p_target.data.copy_(p_online.data)        for p in self.target_backbone.parameters():            p.requires_grad = False        for p in self.target_projector.parameters():            p.requires_grad = False     @torch.no_grad()    def update_target_network(self):        """EMA 更新目标网络。"""        for p_target, p_online in zip(                self.target_projector.parameters(),                self.online_projector.parameters()):            p_target.data = (self.tau * p_target.data +                             (1 - self.tau) * p_online.data)        for p_target, p_online in zip(                self.target_backbone.parameters(),                self.online_backbone.parameters()):            p_target.data = (self.tau * p_target.data +                             (1 - self.tau) * p_online.data)     def forward(self, x1, x2):        """x1、x2 是同一图像的两个增强视图。         返回值是双向的 BYOL 损失。        """        # 在线分支        z1_online = self.online_projector(self.online_backbone(x1))        p1 = self.online_predictor(z1_online)        z2_online = self.online_projector(self.online_backbone(x2))        p2 = self.online_predictor(z2_online)        # 目标分支        with torch.no_grad():            z1_target = self.target_projector(self.target_backbone(x1))            z2_target = self.target_projector(self.target_backbone(x2))        # 对称损失        loss = 0.5 * (self._cosine_loss(p1, z2_target) +                      self._cosine_loss(p2, z1_target))        return loss     @staticmethod    def _cosine_loss(pred, target):        """将预测向量对齐到目标向量的损失。"""        pred_norm = F.normalize(pred, dim=1)        target_norm = F.normalize(target, dim=1)        return 2 - 2 * (pred_norm * target_norm).sum(dim=1).mean()  # 使用示例if __name__ == "__main__":    # 极简 backbone:一个小 CNN    class TinyCNN(nn.Module):        def __init__(self):            super().__init__()            self.conv = nn.Conv2d(3, 16, 3, padding=1)            self.pool = nn.AdaptiveAvgPool2d(1)         def forward(self, x):            return self.pool(F.relu(self.conv(x))).flatten(1)     model = BYOL(backbone=TinyCNN(), in_dim=16, hidden_dim=64, out_dim=32)    x1 = torch.randn(4, 3, 32, 32)  # 视图 1    x2 = torch.randn(4, 3, 32, 32)  # 视图 2    loss = model(x1, x2)    print("BYOL loss:", loss.item())    # 每个训练步后调用 EMA 更新    # model.update_target_network()
目的:这是一个完整的 BYOL 最小实现,包含在线网络(编码器+投影头+预测头)、目标网络(编码器+投影头)、EMA 更新和余弦相似度损失。可直接运行对比不同增强配置下的学习效果。
  1. class BYOL(nn.Module)定义 BYOL 核心类,内部管理两个网络的参数与更新逻辑。
  2. self.online_predictor = MLP(out_dim, hidden_dim, out_dim)预测头只在在线网络侧出现,是 BYOL 防坍缩的关键组件。
  3. self._initialize_target_network()目标网络初始化为在线网络的副本,并冻结所有参数。
  4. p_target.data = self.tau * p_target.data + (1 - self.tau) * p_online.dataEMA 更新公式的代码实现,确保目标网络缓慢跟踪在线网络。
  5. with torch.no_grad():这就是“停止梯度”的代码体现,目标网络完全不需要梯度。
  6. loss = 0.5 * (self._cosine_loss(p1, z2_target) + ...)对称损失:两个视图互为预测目标。
  7. pred_norm = F.normalize(pred, dim=1)L2 归一化,将向量压缩到单位球面,后续余弦相似度计算的前提。
  8. return 2 - 2 * (pred_norm * target_norm).sum(dim=1).mean()等价于最小化负余弦相似度,范围在 [0, 4] 之间。
  9. model.update_target_network()每个训练步之后调用,更新目标网络参数,实现“教学相长”。

常见误区

误区BYOL 虽然不直接用负样本,但它通过某种隐式方式使用了负样本,本质没区别。

正解BYOL 的损失函数中确实完全没有负样本项——它的损失定义只有预测与目标之间的均方误差(或余弦相似度)。它不依赖隐式负样本,而是通过“结构机制”(stop-gradient + 预测头 + EMA)来防止表示坍缩。要证明这一点,可以做一个简单的实验:从 BYOL 损失中无论如何都拿不出一个“排斥项”。它不靠推远不同样本,只靠拉近两个视图。

为何常见:因为在 BYOL 之前,所有成功的自监督方法都依赖负样本,人们本能地认为“没有负样本一定会在某些地方补一个”。

误区EMA 让目标网络慢慢地、每次变一点地逼近在线网络,所以本质上目标网络就是在线网络的“慢速拷贝版”。

正解EMA 是“目标网络 = 它自己的过去 × τ + 在线网络 × (1-τ)”。目标网络是自身历史状态的加权平均,而不是直接向在线网络的当前状态逼近。当 τ 接近 1 时,目标网络更像一个“长期记忆体”,它对在线网络的最新变化不敏感。这是刻意设计的:缓冲在线网络的波动,提供稳定信号。

为何常见:看到公式里同时出现 τ 和 1-τ 两项,容易误认为目标网络在向在线网络移动。

误区stop-gradient 只是为了让训练快一点、省一点显存,去掉也不影响效果。

正解stop-gradient 是理论证明中必要的条件。2021 年的理论分析表明,没有 stop-gradient,BYOL 的动力学方程会存在一个“坍缩解”(所有输出为常数),并且这个解是稳定的——也就是说,模型一定会学到把一切图片映射到同一个向量。“省内存”只是副产品,防坍缩才是它存在的首要原因。

为何常见:stop-gradient 在代码里只是一行 with torch.no_grad(),看起来像工程优化,容易忽略它架构层面的意义。

误区预测头把高维表征映射到低维空间,主要是为了省计算量。

正解预测头的本质是打破两个网络的对称性。BYOL 的主干网络 + 预测头构成一个“非对称结构”:预测器学习从在线表征到目标表征的映射。如果没有这个非对称结构,在线网络可以直接“复制”目标网络的输出形成一个恒等映射,导致模型学到退化表征。预测头的存在让网络必须学习有意义的变换,而不是简单复制。

为何常见:看到 MLP 和维度变化,第一反应就是“降维”,容易忽略它在架构上承担的角色是一个打破对称性的关键模块。

误区两个视图是同一张图的不同增强,可以看成是“正样本对”;但损失公式中只有一个余弦相似度项,没有负样本项。

正解这个说法混淆了“数据构造”和“损失形式”。BYOL 的损失函数是预测向量与目标向量之间的 L2 距离,其中只有一个样本对的比较。SimCLR 的 InfoNCE 损失中明确包含“分母的负样本求和”项,这才是负样本的数学形式。BYOL 连这个求和都没有,也没有额外维护负样本队列、负样本记忆库等结构。

为何常见:理论上有一个共识——没有负样本就很容易坍缩。BYOL 打破了共识,人们习惯性地想要在它的架构里找到隐藏的负样本,但它确实没有。

面试题

Q1. BYOL 的英文全称是什么?

单选题 · easy

  • A.Bootstrap Your Own Latent← 正确答案
  • B.Backward Your Own Loss
  • C.Batch Your Own Label
  • D.Build Your Online Learning

答案:A。BYOL 全称是 Bootstrap Your Own Latent,“Bootstrap“意为自举,”Latent”指潜在表征。其他选项都是干扰项。

Q2. 对比学习(如 SimCLR)中“负样本”的作用是什么?

单选题 · easy

  • A.推近与锚点的距离
  • B.推开不同样本表征← 正确答案
  • C.增大批次样本量
  • D.加速网络收敛

答案:B。负样本提供了“排斥力”,防止模型把所有样本映射到同一位置。BYOL 用架构机制替代了这个排斥力。

Q3. BYOL 中目标网络的参数更新方式是?

单选题 · mid

  • A.通过反向传播梯度更新
  • B.在线网络参数的指数移动平均← 正确答案
  • C.每隔若干步直接拷贝在线网络
  • D.随机梯度下降独立更新

答案:B。目标网络使用 EMA 更新:$\xi \leftarrow \tau\xi + (1-\tau)\theta$,τ 通常接近 1,这使得目标网络的参数是历史状态的平滑组合。

Q4. 以下哪个组件不是防止 BYOL 表示坍缩的必要条件?

单选题 · mid

  • A.Stop-gradient
  • B.预测头(Predictor)
  • C.EMA 更新
  • D.大 batch size← 正确答案

答案:D。BYOL 的重要设计就是在小 batch size 下也能工作。Stop-gradient、预测头和 EMA 三者缺一不可,但大 batch size 不是必需的。

Q5. 在 BYOL 中,如果移除 stop-gradient,会发生什么?

单选题 · hard

  • A.训练继续正常进行,但收敛变慢
  • B.模型会坍缩到常数输出← 正确答案
  • C.训练停止不再收敛
  • D.损失函数变为负无穷

答案:B。移除 stop-gradient 后,梯度会流过两个网络导致它们互相同化,最终一起崩溃到输出一个常数向量,损失虽然小但学不到任何有意义的表征。

Q6. 下列关于 BYOL 说法正确的是?

多选题 · mid

  • A.BYOL 不需要负样本← 正确答案
  • B.BYOL 需要非常大的 batch size
  • C.BYOL 使用两个网络互相监督← 正确答案
  • D.BYOL 的预测头在目标网络侧

答案:AC。A 正确,BYOL 完全不用负样本;C 正确,在线网络与目标网络互相引导;B 错误,BYOL 在 batch size 为 256 时即可超过 SimCLR;D 错误,预测头只存在于在线网络侧。

Q7. BYOL 中的目标网络相比在线网络,有哪些特点?

多选题 · mid

  • A.更新频率更低← 正确答案
  • B.参数变化更平滑← 正确答案
  • C.参数量更大
  • D.不参与反向传播← 正确答案

答案:ABD。目标网络通过 EMA 更新(A、B 正确),且梯度被 stop-gradient 截断(D 正确)。C 错误,两个网络的架构完全相同。

Q8. BYOL 损失函数的本质是最小化什么?

单选题 · hard

  • A.预测向量与目标向量的余弦相似度
  • B.预测向量与目标向量的 L2 距离← 正确答案
  • C.两个视图的表征之间的 KL 散度
  • D.在线网络预测结果的信息熵

答案:B。核心是 loss = 2 - 2·cos(q, y),这是 L2 距离的等价形式,本质上让两个向量越靠近越好。

Q9. 关于 BYOL 的理论分析,以下说法正确的是?

多选题 · hard

  • A.动力系统存在唯一的非零稳定均衡点← 正确答案
  • B.存在坍缩解但它在特定条件下不稳定← 正确答案
  • C.Stop-gradient 是避免坍缩的必要条件← 正确答案
  • D.EMA 系数 τ 越接近 1 训练越稳定越好

答案:ABC。理论分析表明动力系统的非零均衡点可捕获数据低维结构(A)且坍缩解在 stop-gradient 下有界(B)。stop-gradient 确实是必要条件(C)。D 错误,τ 过大导致目标网络更新过慢,初期训练极不稳定。

Q10. BYOL 在 ImageNet 上的 Top-1 准确率(线性评估)大概是?

单选题 · easy

  • A.约 69.3%(SimCLR 水平)
  • B.约 74.3%(超过 SimCLR)← 正确答案
  • C.约 59.3%(略低于 SimCLR)
  • D.约 89.3%(接近监督学习)

答案:B。BYOL 在线性评估下达到 74.3%,超过 SimCLR 的 69.3%,但仍低于监督学习(约 76%),D 选项 89.3% 是不现实的数字。