想象你是高三毕业班的班主任。班里1000名学生,有990个是“稳上985”的学霸,剩下10个是中游学生。如果你给全班布置同样的作业、花同样的精力批改,那么你几乎所有的注意力都会耗在学霸们那900多份全对的作业上——每一份都写得工工整整,你画上去的每一个勾都毫无信息量。真正需要你拉一把的那10个学生,反而被淹没在作业堆里,连名字都没被你记住。这,就是目标检测模型面临的核心困境:一张图片里有上万个“背景”候选框(这些是稳拿高分的负样本),却只有寥寥几个“目标”候选框(这才是我们真正在乎的正样本)。RetinaNet 的 focal loss,就是那位懂得“偏心”的班主任——它把批改作业的精力,从已经全对的学霸身上抽走,精准地投给那些还不会做的学生。它用一个精巧的“关注度调节器”,让简单样本的损失趋近于零,让模型把全部学习能力集中在难样本上。这篇文章将带你走进这个“偏心课堂”,看看 RetinaNet 是如何用 focal loss 解决目标检测中正负样本极度不平衡这个老大难问题的。

岗位关联

对AI从业者而言,掌握 focal loss 就掌握了目标检测中最关键的样本不平衡处理武器。无论你在医学影像找病灶、在自动驾驶找行人,还是在长尾数据中挖掘稀有事件,它都能显著提升难样本的召回率,是你简历和实战中都能立得住的技术亮点。

目录
  1. 可视化演示
  2. 样本失衡问题:为什么模型被“简单题”带偏
  3. RetinaNet架构:为“偏心”搭建的舞台
  4. Focal Loss原理:给损失函数装上“关注度调节器”
  5. 超参调优:偏心也要讲分寸
  6. 训练技巧:让聚焦策略稳稳落地
  7. 医学应用:微小病灶的救星
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示DMA控制器接管总线后直接在设备与内存间传输数据的过程,对比程序查询、中断驱动和DMA三种I/O方式的效率差异。

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

DMA传输过程 CPU发出DMA请求后释放总线,DMA控制器接管数据传输 传输完成后DMA控制器向CPU发送中断信号通知完成 CPU → DMA Req → Bus Grant → Transfer → Interrupt

样本失衡问题:为什么模型被“简单题”带偏

回到班主任的比喻。假设你批改完990份学霸作业,每份都得了满分,只有那10个中游学生的作业暴露出各种问题。但如果把所有学生的错题数加起来,你会发现——990份满分作业里偶尔写错的几个小笔误,累计起来竟然比10个中游学生正经错题的数量还要多好几倍。于是,你会在下一次教学中有意无意地重点讲“笔误”这个大多数人已经掌握的知识点,反而没时间去讲真正拉分的大题。这就是传统交叉熵在目标检测中的困境。

在目标检测里,一张普通的街景图会产生数万个候选框,其中超过99%都是背景框。这些背景框对模型来说“太简单了”——它们与任何目标的重叠度接近于零,模型很快就能把它们判成背景,单个损失非常小。但关键问题是:它们的数量实在太大,成千上万个微小损失加在一起,其梯度总量反而盖过了那几十个真正的目标框。模型被背景“笔误”的海洋淹没,学到的最优策略就是:把一切都预测为背景,反正这样总损失也很小。

这就是“样本不平衡”问题的本质。用失衡比可以粗略衡量严重程度:

你可以把这个比值理解为“讲台上堆积的作业总量”。老师的时间是有限的,若不加干预,必然被海量的学霸作业消耗殆尽。解决样本不平衡,本质上就是解决“如何让学生不甘心做全对作业里那一个不起眼的错号”的问题——这需要一位真正懂得精力分配的班主任,也就是我们接下来要认识的 RetinaNet。

R=NnegNpos\displaystyle R = \frac{N_{\text{neg}}}{N_{\text{pos}}}
  1. 负样本数量$N_{\text{neg}}$ 表示一幅图中背景候选框的数量,在锚框密集的设计下通常数以万计。
    NnegN_{\text{neg}}
  2. 正样本数量$N_{\text{pos}}$ 表示真正包含目标的候选框数量,一张图可能只有几个到几十个。
    NposN_{\text{pos}}
  3. 失衡比两者之间的比值 $R$ 经常达到几百甚至上千,定量说明了为什么模型会被背景主导。
    R=NnegNposR = \frac{N_{\text{neg}}}{N_{\text{pos}}}

RetinaNet架构:为“偏心”搭建的舞台

好的教学理念需要好的课堂设计。如果老师想精准辅导那10个中游学生,首先得知道他们在哪里、坐在教室的哪个方位。RetinaNet 这位“班主任”在开学前就把教室重新装修了:它用一条纵向走廊(特征金字塔)让坐在前排和后排的学生都能被老师看见;又在走廊的每一层贴满了座位牌(锚框),保证不管学生是高是矮(目标尺寸大小),都有自己的位置。

从技术上讲,RetinaNet 是一阶段检测器,意思是它把“找目标在哪”和“目标是什么”一步完成——不必像二阶段检测器(如Faster R-CNN)那样先让“区域提议网络”粗筛一轮候选框,再对少数候选框精细分类。一阶段检测器胜在速度,但代价是它必须在一张图上同时处理上万个锚框,其中绝大多数是背景。这正是样本不平衡问题的爆发点——二阶段检测器因为第一轮已经把候选框数量砍到几百个,不平衡问题没那么刺眼;而RetinaNet被迫直面数万候选框的残酷现实。

RetinaNet 的骨干网络是ResNet,再接上特征金字塔(FPN)。FPN 通过自顶向下的路径把深层语义信息逐步上采样并与浅层细节融合,让每个尺度的物体都有自己专属的特征层。在每一层上,网络又铺设了不同大小和长宽比的锚框,每个锚框都要输出“是目标还是背景”的分类概率和“框得准不准”的回归偏移。金字塔特征层的融合过程可以用下式表示:

如果说特征金字塔是教室的座位排布,那么接下来的 focal loss 就是老师手里的“教学重点名单”。教室已经布置好,一万个座位摆在那里,哪个学生最需要老师走过去,名单说了算。

Pl=conv(Cl)+up(Pl+1)\displaystyle P_l = \text{conv}(C_l) + \text{up}(P_{l+1})
  1. 上采样高层特征$P_{l+1}$ 是来自更高层(语义更强但分辨率更低)的特征图,通过上采样($\text{up}$)放大到当前层的大小,让深层语义传播到浅层。
    up(Pl+1)\text{up}(P_{l+1})
  2. 横向连接融合$C_l$ 是主干网络第 $l$ 层的原始特征,先经过1×1卷积($\text{conv}$)调整通道数,再与上采样特征逐元素相加,得到兼顾细节与语义的输出。
    Pl=conv(Cl)+up(Pl+1)P_l = \text{conv}(C_l) + \text{up}(P_{l+1})

Focal Loss原理:给损失函数装上“关注度调节器”

想象老师批改一份作业时心里有一个“红笔力度”:对于一道已经写了正确答案的题目,老师只需轻轻划一个勾;对于空着或做错的题目,老师会重重地写下批注。传统交叉熵老师的问题是:不管学生这道题是不是早就掌握了,红笔力度都相等。于是学霸作业里那几道全对的题,也消耗了老师同样多的墨水和时间。

Focal loss 的巧妙之处在于,它给交叉熵加了一个“熟悉度调节器”——调制因子 $(1-p_t)^\gamma$。这个因子做的事情很直观:如果模型对某个样本已经给出很高的正确置信度($p_t$ 接近1),说明这道题它已经会了,那 $(1-p_t)^\gamma$ 就趋近于0,损失被压得几乎没有;如果模型对样本还很模糊($p_t$ 比如只有0.6),说明这道题还不会,调制因子接近0.16甚至更高,损失基本保留。这样,梯度就被重新分配给了真正“不会做”的难样本。

先看普通的交叉熵:

通过一个权重来压制简单样本的贡献,就得到了 focal loss:

回看教室场景:学霸作业(简单负样本)虽然数量惊人,但每份都只被轻轻画一个“已阅”,老师终于从繁重的无效批改中解放出来,攥着红笔走向那10个真正需要帮助的中游学生。这个看似微小的公式改动,却在目标检测领域引发了一场“教育革命”。

CE(pt)=−log⁡(pt)\displaystyle CE(p_t) = -\log(p_t)
  1. 调制因子$(1-p_t)^\gamma$ 是压制强度的核心。当 $p_t \to 1$(简单样本),因子趋近0,整个损失项被压低;当 $p_t \to 0$(困难样本),因子趋近1,损失几乎原样保留。
    (1−pt)γ(1-p_t)^\gamma
  2. 与交叉熵相乘把调制因子乘到标准交叉熵上,组成focal loss。γ 控制偏心程度:γ越大,对简单样本的压制越猛烈。
    FL(pt)=−(1−pt)γlog⁡(pt)FL(p_t) = -(1-p_t)^\gamma \log(p_t)

超参调优:偏心也要讲分寸

有了调治理念,老师还得掌握“偏心的分寸”。如果老师完全无视学霸,连基础知识的巩固都跳过,班级平均分会下降;如果老师依旧一视同仁,问题又回到原点。在 focal loss 里,γ 就是那个“偏心程度”旋钮,α 则是另一个平衡正负样本基数的旋钮。

γ 取0时,调制因子恒为1,focal loss 退化为普通交叉熵——偏心完全不开启。γ 取1时,简单样本的损失开始被压缩。论文作者在 RetinaNet 上做了大量实验:γ从0增加到2时,检测平均精度(AP)显著提升;但继续调到5或6,效果反而下滑。原因很容易理解:γ过大时,连中等难度的负样本也被压得近乎为零,梯度信号变得过于稀疏,模型反而学不动了。所以 γ 并不是越大越好。

α 则是直接给正负样本的基础权重做倾斜。因为即使经过调制因子,负样本的数量还是多得多,所以给正样本一个额外的“照顾系数”α,给负样本系数 $1-\alpha$。论文推荐 $\alpha=0.25$、$\gamma=2$,并指出这两个旋钮并非独立——α 大一点可以用 γ 小一点来配合,实际使用时最好基于验证集做几次小范围扫描。完整的 focal loss 公式如下:

调参的过程就像老师在一个学期中不断调整帮扶策略:既不能对学霸完全放任不管,也不能把全部资源砸给学困生导致中间层被忽略。每调一次旋钮,都要用考试(验证集)来检验班级整体成绩是否真的提升了。

FL(pt)=−αt(1−pt)γlog⁡(pt)\displaystyle FL(p_t) = -\alpha_t (1-p_t)^\gamma \log(p_t)
  1. α 按标签取值$\alpha_t$ 根据样本真实标签取值,正样本取 $\alpha$,负样本取 $1-\alpha$,用来直接拉高少数类的权重。
    αt=α⋅y+(1−α)⋅(1−y)\alpha_t = \alpha \cdot y + (1-\alpha) \cdot (1-y)
  2. 加权组合将 α 权重乘到调制因子和交叉熵前面,得到同时解决“基数不平衡”(α)和“难易不平衡”(调制因子)的完整形式。
    FL(pt)=−αt(1−pt)γlog⁡(pt)FL(p_t) = -\alpha_t (1-p_t)^\gamma \log(p_t)

训练技巧:让聚焦策略稳稳落地

任何教育理念在落地时都会遇到意外。比如开学第一天,老师对学生完全不了解,若直接执行“极度偏心”策略,可能连哪些学生是学霸、哪些是学困生都分不清,偏心就偏到了空气上。focal loss 在训练初期也会遇到类似问题:模型初始输出几乎是均匀的,每个样本的 $p_t$ 都徘徊在0.5附近,调制因子 $(1-p_t)^\gamma$ 全都在1附近,等于没起到任何压制作用,训练一开始就陷入震荡。

RetinaNet 论文给出了一个优雅的初始化技巧:在分类子网络的最后一层,把偏置项初始化为一个正数,让模型在第一步就“默认”几乎所有锚框都是背景。数学上,如果我们希望训练初期模型预测每个锚框为目标的概率是 $\pi$(通常取0.01),那么偏置项应设为:

除了初始化,工程实战中还有几个重要细节。第一,损失归一化时建议用“正样本的数量”而不是“总样本数”来平均,否则总损失仍会被负样本稀释。第二,focal loss 可以与在线难样本挖掘(OHEM)、硬负样本挖掘等方法结合,构成多层次的难样本聚焦策略。第三,如果数据集极其稀疏,还可以先做一轮难样本采样,再叠加 focal loss,效果往往比单用某一种更好。这些技巧如同老师在新学期开始时先做一次摸底考试,摸清学生底细后,后续的偏心辅导才真正有效。

b=−log⁡(1−ππ)\displaystyle b = -\log\left(\frac{1-\pi}{\pi}\right)
  1. 设定初期前景概率$\pi$ 表示训练刚开始时我们希望模型对每个锚框输出“前景”的概率,论文取0.01,即默认只有1%的锚框可能是目标。
    π=0.01\pi = 0.01
  2. 反推偏置值将 $\pi$ 代入 $-log((1-\pi)/\pi)$ 计算出偏置 $b$ 约等于4.6。这样sigmoid输出在训练第一步就偏向背景,focal loss 的调制因子才能真正发挥作用。
    b=−log⁡(1−ππ)b = -\log\left(\frac{1-\pi}{\pi}\right)

医学应用:微小病灶的救星

把目光转向真实的医疗场景。在一张肺部CT影像里,一个早期肺结节可能只有几个毫米,占据整张图像的千分之一都不到。如果把整张CT切成无数小区域当作候选框,那么负样本(正常肺组织)的数量是病灶候选框的几千倍。这让样本不平衡问题变得生死攸关——漏掉一个微小结节,患者可能错过最佳治疗期;而误报太多,又会给医生带来巨大的无效工作量。

focal loss 在医学影像检测中就像是那位目光如炬的专家门诊老师。他在海量正常组织里扫过,快速跳过那些“一眼就是正常”的区域(易分负样本),把注意力锁定在形态稍有可疑的微小结节上(难分正样本)。研究表明,在肺结节检测、视网膜眼底图像病变筛查、病理切片癌细胞检测等任务上,使用 focal loss 相比普通交叉熵能提升3到8个百分点的平均精度,对小目标的召回率提升尤其明显。因为临床最怕的是“漏检”,而 focal loss 恰恰让模型更敢于把“不太确定”的区域判定为疑似病灶,而不是因为背景样本太多而保守地全部判为阴性。

临床上评估这种提升,常用相对提升率来衡量新旧模型的差距:

医学影像只是 focal loss 大显身手的一个缩影。在自动驾驶中,远处的小行人、道路上的小障碍物同样是海量背景中的稀有目标;在工业质检中,产品表面极罕见的划痕缺陷同样受惠于这套“偏心教学法”。那个曾经在教室角落里无人问津、名字都不被记住的学生,如今终于被看见了。

Δ=APnew−APoldAPold×100%\displaystyle \Delta = \frac{AP_{\text{new}} - AP_{\text{old}}}{AP_{\text{old}}} \times 100\%
  1. 新旧平均精度$AP_{\text{new}}$ 是使用 focal loss 后的平均精度,$AP_{\text{old}}$ 是基线模型(如普通交叉熵)的平均精度。
    APnew, APoldAP_{\text{new}},\, AP_{\text{old}}
  2. 计算相对提升两者相减得到绝对提升,再除以旧模型的AP,换算成百分比,直观地表达“比原来好了多少”。
    Δ=APnew−APoldAPold×100%\Delta = \frac{AP_{\text{new}} - AP_{\text{old}}}{AP_{\text{old}}} \times 100\%

AI 应用场景

医学影像:肺结节CT智能筛查

阶段:模型训练阶段(损失函数设计)

解决的问题:传统交叉熵训练下,CT影像中的正常组织像素占据了约99.9%的候选框,模型倾向于把所有区域判为背景,导致微小结节漏检率居高不下。focal loss 通过压制大量易分负样本的梯度,让模型把学习能力集中到形态可疑的结节候选区,显著降低假阴性。

具体案例:某三甲医院放射科部署了一套基于RetinaNet的肺结节检测系统。训练时使用 focal loss(γ=2, α=0.25),在内部数据集上肺结节召回率从78%提升到91%,其中直径小于5毫米的微小结节召回率提升尤为显著。放射科医生在AI辅助下读片效率提高了约40%。

自动驾驶:小目标行人检测

阶段:数据构建与模型迭代阶段

解决的问题:自动驾驶感知系统中,远处的小行人在图像中仅占几十个像素,而道路、天空等背景区域占据绝大多数候选框。focal loss 让检测器不再被海量背景“带偏”,提高了中远距离小目标的检出率,对自动紧急制动系统的触发准确性至关重要。

具体案例:某自动驾驶公司在其感知模型(基于RetinaNet改进)中引入 focal loss 后,在夜间和雨天场景下行人检测的AP提高了5.2个百分点,且误报率没有明显上升。该模型已在量产车的辅助驾驶系统中上线。

工业质检:稀有缺陷检测

阶段:模型精调阶段

解决的问题:工业产品表面的划痕、凹坑、脏污等缺陷出现频率极低(不良率可能低于0.1%),缺陷样本在整个训练集里是绝对的少数派。focal loss 配合难样本挖掘,让模型从“几乎只看得到正常产品”变成“对微小异常保持高度警惕”,解决了传统视觉算法漏检稀有缺陷的痛点。

具体案例:某面板制造企业在OLED屏幕质检环节使用 focal loss 训练缺陷检测模型,将极细微的Mura缺陷检出率从82%提升到94%,同时每片屏幕的误检次数下降了30%,每年减少数百万元的返修成本。

Python 演示

python41 行
import numpy as np  def sigmoid(x):    return 1.0 / (1.0 + np.exp(-x))  def focal_loss(logits, labels, alpha=0.25, gamma=2.0):    probs = np.clip(sigmoid(logits), 1e-9, 1 - 1e-9)    pt = labels * probs + (1 - labels) * (1 - probs)    ce = -np.log(pt)    alpha_t = labels * alpha + (1 - labels) * (1 - alpha)    return (alpha_t * np.power(1 - pt, gamma) * ce).mean()  def main():    rng = np.random.RandomState(42)    n_neg, n_pos = 900, 100    # 易分负样本:logits 很负,模型确信背景    neg_logits = rng.normal(-3.0, 1.0, n_neg)    # 难分正样本:logits 靠近0,模型犹豫    pos_logits = rng.normal(0.5, 1.5, n_pos)    logits = np.concatenate([neg_logits, pos_logits]).reshape(-1, 1)    labels = np.concatenate([np.zeros(n_neg), np.ones(n_pos)]).reshape(-1, 1)     probs = np.clip(sigmoid(logits), 1e-9, 1 - 1e-9)    pt = labels * probs + (1 - labels) * (1 - probs)    ce_loss = -np.log(pt)     neg_mask = labels.ravel() == 0    simple_neg_ce = ce_loss[neg_mask].mean()    simple_neg_fl = np.power(1 - pt[neg_mask], 2) * ce_loss[neg_mask]     print("普通CE总损失: %.4f" % ce_loss.mean())    print("易分负样本平均CE: %.4f" % simple_neg_ce)    print("Focal Loss(gamma=2): %.4f" % focal_loss(logits, labels))    print("易分负样本在FL中的平均损失: %.4f" % simple_neg_fl.mean())  if __name__ == "__main__":    main()
目的:用 NumPy 手动实现 focal loss,并模拟正负样本极度不平衡(900个易分负样本 vs 100个难分正样本)的场景,对比普通交叉熵与 focal loss 的损失差异。
  1. def focal_loss(logits, labels, alpha=0.25, gamma=2.0):定义 focal loss 函数,默认参数与论文推荐一致。
  2. probs = np.clip(sigmoid(logits), 1e-9, 1 - 1e-9)对 logits 做 sigmoid 并限制到安全区间,防止 log(0) 溢出。
  3. pt = labels * probs + (1 - labels) * (1 - probs)计算模型对“正确类别”的置信度 $p_t$:标签为1时取 probs,标签为0时取 1-probs。
  4. alpha_t = labels * alpha + (1 - labels) * (1 - alpha)正样本乘 α,负样本乘 1-α,直接调节正负样本的基础权重。
  5. neg_logits = rng.normal(-3.0, 1.0, n_neg)生成900个“模型已经很有把握”的负样本 logits,模拟易分背景框。
  6. pos_logits = rng.normal(0.5, 1.5, n_pos)生成100个“模型还很犹豫”的正样本 logits,模拟难分目标。
  7. simple_neg_fl = np.power(1 - pt[neg_mask], 2) * ce_loss[neg_mask]单独提取易分负样本在 focal loss 中的损失,看看被压制了多少。

常见误区

误区“我用了 focal loss,正负样本就不用做任何采样和加权了,模型自然就学得均衡。很多教程不就这么说吗?”

正解focal loss 压制的是“已经容易分对的负样本”,但如果正样本本身极端稀少(比如一张医疗图像里只有1个病灶),调制因子救不了“信息量不足”的问题。实践中仍常用 α 平衡权重、难样本挖掘、数据增强等手段与 focal loss 配合。好比老师再偏心学困生,若全班只有1个学困生且教材信息严重不足,偏心也无法凭空变出知识。

为何常见:focal loss 常被宣传为“处理样本不平衡的利器”,容易让人误以为它是万能的,忽略了它只解决“难易不平衡”这一层,不直接增加少数类的绝对信息量。

误区“γ 的作用是压制简单样本,那把 γ 调到5、6甚至10,简单样本被压得更狠,效果不就更好了吗?”

正解γ 过大会让中等难度的样本也被过度压制,梯度信号变得稀疏,模型收敛变慢、AP 反而下降。论文实验显示 γ=2 是最优区间,γ 从2增加到5时性能明显下滑。调 γ 时要观察验证集的 AP,而不是盲目追求“压得越狠越好”。

为何常见:人的直觉是“既然原因是要压制简单样本,那压制得越彻底越好”,但忽略了损失函数还需要保留足够的训练信号。

误区“focal loss 公式里的 p_t,直接把模型的 logits 输出套进去不就行了吗?反正数值越大表示越确信。”

正解logits 是未归一化的分数,必须先经过 sigmoid 函数压缩到0~1的区间,再根据真实标签取出“正确类别的概率” p_t。如果错用 logits,调制因子 $(1-p_t)^\gamma$ 会变成负数甚至指数爆炸,整个损失函数面目全非。

为何常见:公式书写通常只写 p_t 不写计算细节,初学者容易忽略 sigmoid 这一步“默认动作”。

误区“RetinaNet 是因为一阶段检测器才有不平衡问题,像 Faster R-CNN 那种二阶段检测器早就筛选过候选框,根本不需要 focal loss。”

正解二阶段检测器虽然在 RPN 阶段砍掉了大量背景框,但之后 ROI 分类头面对的样本仍然存在类别不平衡(头部的正负比可能仍有1:10以上),只是程度轻些。focal loss 的思想也已成功移植到二阶段检测器中用于难样本挖掘,并不是一阶段专属。

为何常见:教材为了突出 focal loss 的价值,常拿一阶段和二阶段对比,让人误以为二阶段完全免疫样本不平衡。

面试题

Q1. focal loss 中 γ=0 时退化成什么损失?

单选题 · easy

  • A.均方误差损失
  • B.交叉熵损失← 正确答案
  • C.平滑L1损失
  • D.对比损失

答案:B。γ=0 时调制因子 $(1-p_t)^0=1$,focal loss 就变回普通交叉熵。相当于老师把“偏心程度”旋钮归零,又回到了对每个学生平均用力的状态,所以答案是交叉熵。

Q2. RetinaNet 通过哪种机制让不同尺寸的目标都有对应的特征层?

单选题 · easy

  • A.滑动窗口
  • B.特征金字塔FPN← 正确答案
  • C.区域提议网络RPN
  • D.注意力机制

答案:B。RetinaNet 使用特征金字塔(FPN)融合多尺度特征,让大目标和微小目标都能在合适的特征层被检测到。RPN 是二阶段检测器的组件,滑动窗口和注意力都不是RetinaNet多尺度检测的核心机制。

Q3. 关于 focal loss 中的 p_t,以下说法正确的是?

多选题 · easy

  • A.p_t 接近1表示样本已经被模型分对了← 正确答案
  • B.p_t 接近0表示模型对这个样本判断困难← 正确答案
  • C.p_t 只取决于真实标签
  • D.p_t 是模型对真实类别的预测概率← 正确答案

答案:ABD。p_t 表示模型给“真实标签那类”的置信度,既与模型输出有关也依赖真实标签,所以C错。p_t 越大说明越容易分对,越小说明越难学,A、B、D均正确。

Q4. focal loss 主要解决目标检测中的什么问题?

单选题 · mid

  • A.训练速度过慢
  • B.正负样本数量极度不平衡← 正确答案
  • C.梯度爆炸
  • D.模型过拟合

答案:B。目标检测一张图有上万个锚框,其中绝大多数是背景负样本,简单负样本累积的梯度淹没了正样本。focal loss 通过调制因子压低易分负样本的损失,从而解决这一不平衡问题。

Q5. RetinaNet 论文推荐的 α 和 γ 默认组合是?

单选题 · mid

  • A.α=0.25, γ=2← 正确答案
  • B.α=0.5, γ=2
  • C.α=0.25, γ=1
  • D.α=0.75, γ=0.5

答案:A。论文通过网格搜索发现 α=0.25 与 γ=2 的组合在COCO数据集上效果最佳。α 负责正负样本的基础权重倾斜,γ 负责对简单样本的压制强度。

Q6. 简单负样本每个损失很小,为什么仍然主导梯度?

单选题 · extreme

  • A.因为它们的梯度被数值放大
  • B.因为它们的数量级远大于正样本← 正确答案
  • C.因为它们的标签噪声很小
  • D.因为它们的梯度方向一致

答案:B。即使每个简单负样本的损失微小,数量达到正样本的几百上千倍时,累积的梯度总量仍超过正样本。这就好比千名学霸每人犯一个小笔误,总错误量也可能超过唯一一个学困生犯的大错误。

Q7. 下列哪些手段可以缓解正负样本不平衡?

多选题 · mid

  • A.在线难样本挖掘OHEM← 正确答案
  • B.α 平衡权重← 正确答案
  • C.增大输入图像分辨率
  • D.随机水平翻转增强

答案:AB。OHEM 挑选损失最高的样本参与训练,α 平衡权重直接给少数类加权,都是针对不平衡的干预。增大分辨率和翻转增强属于数据层面通用操作,不直接解决数量失衡。

Q8. 分类层偏置 b 初始化为 $-\log((1-\pi)/\pi)$ 的目的是什么?

单选题 · hard

  • A.让模型训练初期默认所有锚框为背景← 正确答案
  • B.加速特征金字塔的特征融合
  • C.减少锚框的生成数量
  • D.让模型初始输出均匀分布

答案:A。π 通常取0.01,此时偏置约4.6,sigmoid 输出接近0.01,模型在第一步就“认为”绝大多数锚框是背景。这样 focal loss 的调制因子在训练初期就能稳定起作用,避免因初始预测均匀导致训练震荡。

Q9. 关于 γ 的取值,以下说法正确的是?

多选题 · hard

  • A.γ=0 时 focal loss 退化为交叉熵← 正确答案
  • B.γ 越大对简单样本的压制越强← 正确答案
  • C.γ 越大模型效果一定越好
  • D.γ=2 是论文实验中的推荐取值← 正确答案

答案:ABD。γ=0 时退化为交叉熵,A对;调制因子 $(1-p_t)^\gamma$ 随 γ 增大指数级变小,压制更强,B对;但 γ 过大会连中等难度样本也被压制,AP 下滑,C错;论文实验推荐 γ=2,D对。

Q10. 在医学影像小目标检测中,focal loss 最直接减少的是哪类错误?

单选题 · mid

  • A.假阳性(误报)
  • B.假阴性(漏检)← 正确答案
  • C.类别混淆
  • D.定位偏移

答案:B。focal loss 让模型更关注难以判别的病灶样本,减少了将微小病灶误判为背景的漏检。临床上漏检比误报后果更严重,所以这一特性对医学影像价值巨大。