关于神经网络中的网络训练过程中的验证集validation_data的认识

本文探讨了如何使用规范化技术减轻神经网络中的过匹配问题,并通过实验展示了规范化如何改善模型的泛化能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

validation_data中包含了 幅数字图像,这些图像和训练数据集中的 幅图像以及测试数据集中的 幅都不相同。我们会使用 validation_data 来防止过匹配。我们会使用和上面应用在 test_data 的策略。我们每个回合都计算在 validation_data 上的分类准确度。一旦分类准确度已经饱和,就停止训练。这个策略被称为 提前停止(Early stopping)。当然,实际应用中,我们不会立即知道什么时候准确度会饱和。相反,我们会一直训练知道我们确信准确度已经饱和。

这里需要一些判定标准来确定什么时候停止。在我前面的图中,将 回合看成是饱和的地方。可能这有点太悲观了。因为神经网络有时候会训练过程中处在一个平原期,然后又开始提升。如果在 回合后,性能又开始提升(也许只是一些少量提升),那我也不会诧异。所以,在提前停止中采取一点激进的策略也是可以的。

为何要使用 validation_data 来替代 test_data 防止过匹配问题?实际上,这是一个更为一般的策略的一部分,这个一般的策略就是使用 validation_data 来衡量不同的超参数(如训练回合,学习率,最好的网络架构等等)的选择的效果。我们使用这样方法来找到超参数的合适值。因此,尽管到现在我并没有提及这点,但其实本书前面已经稍微介绍了一些超参数选择的方法。

当然,这对于我们前面关于 validation_data 取代 test_data 来防止过匹配的原因仍旧没有回答。实际上,有一个更加一般的问题,就是为何用validation_data 取代 test_data 来设置更好的超参数?为了理解这点,想想当设置超参数时,我们想要尝试许多不同的超参数选择。如果我们设置超参数是基于 test_data 的话,可能最终我们就会得到过匹配于 test_data 的超参数。也就是说,我们可能会找到那些 符合 test_data 特点的超参数,但是网络的性能并不能够泛化到其他数据集合上。我们借助 validation_data 来克服这个问题。然后一旦获得了想要的超参数,最终我们就使用 test_data 进行准确度测量。这给了我们在 test_data 上结果是一个网络泛化能力真正的度量方式的信心。换言之,你可以将验证集看成是一种特殊的训练数据集能够帮助我们学习好的超参数。这种寻找好的超参数的观点有时候被称为 hold out 方法,因为 validation_data 是从训练集中保留出来的一部分。

在实际应用中,甚至在衡量了测试集上的性能后,我们可能也会改变想法并去尝试另外的方法——也许是一种不同的网络架构——这将会引入寻找新的超参数的的过程。如果我们这样做,难道不会产生过匹配于 test_data 的困境么?我们是不是需要一种潜在无限大的数据集的回归,这样才能够确信模型能够泛化?去除这样的疑惑其实是一个深刻而困难的问题。但是对实际应用的目标,我们不会担心太多。相反,我们会继续采用基于 training_data, validation_data, and test_data 的基本 hold out 方法。


如你所见,测试集和训练集上的准确度相比我们使用 个训练数据时相差更小。特别地,在训练数据上的最佳的分类准确度 97.86% 只比测试集上的 95.33% 准确度高一点点。而之前的例子中,这个差距是 17.73%!过匹配仍然发生了,但是已经减轻了不少。我们的网络从训练数据上更好地泛化到了测试数据上。一般来说,最好的降低过匹配的方式之一就是增加训练样本的量。有了足够的训练数据,就算是一个规模非常大的网络也不大容易过匹配。不幸的是,训练数据其实是很难或者很昂贵的资源,所以这不是一种太切实际的选择。

规范化

增加训练样本的数量是一种减轻过匹配的方法。还有其他的一下方法能够减轻过匹配的程度么?一种可行的方式就是降低网络的规模。然而,大的网络拥有一种比小网络更强的潜力,所以这里存在一种应用冗余性的选项。

幸运的是,还有其他的技术能够缓解过匹配,即使我们只有一个固定的网络和固定的训练集合。这种技术就是规范化。本节,我会给出一种最为常用的规范化手段——有时候被称为权重下降(weight decay)或者 L2规范化。L2 规范化的想法是增加一个额外的项到代价函数上,这个项叫做 规范化 项。下面是规范化交叉熵:

训练集上的代价函数持续下降,和前面无规范化的情况一样的规律:


但是这里测试集上的准确度是随着回合次数持续增加的:


显然,规范化的使用能够解决过匹配的问题。而且,准确度相当搞了,最高处达到了 87.1%,相较于之前的 82.27%。因此,我们几乎可以确信持续训练会有更加好的结果。实验起来,规范化让网络具有更好的泛化能力,显著地减轻了过匹配的效果。

+

如果我们换成全部的训练数据进行训练呢?当然,我们之前已经看到过匹配在大规模的数据上其实不是那么明显了。那规范化能不能起到相应的作用呢?保持超参数和之前一样。不过我们这里需要改变规范化参数。原因在于训练数据的大小已经从 改成了 ,这个会改变权重下降因子 。如果我们持续使用 就会产生很小的权重下降,因此就将规范化的效果降低很多。我们通过将 来补偿这种下降。


参考:https://tigerneil.gitbooks.io/neural-networks-and-deep-learning-zh/content/chapter3a.html

<think>嗯,用户想了解在MATLAB中训练神经网络时如何设置训练集和测试集的loss对比。首先,我得回想一下MATLAB里神经网络的基本流程。通常,用户会用nntraintool或者trainNetwork函数,可能还涉及到数据划分的问题。 用户提到训练集和测试集的loss对比,这可能涉及到过拟合或欠拟合的问题。首先需要确认用户是否了解过拟合的概念,但可能不需要深入解释,因为问题比较具体。接下来,我需要考虑数据划分的方法。MATLAB中常用的有dividerand、divideblock和divideint这些函数,或者直接使用crossvalind进行交叉验证。另外,在训练选项里,比如trainNetwork的trainingOptions中,有ValidationData参数,可以设置验证集,这里验证集可能被用户称为测试集。 然后,训练过程中会输出训练损失和验证损失,用户可能需要可视化这些结果。可能涉及到训练完成后如何提取这些损失值,比如使用trainingInfo结构体。然后,如何绘制训练和验证损失的曲线,对比两者的趋势,判断模型是否过拟合。 还需要考虑数据预处理的问题,比如归一化,是否在划分数据前进行,这会影响结果的准确性。另外,可能用户在使用某些内置的网络结构,比如LSTM或CNN,不同的网络结构在数据划分上是否有特别需要注意的地方。 可能用户遇到的问题是训练损失下降但测试损失上升,这时候需要调整正则化参数,比如L2正则化,或者使用dropout层。这些在MATLAB中可以通过网络层参数设置,比如fullyConnectedLayer的'WeightLearnRateFactor'或者添加dropout层。 需要一步步引导用户如何操作,包括数据划分、网络定义、训练选项设置、训练过程监控和结果分析。可能还需要提醒用户注意数据泄露的问题,确保验证集或测试集的数据没有参与训练。 另外,用户可能对训练过程中的输出信息不太清楚,需要解释trainingInfo中的各个字段,比如TrainingLoss和ValidationLoss,以及如何访问这些数据。同时,可能还需要提到使用plot函数来绘制损失曲线,并解释曲线的含义,比如早停法(early stopping)的依据。 总结下来,回答的结构应该是先介绍数据划分方法,再说明如何在训练中设置验证集,然后展示如何获取并可视化损失曲线,最后分析结果和可能的调整策略。需要确保步骤清晰,代码示例正确,并且解释每个步骤的目的,帮助用户理解如何对比训练集和测试集的loss,从而优化模型。</think>在MATLAB中训练神经网络时,训练集与测试集(或验证集)的损失对比是评估模型泛化能力的重要指标。以下为分步说明: --- ### **1. 数据划分** MATLAB中常用以下方法划分数据集: - **手动划分**(适用于自定义比例): ```matlab % 假设数据为X(特征)和Y(标签) [trainInd, valInd, testInd] = dividerand(totalSamples, 0.7, 0.15, 0.15); % 70%训练,15%验证,15%测试 XTrain = X(:, trainInd); YTrain = Y(:, trainInd); XVal = X(:, valInd); YVal = Y(:, valInd); ``` - **自动划分**(通过`trainingOptions`指定): ```matlab options = trainingOptions('adam', ... 'ValidationData', {XVal, YVal}, ... % 显式指定验证集 'ValidationFrequency', 50, ... % 每50次迭代验证一次 'Plots', 'training-progress'); % 自动绘制损失曲线 ``` --- ### **2. 定义网络结构** 以简单全连接网络为例: ```matlab layers = [ featureInputLayer(inputSize) fullyConnectedLayer(128) reluLayer dropoutLayer(0.5) % 添加正则化防止过拟合 fullyConnectedLayer(outputSize) softmaxLayer classificationLayer]; ``` --- ### **3. 训练网络并监控损失** ```matlab [net, info] = trainNetwork(XTrain, YTrain, layers, options); ``` - **输出参数`info`**:包含训练过程的详细记录: - `info.TrainingLoss`:训练集损失曲线 - `info.ValidationLoss`:验证集损失曲线 --- ### **4. 可视化损失对比** 手动绘制对比图: ```matlab figure; plot(info.TrainingLoss, 'b-', 'LineWidth', 1.5); hold on; plot(info.ValidationLoss, 'r--', 'LineWidth', 1.5); xlabel('迭代次数'); ylabel('损失值'); legend('训练集损失', '验证集损失'); title('训练集 vs 验证集损失对比'); grid on; ``` --- ### **5. 关键分析场景** #### **(1) 理想情况** - 训练损失和验证损失均下降 → 模型正常收敛 $$ \text{训练损失} \approx \text{验证损失} $$ #### **(2) 过拟合** - 训练损失下降,验证损失上升 → 模型过度拟合训练数据 $$ \text{训练损失} \downarrow \quad \text{但} \quad \text{验证损失} \uparrow $$ **解决方法**:增加Dropout层、L2正则化、减少网络复杂度。 #### **(3) 欠拟合** - 训练损失和验证损失均较高 → 模型能力不足 $$ \text{训练损失} \approx \text{验证损失} \quad \text{且值较大} $$ **解决方法**:增加网络层数、调整超参数(学习率、批次大小)。 --- ### **6. 补充技巧** - **早停法(Early Stopping)**:通过`trainingOptions`设置: ```matlab options = trainingOptions('adam', ... 'ValidationPatience', 10); % 若验证损失连续10次未下降,则停止训练 ``` - **数据标准化**:对输入数据归一化(如`zscore(X)`)可加速收敛。 --- 通过对比训练集和测试集的损失曲线,能够直观判断模型是否存在过拟合/欠拟合问题,并指导后续调参优化。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值