复习
上一章节,我们学习了对误差损失的可视化和对第一个字符预测的准确率;
众所周知,深度模型养蛊的部分是在深度学习训练过程中的调参。这是在数据集上调参的过程。
模型的训练与认证
了解认识数据集并对其进行构造
训练集(train set) —— 用于模型拟合的数据样本。
验证集(development set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。
在神经网络中, 我们用验证数据集去寻找最优的网络深度(number of hidden layers),或者决定反向传播算法的停止点或者在神经网络中选择隐藏层神经元的数量;
在普通的机器学习中常用的交叉验证(Cross Validation) 就是把训练数据集本身再细分成不同的验证数据集去训练模型。
测试集 —— 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
显然验证集并不是刚需 ,在有需要的时候可以自己划分一部分出来,或者赛题有提供的时候可以利用。显然这次的赛题是有提供的。
测试集的作用
a)训练集直接参与了模型调参的过程,显然不能用来反映模型真实的能力(防止课本死记硬背的学生拥有最好的成绩,即防止过拟合)。
b)验证集参与了人工调参(超参数)的过程,也不能用来最终评判一个模型(刷题库的学生不能算是学习好的学生)。
c) 所以要通过最终的考试(测试集)来考察一个学(模)生(型)真正的能力(期末考试)。
但是仅凭一次考试就对模型的好坏进行评判显然是不合理的,所以接下来就要介绍交叉验证法
交叉检验法
作用是 尝试利用不同的训练集/验证集划分来对模型做多组不同的训练/验证,来应对单独测试结果过于片面以及训练数据不足的问题。(就像通过多次考试,才通知哪些学生是比较比较牛的)
交叉验证的做法就是将数据集粗略地分为比较均等不相交的k份,即
具体的步骤如下
-
随机将训练数据等分成k份,S1, S2, …, Sk。
-
对于每一个模型Mi,算法执行k次,每次选择一个Sj作为验证集,而其它作为训练集来训练模型Mi,把训练得到的模型在Sj上进行测试,这样一来,每次都会得到一个误差E,最后对k次得到的误差求平均,就可以得到模型Mi的泛化误差。
-
算法选择具有最小泛化误差的模型作为最终模型,并且在整个训练集上再次训练该模型,从而得到最终的模型。 K折交叉验证,其主要 的目的是为了选择不同的模型类型(比如一次线性模型、非线性模型、),而不是为了选择具体模型的具体参数。比如在BP神经网络中,其目的主要为了选择模型的层数、神经元的激活函数、每层模型的神经元个数(即所谓的超参数)。每一层网络神经元连接的最终权重是在模型选择(即K折交叉验证)之后,由全部的训练数据重新训练。
目的在模型选择,而非模型训练调整参数。
对k值的选取
K值的选取是一个偏差与方差的权衡:
K=1时,所有数据用于训练,容易过拟合;
K=N时,相当于留一法LOOCV (Leave-one-out cross-validation ).;
通常建议K=10.,2017年的一项研究给出了另一种经验式的选择方法[3],作者建议 且保证
模型的保存与加载
torch.save(model_object.state_dict(), 'model.pt')
model.load_state_dict(torch.load(' model.pt'))
模型的调参
画图分析是种不错调参学习率的方式:学习率过大,loss曲线可能会上升,或者不能一直下降,出现震荡情况,由于学习率较大,导致参数在最优点附近徘徊,loss大小一下大一下小,就是却无法到达最优点,容易拟合在局部最小值。学习率太小loss曲线可能下降速度过于缓慢。好的学习率loss呈平滑的下降曲线。
学习率代表了参数的更新步长,你走的距离越短当然不会错过每个最低点,但是耗时间。而且步长越小,越容易得到局部最优化(到了比较大的山谷,就出不去了),而太大了可能会直接越过全局最优点。
具体的步骤有
1.参数的初始化
2.激活函数
3.模型
4.优化函数
5.卷积步幅,池化
6.数据集,输入预处理和输出
7.目标函数
8.正则化
总结
模型的调参是个具有玄学的东西 ,作为小白具体的代码还是看不太懂不过还是多多看看前人文章。