1. 从线性回归到分类问题:逻辑回归的完整推导
做深度学习的朋友迟早会遇到这三个概念:逻辑回归、Softmax 回归、交叉熵。很多人初学的时候把它们当成三个孤立的模型分别去记,结果越记越乱。实际上这三者是同一条思路在不同场景下的延伸,逻辑回归解决二分类问题,Softmax 回归把它推广到多分类,而交叉熵则是这两个模型共同使用的损失函数,也是整个深度学习分类任务的基石。
我最早接触逻辑回归时有个困惑:为什么明明叫"回归",干的却是分类的活?后来才明白,逻辑回归的核心不是直接预测一个数值,而是预测"样本属于某个类别的概率"。概率天然落在0到1之间,线性回归的输出却可以跑到正负无穷,所以需要引入一个函数把线性输出压缩到[0, 1]区间。这个函数就是sigmoid。
1.1 sigmoid函数为什么长这样
sigmoid的公式极其简洁:
[ \sigma(z) = \frac{1}{1 + e^{-z}} ]
这个函数有几个非常优雅的性质。首先,当z=0时,输出恰好是0.5,这意味着模型以0.5作为默认的判定阈值具有天然的对称性。其次,它的导数形式极为简洁:
[ \sigma'(z) = \sigma(z) \cdot (1 - \sigma(z)) ]
这个性质在梯度下降中至关重要。很多初学者不理解为什么神经网络的反向传播里总出现\hat{y}(1-\hat{y})这种项,根子就在这个导数公式上。sigmoid的导数等于"输出乘以一减输出",形式与概率分布完美对应,这让我在推导梯度时省了大量功夫。
实际应用中还有一个经常被忽略的细节:sigmoid对中间区域的输入最敏感,两端很快饱和。输入从-1变化到1时,输出大约从0.27跳到0.73,这个区间正好是模型"最有判断力"的范围。一旦输入绝对值超过4或5,输出基本就钉死在0或1附近,梯度趋近于零,参数更新极其缓慢。这就是梯度饱和现象,后面讲训练技巧时还要展开。
1.2 从线性决策面到概率输出
逻辑回归的完整表达式是:
[ P(y=1|x) = \sigma(W^T x + b) ]
本质上它先用线性模型 W^T x + b 映射特征,再用sigmoid转换为概率。这里有个容易忽略的点:逻辑回归的决策边界在原始特征空间里永远是线性的。如果有人告诉你它用sigmoid函数所以"是非线性的",那是在混淆视角。非线性变换发生在输出端,而不是特征空间内。特征空间里,分界线就是 W^T x + b = 0 这条直线(或超平面)。
从线性回归切换到逻辑回归时,损失函数也要跟着换。线性回归用均方误差(MSE),逻辑回归若继续用MSE,会面临两个问题。第一,梯度被sigmoid的饱和区压制,训练极慢甚至停滞。第二,MSE假定误差服从高斯分布,而二分类问题的目标本质上是伯努利分布,用错分布假设相当于用错了尺子。这时候交叉熵就该登场了。
1.3 贝叶斯视角下的逻辑回归
从贝叶斯角度看,逻辑回归在做什么?它实际上是对后验概率 P(y|x) 做建模。假设两类样本的特征都服从某个指数族分布,且协方差矩阵相同,推导出来的后验概率恰好就是sigmoid形式。这个结论在经典统计机器学习教材里都有证明,实际意义是:逻辑回归不是一个拍脑袋发明的模型,它有扎实的概率假设做支撑。
理解了这一层,就会明白为什么逻辑回归的系数可以当作特征重要性的参考。因为模型直接对概率建模,每个特征前的系数W_i就代表了该特征取值的对数几率贡献。系数为正,特征值增大时正类概率上升;系数为负则相反。虽然没有决策树那种直观的分裂规则,但系数的符号和大小仍然能给业务分析提供可解释性。
2. 从二分类到多分类:Softmax回归的自然演化
逻辑回归解决二分类问题,那遇到手写数字识别这种十类分类任务怎么办?一种朴素的想法是训练多个二分类器,比如"是1还是不是1"、"是2还是不是2",然后用某种策略组合。但这种做法忽略了类别之间的竞争关系,而且每个分类器的概率尺度不统一,组合策略非常别扭。Softmax回归用一套参数同时处理所有类别,输出一个概率分布向量,天然解决了这个问题。
2.1 Softmax的公式与几何直觉
Softmax的表达式:
[ \text{softmax}(z)i = \frac{e^{z_i}}{\sum{j=1}^K e^{z_j}} ]
分母对所有的 e^{z_j} 求和,分子对应第i类的指数。这样输出的每一项都在0到1之间,且所有项加起来恒等于1。这个"和为1"的性质让输出可以直接解释为概率分布——这是逻辑回归做不到的,因为二分类时两个互补概率只需要一个值就能表达。
指数运算的作用值得仔细体会。它首先把输入全部变为正数,其次放大了输入之间的差异。如果 z_1=2,z_2=1,两者本来只差1,但 e^2 ≈ 7.39,e^1 ≈ 2.72,归一化后概率大约是0.73和0.27,差距从1倍变成了接近3倍。这相当于对输入做了一次非线性放大,让模型对"最有把握的类别"更加自信。
从几何上看,Softmax对输入向量做的是"概率单纯形投影"。把 z 想象成高维空间里的一个自由点,Softmax把它投影到所有坐标非负且和为1的平面上。这个约束空间就是概率单纯形。理解了这层几何意义,就理解了为什么Softmax适合多分类:它天生把任意实值向量映射为合法的概率分布。
2.2 温度参数:改变输出的置信度分布
Softmax有个不那么常见但实用性极强的变体——带温度参数的版本:
[ \text{softmax}(z / T)i = \frac{e^{z_i / T}}{\sum{j=1}^K e^{z_j / T}} ]
当温度 T=1 时就是标准Softmax。T越大,输出的概率分布越平滑,各类别概率趋于接近;T越小,分布越尖锐,最大值位置的概率趋近于1。这个trick在大模型蒸馏和强化学习中都很常见,用来控制模型输出置信度。实际工作中我做过一次温度调参实验:手写数字分类模型在T=1时对难例的置信度在0.5左右摇摆,调到T=0.5后直接拉到0.9以上,看起来"更自信",但过拟合风险也随之上升。温度参数本质上是在调节模型的熵,需要根据任务场景平衡。
2.3 Softmax回归vs多个二分类器的本质区别
有人会问:既然二分类可以拆成多个逻辑回归,为什么要用Softmax?区别在于参数共享和类别互斥性。
多个二分类器是"一对多"策略,每个分类器单独训练,各自的决策边界互不影响。训练"是猫还是不是猫"的分类器时,狗和兔子的样本全被当成负样本处理;训练"是狗还是不是狗"时,猫和兔子又成了负样本。这套方案有两个隐患:类别不均衡极为严重(每类的负样本可能是正样本的好几倍),而且某个样本可能被多个分类器同时判定为正类,得到矛盾结论。
Softmax回归一次输出所有类别的概率,训练时所有类别一起优化,自然引入类别间的竞争关系。预测时取概率最大的类别作为结果,天然保证了一致性和排他性。多标签场景下才需要拆成多个二分类或使用sigmoid做逐标签预测——这一点很多初学者会搞混。
3. 交叉熵损失函数:信息论视角与梯度推导
交叉熵是整篇文章的核心主题。逻辑回归和Softmax回归都用它做损失函数,深度学习里的绝大多数分类任务也都在用它。为什么不继续用均方误差?理由需要从信息论和梯度两个角度分别理解。
3.1 从信息论理解交叉熵
信息论里,交叉熵定义为:
[ H(p, q) = -\sum_i p_i \log q_i ]
这里 p 是真实概率分布,q 是模型预测的概率分布。交叉熵度量的是"用分布q去编码真实分布p所需的最小平均编码长度"。如果q和p完全一致,交叉熵等于p的熵,这是理论下界。差异越大,交叉熵越大。
在分类任务中,真实标签通常用one-hot编码表示。比如一个三分类样本的标签是第2类,对应的p就是 [0, 1, 0],此时交叉熵公式里的求和只剩一项:
[ L = -\log q_2 ]
这就是为什么很多训练日志里显示的 loss 恰好是"正确类别的预测概率取负对数"。预测概率越接近1,损失越接近0;预测概率越小,损失增长越快,尤其当预测概率接近0时,损失趋近无穷。这个"对错误分类施以重罚"的特性,让模型对低置信度的错误预测非常敏感。
二分类场景下的交叉熵公式通常写成:
[ L = -\left[ y \log \hat{y} + (1-y) \log (1-\hat{y}) \right] ]
y取1时只看第一项,y取0时只看第二项。这个公式实践中最容易踩的坑是数值下溢:当\hat{y}接近0或1时,log里面可能出现0,导致计算结果为无穷。后面讲数值稳定性时再谈解决方案。
3.2 梯度推导:核心中的核心
交叉熵和sigmoid/Softmax的组合之所以被广泛使用,一个关键原因是梯度形式极其简洁。拿二分类逻辑回归来推导一遍。
设线性输出 z = W^T x + b,预测概率 \hat{y} = \sigma(z),损失 L = -[y\log\hat{y} + (1-y)\log(1-\hat{y})]。
对 W 求梯度,运用链式法则:
[ \frac{\partial L}{\partial W} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z} \cdot \frac{\partial z}{\partial W} ]
逐项计算。第一项:
[ \frac{\partial L}{\partial \hat{y}} = -\frac{y}{\hat{y}} + \frac{1-y}{1-\hat{y}} = \frac{\hat{y} - y}{\hat{y}(1-\hat{y})} ]
第二项(sigmoid导数):
[ \frac{\partial \hat{y}}{\partial z} = \hat{y}(1-\hat{y}) ]
两项相乘,分母的 \hat{y}(1-\hat{y}) 正好约掉,得到:
[ \frac{\partial L}{\partial z} = \hat{y} - y ]
这个式子简洁到了极点:损失对线性输出的梯度,恰好等于预测概率减真实标签。这意味着什么?当模型预测接近真实标签时,梯度趋近于0,参数几乎不动;预测偏离时,梯度近似等于误差本身,推动参数大刀阔斧地修正。交叉熵与sigmoid的组合天生就是为梯度下降设计的默契搭档。
换成Softmax配交叉熵,梯度同样优雅。Softmax的雅可比矩阵本来有复杂的交叉项,但配合交叉熵后,损失对第i类线性输出的梯度也变成了:
[ \frac{\partial L}{\partial z_i} = \hat{y}_i - y_i ]
第i类预测概率与one-hot标签的差。向量化的表示就是 \hat{y} - y,看起来和二分类几乎一样。这个结论被我验证过无数次,也是很多深度学习框架里交叉熵和Softmax被合并成一个算子的原因——合在一起计算又快又稳,还能避免中间结果的数值问题。
3.3 为什么不建议用均方误差
对比实验最有说服力。我用同样的逻辑回归结构、同样的数据、同样的优化器,只换损失函数,观察收敛曲线。均方误差配sigmoid的梯度表达式是:
[ \frac{\partial L}{\partial z} = 2(\hat{y} - y) \cdot \hat{y}(1-\hat{y}) ]
多出来的因子 \hat{y}(1-\hat{y}) 在预测接近0或1时会把梯度压得极小。最需要学习的是那些"刚刚起步、离正确答案很远"的样本,可MSE恰恰在样本最困难时给最强的梯度衰减。训练曲线显示,MSE版本的模型前期loss下降极慢,迭代几百步后仍处于高位,切换到交叉熵后几十步就进入快速收敛区间。印象最深的是,同样的初始化权重,交叉熵版本的模型在测试集上的准确率最终高出两到三个百分点。
如果你见到某些旧项目仍然使用MSE做分类损失,大概率是历史遗留代码。可能在一个内部演示里,某个团队写了二分类只把线性输出直接当预测值,没有套sigmoid也没用交叉熵,这实际上是线性回归误用场景,训练时梯度没问题但输出无法解释为概率。
4. 数值稳定性:工程实现中的关键细节
理论推导再漂亮,落实到浮点数运算时就可能翻车。Softmax和交叉熵在计算机上的实现有一些必须处理的数值问题,这也是很多框架把两者合并实现的原因。
4.1 Softmax的数值溢出问题
看这个例子。假设Softmax的输入是 [1000, 1005, 990],直接算 e^1000 会发生什么?float32能表示的最大数大约3.4e38,e^1000 ≈ 1.97e434,溢出直接得到inf。就算不溢出,e^1005 / e^1000 这种运算在浮点数下也可能损失精度。
解决办法出奇地简单:给所有输入统一减去一个常数,结果不变。因为:
[ \frac{e^{z_i}}{\sum_j e^{z_j}} = \frac{e^{z_i - c}}{\sum_j e^{z_j - c}} ]
常数c最稳妥的选择是max(z_i),这样最大的指数项变成 e^0 = 1,所有项都在安全范围内。这就是几乎所有深度学习框架在Softmax实现里都会做的操作。没人会直接暴露这个细节,但理解它对断点调试非常有帮助。几年前我在自己实现一个简单的分类器时,遇到loss变成NaN,打印中间输出后发现 z 里有几个接近300的大数,减掉最大值后训练一切正常。
同理,交叉熵里的 \log \hat{y} 在 \hat{y} 为0时是负无穷。通常的做法是对 \hat{y} 加一个极小值如1e-12,或者用log_softmax联合计算,把直接计算概率的中间环节绕开。log_softmax的表达式:
[ \log(\text{softmax}(z_i)) = z_i - \log\sum_j e^{z_j} ]
这样算出来的 log 概率既避免了中间值下溢到0甚至负数,也避免了先算概率再取log的精度损失,是更稳的方式。PyTorch里直接调 torch.nn.CrossEntropyLoss,它的实现把LogSoftmax和NLLLoss合并了,正是为了这个目的。当你看到某个教程手动拼了softmax加log加nll_loss三个操作时,心里要清楚这样做可能引入不必要的数值风险。
4.2 数据预处理与初始化对收敛的影响
数值稳定不止和损失函数实现有关,数据预处理同样关键。我在某个实验里直接拿像素值0到255的原始图像训练逻辑回归,loss曲线震荡严重,准确率在低位徘徊。归一化到0到1之后,同样的模型参数和优化器,top-1准确率立刻提升接近十个百分点。原因在于特征尺度差异过大会让线性输出W^T x的数值范围失控,导致sigmoid长期处于饱和区,梯度几乎消失。
权重初始化也讲究。常见做法是把权重初始化为接近零的小随机数,比如标准正态分布乘以0.01。这样初始的线性输出接近0,sigmoid工作在敏感区,梯度充足,模型能够正常"启动"。如果初始化得太大,模型从一开始就死在饱和区,训练会变成"假性死机"——loss不降,但参数也没怎么更新。
4.3 学习率与梯度的尺度匹配
交叉熵与Softmax的梯度表达式 \hat{y} - y 有一个好特性:梯度各分量严格落在(-1, 1)区间。这意味着无论输入特征如何波动,梯度本身有界,对学习率的选择比较宽容。相比之下,MSE配合sigmoid在饱和区几乎零梯度,在非饱和区最大梯度也只有0.5左右,尺度更小且不均匀,需要更精细地调学习率。这也是交叉熵在实际工程里更受欢迎的原因之一。
不过有界不代表可以乱来。实践中梯度还要经过反向传播逐层放大或衰减,神经网络深层场景里仍然需要配合归一化技术或自适应优化器(如Adam)来控制更新步长。我见过新手在逻辑回归上调了个1.0的学习率,loss直接发散去到NaN;换到0.1之后训练正常,这说明即便有界梯度,太大步长仍然可能越过最优点进入发散区域。
5. 工程实践:正则化、类别不平衡与效果验证
理论模型写完了,下一步是真正在数据集上跑起来。这里涉及几个工程上绕不开的问题:特征标准化、正则化选择、类别分布处理,以及模型效果的诊断方式。
5.1 正则化选择:什么时候用L1、什么时候用L2
逻辑回归和Softmax回归都是线性模型,参数维度等于特征维度。在特征数量远超样本数量的场景(比如文本分类里的词袋特征),模型极易过拟合,必须引入正则化。
L2正则化的梯度是直接在原有梯度上加上参数本身(乘以正则化系数λ),它倾向于让参数均匀地变小但不精确为0。对于特征之间相关性较强的场景,L2能平滑权重分布,稳定模型。L1正则化的梯度则包含符号项,它会推动参数中的大部分精确归零,达到特征选择的效果。实际上组合使用弹性网正则化(L1加L2)也常见——先用L1筛特征,再用L2稳定剩余的权重。
实际操作里,正则化系数λ需要从小范围试起,从0.0001, 0.001, 0.01逐级扫描,观察验证集性能变化。λ太大会把模型的输出概率全部压向先验分布,准确率骤降;λ太小则过拟合现象复现。我习惯用一组对数间距的候选值做3到5折交叉验证,根据验证loss曲线选出最优。这里有个小技巧:如果训练loss和验证loss之间的差距随着λ增大而缩小,说明正则化正在发挥作用,可以继续加大;如果两者同时快速上升,说明λ已经过头了。
5.2 类别不平衡该怎么处理
逻辑回归在训练时假设随机梯度下降看到的样本分布近似真实分布。如果正类只占1%,模型学到的最优策略可能是什么都不做、全部判负,也能达到99%的表观准确率。这个假象在混淆矩阵里暴露无遗。我在处理某个异常检测任务时遇到过这类情况,正例300条、负例3万条,没做任何处理直接训练,精确率看着还行,召回率只有0.1,模型几乎把所有正例都漏掉了。
标准做法有几种。一是重采样,对少数类过采样(如SMOTE生成合成样本)或对多数类欠采样。二是调整损失函数里的类别权重,等价于给少数类样本的损失乘上更大系数,迫使模型更加关注稀有类别。PyTorch的CrossEntropyLoss里自带weight参数,这比手动改数据分布要省事得多。实际中我会先做简单的多数类降采样,让比例降到大约2:1到5:1之间,训练初期效果立竿见影,再配合类别权重做精调。
5.3 如何诊断模型到底学到了什么
训练完成后,不要只看一个test accuracy就完事。几个工具可以帮你看得更深。
第一个是混淆矩阵。通过它你能看到模型具体在哪两个类别之间混淆最多。手写数字识别里最经典的混淆对是4和9,或者3和8。如果发现这类系统性错误,多半是特征空间中这些类别的分布高度重叠,单纯增加模型容量未必能解决,更好的方向是补充区分性更强的特征。
第二个是预测概率分布图。把测试样本按预测概率分桶,统计每个桶里的准确率。一个校准良好的模型,概率0.9到1.0之间的样本准确率应该接近90%以上。如果出现"概率很高但错误很多"的样本,说明模型过于自信,可能过拟合了训练集中的某些模式。这时候温度缩放(前面提到的T参数)可以用来重新校准概率。
第三个是权重向量可视化。对于图像类任务,直接把Softmax回归的每一类权重向量reshape成图像查看。训练有素的模型,权重图会呈现出类似该类样本"平均模板"的形式——数字1的权重图看起来像斜杠,数字0的权重图是一个环。这既是模型可解释性的直接证据,也是排查数据标注错误的有力工具。如果某一类的权重图杂乱无章,多半是这类样本太少或标注噪声太大。
6. 从分类到表示学习:逻辑回归和Softmax的上层应用
逻辑回归和Softmax回归不只停留在浅层模型。它们在整个深度学习体系里扮演着两个关键角色:作为网络的最终分类头,以及作为表示学习的诊断工具。
6.1 分类头在神经网络中的角色
几乎所有图像分类、文本分类的神经网络架构,最后几层做的事情都一样:把前面主干网络提取的高维特征映射到类别空间。这个最终的线性层加Softmax,本质上就是一个Softmax回归。把某个卷积网络的最后一层特征取出来(比如2048维的向量),输入到一个独立的Softmax回归分类器里,也能得到相当不错的分类效果——这就是最简单的迁移学习。在这个框架下,主干网络负责"把原始输入变成好的特征表示",分类头负责"用线性边界切分这些特征"。两者各司其职,任何一个部分太弱都会拖累整体。
在少样本场景里,固定主干特征、只训练一个逻辑回归分类头,往往比微调整个网络更稳健。原因是主干网络在大规模数据上学到的特征是通用的,小样本不足以支撑全网络微调,而线性分类头参数量小、不容易过拟合。这个思路在多个实际任务里验证过,特别是当训练数据只有几百张时,效果显著优于直接端到端微调。
6.2 作为诊断工具:测试表示质量
逻辑回归还是一种评估表示质量的利器。假设有人给你一个特征提取器,你想知道它提取的特征区分度如何。用这些特征训练一个逻辑回归模型(或线性Softmax),如果线性分类能拿到高准确率,说明特征本身是线性可分的;如果线性模型表现不佳但K近邻表现好,说明特征存在较强的非线性结构。这类诊断信息对决定下一步建模策略非常有帮助。
我在对比不同预训练模型时常用的方法:拿同一批标注数据,分别提取各模型的倒数第二层特征,训练逻辑回归,比较线性分类准确率。这个指标比端到端微调的准确率更能反映特征本身的判别能力,而且训练成本低、结果稳定。谁的特征更"线性可分",谁的基础表示就更适合作为迁移学习的起点。
6.3 决策边界与不确定性估计
逻辑回归和Softmax回归天然输出概率,这赋予了它们一个隐藏优势:可以做简单的不确定性估计。对于一个测试样本,如果模型给出的最大类别概率只有0.4,说明这个样本处于决策边界附近,归类结果可信度低。在自动标注、辅助决策等场景里,可以把这类低置信度样本挑出来交给人工复核,显著降低错误率。
不过要注意,神经网络输出的概率未必校准良好,Softmax的置信度有时会虚高。针对这一点,可以做一个简单的线下校准:拿一部分验证集样本,记录模型输出的最大概率值和对应的真实准确率,绘制校准曲线。如果发现系统性的偏移(比如概率0.9时准确率只有0.6),可以用前面的温度缩放做个一维参数调整。这个操作往往只需几十行代码,却能大幅提升输出概率的可信度,我几乎在每个实际落地的分类项目里都会做一遍。
还有一个方向值得提及:类别间关系的学习。标准Softmax回归把每个类别当成独立互斥的,但现实世界很多分类问题存在层级结构,比如"动物"下有"猫"和"狗"。层级Softmax(Hierarchical Softmax)通过把类别组织成树状结构来降低大词表场景的计算开销,这个技巧在语言模型领域一度非常重要。理解基础Softmax的数学形式之后,再去读层级Softmax的公式会顺理成章很多。
7. 常见误区与自查清单
围绕这个主题,我在教学和代码评审里见过大量重复出现的误区。把它们集中整理出来,算是给后来者的一份避坑手册。
7.1 概念混淆类误区
第一个误区是把逻辑回归当成回归模型。它叫"回归"纯粹是历史原因,处理的是分类问题,输出的是概率。第二个误区是认为Softmax可以替代sigmoid做任意二分类——实际上二分类时两者严格等价,sigmoid输出p,Softmax输出[p, 1-p],没区别,但框架实现上二分类用sigmoid更省显存和计算。第三个误区是混淆"多分类"和"多标签":多分类每个样本只能属一个类别,用Softmax;多标签每个样本可以同时拥有多个标签,通常对每个标签单独用sigmoid加二元交叉熵。这个区别我在一个项目里犯过错误,把多标签任务套了Softmax,训练半天发现模型总是只预测出少数几个标签,因为Softmax的"和为1"约束天然抑制了同时激活多个标签的行为。
7.2 使用中的典型错误
训练时一个高频错误是数据泄露。先做标准化再划分训练集和测试集,会让测试集的信息通过均值方差间接参与训练,得到的评估指标虚高。正确做法是先划分数据,再在训练集上计算均值和方差,用同一套参数转换测试集。逻辑回归对特征尺度敏感,标准化不是可选项,是必选项。
另一个错误是选择损失函数和输出层不匹配。输出层用了Softmax,损失却用MSE,这在数值上完全可行,但收敛慢且容易陷入局部平坦区。输出层用sigmoid,损失用多分类交叉熵,框架会报错或者给出荒谬结果。工程上我建议固定组合:二分类sigmoid加BCE,多分类Softmax加交叉熵,不要混搭。
还有一个细小但影响实际使用的问题:预测时到底该用 argmax 还是根据概率阈值决定。标准多分类任务用 argmax 取概率最大的类别没毛病,但如果想让模型在不确定时"弃权"(输出低置信度并拒绝判断),那就需要设置一个最小概率阈值,低于它时标记为"待人工处理"。这在自动化流程里很常见,做的时候记得把阈值的选择也放入验证集调参流程里,不要拍脑袋定。
7.3 项目落地前的前置检查清单
把所有的实战经验收拢成一份检查清单,每接手一个新的分类任务时快速过一遍:
- 标签是否互斥?互斥用Softmax,不互斥用多标签sigmoid
- 特征是否标准化?先划数据再算均值和方差
- 类别是否严重不平衡?考虑过采样、欠采样或损失加权
- 有没有从验证集统计出最优分类阈值?还是直接用默认的0.5或argmax
- 损失函数输出层是否匹配?建议统一用框架的融合算子
- 数值稳定性是否保障?确认框架实现里做了减最大值的Softmax处理
- 权重初始化是否接近零?偏置是否置零?
- 正则化系数是否经过交叉验证?还是直接用了默认值
- 测试集的评价指标是否被类别不平衡误导?看混淆矩阵和各类别单独指标
前几次做分类项目时踩了很多坑,后来把这份清单逐步完善,现在几乎成了每次开工的固定仪式。这些检查项大多不是"如果出错会有多严重"的问题,而是"出错概率非常高、一错就返工再错就更难追"的问题,提前过一遍比事后排查省时得多。