【问题标题】:Hyper-parameter tuning and Over-fitting with Feed-Forward Neural Network - Mini-Batch Epoch and Cross Validation前馈神经网络的超参数调整和过拟合 - 小批量时代和交叉验证
【发布时间】:2020-03-25 18:12:38
【问题描述】:

我正在考虑为使用 PyTorch 实现的前馈神经网络 (FNN) 实施超参数调整方法。我最初的 FNN 模型名为 net,已使用带有 epochs 的小批量学习方法实现:

#Parameters
batch_size = 50 #larger batch size leads to over fitting
num_epochs = 1000 
learning_rate = 0.01 #was .01-AKA step size - The amount that the weights are updated during training
batch_no = len(x_train) // batch_size 

criterion = nn.CrossEntropyLoss()  #performance of a classification model whose output is a probability value between 0 and 1
optimizer = torch.optim.Adam(net.parameters(), lr=learning_rate)

for epoch in range(num_epochs):
    if epoch % 20 == 0:
        print('Epoch {}'.format(epoch+1))
    x_train, y_train = shuffle(x_train, y_train)
    # Mini batch learning - mini batch since batch size < n(batch gradient descent), but > 1 (stochastic gradient descent)
    for i in range(batch_no):
        start = i * batch_size
        end = start + batch_size
        x_var = Variable(torch.FloatTensor(x_train[start:end]))
        y_var = Variable(torch.LongTensor(y_train[start:end]))
        # Forward + Backward + Optimize
        optimizer.zero_grad()
        ypred_var = net(x_var)
        loss =criterion(ypred_var, y_var)
        loss.backward()
        optimizer.step()

我最后在一个单独的测试集上测试了我的模型。

我遇到了一种方法,它使用随机搜索来调整超参数以及实现 K 折交叉验证 (RandomizedSearchCV)。

我的问题是双重的(没有双关语!),首先是理论上的:k-fold 验证是必要的还是可以为小批量前馈神经网络增加任何好处?据我所见,小批量方法应该做大致相同的工作,停止过度拟合。

我还找到了一个很好的答案 here,但我不确定这是否专门针对小批量方法。

其次,如果k-fold不是必须的,有没有针对PyTorch的另一种超参数调优功能来避免手动创建?

【问题讨论】:

    标签: python machine-learning neural-network pytorch


    【解决方案1】:
    • k-fold 交叉验证通常在您拥有非常小的数据集时很有用。因此,如果您在 CIFAR10 之类的数据集上进行训练(很大,有 60000 张图像),那么您不需要 k 折交叉验证。
    • k 折交叉验证的想法是查看模型性能(泛化)如何随着不同的数据子集用于训练和测试而变化。当您的数据非常少时,这变得很重要。但是,对于大型数据集,测试数据集上的度量结果足以测试模型的泛化性。
    • 因此,是否需要 k 折交叉验证取决于数据集的大小。这与您使用的型号无关。
    • 如果您查看深度学习一书的this chapter(这在this link 中首次引用):

    小批量可以提供正则化效果(Wilson 和 Martinez,2003 年),这可能是因为它们在学习过程中添加了噪音。泛化误差通常最适合批量大小为 1。由于梯度估计值的高方差,使用如此小的批量大小进行训练可能需要较小的学习率来保持稳定性。由于需要执行更多步骤,因此总运行时间可能非常高,这既是因为学习率降低了,也是因为观察整个训练集需要更多的步骤。

    • 所以,是的,小批量训练在一定程度上会产生正则化效果(减少过拟合)。
    • 没有内置的超参数调整(至少在撰写此答案时),但许多开发人员已经为此目的开发了工具 (for example)。您可以通过搜索找到更多此类工具。 This question 的答案列出了很多此类工具。

    【讨论】:

      猜你喜欢
      • 2023-02-01
      • 2021-02-06
      • 2023-04-04
      • 2020-09-29
      • 2022-06-15
      • 2018-05-22
      • 2018-10-20
      • 2020-08-13
      • 1970-01-01
      相关资源
      最近更新 更多