ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从极大似然估计到交叉熵损失:深度学习分类任务损失函数原理与实现

从极大似然估计到交叉熵损失:深度学习分类任务损失函数原理与实现 1. 项目概述从“猜硬币”到模型训练的本质如果你曾经尝试过训练一个神经网络无论是做图像分类还是文本生成那么“交叉熵损失”这个词对你来说一定不陌生。它几乎是所有分类任务中损失函数的首选其地位堪比机器学习领域的“万金油”。但你是否想过为什么偏偏是它为什么不是均方误差或者其他什么听起来更复杂的函数这个问题的答案就藏在另一个统计学基石概念——“极大似然估计”之中。简单来说交叉熵损失是极大似然估计思想在深度学习模型训练中的一种具体实现和优化形式。理解这一点是真正从“调包侠”迈向理解模型训练内在逻辑的关键一步。它解决的是如何量化模型预测的概率分布与真实标签的概率分布之间的“距离”或“差异”并指导模型朝着“最可能”产生我们观测到的数据的方向去调整参数。想象一个场景你有一个朋友他抛一枚硬币10次结果有7次正面朝上。你可能会猜测这枚硬币可能不是绝对公平的正面朝上的概率大概在0.7左右。这个“猜测”的过程就蕴含了极大似然估计的思想——我们寻找一个参数这里指硬币正面的概率使得观测到当前结果7正3反的可能性最大。而在深度学习中我们的“硬币”变成了复杂的神经网络模型观测到的“抛掷结果”就是我们的训练数据我们需要调整的“参数”则是网络中数以百万计的权重和偏置。交叉熵损失就是那个帮助我们衡量“当前模型参数下出现这批数据的可能性有多大”的标尺并且通过最小化这个损失即最大化可能性来找到那组最合适的参数。这篇文章我将为你彻底拆解交叉熵损失与极大似然估计之间的深刻联系。我们不会停留在公式的表面而是会一步步推导看看这个在代码里可能只是一行nn.CrossEntropyLoss()的函数背后究竟有着怎样严密的统计逻辑。无论你是刚刚入门希望夯实理论基础的新手还是有一定经验想深入理解损失函数选择的从业者相信这篇结合原理、推导与实操心得的文章都能给你带来新的启发。2. 核心概念拆解似然、熵与交叉熵在深入探讨它们的联系之前我们必须先打好地基清晰理解这三个核心概念各自的内涵。2.1 极大似然估计寻找“最可能”的真相极大似然估计是一种参数估计方法其核心思想非常直观且强大在已经观察到一组数据的前提下我们认为使得这组数据出现“可能性”最大的那个参数值就是最合理的估计值。这里有两个关键点“可能性”用概率来衡量对于离散数据就是概率质量函数对于连续数据则是概率密度函数。我们通常将其称为似然函数。“最可能”意味着最大化我们的目标就是找到能让这个似然函数值达到最大的参数。一个经典例子伯努利分布与抛硬币假设我们观测到一组抛硬币的结果[正 反 正 正 反]。我们假设每次抛掷是独立的且正面朝上的概率为p。那么出现这个特定序列的似然函数L(p)就是每个结果概率的乘积L(p) P(正) * P(反) * P(正) * P(正) * P(反) p * (1-p) * p * p * (1-p) p^3 * (1-p)^2我们的任务是找到那个使L(p)最大的p。直接求最大值可能有点麻烦但数学上有一个非常巧妙的技巧对似然函数取自然对数得到对数似然函数log L(p)。因为对数函数是单调递增的所以最大化L(p)等价于最大化log L(p)。这样做的好处是连乘变成了连加求导更简单。log L(p) 3*log(p) 2*log(1-p)然后对p求导并令其为零d/dp [log L(p)] 3/p - 2/(1-p) 0解得p 3/5 0.6这个结果非常符合直觉我们观测到5次抛掷中3次正面所以估计正面概率为0.6。极大似然估计在这里给出了一个非常自然且合理的答案。注意在实际的模型训练中我们面对的是成千上万个样本似然函数是所有样本联合概率的乘积。取对数后就变成了所有样本对数概率的求和。而我们的优化目标通常是最小化损失函数。因此最大化对数似然就等价于最小化负对数似然。这个“负对数似然”正是交叉熵损失的雏形。2.2 信息熵度量“不确定性”熵的概念源于信息论由香农提出用于量化一个随机变量的不确定性。对于一个离散随机变量X其概率分布为P(X)那么它的信息熵H(P)定义为H(P) - Σ P(x) * log(P(x))求和遍历所有可能取值x熵越大表示系统的不确定性越高所含的“信息量”也越大。举个例子一枚均匀硬币正反面概率各0.5其熵为- (0.5*log0.5 0.5*log0.5) 1这里log以2为底单位是比特。一枚作弊硬币正面概率0.9反面0.1其熵为- (0.9*log0.9 0.1*log0.1) ≈ 0.47。 显然均匀硬币的结果更难预测不确定性更高所以熵值更大。2.3 交叉熵度量两个分布的“差异”交叉熵是信息熵概念的延伸。它衡量的是当我们用一个估计的概率分布Q去描述真实概率分布P的数据时所需要的平均编码长度或信息量。其定义为H(P, Q) - Σ P(x) * log(Q(x))注意这里的关键log里面是估计分布Q的概率而前面乘的是真实分布P的概率。交叉熵永远大于或等于真实分布P的信息熵。当且仅当估计分布Q与真实分布P完全一致时交叉熵等于信息熵。我们可以这样理解H(P)用真实分布P来编码数据所需的最短平均编码长度理论下限。H(P, Q)用估计分布Q来编码源于真实分布P的数据所需的平均编码长度。由于Q可能不是最优的编码方案所以H(P, Q) H(P)。它们之间的差值就是著名的KL散度它专门用来衡量两个分布之间的差异。即H(P, Q) H(P) D_KL(P||Q)。因为H(P)对于固定数据集是常数所以最小化交叉熵H(P, Q)就等价于最小化KL散度D_KL(P||Q)也就是在迫使估计分布Q尽可能地逼近真实分布P。3. 桥梁搭建从极大似然到交叉熵损失现在让我们把这两块拼图连接起来。在分类任务中特别是单标签分类一张图片只属于一个类别我们的真实标签通常用one-hot编码表示。假设我们有K个类别。对于某一个样本其真实分布P是一个one-hot向量。比如真实类别是第3类则P [0, 0, 1, 0, ..., 0]。只有在真实类别位置为1其余为0。模型估计分布Q是模型softmax层的输出一个概率向量。例如Q [0.1, 0.05, 0.7, 0.05, ...]。所有元素和为1。第一步写出似然函数对于这个样本在模型参数θ下我们“观测到”这个真实标签的概率似然是多少根据我们的模型它预测样本属于第3类的概率是Q_3 0.7。那么似然就是L(θ) Q_3 0.7。更一般地如果真实类别是k则L(θ) Q_k。对于整个包含N个独立同分布样本的数据集总的似然函数是每个样本似然的乘积L(θ) ∏_{i1}^{N} Q_{i, y_i}其中Q_{i, y_i}表示第i个样本在其真实类别y_i上的模型预测概率。第二步转化为对数似然并取负我们追求最大化似然。取对数后log L(θ) Σ_{i1}^{N} log(Q_{i, y_i})在优化领域我们习惯最小化一个目标函数损失函数。因此我们取负对数似然作为损失Loss - log L(θ) - Σ_{i1}^{N} log(Q_{i, y_i})第三步与交叉熵定义对照回顾交叉熵公式H(P, Q) - Σ P(x) * log(Q(x))。 对于我们的one-hot真实标签P只有真实类别k对应的P_k 1其他都为0。因此对于单个样本H(P, Q) - [0*log(Q_1) 0*log(Q_2) ... 1*log(Q_k) ...] - log(Q_k)这正是我们上一步得到的单个样本的负对数似然因此对于整个数据集最小化交叉熵损失Σ_i H(P_i, Q_i)完全等价于最大化整个数据集的对数似然Σ_i log(Q_{i, y_i})也就是在执行极大似然估计。实操心得这个推导解释了为什么在PyTorch中nn.CrossEntropyLoss()默认已经包含了log_softmax和negative log likelihood loss两个步骤。你不需要在模型最后一层手动添加softmax该损失函数会内部处理。如果你在最后一层已经用了softmax再输入CrossEntropyLoss就相当于做了两次归一化这通常是错误的会导致训练无法收敛或效果很差。这是一个非常常见的坑。4. 为何是交叉熵深入对比与优势分析理解了“是什么”和“为什么等价”之后一个更深层的问题是为什么在分类任务中交叉熵损失比更直观的均方误差损失要好得多这背后有深刻的数学和实操原因。4.1 与均方误差的直观对比均方误差损失定义为MSE (1/N) Σ (y_i - ŷ_i)^2其中y_i是真实标签one-hotŷ_i是模型预测通常是softmax后的概率。假设一个三分类问题某个样本真实标签是[1, 0, 0]。情况A预测较好模型预测为[0.8, 0.1, 0.1]。情况B预测很差模型预测为[0.4, 0.3, 0.3]。计算MSEA:(1-0.8)^2 (0-0.1)^2 (0-0.1)^2 0.04 0.01 0.01 0.06B:(1-0.4)^2 (0-0.3)^2 (0-0.3)^2 0.36 0.09 0.09 0.54B的损失是A的9倍惩罚看起来足够大。计算交叉熵损失CEA:-log(0.8) ≈ 0.223B:-log(0.4) ≈ 0.916B的损失大约是A的4倍。从数值上看MSE似乎也对错误预测给予了更严厉的惩罚。但问题出在梯度上。4.2 梯度视角下的致命差异损失函数指导模型学习靠的是反向传播的梯度。梯度的大小和性质决定了优化的效率和稳定性。对于交叉熵损失L -log(q)其中q是正确类别的预测概率。其对q的导数为dL/dq -1/q这个导数有一个关键特性当模型预测完全错误q - 0时梯度会变得非常大-1/q - -∞。这给了模型一个非常强烈的信号“你错得太离谱了需要大步幅修正” 而当预测接近正确q - 1时梯度趋近于-1更新幅度温和。对于均方误差损失经过softmax后求导过程略复杂其梯度会包含一个q * (1-q)的因子。当预测完全错误时比如正确类别q0.01这个因子0.01*0.99≈0.01会极大地削弱梯度导致模型在错误时收到的修正信号非常微弱学习速度极其缓慢。这就是所谓的“梯度消失”问题在损失函数层面的体现。下表对比了两种损失在分类任务中的核心差异特性交叉熵损失均方误差损失理论基础源于极大似然估计具有统计解释性源于最小二乘直观但未必适合概率建模梯度性质错误越大梯度越大学习信号强错误时梯度可能很小受softmax饱和影响学习信号弱收敛速度通常更快尤其对于分类问题通常较慢容易陷入平台期与Softmax配合完美匹配梯度计算简洁高效配合使用时梯度计算复杂且包含削弱因子概率解释直接优化预测概率分布与真实分布的差异优化的是概率值的欧氏距离缺乏严格的概率解释4.3 交叉熵的实践优势凸性在逻辑回归等线性模型中对于像逻辑回归这样的广义线性模型负对数似然损失即交叉熵是关于参数的凸函数。这意味着优化过程中只有全局最优解没有讨厌的局部最优保证了梯度下降能找到最好的解。概率校准最小化交叉熵直接鼓励模型输出校准良好的概率。即一个预测为0.9置信度的样本其实际属于该类的概率也应在90%左右。MSE没有这个特性。信息论解释提供了“最小化额外编码长度”的直观理解与压缩、传输等概念关联理论体系优美。注意事项虽然交叉熵优势明显但它并非没有缺点。它对“绝对正确”的要求非常严格。例如一个样本真实概率可能是0.9存在噪声但交叉熵损失会强制模型向1.0逼近可能导致过拟合。在一些需要模型认知不确定性或处理噪声标签的场景下标签平滑、Focal Loss等变体应运而生它们都是在交叉熵基础上进行的改良。5. 实操演练从公式到代码的完整实现理论再美也需要落地。让我们抛开深度学习框架用最基础的Python和NumPy亲手实现一遍交叉熵损失并验证其梯度从而加深理解。5.1 核心组件实现Softmax与交叉熵首先实现稳定的Softmax函数。直接计算exp(x)可能导致数值溢出x很大时因此需要使用“减去最大值”的技巧进行数值稳定。import numpy as np def softmax_stable(x): 数值稳定的Softmax函数。 参数: x: 输入向量或矩阵最后一个维度为特征维度。 返回: softmax概率分布。 # 沿最后一个轴找出最大值并保持维度以便广播 x_max np.max(x, axis-1, keepdimsTrue) # 减去最大值使exp计算更稳定 exp_x_shifted np.exp(x - x_max) # 求和同样保持维度 sum_exp np.sum(exp_x_shifted, axis-1, keepdimsTrue) return exp_x_shifted / sum_exp def cross_entropy_loss(y_pred_logits, y_true): 计算交叉熵损失。 参数: y_pred_logits: 模型最后一层的输出logits形状为 (N, C)N为样本数C为类别数。 y_true: 真实标签形状为 (N,)每个元素是类别索引0到C-1。 返回: 平均交叉熵损失标量。 N y_pred_logits.shape[0] # 1. 计算softmax概率 probs softmax_stable(y_pred_logits) # 形状 (N, C) # 2. 获取每个样本在其真实类别上的预测概率 # 使用高级索引probs[np.arange(N), y_true] correct_class_probs probs[np.arange(N), y_true] # 形状 (N,) # 3. 计算负对数似然交叉熵 # 添加微小值epsilon防止log(0)导致-inf epsilon 1e-12 correct_class_probs np.clip(correct_class_probs, epsilon, 1.0) loss_per_sample -np.log(correct_class_probs) # 形状 (N,) # 4. 对所有样本损失求平均 total_loss np.mean(loss_per_sample) return total_loss5.2 梯度推导与手动验证反向传播的核心是计算损失对输入logits的梯度。让我们推导一下。对于单个样本损失为L -log(p_y)其中p_y softmax(z)_yz是logits向量。根据链式法则∂L/∂z_j (∂L/∂p_y) * (∂p_y/∂z_j)。但更通用的方法是直接计算损失L对每个z_j的偏导。已知Softmax函数的导数特性∂p_i/∂z_j p_i * (δ_ij - p_j)其中δ_ij是克罗内克δ函数当ij时为1否则为0。对于损失L -log(p_y)先求∂L/∂p_y -1/p_y。然后当j y正确类别时∂L/∂z_y (∂L/∂p_y) * (∂p_y/∂z_y) (-1/p_y) * [p_y * (1 - p_y)] p_y - 1当j ≠ y错误类别时∂L/∂z_j (∂L/∂p_y) * (∂p_y/∂z_j) (-1/p_y) * [p_y * (0 - p_j)] p_j因此梯度向量g的通用形式为g_j p_j - δ_jy。也就是说对于正确类别梯度是(预测概率 - 1)对于错误类别梯度就是预测概率本身。这个结果非常优雅它意味着梯度等于模型预测的概率分布向量减去真实标签的one-hot向量。def cross_entropy_gradient(y_pred_logits, y_true): 计算交叉熵损失对输入logits的梯度。 参数: y_pred_logits: 模型最后一层的输出logits形状为 (N, C)。 y_true: 真实标签形状为 (N,)。 返回: 梯度形状与 y_pred_logits 相同。 N, C y_pred_logits.shape # 1. 计算softmax概率 probs softmax_stable(y_pred_logits) # (N, C) # 2. 创建真实标签的one-hot编码 y_true_one_hot np.zeros_like(probs) y_true_one_hot[np.arange(N), y_true] 1 # (N, C) # 3. 计算梯度 probs - y_true_one_hot grad (probs - y_true_one_hot) / N # 除以N是因为我们计算的是平均损失的梯度 return grad5.3 梯度数值检验为了确保我们手动推导的梯度公式是正确的我们可以使用数值梯度检验的方法。这是调试自定义层或损失函数时至关重要的技巧。def numerical_gradient(f, x, eps1e-6): 计算函数f在点x处的数值梯度中心差分法更精确。 参数: f: 函数输入x输出标量损失。 x: 输入点numpy数组。 eps: 微小的扰动。 返回: 数值梯度形状与x相同。 grad np.zeros_like(x) # 使用迭代器遍历多维数组的每个元素 it np.nditer(x, flags[multi_index], op_flags[readwrite]) while not it.finished: idx it.multi_index original_val x[idx].copy() # 计算 f(x eps) x[idx] original_val eps f_plus f(x) # 计算 f(x - eps) x[idx] original_val - eps f_minus f(x) # 中心差分公式 grad[idx] (f_plus - f_minus) / (2 * eps) # 恢复原始值 x[idx] original_val it.iternext() return grad # 梯度检验示例 np.random.seed(42) N, C 3, 5 dummy_logits np.random.randn(N, C) * 0.1 # 小随机数 dummy_labels np.random.randint(0, C, size(N,)) # 定义一个包装函数固定标签只以logits为输入 def loss_wrapper(logits): return cross_entropy_loss(logits, dummy_labels) # 计算解析梯度我们推导的公式 analytic_grad cross_entropy_gradient(dummy_logits, dummy_labels) # 计算数值梯度 numeric_grad numerical_gradient(loss_wrapper, dummy_logits.copy()) # 比较两者差异 print(解析梯度形状:, analytic_grad.shape) print(数值梯度形状:, numeric_grad.shape) diff np.abs(analytic_grad - numeric_grad).max() print(f最大绝对差异: {diff}) # 通常差异在 1e-7 或更小可以认为梯度实现正确 if diff 1e-6: print(梯度检验通过) else: print(警告梯度实现可能有误差异过大。)运行这段代码你会看到解析梯度与数值梯度的差异极小通常在1e-7量级这验证了我们梯度公式的正确性。这个手动推导和验证的过程能让你对反向传播时到底在计算什么有“手感”层面的理解而不是仅仅停留在调用loss.backward()的层面。6. 高级话题与常见陷阱掌握了基础原理和实现后我们来看看在实际应用中会遇到哪些问题以及交叉熵的一些重要变体。6.1 数值稳定性Log-Sum-Exp技巧在上面的softmax_stable函数中我们使用了x - max(x)的技巧来避免exp溢出。但在计算交叉熵损失时我们有时会直接使用Log-Sum-Exp技巧来一步到位同时保证数值稳定。交叉熵损失L -log( exp(z_y) / Σ_j exp(z_j) ) -z_y log(Σ_j exp(z_j))直接计算log(Σ_j exp(z_j))仍然可能因为z_j很大而导致exp溢出。LSE技巧如下log(Σ_j exp(z_j)) max(z) log(Σ_j exp(z_j - max(z)))这样exp的指数部分最大为0确保了数值稳定。def cross_entropy_loss_stable(logits, labels): 使用Log-Sum-Exp技巧的数值稳定交叉熵计算。 N logits.shape[0] # 找到每个样本logits的最大值保持维度 (N, 1) max_vals np.max(logits, axis1, keepdimsTrue) # 稳定的log-sum-exp log_sum_exp max_vals np.log(np.sum(np.exp(logits - max_vals), axis1, keepdimsTrue)) # 获取正确类别的logit correct_logits logits[np.arange(N), labels].reshape(-1, 1) # 计算损失 losses -correct_logits log_sum_exp return np.mean(losses)这种实现方式在底层库如PyTorch, TensorFlow中广泛使用是生产级代码的标配。6.2 处理类别不平衡加权交叉熵与Focal Loss标准的交叉熵损失平等看待每一个样本。但在医学影像、缺陷检测等场景中正负样本或不同类别的数量可能极度不平衡。例如在肿瘤检测中正常样本负类可能占99%肿瘤样本正类只占1%。模型可能倾向于将所有样本都预测为负类从而轻松获得99%的准确率但这完全丧失了检测肿瘤的能力。解决方案1加权交叉熵为不同类别的损失项赋予不同的权重。损失函数变为L - Σ_i w_{y_i} * log(Q_{i, y_i})其中w_{y_i}是类别y_i的权重。通常权重与类别频率成反比即稀有类别的权重更大。在PyTorch中可以通过nn.CrossEntropyLoss(weightclass_weights)轻松实现。解决方案2Focal Loss这是何恺明团队在目标检测论文中提出的专门针对难易样本不平衡问题。其核心思想是降低那些已经被模型很好分类的高置信度样本的损失权重让训练更聚焦于难分的样本。FL(p_t) -α_t * (1 - p_t)^γ * log(p_t)其中p_t是模型对真实类别的预测概率。γ是调节因子通常0γ越大对易分样本的抑制越强。α_t是类别平衡因子。Focal Loss通过(1-p_t)^γ这个调制因子自动降低了高置信度样本的贡献。实操心得不要盲目使用Focal Loss。首先尝试加权交叉熵因为其超参数权重的意义更直观通常根据训练集类别频率的倒数来设置。Focal Loss引入了γ和α两个超参数调参更复杂。通常在简单数据集上标准交叉熵或加权交叉熵就足够了。只有在存在大量“简单背景”和少量“困难目标”的场景如密集目标检测Focal Loss的优势才非常明显。6.3 多标签分类与二元交叉熵我们之前讨论的都是单标签分类一个样本只属于一个类别。对于多标签分类一个样本可以同时属于多个类别比如一张图片包含“天空”、“云”、“树”我们需要使用二元交叉熵。此时对于每一个类别我们将其视为一个独立的二分类问题是或不是。模型最后一层通常使用sigmoid激活函数而非softmax为每个类别输出一个介于0到1之间的概率。损失函数是每个类别上二元交叉熵损失的总和或平均。BCE Loss - [y * log(ŷ) (1-y) * log(1-ŷ)]其中y是真实标签0或1ŷ是模型预测概率。在PyTorch中对应nn.BCELoss需要先sigmoid或nn.BCEWithLogitsLoss内置sigmoid数值更稳定。关键区别Softmax 交叉熵输出概率总和为1类别间存在竞争关系。适用于“互斥”分类。Sigmoid 二元交叉熵每个类别的概率独立总和不一定为1。适用于“非互斥”的多标签分类。混淆二者是一个常见错误。如果你在一个多标签任务上错误地使用了softmax模型会强迫所有类别的概率和为1导致学习目标混乱性能严重下降。6.4 标签平滑一种正则化技术标准交叉熵损失鼓励模型对正确类别的预测概率无限接近1对错误类别的预测概率无限接近0。这种“非黑即白”的目标在训练数据有噪声或类别本身存在模糊性时容易导致模型过度自信泛化能力下降。标签平滑通过修改真实标签的分布来缓解这个问题。我们将one-hot标签[0, 0, 1, 0]替换为混合分布[ε/(K-1), ε/(K-1), 1-ε, ε/(K-1)]其中K是类别总数ε是一个小常数如0.1。这样模型的目标不再是让正确类别概率达到1而是1-ε错误类别的目标也不再是0而是一个很小的正数ε/(K-1)。这相当于对模型进行了正则化防止其过度拟合训练数据中的特定标签通常能带来轻微的泛化性能提升。在PyTorch的nn.CrossEntropyLoss中可以通过label_smoothing参数直接启用。7. 总结与个人体会走完这一趟从统计原理到代码实现的旅程我们再回头看nn.CrossEntropyLoss()它不再是一个黑箱魔法而是一个有着坚实理论根基、经过精心设计的工具。理解交叉熵与极大似然估计的等价性不仅让我们明白了损失函数选择的必然性更让我们在模型出现问题时比如损失不下降、梯度爆炸有了从原理层面进行诊断的能力。我个人在项目中最深刻的几点体会是第一性原理思考每当接触一个新的损失函数或模型组件尝试去追溯其背后的统计学或信息论原理。比如了解Focal Loss是从解决类别不平衡和难易样本不平衡出发修改了标准交叉熵的权重分配策略这比死记硬背公式有效得多。梯度是灵魂损失函数的价值很大程度上体现在其梯度特性上。交叉熵的梯度(预测-真实)形式简洁、含义明确这是它优化效率高的根本原因。在自定义损失函数时一定要亲手推导并数值验证其梯度这是保证训练正确的关键。没有银弹交叉熵虽好但并非万能。面对类别极度不平衡、噪声标签、需要模型输出不确定性等场景标准交叉熵可能力不从心。此时了解加权交叉熵、Focal Loss、标签平滑乃至更复杂的如知识蒸馏中的KL散度损失等变体并理解其适用场景是资深从业者的必备技能。实践出真知理论推导和代码实现之间往往隔着“数值稳定性”这条鸿沟。log(0)导致-infexp(1000)导致inf这些在实际编码中必须处理。掌握像logsumexp、softmax_stable这样的数值稳定技巧是写出鲁棒代码的基础。最后建议你在下次训练分类模型时可以尝试一个小实验用相同的网络和数据集分别使用交叉熵损失和均方误差损失进行训练观察它们的损失下降曲线、收敛速度以及最终验证集准确率。这个直观的对比会让你对本文所阐述的理论优势有最切身的感受。机器学习的世界里把基础打牢把原理吃透就是在为未来解决更复杂问题积蓄最强大的力量。
返回列表