返回首页

Roadmap
更新于 2026年10月30日 全文 2116 字未阅读

神经网络:多类别分类#

本页、节要点:

  • 多类别分类:从两个以上的候选里挑出答案,而不像二元分类那样只做二选一。
  • 两条主要路线:一对多(one-vs.-all)与一对一(one-vs.-one,后者通常就叫 softmax)。
  • 一对多:用多个二元分类器,各自独立地算出每一个类别的概率。
  • 一对一(softmax):预测每个类别相对于其他所有类别的概率,softmax 保证所有概率加起来正好是 1。
  • softmax 的效率:类别少的时候很划算,类别一多计算成本就吃不消;候选采样是提效的替代方案。

前面几节我们接触过的分类模型都只做二选一,比如:

  • 这封邮件是不是垃圾邮件。

  • 这个肿瘤是恶性的还是良性的。

这一节要研究的是多类别分类模型,它们可以从多个候选中挑出答案,比如:

  • 这条狗是比格犬、巴吉度还是寻血猎犬?

  • 这朵花是西伯利亚鸢尾、荷兰鸢尾、蓝旗鸢尾还是矮须鸢尾?

  • 那架飞机是波音 747、空客 320、波音 777,还是巴航工业 190?

  • 这张图是苹果、熊、糖果、狗还是鸡蛋?

真实世界里的多类别问题,甚至可能要在数百万个类别中做选择——比如那种几乎能认出任何东西的图像多类别分类模型。

本节详解多类别分类的两个主要变体:

  • 一对多(one-vs.-all)

  • 一对一(one-vs.-one),通常就叫 softmax

一对多#

一对多给出了一条把二元分类用成一连串「是 / 否」判断的路子。

如果一个分类问题有 N 个可能的答案,一对多方案就是由 N 个彼此独立的二元分类器组成——每种可能的结果配一个。训练的时候,模型依次跑过这一串二元分类器,把每一个都训练成能回答自己那个独立的问题。

举个例子:拿到一张水果的图片,训练时可能会得到 4 个不同的识别器,每个都回答一个不同的是非题:

  • 这张图是苹果吗?

  • 这张图是橙子吗?

  • 这张图是香蕉吗?

  • 这张图是葡萄吗?

下图展示了这套做法在实践中是怎么跑起来的。

图 7. 一颗梨作为输入,被送进 4 个不同的二元分类器模型。第一个模型判断「苹果 / 非苹果」,给出「非苹果」;第二个模型判断「橙子 / 非橙子」,给出「非橙子」;第三个模型判断「梨 / 非梨」,给出「梨」;第四个模型判断「葡萄 / 非葡萄」,给出「非葡萄」。
图 7. 一对多:同一张图片过 4 个二元分类器

提示: 想知道二元分类器到底是怎么做出预测的(也就是怎么设定分类阈值,把模型输出的数值变成「正」或「负」的标签),可以看看分类模块。

当类别总数不多时,这套做法相当合理;但类别一多,效率就越来越差。

不过我们可以用深层神经网络做出一对多得高效得多的模型:让每个输出节点代表一个不同的类别。下图就是这种做法。

图 8. 一个神经网络,架构为:输入层 1 个节点,第一层隐藏层 3 个节点,第二层隐藏层 4 个节点,输出层 4 个节点。输入节点被喂入一张梨的图片。输出层施加 sigmoid 激活函数,每个输出节点表示这张图是某种指定水果的概率。输出节点 1 表示「是苹果吗?」取值 0.34,节点 2 表示「是橙子吗?」取值 0.18,节点 3 表示「是梨吗?」取值 0.84,节点 4 表示「是葡萄吗?」取值 0.07。
图 8. 用神经网络完成同一组一对多任务

一对一(softmax)#

你可能已经注意到,图 8 输出层里那些概率值加起来并不是 1.0(也就是 100%)——实际上它们加起来是 1.43。

在一对多做法里,每一组二元结果的概率都是独立于其他所有组算出来的。也就是说,我们判断「苹果 vs 非苹果」的概率时,并没有把「橙子」「梨」「葡萄」这些选项的可能性考虑进去。

可如果我们想预测的是各种水果彼此之间的概率呢?这时要预测的不再是「苹果 vs 非苹果」,而是「苹果 vs 橙子 vs 梨 vs 葡萄」。这种多类别分类就叫一对一分类。

一对一分类可以沿用一对多那套一模一样的网络架构来实现,只有一个关键区别:输出层需要换一种变换。

一对多里,我们给每个输出节点独立地施加 sigmoid 激活函数,得到的输出值落在 0 到 1 之间,但并不保证这些值加起来恰好等于 1。

一对一里,我们可以改用一个叫 softmax 的函数。它给多类别问题中的每个类别分配一个小数概率,让所有概率加起来正好是 1.0。这条额外的约束能帮助训练比原本更快收敛。

softmax 公式如下:

$$ p(y = j|\textbf{x}) = \frac{e^{(\textbf{w}_j^{T}\textbf{x} + b_j)}}{\sum_{k\in K} {e^{(\textbf{w}_k^{T}\textbf{x} + b_k)}} } $$

注意,这个公式基本上就是把逻辑回归的公式扩展到了多个类别。

下图把前面那个一对多的多类别分类任务,重新实现成了一对一的任务。要做 softmax,紧挨着输出层之前的那一层隐藏层(叫 softmax 层)必须和输出层的节点数一样多。

图 9. 一个神经网络,架构为:输入层 1 个节点,第一层隐藏层 3 个节点,第二层隐藏层 4 个节点,输出层 4 个节点。输入节点被喂入一张梨的图片。输出层施加 softmax 激活函数,每个输出节点表示这张图是某种指定水果的概率。输出节点 1 表示「是苹果吗?」取值 0.19,节点 2 表示「是橙子吗?」取值 0.12,节点 3 表示「是梨吗?」取值 0.63,节点 4 表示「是葡萄吗?」取值 0.06。
图 9. 一对多改写成一对一(softmax)

softmax 的几种变体#

可以考虑 softmax 的下面这些变体:

  • 完整 softmax(Full softmax):就是我们前面一直在说的 softmax,也就是为每一个可能的类别都算出一个概率。

  • 候选采样(Candidate sampling):为所有正标签计算概率,但只为随机采样出来的一部分负标签计算概率。比如,如果我们只想判断输入图片是比格犬还是寻血猎犬,那没必要为每一张「非狗」图片都给出概率。

完整 softmax 在类别少的时候相当便宜,但类别数一多,代价就高到难以承受。候选采样能在类别很多的问题上提高效率。

单标签与多标签#

softmax 假设每个样本恰好属于一个类别。但有些样本是可以同时属于多个类别的。对这类样本:

  • 不能使用 softmax。

  • 必须依靠多个逻辑回归。

比如,上面图 9 里的一对一模型假设每张输入图只会画一种水果:苹果、橙子、梨或葡萄。但如果一张输入图里可能同时有好几种水果——比如一碗苹果和橙子混在一起——那就得改用多个逻辑回归了。

MLWM: softmax 的数学原理、它与逻辑回归的关系,可以参见「Softmax 回归原理:从逻辑回归到多分类与深度学习特征抽象」;想亲手实现一遍多分类模型,参见「从零实现MNIST分类:手写体识别3层神经网络代码实战」;本课程里对应的多分类基础概念,参见「多分类原理教程」。

关键术语:

  • 二元分类(Binary classification)
  • 多类别分类(Multi class classification)
  • 一对多分类(One-vs.-all classification)
  • softmax(一对一分类)
阅读 --