【d2l.ai】线性神经网络
2inc

线性回归

随机梯度下降

即使在我们无法得到解析解的情况下,我们仍然可以有效地训练模型。在许多任务上,那些难以优化的模型效果要更好。因此,弄清楚如何训练这些难以优化的模型是非常重要的。
本书中我们用到一种名为梯度下降(gradient descent)的方法,这种方法几乎可以优化所有深度学习模型。它通过不断地在损失函数递减的方向上更新参数来降低误差。
梯度下降最简单的用法是计算损失函数(数据集中所有样本的损失均值)关于模型参数的导数(在这里也可以称为梯度)。但实际中的执行可能会非常慢:因为在每一次更新参数之前,我们必须遍历整个数据集。因此,我们通常会在每次需要计算更新的时候随机抽取一小批样本,这种变体叫做小批量随机梯度下降(minibatch stochastic gradient descent)。
在每次迭代中,我们首先随机抽样一个小批量,它是由固定数量的训练样本组成的。然后,我们计算小批量的平均损失关于模型参数的导数(也可以称为梯度)。最后,我们将梯度乘以一个预先确定的正数,并从当前参数的值中减掉。
我们用下面的数学公式来表示这一更新过程(表示偏导数):

总结一下,算法的步骤如下:
(1)初始化模型参数的值,如随机初始化;
(2)从数据集中随机抽取小批量样本且在负梯度的方向上更新参数,并不断迭代这一步骤。对于平方损失和仿射变换,我们可以明确地写成如下形式:

公式中的都是向量。
在这里,更优雅的向量表示法比系数表示法(如)更具可读性。表示每个小批量中的样本数,这也称为批量大小(batch size)。表示学习率(learning rate)。批量大小和学习率的值通常是手动预先指定,而不是通过模型训练得到的。这些可以调整但不在训练过程中更新的参数称为超参数(hyperparameter)。调参(hyperparameter tuning)是选择超参数的过程。超参数通常是我们根据训练迭代结果来调整的,而训练迭代结果是在独立的验证数据集(validation dataset)上评估得到的。

在训练了预先确定的若干迭代次数后(或者直到满足某些其他停止条件后),我们记录下模型参数的估计值,表示为。但是,即使我们的函数确实是线性的且无噪声,这些估计值也不会使损失函数真正地达到最小值。因为算法会使得损失向最小值缓慢收敛,但却不能在有限的步数内非常精确地达到最小值。

线性回归恰好是一个在整个域中只有一个最小值的学习问题。但是对像深度神经网络这样复杂的模型来说,损失平面上通常包含多个最小值。深度学习实践者很少会去花费大力气寻找这样一组参数,使得在训练集上的损失达到最小。事实上,更难做到的是找到一组参数,这组参数能够在我们从未见过的数据上实现较低的损失,这一挑战被称为泛化(generalization)。

softmax 回归

虽然叫做回归,但其实是分类问题

统计学家很早以前就发明了一种表示分类数据的简单方法:独热编码(one-hot encoding)。独热编码是一个向量,它的分量和类别一样多。类别对应的分量设置为1,其他所有分量设置为0。在我们的例子中,标签 将是一个三维向量,其中 对应于“猫”、 对应于“鸡”、 对应于“狗”:

为了估计所有可能类别的条件概率,我们需要一个有多个输出的模型,每个类别对应一个输出。
为了解决线性模型的分类问题,我们需要和输出一样多的仿射函数(affine function)。
每个输出对应于它自己的仿射函数。
在我们的例子中,由于我们有4个特征和3个可能的输出类别,
我们将需要12个标量来表示权重(带下标的),
3个标量来表示偏置(带下标的)。
下面我们为每个输入计算三个未规范化的预测(logit):

与线性回归一样,softmax 回归也是一个单层神经网络。由于计算每个输出 取决于所有输入 ,所以 softmax 回归的输出层也是全连接层。
为了更简洁地表达模型,我们仍然使用线性代数符号。通过向量形式表达为 ,这是一种更适合数学和编写代码的形式。由此,我们已经将所有权重放到一个 矩阵中。对于给定数据样本的特征 ,我们的输出是由权重与输入特征进行矩阵-向量乘法再加上偏置 得到的。
softmax 函数能够将未规范化的预测变换为非负数并且总和为1,同时让模型保持
可导的性质。
为了完成这一目标,我们首先对每个未规范化的预测求幂,这样可以确保输出非负。
为了确保最终输出的概率值总和为1,我们再让每个求幂后的结果除以它们的总和。如下式:

损失函数

接下来,我们需要一个损失函数来度量预测的效果。我们将使用最大似然估计,这与在线性回归中的方法相同。

对数似然

softmax 函数给出了一个向量 ,我们可以将其视为“对给定任意输入 的每个类的条件概率”。例如, = 。假设整个数据集 具有 个样本,其中索引 的样本由特征向量 和独热标签向量 组成。我们可以将估计值与实际值进行比较:

(这是给定输入 X 的条件下,观测到标签 Y 的概率)
根据最大似然估计,我们最大化 ,相当于最小化负对数似然:

其中,对于任何标签 和模型预测 ,损失函数为:

在本节稍后的内容会讲到, 上面的损失函数通常被称为交叉熵损失(cross-entropy loss)。由于 是一个长度为 的独热编码向量,所以除了一个项以外的所有项 都消失了。由于所有 都是预测的概率,所以它们的对数永远不会大于 。因此,如果正确地预测实际标签,即如果实际标签 ,则损失函数不能进一步最小化。注意,这往往是不可能的。例如,数据集中可能存在标签噪声(比如某些样本可能被误标),或输入特征没有足够的信息来完美地对每一个样本分类。

Softmax 及其导数

由于 softmax 和相关的损失函数很常见,
因此我们需要更好地理解它的计算方式。

考虑相对于任何未规范化的预测 的导数,我们得到:

换句话说,导数是我们 softmax 模型分配的概率与实际发生的情况(由独热标签向量表示)之间的差异。从这个意义上讲,这与我们在回归中看到的非常相似,其中梯度是观测值 和估计值 之间的差异。这不是巧合,在任何指数族分布模型中(参见本书附录中关于数学分布的一节),对数似然的梯度正是由此得出的。这使梯度计算在实践中变得容易很多。

交叉熵损失

现在让我们考虑整个结果分布的情况,即观察到的不仅仅是一个结果。对于标签 ,我们可以使用与以前相同的表示形式。唯一的区别是,我们现在用一个概率向量表示,如 ,而不是仅包含二元项的向量 。我们使用上面的公式来定义损失 ,它是所有标签分布的预期损失值。此损失称为交叉熵损失(cross-entropy loss),它是分类问题最常用的损失之一。

信息论基础

信息论(information theory)涉及编码、解码、发送以及尽可能简洁地处理信息或数据。

信息论的核心思想是量化数据中的信息内容。在信息论中,该数值被称为分布(entropy)。可以通过以下方程得到:

信息论的基本定理之一指出,为了对从分布中随机抽取的数据进行编码,我们至少需要“纳特(nat)”对其进行编码。“纳特”相当于比特(bit),但是对数底为而不是2。因此,一个纳特是比特。

信息量

压缩与预测有什么关系呢?想象一下,我们有一个要压缩的数据流。如果我们很容易预测下一个数据,那么这个数据就很容易压缩。为什么呢?举一个极端的例子,假如数据流中的每个数据完全相同,这会是一个非常无聊的数据流。由于它们总是相同的,我们总是知道下一个数据是什么。所以,为了传递数据流的内容,我们不必传输任何信息。也就是说,“下一个数据是xx”这个事件毫无信息量。

但是,如果我们不能完全预测每一个事件,那么我们有时可能会感到"惊异"。克劳德·香农决定用信息量 来量化这种惊异程度。在观察一个事件 时,并赋予它(主观)概率 。当我们赋予一个事件较低的概率时,我们的惊异会更大,该事件的信息量也就更大。熵,是当分配的概率真正匹配数据生成过程时的信息量的期望

重新审视交叉熵

如果把熵 § 想象为“知道真实概率的人所经历的惊异程度”,那么什么是交叉熵?交叉熵,记为。我们可以把交叉熵想象为“主观概率为的观察者在看到根据概率生成的数据时的预期惊异”。当时,交叉熵达到最低。在这种情况下,从的交叉熵是§

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

 评论
评论插件加载失败
正在加载评论插件