动手学人工智能-线性神经网络4-Softmax回归

367 阅读2分钟

在前面几篇文章中,我们探索了 线性回归 的基础知识、从零开始的实现方法以及通过深度学习框架简洁实现的途径。线性回归主要用于解决回归问题,即 “预测多少” 的问题,例如预测房屋价格或患者的住院天数。

然而,在实际应用中,我们同样关心 分类问题 ,即 “属于哪一个” 的问题。比如,判断一封电子邮件是否为垃圾邮件,预测用户是否会订阅服务,或者识别图片中的动物是猫、狗、还是其他。

在机器学习中,分类问题可以进一步细分为“硬性”类别分类和“软性”概率分类。前者关注样本所属的具体类别,后者则试图估计每个类别的概率分布。即使在硬分类问题中,我们也常通过软分类模型获得类别概率,从而提升分类的精确度。

本节将介绍 Softmax回归,一种经典的多分类方法,通过构建概率分布来预测样本的类别归属,为多类别分类任务提供有力支持。

1. 分类问题

在机器学习中,分类任务是通过判断样本属于哪一个类别来完成的。我们首先用一个图像分类问题来引出这一概念:假设我们有一个灰度图像,每个图像像素值为一个标量,图像可以属于“猫”、“狗”或“鸡”三个类别之一。

为了表示图像所属的类别,我们使用 独热编码(one-hot encoding) 方式。例如,如果一张图像是“猫”,它的标签可以表示为 [1,0,0]\begin{bmatrix}1, 0, 0\end{bmatrix},表示类别“猫”;如果是“鸡”,标签则为 [0,1,0]\begin{bmatrix}0, 1, 0\end{bmatrix}

2. 网络架构

在Softmax回归中,模型输出一个向量,每个向量的元素表示该样本属于某个类别的概率。假设我们有 nn 个输入特征和 mm 个输出类别,那么我们需要构建一个具有 n×mn \times m 个权重的 全连接层

全连接层(Fully Connected Layer,简称FC层) 是神经网络中的一种基本层类型,也是前馈神经网络(Feedforward Neural Network)中常见的构成单元。

全连接层的特点是:其输入和输出之间的每一个节点都是全连接的,即输入层的每个节点都与输出层的每个节点有一个独立的权重相连。

计算方式可以表示为:

y=XW+by = XW + b

这里,XX 表示输入数据矩阵,WW 为权重矩阵,bb 为偏置向量。

3. 全连接层的参数开销

在全连接层中,模型每个输入特征都与每个输出类别关联,这会增加参数数量。如果输入和输出层次较高,参数的开销也会随之增加。

参数开销公式:

Parameter Cost=n×m+m=m×(n+1)\text{Parameter Cost} = n \times m + m = m \times (n + 1)

对于一个全连接层,参数总数包括权重参数和偏置参数:

  • nn 表示输入神经元的数量(输入特征的维度)。
  • mm 表示输出神经元的数量(输出特征的维度)。
  • 权重参数:因为输入层的每个神经元都和输出层的每个神经元相连,所以有 n×mn×m 个权重。
  • 偏置参数:每个输出神经元有一个偏置,所以有 mm 个偏置。

4. Softmax运算

为了确保模型输出可以解释为概率分布,我们引入了Softmax函数,它将未规范化的预测值变换为非负数,且总和为 1。

Softmax 函数定义如下:

σ(z)j=ezjk=1Kezk\sigma(z)_j = \frac{e^{z_j}}{\sum_{k=1}^K e^{z_k}}

通过这个公式,我们可以获得每个类别的概率分布。

让我们来用简单的方式理解一下 Softmax 运算。

  • 输入数据:假设我们有一个数列,比如 [2,1,0.5][2, 1, 0.5]。这个数列代表了不同类别的分数或“信心值”,通常叫做“原始得分”。

  • 指数运算:为了处理这些得分,我们会先对它们做指数运算。也就是说,把每个数都放在指数的“幂”上(e 的幂)。这样做是因为指数可以把所有值变成正数,同时能放大数值间的差异。

    举例来说,原始得分 [2,1,0.5][2, 1, 0.5] 变成了:

    [𝑒2,𝑒1,𝑒0.5][𝑒^2, 𝑒^1, 𝑒^{0.5}]

    假设 𝑒2.718𝑒≈2.718 ,计算后我们得到 [7.39,2.72,1.65][7.39, 2.72, 1.65]

  • 求和:接下来,我们把这些指数值加起来,得到一个总和。上面的结果中,7.39+2.72+1.65=11.767.39 + 2.72 + 1.65 = 11.76

  • 归一化:然后,我们把每个指数值除以这个总和,这就是“归一化”。这个步骤是为了让每个结果都在 0 和 1 之间,并且所有结果加起来等于 1,方便我们理解为“概率”。

    • 第一个值变成 7.3911.760.63\frac{7.39}{11.76}≈0.63
    • 第二个值变成 2.7211.760.23\frac{2.72}{11.76}≈0.23
    • 第三个值变成 1.6511.760.14\frac{1.65}{11.76}≈0.14
  • 输出结果:最后的结果 [0.63,0.23,0.14][0.63, 0.23, 0.14] 就是每个类别的概率。这个输出表示第一个类别的概率最高,约为 63%,第二和第三个类别的概率相对较低。

总结来说,Softmax 是一种将任意分数转换为概率的方式,让我们可以清楚地知道每个类别的可能性大小。

5. 小批量样本的矢量化

在计算Softmax时,我们通常使用小批量样本以提升计算效率。在批量计算中,每个批量的特征为矩阵 XX,权重为矩阵 WW,偏置为向量 bb

矢量化Softmax公式:

Y=softmax(XW+b)Y = \text{softmax}(XW + b)

6. 损失函数

在Softmax回归中,我们使用交叉熵损失函数来度量模型的预测效果。交叉熵损失函数公式为:

L(y,y^)=i=1nyilog(y^i)\mathcal{L}(y, \hat{y}) = -\sum_{i=1}^n y_i \log(\hat{y}_i)

其中,yy 表示真实标签,y^\hat{y} 表示预测概率。

通过例子来理解

假设我们在做二分类问题,比如判断一张图片是“猫”还是“狗”。

我们用两个标签来表示:猫 = [1, 0]狗 = [0, 1],其中 [1,0][1, 0] 表示图片是真实的“猫”,而 [0,1][0, 1] 表示图片是真实的“狗”。

示例1:模型准确预测“猫”

假如模型的预测概率为 [0.9, 0.1],即模型认为这张图片是猫的概率为90%,是狗的概率为10%。实际标签是 [1, 0],表示图片确实是猫。交叉熵计算如下:

CrossEntropy=(1log(0.9)+0log(0.1))=log(0.9)0.105\text{CrossEntropy} = -\left(1 \cdot \log(0.9) + 0 \cdot \log(0.1)\right) = -\log(0.9) \approx 0.105
示例2:模型错误预测为“狗”

如果模型预测图片是“狗”的概率为 [0.2, 0.8],即它认为是狗的概率为80%。实际标签还是 [1, 0],交叉熵计算为:

CrossEntropy=(1log(0.2)+0log(0.8))=log(0.2)1.609\text{CrossEntropy} = -\left(1 \cdot \log(0.2) + 0 \cdot \log(0.8)\right) = -\log(0.2) \approx 1.609

可以看到,当模型预测结果偏差越大时,交叉熵的值越高。这是因为我们希望模型的预测与实际标签一致,交叉熵损失值越小越好。

6.1 对数似然

在交叉熵损失中,我们使用对数似然估计。对数似然公式如下:

Log Likelihood=log(P(ymodel))\text{Log Likelihood} = \log(P(y|\text{model}))

假设你是一家餐馆老板,想预测顾客来点餐的概率。根据过去的数据,你发现通常有80%的顾客会点披萨,而20%会点沙拉。

现在,有一位新顾客走进来,你想知道这位顾客点披萨的概率。假设这个顾客真的点了披萨,那么 似然(likelihood) 就是你给实际结果分配的概率:点披萨的概率是0.8。

但是概率很小的数相乘容易变得很小,不方便计算。因此,我们引入了对数似然(log-likelihood)。对数似然就是将似然取对数:

对数似然=log(0.8)0.22\text{对数似然} = \log(0.8) \approx -0.22

这样做的好处是,把小概率相乘的结果“放大”一点,方便进行计算,并且能保持概率的相对大小。对数似然值越高,说明模型预测的效果越好。

6.2 Softmax及其导数

Softmax的导数帮助我们优化模型。导数公式为:

σ(z)jzk=σ(z)j(δjkσ(z)k)\frac{\partial \sigma(z)_j}{\partial z_k} = \sigma(z)_j (\delta_{jk} - \sigma(z)_k)

理解Softmax的导数时,可以从其主要功能入手:Softmax将一组得分(通常是神经网络输出的非概率值)转换为概率分布。这些概率描述每个类别的相对可能性。那么Softmax的导数描述的就是,当我们改变一个得分时,其对应的概率会发生怎样的变化

Softmax导数的直观理解

假设有三个类别的得分 [2,3,5][2, 3, 5],我们先用Softmax计算它们的概率分布,然后思考如果其中一个得分发生微小变化,概率分布会如何变化。

  1. 导数的目标:Softmax的导数用于告诉我们每个分数的变化对最终概率的影响。比如,当第一个分数增加时,它自己的概率会增加,其他类别的概率可能会略微减少。
  2. 示例:如果我们稍微增加类别1的得分,比如从2增加到2.1,会导致类别1的概率升高,而类别2和类别3的概率会略微下降。这是因为Softmax会重新分配概率,总和依然是1。
  3. 数学直观
    • 对于类别 ii 的导数,有两种情况:
      • 𝑖=j𝑖=j 时:增加某个类别的得分时,其对应概率的变化比其他类别更大。
      • iji≠j 时:增加一个类别的得分会导致其他类别的概率略微减少,因为总概率固定为1。

导数公式总结为:

Softmax(z)izj=Softmax(z)i(δijSoftmax(z)j)\frac{\partial \text{Softmax}(z)_i}{\partial z_j} = \text{Softmax}(z)_i \cdot (\delta_{ij} - \text{Softmax}(z)_j)

其中,δij\delta_{ij} 表示克罗内克 δ 函数,用来区分当 𝑖=𝑗𝑖=𝑗𝑖𝑗𝑖≠𝑗 的情况。

7. 信息论基础

在信息论中,我们使用熵(Entropy)来衡量不确定性,公式为:

H(p)=i=1np(xi)logp(xi)H(p) = - \sum_{i=1}^n p(x_i) \log p(x_i)
  • H(p)H(p):表示熵(Entropy),它是对随机变量不确定性的度量,用来表示我们对结果可能性的不确定程度。
  • p(xi)p(x_i):这是事件 xix_i 发生的概率,描述的是每一个可能结果的概率。如果某个事件的概率高,代表我们对其发生更有把握;相反,低概率意味着更大的不确定性。
  • logp(xi)\log p(x_i):这是 xix_i 的概率的对数,描述的是事件发生带来的“惊异”程度。低概率事件会导致较高的惊异值,而高概率事件带来的惊异较小。使用对数函数有助于将小概率事件与高概率事件区分开来。
  • i=1n- \sum_{i=1}^n:对所有可能的事件 xix_i 进行求和。负号用于保证熵值为正,因为对数的结果是负数(对数小于 1 的值为负)。最终,整个和式表示的是对所有事件的“平均惊异程度”。

熵是信息论中的一个重要概念,它用于衡量数据的“信息不确定性”或“信息量”。简单来说,熵越高,数据的随机性越大,信息的“惊喜”程度也越高;而熵越低,数据的确定性越大,信息也就越少。

8. 重新审视交叉熵

交叉熵可以理解为两种概率分布之间的 “惊异程度差异”。如果我们知道数据的真实分布(称为 𝑝𝑝)与模型预测的分布(称为 𝑞𝑞),交叉熵的作用就是衡量“用模型预测的分布 𝑞𝑞 来解释真实分布 𝑝𝑝 时的惊异程度”。

  • 熵的含义:熵是一个人知道真实概率分布 𝑝𝑝 时,对结果不确定性的度量——也就是对真实情况的“惊异程度”。
  • 交叉熵的含义:交叉熵则是当我们用一个主观的预测分布 𝑞𝑞 去解释实际分布 𝑝𝑝 时,预期的“惊异程度”。如果 𝑞𝑞𝑝𝑝 很接近,那么惊异程度较低,交叉熵也低;如果 𝑞𝑞 偏离 𝑝𝑝,惊异程度增加,交叉熵随之升高。

示例理解

假设一个天气预报系统预测明天“下雨”或“晴天”的概率分布:

  • 实际情况 𝑝𝑝:90% 下雨,10% 晴天。
  • 模型预测 𝑞𝑞:80% 晴天,20% 下雨。

如果我们用 𝑞𝑞 去描述真实情况 𝑝𝑝,我们会对预测出现更大的惊异(即交叉熵会更高),因为预测严重偏离了实际情况。这就好比是在说,“如果我们误以为晴天是更可能的情况,我们看到下雨时就会更加惊讶。”

交叉熵的目的是衡量预测模型 𝑞𝑞 与真实情况 𝑝𝑝 之间的差距,并优化模型,使得这种惊异(或不确定性)最小。