4.1. Softmax回归
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 SageMaker Studio Lab 中打开 Notebook

第 3.1 节中,我们介绍了线性回归,在 第 3.4 节中从零开始实现了线性回归,并在 第 3.5 节中使用了深度学习框架的高级API来完成繁重的工作。

当想要回答*多少*或*几*这类问题时,回归是我们自然而然会想到的工具。如果你想预测一栋房子的售价(美元),或者棒球队可能获得的胜场数,或者病人出院前将住院的天数,那么你可能正在寻找一个回归模型。然而,即使在回归模型中,也存在重要的区别。例如,房子的价格永远不会是负数,其变化可能经常是*相对于*其基准价格。因此,对价格的对数进行回归可能会更有效。同样,病人在医院度过的天数是一个*离散非负*随机变量。因此,最小均方可能也不是一个理想的方法。这种事件发生时间的建模伴随着许多其他复杂问题,这些问题在一个叫做*生存建模*的专业子领域中处理。

这里的重点不是要让你不知所措,只是想让你知道,除了简单地最小化平方误差之外,估计还有很多东西。更广泛地说,监督学习远不止回归。在本节中,我们关注*分类*问题,我们抛开*多少*的问题,转而关注*哪一类*的问题。

  • 这封邮件应该放在垃圾邮件文件夹还是收件箱?

  • 这位客户更可能注册还是不注册订阅服务?

  • 这张图片描绘的是驴、狗、猫还是公鸡?

  • 阿斯顿最有可能接下来看哪部电影?

  • 你接下来要读这本书的哪一节?

通俗地说,机器学习从业者滥用*分类*这个词来描述两个稍有不同的问题:(i) 我们只关心将样本硬性分配到类别(类)中;(ii) 我们希望进行软性分配,即评估每个类别适用的概率。这种区别往往变得模糊,部分原因在于,即使我们只关心硬性分配,我们仍然使用进行软性分配的模型。

更有甚者,在某些情况下,可能不止一个标签是正确的。例如,一篇新闻文章可能同时涵盖娱乐、商业和航天等主题,但不涉及医学或体育主题。因此,将其单独归入上述任何一个类别都不是很有用。这个问题通常被称为多标签分类。关于概述,请参见 Tsoumakas 和 Katakis (2007),关于标记图像的有效算法,请参见 Huang et al. (2015)

4.1.1. 分类

为了让我们初步尝试,我们从一个简单的图像分类问题开始。在这里,每个输入由一个 \(2\times2\) 的灰度图像组成。我们可以用一个标量表示每个像素值,这样我们就有了四个特征 \(x_1, x_2, x_3, x_4\)。此外,我们假设每张图像属于“猫”、“鸡”和“狗”这几个类别中的一个。

接下来,我们必须选择如何表示标签。我们有两个显而易见的选择。也许最自然的想法是选择 \(y \in \{1, 2, 3\}\),其中整数分别代表 \(\{\textrm{狗}, \textrm{猫}, \textrm{鸡}\}\)。这是在计算机上*存储*此类信息的好方法。如果类别之间有某种自然顺序,比如说我们试图预测 \(\{\textrm{婴儿}, \textrm{幼儿}, \textrm{青少年}, \textrm{青年}, \textrm{成年人}, \textrm{老年人}\}\),那么将其视为一个序数回归问题并保持这种格式的标签甚至可能是有意义的。关于不同类型的排序损失函数的概述,请参见 Moon et al. (2010),关于处理具有多个模式的响应的贝叶斯方法,请参见 Beutel et al. (2014)

总的来说,分类问题中的类别之间没有自然的顺序。幸运的是,统计学家很久以前就发明了一种简单的方法来表示分类数据:*独热编码*(one-hot encoding)。独热编码是一个向量,其分量数与我们拥有的类别数相同。与特定实例类别对应的分量设置为1,所有其他分量设置为0。在我们的例子中,标签 \(y\) 将是一个三维向量,其中 \((1, 0, 0)\) 对应于“猫”,\((0, 1, 0)\) 对应于“鸡”,\((0, 0, 1)\) 对应于“狗”。

(4.1.1)\[y \in \{(1, 0, 0), (0, 1, 0), (0, 0, 1)\}.\]

4.1.1.1. 线性模型

为了估计与所有可能类别相关的条件概率,我们需要一个具有多个输出的模型,每个类别一个输出。为了用线性模型解决分类问题,我们需要的仿射函数数量与输出数量相同。严格来说,我们只需要少一个,因为最后一个类别必须是 \(1\) 与其他类别之和的差,但出于对称性的原因,我们使用一个稍微冗余的参数化。每个输出对应于其自身的仿射函数。在我们的例子中,由于我们有4个特征和3个可能的输出类别,我们需要12个标量来表示权重(带下标的 \(w\)),和3个标量来表示偏置(带下标的 \(b\))。这得到

(4.1.2)\[\begin{split}\begin{aligned} o_1 &= x_1 w_{11} + x_2 w_{12} + x_3 w_{13} + x_4 w_{14} + b_1,\\ o_2 &= x_1 w_{21} + x_2 w_{22} + x_3 w_{23} + x_4 w_{24} + b_2,\\ o_3 &= x_1 w_{31} + x_2 w_{32} + x_3 w_{33} + x_4 w_{34} + b_3. \end{aligned}\end{split}\]

相应的神经网络图如 图 4.1.1 所示。就像在线性回归中一样,我们使用一个单层神经网络。由于每个输出 \(o_1, o_2\)\(o_3\) 的计算都依赖于每个输入 \(x_1\), \(x_2\), \(x_3\), 和 \(x_4\),输出层也可以被描述为*全连接层*。

../_images/softmaxreg.svg

图 4.1.1 Softmax回归是一个单层神经网络。

为了更简洁的表示,我们使用向量和矩阵:\(\mathbf{o} = \mathbf{W} \mathbf{x} + \mathbf{b}\) 更适合数学和代码。请注意,我们已将所有权重收集到一个 \(3 \times 4\) 矩阵中,并将所有偏置 \(\mathbf{b} \in \mathbb{R}^3\) 收集到一个向量中。

4.1.1.2. Softmax函数

假设有一个合适的损失函数,我们可以直接尝试最小化 \(\mathbf{o}\) 和标签 \(\mathbf{y}\) 之间的差异。虽然事实证明,将分类视为一个向量值回归问题效果出奇地好,但它在以下方面仍然不尽人意:

  • 无法保证输出 \(o_i\) 的和为 \(1\),这不符合我们对概率的期望。

  • 无法保证输出 \(o_i\) 甚至是非负的,即使它们的和为 \(1\),也无法保证它们不超过 \(1\)

这两个方面都使得估计问题难以解决,并且解决方案对异常值非常脆弱。例如,如果我们假设卧室数量与某人购买房屋的可能性之间存在正线性依赖关系,那么在购买豪宅时,概率可能会超过 \(1\)!因此,我们需要一种机制来“压缩”输出。

我们有很多方法可以实现这个目标。例如,我们可以假设输出 \(\mathbf{o}\)\(\mathbf{y}\) 的损坏版本,损坏是通过添加从正态分布中抽取的噪声 \(\boldsymbol{\epsilon}\) 发生的。换句话说,\(\mathbf{y} = \mathbf{o} + \boldsymbol{\epsilon}\),其中 \(\epsilon_i \sim \mathcal{N}(0, \sigma^2)\)。这就是所谓的probit模型,最早由 Fechner (1860) 引入。虽然很有吸引力,但与softmax相比,它的效果不那么好,也无法导出一个特别好的优化问题。

实现这个目标(并确保非负性)的另一种方法是使用指数函数 \(P(y = i) \propto \exp o_i\)。这确实满足了条件类别概率随着 \(o_i\) 的增加而增加的要求,它是单调的,并且所有概率都是非负的。然后我们可以转换这些值,使它们的和为 \(1\),方法是将每个值除以它们的总和。这个过程称为*归一化*。将这两个部分结合起来,我们得到了*softmax*函数:

(4.1.3)\[\hat{\mathbf{y}} = \mathrm{softmax}(\mathbf{o}) \quad \textrm{其中}\quad \hat{y}_i = \frac{\exp(o_i)}{\sum_j \exp(o_j)}.\]

请注意,\(\mathbf{o}\) 的最大坐标对应于根据 \(\hat{\mathbf{y}}\) 最可能的类别。此外,因为softmax操作保留了其参数之间的顺序,我们不需要计算softmax来确定哪个类别被分配了最高概率。因此,

(4.1.4)\[\operatorname*{argmax}_j \hat y_j = \operatorname*{argmax}_j o_j.\]

softmax的思想可以追溯到 Gibbs (1902),他借鉴了物理学的思想。更早的时候,现代统计物理学之父玻尔兹曼使用这个技巧来模拟气体分子中能量状态的分布。特别是,他发现热力学系综中(如气体中的分子)某一能量状态的出现概率与 \(\exp(-E/kT)\) 成正比。这里,\(E\) 是一个状态的能量,\(T\) 是温度,\(k\) 是玻尔兹曼常数。当统计学家谈论增加或减少统计系统的“温度”时,他们指的是改变 \(T\) 以偏爱较低或较高能量状态。根据吉布斯的思想,能量等同于误差。能量 기반 모델 (Ranzato et al., 2007) 在描述深度学习问题时使用了这种观点。

4.1.1.3. 向量化

为了提高计算效率,我们在小批量数据中进行向量化计算。假设我们给定一个包含 \(n\) 个样本的小批量数据 \(\mathbf{X} \in \mathbb{R}^{n \times d}\),其维度(输入数量)为 \(d\)。此外,假设我们在输出中有 \(q\) 个类别。那么权重满足 \(\mathbf{W} \in \mathbb{R}^{d \times q}\),偏置满足 \(\mathbf{b} \in \mathbb{R}^{1\times q}\)

(4.1.5)\[\begin{split}\begin{aligned} \mathbf{O} &= \mathbf{X} \mathbf{W} + \mathbf{b}, \\ \hat{\mathbf{Y}} & = \mathrm{softmax}(\mathbf{O}). \end{aligned}\end{split}\]

这将主要操作加速为矩阵-矩阵乘积 \(\mathbf{X} \mathbf{W}\)。此外,由于 \(\mathbf{X}\) 中的每一行代表一个数据样本,softmax操作本身可以*按行*计算:对于 \(\mathbf{O}\) 的每一行,对所有条目取指数,然后通过它们的和进行归一化。不过请注意,必须小心避免对大数进行指数和对数运算,因为这可能导致数值上溢或下溢。深度学习框架会自动处理这个问题。

4.1.2. 损失函数

现在我们有了一个从特征 \(\mathbf{x}\) 到概率 \(\mathbf{\hat{y}}\) 的映射,我们需要一种方法来优化这个映射的准确性。我们将依赖于最大似然估计,这与我们在 第 3.1.3 节 中为均方误差损失提供概率 justifications 时遇到的方法完全相同。

4.1.2.1. 对数似然

softmax函数给了我们一个向量 \(\hat{\mathbf{y}}\),我们可以将其解释为给定任何输入 \(\mathbf{x}\) 时每个类别的(估计的)条件概率,例如 \(\hat{y}_1\) = \(P(y=\textrm{cat} \mid \mathbf{x})\)。在下文中,我们假设对于一个具有特征 \(\mathbf{X}\) 的数据集,标签 \(\mathbf{Y}\) 是使用独热编码标签向量表示的。我们可以通过检查给定特征下,我们的模型认为实际类别有多大的可能性来比较估计值与现实情况。

(4.1.6)\[P(\mathbf{Y} \mid \mathbf{X}) = \prod_{i=1}^n P(\mathbf{y}^{(i)} \mid \mathbf{x}^{(i)}).\]

我们之所以可以使用这种分解,是因为我们假设每个标签都是从其各自的分布 \(P(\mathbf{y}\mid\mathbf{x}^{(i)})\) 中独立抽取的。由于最大化乘积项很麻烦,我们取负对数以获得最小化负对数似然的等价问题。

(4.1.7)\[-\log P(\mathbf{Y} \mid \mathbf{X}) = \sum_{i=1}^n -\log P(\mathbf{y}^{(i)} \mid \mathbf{x}^{(i)}) = \sum_{i=1}^n l(\mathbf{y}^{(i)}, \hat{\mathbf{y}}^{(i)}),\]

其中,对于任何标签 \(\mathbf{y}\) 和模型预测 \(\hat{\mathbf{y}}\)\(q\) 个类别上的任何一对,损失函数 \(l\)

(4.1.8)\[l(\mathbf{y}, \hat{\mathbf{y}}) = - \sum_{j=1}^q y_j \log \hat{y}_j.\]

由于稍后将解释的原因,(4.1.8) 中的损失函数通常被称为*交叉熵损失*。由于 \(\mathbf{y}\) 是一个长度为 \(q\) 的独热向量,对其所有坐标 \(j\) 的求和除了一个项之外都为零。请注意,当 \(\hat{\mathbf{y}}\) 是一个概率向量时,损失 \(l(\mathbf{y}, \hat{\mathbf{y}})\) 的下界为 \(0\):没有单个条目大于 \(1\),因此它们的负对数不能低于 \(0\);只有当我们*确定地*预测实际标签时,\(l(\mathbf{y}, \hat{\mathbf{y}}) = 0\)。对于任何有限的权重设置,这永远不会发生,因为将一个softmax输出趋向于 \(1\) 需要将相应的输入 \(o_i\) 趋向于无穷大(或所有其他输出 \(o_j\) 对于 \(j \neq i\) 趋向于负无穷大)。即使我们的模型可以分配一个输出概率为 \(0\),在分配如此高的置信度时所犯的任何错误都会导致无限的损失 (\(-\log 0 = \infty\))。

4.1.2.2. Softmax和交叉熵损失

由于softmax函数和相应的交叉熵损失非常常见,所以值得更好地理解它们是如何计算的。将 (4.1.3) 代入 (4.1.8) 中损失的定义,并使用softmax的定义,我们得到

(4.1.9)\[\begin{split}\begin{aligned} l(\mathbf{y}, \hat{\mathbf{y}}) &= - \sum_{j=1}^q y_j \log \frac{\exp(o_j)}{\sum_{k=1}^q \exp(o_k)} \\ &= \sum_{j=1}^q y_j \log \sum_{k=1}^q \exp(o_k) - \sum_{j=1}^q y_j o_j \\ &= \log \sum_{k=1}^q \exp(o_k) - \sum_{j=1}^q y_j o_j. \end{aligned}\end{split}\]

为了更好地理解发生了什么,考虑关于任何logit \(o_j\) 的导数。我们得到

(4.1.10)\[\partial_{o_j} l(\mathbf{y}, \hat{\mathbf{y}}) = \frac{\exp(o_j)}{\sum_{k=1}^q \exp(o_k)} - y_j = \mathrm{softmax}(\mathbf{o})_j - y_j.\]

换句话说,导数是我们模型分配的概率(由softmax操作表示)与实际发生的情况(由独热标签向量中的元素表示)之间的差异。从这个意义上说,这与我们在回归中看到的情况非常相似,其中梯度是观测值 \(y\) 和估计值 \(\hat{y}\) 之间的差异。这并非巧合。在任何指数族模型中,对数似然的梯度都由这个项给出。这个事实使得在实践中计算梯度变得容易。

现在考虑我们不仅观察到单个结果,而是观察到结果的整个分布的情况。我们可以使用与之前相同的表示法来表示标签 \(\mathbf{y}\)。唯一的区别是,现在我们不再有一个只包含二进制条目的向量,比如 \((0, 0, 1)\),而是一个通用的概率向量,比如 \((0.1, 0.2, 0.7)\)。我们之前用来定义损失 \(l\) 的数学公式 (4.1.8) 仍然很好用,只是解释更具一般性。它是标签分布的损失期望值。这个损失被称为*交叉熵损失*,它是分类问题中最常用的损失之一。我们可以通过引入信息论的基础知识来揭开这个名字的神秘面纱。简而言之,它衡量了编码我们所看到的 \(\mathbf{y}\) 所需的位数,相对于我们预测应该发生的 \(\hat{\mathbf{y}}\)。我们在下面提供一个非常基本的解释。有关信息论的更多细节,请参见 Cover and Thomas (1999)MacKay (2003)

4.1.3. 信息论基础

许多深度学习论文使用信息论的直觉和术语。为了理解它们,我们需要一些共同的语言。这是一个生存指南。*信息论*处理编码、解码、传输和处理信息(也称为数据)的问题。

4.1.3.1.

信息论的核心思想是量化数据中包含的信息量。这对我们压缩数据的能力设定了限制。对于一个分布 \(P\),其*熵* \(H[P]\) 定义为

(4.1.11)\[H[P] = \sum_j - P(j) \log P(j).\]

信息论的一个基本定理指出,为了编码从分布 \(P\) 中随机抽取的数据,我们至少需要 \(H[P]\) “奈特(nats)”来编码它 (Shannon, 1948)。如果你想知道“奈特”是什么,它相当于比特,但是使用以 \(e\) 为底的编码,而不是以2为底的编码。因此,1奈特约等于 \(\frac{1}{\log(2)} \approx 1.44\) 比特。

4.1.3.2. 惊奇度

你可能想知道压缩与预测有什么关系。想象一下,我们有一串数据想要压缩。如果我们总是能轻易预测下一个符号,那么这些数据就很容易压缩。举个极端的例子,如果数据流中的每个符号总是取相同的值。那是一个非常无聊的数据流!它不仅无聊,而且很容易预测。因为符号总是一样的,我们不需要传输任何信息来传达数据流的内容。易于预测,易于压缩。

然而,如果我们不能完美地预测每个事件,那么我们有时可能会感到惊讶。当一个事件被赋予较低的概率时,我们的惊讶程度就更大。克劳德·香农确定用 \(\log \frac{1}{P(j)} = -\log P(j)\) 来量化观察到事件 \(j\) 时的*惊奇度*,这个事件被赋予了(主观的)概率 \(P(j)\)。在 (4.1.11) 中定义的熵就是当一个人分配了真正匹配数据生成过程的正确概率时的*期望惊奇度*。

4.1.3.3. 再探交叉熵

那么,如果熵是知道真实概率的人所经历的惊讶程度,你可能会想,什么是交叉熵?*从* \(P\) *到* \(Q\) 的交叉熵,记为 \(H(P, Q)\),是一个具有主观概率 \(Q\) 的观察者在看到实际上是根据概率 \(P\) 生成的数据时所经历的期望惊奇度。它由 \(H(P, Q) \stackrel{\textrm{def}}{=} \sum_j - P(j) \log Q(j)\) 给出。当 \(P=Q\) 时,可以达到最低可能的交叉熵。在这种情况下,从 \(P\)\(Q\) 的交叉熵是 \(H(P, P)= H(P)\)

简而言之,我们可以从两个方面来考虑交叉熵分类目标:(i) 最大化观测数据的似然;(ii) 最小化我们传达标签所需的惊奇度(以及比特数)。

4.1.4. 总结与讨论

在本节中,我们遇到了第一个非平凡的损失函数,它允许我们对*离散*输出空间进行优化。其设计的关键在于我们采用了一种概率方法,将离散类别视为从概率分布中抽取的实例。作为副作用,我们遇到了softmax,这是一个方便的激活函数,可以将普通神经网络层的输出转换为有效的离散概率分布。我们看到,当与softmax结合时,交叉熵损失的导数与平方误差的导数非常相似;即通过取期望行为与其预测之间的差异。而且,虽然我们只触及了皮毛,但我们遇到了与统计物理和信息论的激动人心的联系。

虽然这足以让你上路,并希望能激发你的兴趣,但我们在这里几乎没有深入探讨。除其他外,我们跳过了计算方面的考虑。具体来说,对于任何具有 \(d\) 个输入和 \(q\) 个输出的全连接层,其参数化和计算成本为 \(\mathcal{O}(dq)\),这在实践中可能会高得令人望而却步。幸运的是,将 \(d\) 个输入转换为 \(q\) 个输出的成本可以通过近似和压缩来降低。例如,Deep Fried Convnets (Yang et al., 2015) 使用置换、傅里叶变换和缩放的组合将成本从二次降低到对数线性。类似的技术也适用于更高级的结构化矩阵近似 (Sindhwani et al., 2015)。最后,我们可以使用类四元数分解将成本降低到 \(\mathcal{O}(\frac{dq}{n})\),同样,如果我们愿意用少量精度换取计算和存储成本 (Zhang et al., 2021),这基于一个压缩因子 \(n\)。这是一个活跃的研究领域。使其具有挑战性的是,我们不一定追求最紧凑的表示或最少的浮点运算,而是追求在现代GPU上能最有效执行的解决方案。

4.1.5. 练习

  1. 我们可以更深入地探讨指数族和softmax之间的联系。

    1. 计算softmax的交叉熵损失 \(l(\mathbf{y},\hat{\mathbf{y}})\) 的二阶导数。

    2. 计算由 \(\mathrm{softmax}(\mathbf{o})\) 给出的分布的方差,并证明它与上面计算的二阶导数相匹配。

  2. 假设我们有三个类别,它们以相等的概率出现,即概率向量为 \((\frac{1}{3}, \frac{1}{3}, \frac{1}{3})\)

    1. 如果我们试图为其设计一个二进制代码,问题出在哪里?

    2. 你能设计一个更好的代码吗?提示:如果我们试图编码两个独立的观察结果会发生什么?如果我们联合编码 \(n\) 个观察结果呢?

  3. 在编码通过物理线路传输的信号时,工程师并不总是使用二进制代码。例如,PAM-3 使用三个信号电平 \(\{-1, 0, 1\}\),而不是两个电平 \(\{0, 1\}\)。你需要多少个三进制单位来传输一个在 \(\{0, \ldots, 7\}\) 范围内的整数?为什么这在电子学方面可能是个更好的主意?

  4. Bradley–Terry模型使用逻辑模型来捕捉偏好。对于一个用户在苹果和橙子之间做出选择,我们假设有分数 \(o_{\textrm{apple}}\)\(o_{\textrm{orange}}\)。我们的要求是,更高的分数应该导致选择相关项目的可能性更高,并且得分最高的项目是最有可能被选择的 (Bradley and Terry, 1952)

    1. 证明softmax满足这个要求。

    2. 如果你想允许一个既不选苹果也不选橙子的默认选项,会发生什么?提示:现在用户有三个选择。

  5. Softmax的名字来源于以下映射:\(\textrm{RealSoftMax}(a, b) = \log (\exp(a) + \exp(b))\)

    1. 证明 \(\textrm{RealSoftMax}(a, b) > \mathrm{max}(a, b)\)

    2. 你能使这两个函数之间的差异变得多小?提示:不失一般性,你可以设置 \(b = 0\)\(a \geq b\)

    3. 证明对于 \(\lambda^{-1} \textrm{RealSoftMax}(\lambda a, \lambda b)\),只要 \(\lambda > 0\),这个结论仍然成立。

    4. 证明当 \(\lambda \to \infty\) 时,我们有 \(\lambda^{-1} \textrm{RealSoftMax}(\lambda a, \lambda b) \to \mathrm{max}(a, b)\)

    5. 构造一个类似的softmin函数。

    6. 将其扩展到两个以上的数字。

  6. 函数 \(g(\mathbf{x}) \stackrel{\textrm{def}}{=} \log \sum_i \exp x_i\) 有时也被称为log-配分函数

    1. 证明该函数是凸的。提示:为此,使用一阶导数相当于softmax函数的概率,并证明二阶导数是方差。

    2. 证明 \(g\) 是平移不变的,即 \(g(\mathbf{x} + b) = g(\mathbf{x})\)

    3. 如果某些坐标 \(x_i\) 非常大,会发生什么?如果它们都非常小,会发生什么?

    4. 证明如果我们选择 \(b = \mathrm{max}_i x_i\),我们会得到一个数值稳定的实现。

  7. 假设我们有一些概率分布 \(P\)。假设我们选择另一个分布 \(Q\),其中 \(Q(i) \propto P(i)^\alpha\)\(\alpha > 0\)

    1. \(\alpha\) 的哪种选择对应于将温度加倍?哪种选择对应于将其减半?

    2. 如果我们让温度接近 \(0\) 会发生什么?

    3. 如果我们让温度接近 \(\infty\) 会发生什么?

讨论