type
Page
status
Invisible
date
Feb 26, 2026
slug
Machine_Learning/deep-learning-study-notes/3_7
summary
动手深度学习v2课程
tags
机器学习
深度学习
category
icon
password
通过深度学习框架的高级API能更方便地实现softmax回归模型。本节如3.6节中一样,继续使用Fashion-MNIST数据集,并保持批量大小为256。
3.7.1. 初始化模型参数
softmax回归的输出层是一个全连接层。因此,为了实现我们的模型,我们只需在
Sequential中添加一个带有10个输出的全连接层。同样,在这里Sequential并不是必要的,但它是实现深度模型的基础。 我们仍然以均值0和标准差0.01随机初始化权重。3.7.2. 重新审视Softmax的实现
在3.6节的例子中,我们计算了模型的输出,然后将此输出送入交叉熵损失。从数学上讲,这是一件完全合理的事情。然而,从计算角度来看,指数可能会造成数值稳定性问题。
回想一下,softmax函数,其中是预测的概率分布,是未规范化的预测的第个元素。如果中的一些数值非常大,那么可能大于数据类型容许的上限,即上溢(overflow)。这将使分母或分子变为
inf(无穷大),最后得到的是0、inf或nan(不是数字)的,从而导致我们无法得到一个明确定义的交叉熵值。解决改问题的一种方案是:在继续softmax计算之前,先从所有的中减去,可以发现每个按常数进行的移动不会改变softmax的返回值:
在减法和规范化步骤之后,可能有些具有较大的负值。由于精度受限,将有接近零的值,即下溢(underflow)。这些值可能会四舍五入为零,使为零,并且使得的值为-inf。反向传播几步后,我们可能会发现自己面对一屏幕可怕的nan结果。
尽管我们要计算指数函数,但我们最终在计算交叉熵损失时会取它们的对数。通过将softmax和交叉熵结合在一起,可以避免反向传播过程中可能会困扰我们的数值稳定性问题。如下面的等式所示,我们避免计算,而可以直接使用,因为被抵消了。后面的求和项中和里面至少有一个为1(),所以整体不会下溢成0。
在训练分类模型时,虽然 softmax 可以把模型输出的分数转换成概率,但在计算交叉熵损失时,我们不应该先手动计算 softmax,再取对数。这样做容易出现数值不稳定的问题,比如概率太小被舍入为 0,导致 log(0) 变成负无穷,从而产生 NaN。
更稳定的做法是:直接把模型输出的原始分数(logits)输入到交叉熵损失函数中。损失函数内部会用一种数值更稳定的方式,同时完成 softmax 和 log 的计算(类似 LogSumExp 技巧),避免指数上溢或下溢问题。
3.7.3. 优化算法
这里使用学习率为0.1的小批量随机梯度下降作为优化算法。
3.7.4. 训练
然后调用3.6节中定义的函数来训练模型,这里调用d2l库里的函数报错,解决方案如下
在vscode中找到
d2l库中的torch.py文件,加入下面的内容,然后重启jupyter变量,重新执行即可成功后执行下面的代码开始训练
3.7.5. 小结
- 使用深度学习框架的高级API,我们可以更简洁地实现softmax回归。
- 从计算的角度来看,实现softmax回归比较复杂。在许多情况下,深度学习框架在这些著名的技巧之外采取了额外的预防措施,来确保数值的稳定性。这使我们避免了在实践中从零开始编写模型时可能遇到的陷阱。
