model capacity
次方越高,模型能力越大,表达能力变强,或者搜索空间变大了。
AlexNet-> VGG-> ResNet 模型网络深度逐渐加深,参数量增多。
模型复杂度比真实数据的复杂度小,模型的表达能力不够,会出现欠拟合。
欠拟合的表现:训练acc和训练loss都表现不好;测试时候的acc也不好。
模型的复杂度比真实数据的复杂度高。
过拟合的表现:训练acc和训练loss都表现得很好,但是测试集上acc不好。泛化能力变差。
现实情况中,更容易出现过拟合的现象,因为计算机计算能力越来越强,可优化的网络非常深。
在training set上训练一个模型,在test set上测试 模型,选择过拟合前表现最好的一组模型参数(选择test acc最高时的时间戳下的模型参数)。
val set用于挑选模型;
test set不用于训练和评估的数据集。用于客观评价模型的泛化能力,test set一般不会给出。
注意:看到test set的性能后不能回过头来选择模型,unavaliable.
如何只得到train-test划分的数据集,那么需要人为地划分train数据集为train-val两个数据集。
torch.utils.data.random_split(train_db, [train_size, val_size[)
如果train:val:test = 5:1:1
那么有2/7的数据不能用于训练,那么如果考虑将验证集(val set)这1/7的数据也用于训练,那么可以使用K-fold交叉验证。
将train-val数据集合并分成N份,依次取第i份(i<=N)作为验证集,剩下的作为训练集来训练。
正则化(Regularization/Weight decay),迫使参数的范数接近于0(预测曲线变得平滑,迫使多项式前几项比较大-预测结果好,多项式后几项比较小,退化成较小次方的模型),减小模型复杂度。
torch.optim优化器实现L2正则化;
optim.SGD()中的weight-decay参数等于L2-regularization中的 λ \lambda λ参数。
pytorch中没有直接实现L1正则的类或函数,需要手动实现。
动量也称为惯性;
代码:
optim.SGD()中的momentum参数等于momentum算法中的 β \beta β参数。
设置学习率衰减的方式:
将optimizer丢给ReduceLROnPlateau管理
torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode=‘min’,
factor=0.1, patience=10, verbose=False,…)
patience:监听多少次loss没有减少的时候,衰减学习率;ReduceLROnPlateau.step()调用一次,监听一次;
factor:每次学习率衰减为原来的多少比例
StepLR(optimizer, step_size=30, gamma=0.1)
在test的时候没有dropout,是要使用net.eval()设置模型使用所有的参数进行预测,训练的时候使用net.train()设置可使用dropout。
最开始的梯度下降算法,使用所有数据的平均loss来计算参数梯度;但是加载全部数据对于内存压力比较大,存在内存不足的情况。
原始的Stochastic Gradient Descent,随机取一个样本来计算参数梯度;
现在的的Stochastic Gradient Descent,随机取一个batch样本来计算梯度;