Python 分批培训会导致更多的过度装配

Python 分批培训会导致更多的过度装配,python,machine-learning,neural-network,pytorch,training-data,Python,Machine Learning,Neural Network,Pytorch,Training Data,我正在训练一个序列到序列seq2seq模型,对于输入序列长度,我有不同的值要训练 对于值10和15,我得到了可接受的结果,但当我尝试使用20进行训练时,我会出现内存错误,因此我将训练切换为分批训练,但模型过度拟合和验证丢失会爆炸,即使累积梯度,我也会得到相同的行为,因此我正在寻找提示并找到更准确的方法来进行更新 以下是我的培训功能,仅适用于批次部分: 如果批次大小不是无: k=lenlistnp.arange0,X_列张量_1.size[0]//批量大小-1,批量大小 对于rangenum_历元

我正在训练一个序列到序列seq2seq模型,对于输入序列长度,我有不同的值要训练

对于值10和15,我得到了可接受的结果,但当我尝试使用20进行训练时,我会出现内存错误,因此我将训练切换为分批训练,但模型过度拟合和验证丢失会爆炸,即使累积梯度,我也会得到相同的行为,因此我正在寻找提示并找到更准确的方法来进行更新

以下是我的培训功能,仅适用于批次部分:

如果批次大小不是无: k=lenlistnp.arange0,X_列张量_1.size[0]//批量大小-1,批量大小 对于rangenum_历元中的历元: 优化程序0\u梯度 历元损失=0 对于listnp.arange0中的i,X_train_tensor_1.size[0]//批处理大小-1,批处理大小:通过使用等距批处理直到最后一个,它比直接使用X.size[0]快得多 序列=X序列张量[i:i+批次大小,:,:]。重塑-1,序列长度,输入大小。todevice 标签=y列张量[i:i+批次大小,:,:]。重塑-1,序列长度,输出大小。todevice 前传 输出=模型序列 损耗=标准输出、标签 历元损失+=损失项目 逆向优化 落后 优化步骤 历元损耗=历元损耗/k 模型评估 验证损失,评估模型,X检验,硬张量,y检验,硬张量 模型火车 培训损失日志 打印'Epoch[{}/{}],列MSELoss:{},验证:{},格式Epoch+1,num_Epoch,Epoch_loss,验证_loss 编辑: 以下是我正在培训的参数:

批量大小=1024 num_epochs=25000 学习率=10e-04 优化器=torch.optim.Adammodel.parameters,lr=学习率 标准=nn.mselossreduce='mean'
批量大小影响正则化。一次只训练一个例子是非常嘈杂的,这使得它更难过度适应。成批培训可以使一切顺利进行,从而更容易过度适应。回到正规化:

小批量添加正则化。 较大的批次会减少正则化。 我也很好奇你的学习率。每次调用loss.backward都会累积梯度。如果您将学习速率设置为一次只学习一个示例,而不是将其降低到批量累积的程度,则会发生以下两种情况之一

对于现在累积的梯度,学习率将太高,训练将发散,训练和验证错误都将爆发

学习率不会太高,也不会有任何分歧。这种模式只会训练得更快更有效。如果模型太大,无法拟合数据,则训练误差将变为0,但验证误差将因过度拟合而爆发

更新

下面是关于梯度累积的更多细节

每次调用loss.backward都会累积渐变,直到您使用optimizer.zero\u grad重置它。当您调用optimizer.step时,将根据它积累的内容对其进行操作

按照编写代码的方式,每次通过内部循环时都调用loss.backward,然后在重置之前调用外部循环中的optimizer.step。所以梯度是累积的,也就是说,在批次中的所有示例上,而不是一次一个示例

在大多数假设下,这将使批次累积梯度大于单个示例的梯度。如果梯度全部对齐,对于B批,它将增大B倍。如果渐变是相同的,那么它将更像是sqrtB乘以更大的值

如果你没有考虑到这一点,那么你已经通过这个因素有效地提高了你的学习率。更大批量的平滑效果将缓解其中的一些问题,从而可以容忍更高的学习率。批量越大,正则化程度越低,学习率越高,正则化程度越高。但这将不是一个完美的匹配,以补偿,所以你仍然想相应地调整

通常,无论何时更改批处理大小,您都需要重新调整学习速率以进行补偿


Leslie N.Smith写了一些关于超参数调优方法的优秀论文。一个很好的起点是。他建议您从阅读图表开始,这些图表做得非常好。

批量大小影响正则化。一次只训练一个例子是非常嘈杂的,这使得它更难过度适应。成批培训可以使一切顺利进行,从而更容易过度适应。回到正规化:

小批量添加正则化。 较大的批次会减少正则化。 我也很好奇你的学习率。每一次呼叫都是失败的 将累积梯度。如果您将学习速率设置为一次只学习一个示例,而不是将其降低到批量累积的程度,则会发生以下两种情况之一

对于现在累积的梯度,学习率将太高,训练将发散,训练和验证错误都将爆发

学习率不会太高,也不会有任何分歧。这种模式只会训练得更快更有效。如果模型太大,无法拟合数据,则训练误差将变为0,但验证误差将因过度拟合而爆发

更新

下面是关于梯度累积的更多细节

每次调用loss.backward都会累积渐变,直到您使用optimizer.zero\u grad重置它。当您调用optimizer.step时,将根据它积累的内容对其进行操作

按照编写代码的方式,每次通过内部循环时都调用loss.backward,然后在重置之前调用外部循环中的optimizer.step。所以梯度是累积的,也就是说,在批次中的所有示例上,而不是一次一个示例

在大多数假设下,这将使批次累积梯度大于单个示例的梯度。如果梯度全部对齐,对于B批,它将增大B倍。如果渐变是相同的,那么它将更像是sqrtB乘以更大的值

如果你没有考虑到这一点,那么你已经通过这个因素有效地提高了你的学习率。更大批量的平滑效果将缓解其中的一些问题,从而可以容忍更高的学习率。批量越大,正则化程度越低,学习率越高,正则化程度越高。但这将不是一个完美的匹配,以补偿,所以你仍然想相应地调整

通常,无论何时更改批处理大小,您都需要重新调整学习速率以进行补偿



Leslie N.Smith写了一些关于超参数调优方法的优秀论文。一个很好的起点是。他建议您从阅读图表开始,这些图表做得非常好。

您的批量大小是多少?如果批量很小,那么就好像您正在逐个查看每个单词,因此您的模型将过适合。根据您的计算机内存,我建议批处理大小为32/64或2^{I}的倍数。出于好奇,您当前的批处理大小是多少?您可以同时发布内存错误吗?因为理解和使用它可以帮助重现问题。您使用哪种优化器?根据相关错误,请始终记住:有多个选项需要处理,但更合适的解决方案是,这是因为小批量数据不适合GPU内存。只要减少批量,它肯定会工作。当我为cifar10数据集设置batch size=256时,我得到了相同的错误;然后我将批量大小设置为128,就解决了这个问题。尝试将批处理大小从1024减少到512。看看它是否有效。你的批量大小是多少?如果你的批量很小,那么它就好像你一个接一个地看每个单词,因此你的模型会过适合。根据您的计算机内存,我建议批处理大小为32/64或2^{I}的倍数。出于好奇,您当前的批处理大小是多少?您可以同时发布内存错误吗?因为理解和使用它可以帮助重现问题。您使用哪种优化器?根据相关错误,请始终记住:有多个选项需要处理,但更合适的解决方案是,这是因为小批量数据不适合GPU内存。只要减少批量,它肯定会工作。当我为cifar10数据集设置batch size=256时,我得到了相同的错误;然后我将批量大小设置为128,就解决了这个问题。尝试将批处理大小从1024减少到512。看看它是否有效。我对这件事的所有研究都让我想到了正规化的话题。你的回答也表明了这一点,如果你能详细说明第一点,学习率会很高,对于现在累积的梯度,这将非常有帮助。@YehdhihANNA我很高兴这是在正确的轨道上。我已经更新了我的答案,增加了梯度累积的细节。让我知道如果你需要任何额外的澄清!非常感谢您提供extrq的详细信息。顺便说一句,你可以把一个重新调整学习率的教程链接放在adam optimizer默认情况下不是这样做的吗?这实际上是一个常见的误解。Adam将帮助网络的不同部分进行同步调整和训练,但仍有必要调整整体学习率。我已经用我最喜欢的关于这个问题的论文更新了我的答案。这些文章将是一个很大的帮助:| |。我对这个问题的所有研究都让我找到了正规化的话题。你的回答也表明了这一点,如果你能对第一点做进一步的阐述,在这一点上,学习率会很高
至少会很有帮助。@YehdhihANNA我很高兴这是在正确的轨道上。我已经更新了我的答案,增加了梯度累积的细节。让我知道如果你需要任何额外的澄清!非常感谢您提供extrq的详细信息。顺便说一句,你可以把一个重新调整学习率的教程链接放在adam optimizer默认情况下不是这样做的吗?这实际上是一个常见的误解。Adam将帮助网络的不同部分进行同步调整和训练,但仍有必要调整整体学习率。我已经用我最喜欢的论文更新了我的答案。这些文章会很有帮助:| |。