使用前馈神经网络进行超参数调整和过度拟合-最小批量时间和交叉验证

问题描述 投票:0回答:1

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

#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倍验证,或者可以为小批量前馈神经网络增加任何好处?从我看到的结果来看,小批量方法应该完成大致相同的工作,从而避免过度拟合。

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

第二,如果不需要k倍,PyTorch是否有另一个超参数调整功能,以避免手动创建一个?

python machine-learning neural-network pytorch
1个回答
0
投票
    当数据集非常小时,
  • k倍交叉验证通常很有用。因此,如果您正在使用像CIFAR10这样的数据集进行训练(该图像很大,有60000张图像),那么就不需要k倍交叉验证。
  • k折交叉验证的想法是,随着不同的数据子集用于训练和测试,模型性能(通用化)如何变化。当您拥有非常少的数据时,这变得很重要。但是,对于大型数据集,测试数据集上的度量结果足以测试模型的泛化。
  • 因此,是否需要k倍交叉验证取决于数据集的大小。它不取决于您使用什么模型。
  • 如果您查看深度学习书的this chapter(这在this link中首次引用):

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

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

推荐问答