Lec2.2 Softmax Regression(1)

我们会快速地浏览这些内容。如果你之前没有接触过这些主题,这可能会太快了。但是我想要做的是强调softmax回归是如何展现这三个要素的。

实际上,你可以对任何算法做相同的事情,但我们将使用softmax回归作为例子,然后在下一节课中转到基本神经网络。在我定义softmax回归的这三个要素之前,我想先从我们的基本设置开始。


Muti-class classification setting

我们现在要讨论的是Muti-class classification,特别是一个kk类分类问题。

​ 我们在这个问题中有训练数据,输入到我们的系统中的向量是x(i)x^{(i)},符号x(i)Rnx^{(i)} \in R^n表明这是一个nn维向量,其元素是实数。因此,每个x(i)x^{(i)}看起来会像这样

x(i)=[x1(i)x2(i)..xn(i)]x^{(i )}=\begin{bmatrix} x_1^{(i )}\\ x_2^{(i )}\\ .\\ .\\ x_n ^{(i )}\\ \end{bmatrix}
  • x(i)x^{(i)}的每个元素值表示了图像中不同像素的强度值。

  • ii 是训练集的索引值

我们接下来需要的是输出或我们算法的期望输出。这也被称为目标或输出,或者称为多个不同的名称。这些输出y(i)y^{(i)}是标量量,实际上它们是离散值,范围从1到kk,其中kk是我们的类数。最后,ii在训练集中进行索引。

这个符号我将在本课程中保持一致。这些符号的重要性在于,它们将影响到我们所关心的向量的维数。

在本课程中,

  • nn将表示输入数据的维数

  • kk将是类的数量,表示我们正在尝试预测多少个输出或有多少个不同的类的输出

  • mm将是训练集的大小,我们在训练数据中有多少样本。

在MNIST数字分类问题的情况下,

  1. nn等于784。因为在这种情况下,我们的数字实际上是表示为28x28像素的网格。每个位置,每个像素位置都有灰度标量值。它实际上范围是从零到一。这就是我们如何表示图像的方式。因此,我们的图像有784个维度。

  2. 在这个例子中有10个类,因为我们有10个不同的类别,我们试图将每个数字归类为这些类别中的一个。即数字0到9。

  3. 最后,在这种情况下,训练集中有60,000个样本。

对于MNIST,nnkkmm取这些值。但是对于其他问题,它们将取决于不同的值。


Linear hypothesis function

好的,现在让我们谈一谈关于 k 维分类时所考虑的假设函数,特别是我们将讨论 softmax 回归所使用的线性假设类。

首先,更一般地讲,假设函数是我们机器学习程序的第一要素,它是一个将 Rn\mathbb{R}^n 中的向量映射到 Rk\mathbb{R}^k 中的实向量的函数。这些 Rn\mathbb{R}^n维向量是我们的输入,而 Rk\mathbb{R}^k 维向量是我们的输出,其中 k 是类的数量。在分类问题中,我们的输出不是离散的类,而是一个 k 维向量,

h(x)=[h1(x)h2(x).hi(x).hk(x)]h(x)=\begin{bmatrix} h_1(x)\\ h_2(x)\\ .\\ h_i(x)\\ .\\ h_k(x) \end{bmatrix}

其第 i 个元素表示类 i 的可能性。但需要注意的是,这些可能性并不是概率,我们将在下面讨论概率解释。

在线性假设类的情况下,hθ(x)=θTxh_\theta(x)=\theta^Tx ,其中 θ\theta 是一个 nnkk 列的矩阵,将 nn 维输入映射到 kk维输出。

简而言之,这个假设函数是一种从输入到输出的映射函数,其输出是一个向量,表示每个类的可能性,线性假设函数则是其中一种特殊的实例化形式。


Matrix batch notation

在我们进入第二个要素---损失函数之前,我们想简单地谈一下矩阵批量表示法。

在许多情况下,我们将许多样本一次性输入到假设函数中会更加方便,而不是仅考虑单个样本。我们可以使用矩阵表示法来表示这些操作。实际上,这不仅是一种数学上的美学,也是在实现这些操作时非常重要的,因为矩阵运算比执行许多向量运算更有效率。因此,在代码中实现这些操作时,矩阵批量表示法不仅是一种优雅的表示方法,而且还是一种更加高效的实现方式。

我们定义一个批量矩阵 XX,它是一个 m×nm \times n 的矩阵,其中 mm 是样本的数量,nn 是输入的维度。该矩阵是我们训练集中所有样本的堆叠。

同样地,我们可以将输出目标的所有值堆叠成一个mm 维向量 yy

需要注意的是这里,假设函数的输入依然是

x(i)=[x1(i)x2(i)..xn(i)]x^{(i )}=\begin{bmatrix} x_1^{(i )}\\ x_2^{(i )}\\ .\\ .\\ x_n ^{(i )}\\ \end{bmatrix}

ii表示训练集里的批量索引

但是假设函数的输出就是yiy^{i},而不是前面的k维向量(这是因为在描述一种更普遍的情况),所以yy是一个m维向量,而不是n×kn \times k矩阵

使用这种表示法,我们可以将假设函数应用于整个批次。现在用hθ(X)h_\theta(X)表示将假设函数应用于所有训练集中的示例。可以写成如下的形式。

hθ(X)=[hθ(x(1))..hθ(x(m))]h_\theta(X)=\begin{bmatrix} -h_\theta(x^{(1)})-\\ .\\ .\\ -h_\theta(x^{(m)})-\\ \end{bmatrix}

这种表示方法的好处是,我们可以找到非常高效的方法来编写这些看似复杂的表达式,例如将假设函数应用于数据集中的每个元素。运算的这些操作简洁地表示为

hθ(X)=Xθh_\theta(X)=X\theta

这是一种非常高效的表示方法。


Loss function #1: classification error

现在我们来谈谈 softmax 回归算法的第二个要素,即损失函数

我们如何评估我们的预测质量呢?

最明显的方法是,既然这是一个分类问题,我们可以根据预测结果是否正确来衡量。这就是所谓的分类器误差(the error of the classifier)。这是一种非常简单,也非常直观的损失函数。

具体来说,如果我们的预测结果中最大的值对应于正确的类别,我们的损失就是 0,否则就是 1。形式上来说,我们可以这样定义损失函数:

Li={0,if argmaxihi(x)=y1,otherwiseL_i = \begin{cases} 0, & \text{if } \operatorname{argmax}_i h_i(x) = y \\ 1, & \text{otherwise} \end{cases}

如果最大值的索引(即具有最大值的 hi(x)h_i(x) 对应的索引)等于 yy,则损失为 00,否则为 11

m个样本的数据集的损失函数平均值就是

L^=1mi=1mLi\hat L=\frac{1}{m } \sum_{i=1}^{m} L_i

另外分类器的准确率为

accuracy=1Laccuracy=1-L

最终我们希望在我们的假设函数将输入从 RnR^n 映射到 RkR^k 的情况下,hi(x)h_i(x) 的值在真实类别 yy 上最大。

这是一种非常直观的损失函数,但是它对于优化来说非常糟糕

我们很难找到一组参数,使误差损失最小化。即使是对于线性分类器,找到一个能够实现最小错误数的分类器也是 NPhardNP-hard 问题。但更根本的是,这种损失函数并没有提供任何信息。它不是可微分的。这意味着如果我们稍微改变假设,这种损失通常不会改变。因为您可能没有准确预测交换点的情况,即从一个状态切换到另一个状态。即使你处于交换点,也会是一个不可微分的点,因为它会立即在 0/1 损失之间来回切换。

这对于优化参数非常不利。因为在深度学习中,优化参数的最常见方式是基于梯度的方法,即基于导数的方法。

因此,这种损失函数尽管可能对于量化分类器性能很好,但非常不适合用于优化参数。


Loss function #2: softmax/cross-entropy loss

现在来看另一个不同的损失函数,称为softmax交叉熵损失

交叉熵损失已经成为大多数机器学习中的标准术语。因此,事实上,我们将定义它为交叉熵损失。为了定义这个损失,我们需要将我们假设函数的输出转换成概率的形式。

我们将通过定义分类的标签(label)等于i的概率来实现这一点,称之为 ziz_i

一个概率必须是正的并且总和为一。我们的假设输出hih_i不是正的,它也可能是负数,并且总和不一定为一。那么我们该如何使其且为正数呢?

  • 首先,我们可以将hih_i指数化。这将使其为正数。因为指数化任何数,正数或负数,结果总是正数。但是它们不总是总和为一,所以这解决了第一个问题(概率为正数)但并没有解决第二个问题(概率总和为一)。

  • 接下来 ,我们然后通过所有指数化假设的总和进行归一化,这就解决了概率总和为一的问题

现在,这个量实际上遵守了概率的基本原则。它是正数的,而所有标签的所有概率总和始终等于一。

zi=ehijehjz_i = \frac{e^{h_i}}{\sum_j e^{h_j}}

另一种写法是,在向量形式中表达,即z\boldsymbol{z},所有概率的向量是规范化函数,这意味着我们将指数函数应用于每个元素。因此,规范化实际上更为复杂,因为它考虑整个向量。但是,所有这个规范化函数所做的事情就是将向量归一化为总和为一

z=exp(h)exp(h)1\boldsymbol{z} = \frac{\mathrm{exp}(\boldsymbol{h})}{\|\mathrm{exp}(\boldsymbol{h})\|_1}

我们将在softmax回归中的损失函数(也称为交叉熵损失)使用ziz_i

好的,现在我们已经从任意假设输出中映射出一个概率,我们需要一种方法来量化我们的概率是否良好,即我们的概率向量是否是一组好的预测。这现在是相当明显的,我们可能会做什么,衡量我们预测的好坏的一个好方法是真实类别的概率是否较高。

那么,在这个表示法下,标签是真实目标yy的概率是多少?我们希望使这个概率尽可能大,但出于惯例原因,我们通常认为损失函数是我们想要最小化的东西。因此,我们想让一些误差变小。我们可以最小化负概率,但实际上,由于各种原因,最小化概率在数值上的条件不是很好。所以我们通常采用对数形式。这是非常常见的,被称为负对数损失,或者是定义损失函数的一种常见方式,我们将定义交叉熵损失函数为真实类别yy的概率的负对数。我们可以更具体地写出这个公式,

L(h(x),y)=hy(x)+log(j=1kexp(hj(x)))L(h(x),y) = -h_y(x) + \log\left(\sum_{j=1}^k \exp(h_j(x))\right)

这被称为交叉熵损失,有时也称为softmax损失或多类logistic损失,但它们实际上是相同的。

如今,在机器学习中,交叉熵损失是最常用的名称。这就是我们如何定义要在softmax回归中使用的损失函数。


  • 注意点

正确的方法是将损失函数应用于线性假设类,而不是先应用softmax函数将logits转换为概率分布

这两种区别举例子如下

假设我们正在解决一个多分类问题,有3个类别,例如预测水果的类型:苹果、香蕉和橙子。我们的模型首先输出一个线性分数,例如:[2, 1, -1],这些线性分数也被称为logits。

一种方法是首先对这些logits应用softmax操作以获得概率分布,如下所示:

  1. Softmax function:

softmax(x)i=exp(xi)j=13exp(xj)\text{softmax}(x)_i = \frac{\exp(x_i)}{\sum_{j=1}^3 \exp(x_j)}

计算后,我们得到:[0.6652, 0.2447, 0.0900]。接着我们使用交叉熵损失函数来计算模型的损失值。

更好的方法是将损失函数(交叉熵损失)直接应用于线性假设类(logits)。这意味着,我们不需要首先计算概率分布,而是直接将交叉熵损失函数应用于logits:[2, 1, -1]。

  1. Cross-entropy loss function:

L(y,x)=hy(x)+log(j=1kexp(hj(x)))L(y, x) = -h_y(x) + \log\left(\sum_{j=1}^k \exp(h_j(x))\right)

假设真实类别是香蕉(对应的one-hot标签为[0, 1, 0]),我们将会得到一个损失值,该值将指导我们的模型在训练过程中进行参数更新。

其实就是把softmax()函数用于x和h(x)的区别

至于为什么注意,原因如下:

  1. 凸性:应用损失函数于线性假设类有助于更容易地观察到问题的凸性属性。softmax回归最终会成为一个凸优化问题,这意味着存在一个全局最小值,而且梯度下降等优化算法更容易收敛。

    凸优化问题是指优化目标函数是凸函数的一类优化问题。其中,凸函数是指具有以下两个性质的实值函数:

    1. 函数定义域内的任意两个点之间的线段上的函数值不大于线段端点的函数值之和(即函数值随线性组合而不降)

    2. 函数值在定义域内存在下确界

    凸优化问题具有很好的性质,如全局最优解唯一等,而且现代优化算法(如梯度下降、牛顿法等)在凸优化问题上的收敛性通常较好

  2. 数值稳定性:直接执行softmax操作可能会导致数值不稳定。如果概率值接近于零,对其取对数可能会导致数值爆炸。

Last updated