1. 数据集
数据集涉及到训练集(train data)、验证集(validation data)和测试集(test data)。
利用训练集(train data)来训练出最好的网络权重,但怎么保证训练过程中参数的更新方向是有效的呢?于是用验证集(validation data)在训练的时候边训练边验证,相当于训练的时候是根据验证集的效果得到反馈,继而可以及时地往对的方向更新权重参数。
举个例子,网络模型就是需要拿着你给的一大堆数据在黑暗中摸索出一条可以到达数据对应标签的路径,怎么保证这个摸索过程是有效可行的呢?有可能一摸黑就偏离大道了。验证集就像一个黑暗中的提醒者,一旦你没训练好,它就喊一句,偏了偏了,这时候你就能及时调整,走向正确的道路。
测试集(test data)则是对训练好的网络进行测试,看看你最终训练完成的模型效果怎么样。
还是上面那个例子,训练结束了就好比天亮了,测试集就是一个拿着标尺的检查者,它能够清楚定量地对你摸黑走出的路进行评估。
当然,还是下面这个经典的比喻更好。
- 训练集相当于上课学知识
- 验证集相当于课后的的练习题,用来纠正和强化学到的知识
- 测试集相当于期末考试,用来最终评估学习效果
说完了含义,再来说说划分。
常用的分配比例是训练集:验证集:测试集=6:2:2
这种划分会带来一些问题。想想看,一旦选定了划分比例,就只能对整个数据集中训练集的那部分进行训练,如果没有提前划分好,导致训练集中的数据没有囊括所有类型,那最后得到的模型肯定是无法对不同情形的样本进行拟合或分类的。也就是说这种将数据集划分成训练集和测试集的验证方式很大程度上依赖于你的划分方式,无法对所有的样本数据进行训练。
因此有了交叉验证(cross-validation)法。
可以看到,交叉验证是将已经划分好的train data再进行细分,比如5折交叉验证会将train data细分成5份,然后在这5份里选一份作为验证集,剩下的作为训练集,这一个iteration结束之后会计算准确率,再更换验证集,重复5次,直到所有的小fold都作为过一次验证集。最后取这5次准确率最高的模型。
按照前面考试的例子,交叉验证就是将验证集进行了扩展,以前可能是月考模拟,现在是日考模拟,但最终的测试集(高考)还是有且仅有一次的。
2. 训练
初始化
数据集准备好之后就是选取网络模型并进行权重参数的初始化。由于参数初始化是随机的,这会导致相同的超参数模型得到的结果有细微不同,也就是无法重现模型,因此有需要可以固定随机数种子再初始化。
损失函数
损失函数衡量的是模型的输出和真实预期之间的差距。
优化方式
优化就是寻找一种方式,使得损失函数越小越好。
典型的比如基于梯度的SGD(随机梯度 下降),在这种方法里为了求梯度,需要用到反向传播算法。
关于batch size,epoch,iteration
首先epoch和iteration衡量的都是训练次数,不过epoch是整个train data训练完才计一次数。而iteration是batch size大小的样本训练完计数一次。
batch衡量的是样本大小,是train data中的一小部分数据。
比如一个训练集大小为2000,batch size是200,那么一个epoch需要10个iteration才能完成。