softmax 回归的简洁实现|线性神经网络|动手学深度学习

138 阅读3分钟

1. 尝试调整超参数,例如批量大小、迭代周期数和学习率,并查看结果。

lr_list = [0.1, 0.01, 0.001]
num_epochs_list = [10, 20, 50, 100, 200]

for lr in lr_list:
    for num_epochs in num_epochs_list:
        timer = d2l.Timer()

        # PyTorch不会隐式地调整输入的形状。因此,
        # 我们在线性层前定义了展平层(flatten),来调整网络输入的形状
        net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10))

        def init_weights(m):
            if type(m) == nn.Linear:
                nn.init.normal_(m.weight, std=0.01)

        net.apply(init_weights);

        loss = nn.CrossEntropyLoss(reduction='none')
        trainer = torch.optim.SGD(net.parameters(), lr)
        try:
            d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)
            # train_ch3_gpu(net, train_iter, test_iter, loss, num_epochs, trainer, device)
        except Exception as e:
            print(f'end with {e}')

        print(f'learning rate {lr}, num_epochs {num_epochs} cost time {timer.stop():.2f} sec')

learning_rate = 0.1

image.png

image.png

image.png

image.png

image.png

learning_rate = 0.01

image.png

image.png

image.png

image.png

image.png

learning_rate = 0.001

image.png

image.png

image.png

image.png

image.png

2. 增加迭代周期的数量。为什么测试精度会在一段时间后降低?我们怎么解决这个问题?

在使用softmax回归进行机器学习任务时,增加迭代周期(即训练模型的epoch数)可能会在一开始提高模型的测试精度,因为模型有更多的时间来学习数据的特征。然而,如果迭代周期过多,可能会出现以下问题导致测试精度降低:

  1. 过拟合(Overfitting):模型可能开始记忆训练数据中的特定样本,而不是学习泛化的模式。这会导致模型在训练集上表现良好,但在未见过的测试集上表现差。

  2. 梯度消失或爆炸:在很多epoch后,梯度可能会变得非常小(梯度消失),或者非常大(梯度爆炸),这会导致学习过程不稳定。

  3. 学习率设置:如果学习率太高,模型可能会在最优解附近“跳跃”,无法收敛到最优点。如果学习率太低,则可能导致收敛过慢,或者在到达最优点之前停止学习。

为了解决这些问题,可以采取以下措施:

  1. 早停(Early Stopping):监控验证集的性能,在验证集的性能不再提升时停止训练。

  2. 正则化:使用L1或L2正则化来惩罚模型权重的大小,减少过拟合。

  3. 学习率衰减:随着训练的进行逐渐减小学习率,这样可以使模型在训练后期更细致地调整权重。

  4. 使用验证集:使用一个单独的验证集来监控模型的泛化能力,并根据验证集的性能来调整超参数。

  5. 数据增强:增加训练数据的多样性,使模型学习到更泛化的特征。

  6. Dropout:在训练过程中随机丢弃(置零)一些神经元的输出,以减少模型对训练数据的依赖。

  7. 批量归一化(Batch Normalization):对输入数据进行归一化处理,以减少内部协变量偏移,加快训练速度,并提高模型的稳定性。

  8. 使用更复杂的模型:如果模型太小,可能没有足够的能力捕捉数据的所有特征,导致过拟合小数据集而非泛化。

  9. 使用预训练模型:利用在大型数据集上预训练的模型作为起点,通过迁移学习来提高性能。

  10. 模型集成:使用多个模型的预测结果进行集成,以提高泛化能力。

  11. 超参数优化:使用网格搜索、随机搜索或更高级的方法(如贝叶斯优化)来找到最佳的超参数组合。

通过这些策略,可以提高模型的泛化能力,避免过拟合,并在增加迭代周期的同时保持或提高测试精度。