今天在学习《python深度学习》的时候,看到了这么一段话:

评估模型的重点是将数据划分为三个集合:训练集、验证集和测试集。在训练数据上训练模型,在验证数据上评估模型。一旦找到了最佳参数,就在测试数据上最后测试一次。
你可能会问,为什么不是两个集合:一个训练集和一个测试集?在训练集上训练模型,然后在测试集上评估模型。这样简单得多!

突然就钻了个牛角尖,觉得验证集和训练集本是出自一个数据集,而且在一轮epoch时都运行的是同一个模型,最后都会得到各自的预测值,通过各自的预测值都能计算出各自的损失和精度,那为什么更新参数时我们用的是验证集上的loss值和accuracy值,不用训练集上的。他俩的区别到底是什么,各自都有什么作用?

于是才发现自己虽然对整个神经网络的流程有一定的了解,但是对于其里面的具体运作还是有很大疑问。

在网上查找了一些资料之后,发现各个文章讲的都挺模糊,都有自己的一套体系,对于小白来说很难理解。但是经过不懈努力的查找,终于发现了一篇浅显易懂的文章。

神经网络15分钟入门!足够通俗易懂了吧 再结合其它一些资料对于神经网络的讲解,终于明白了训练集和验证集各自的作用:

每轮epoch模型都要在所有数据集(训练集+验证集)上跑一遍,分别得到各自的损失值和精度值,对于训练集上的损失值和精度值是用来更新参数的,train_loss=f(w1,w2,…,wn),运用梯度下降法;对于验证集上的损失值和精度值只是用来评估模型,当作参考,用来找图中过拟合的拐点,并不用于更新参数。

神经网络 性能测试方法有哪些 神经网络测试集的作用_神经网络 性能测试方法有哪些

另:随着epoch的增大,training loss会处于一直减小的状态,因为每次更新参数都是依照上一轮训练中得到的训练集上的损失值,所以训练的模型越来越适合训练集,但是在验证集上的表现并不是越来越好,当超过某个epoch后就会出现过拟合的情况,此时意味着模型越来越贴近于训练集但是远离了验证集,因此validation loss在出现一个最小值后会逐渐增大,这是所对应的epoch的模型就是我们要选择的适合的模型。

再附上原书中我认为比较抽象的解释:

原因在于开发模型时总是需要调节模型配置,比如选择层数或每层大小[这叫作模型的超参数(hyperparameter),以便与模型参数(即权重)区分开]。这个调节过程需要使用模型在验 证数据上的性能作为反馈信号。这个调节过程本质上就是一种学习:在某个参数空间中寻找良好的模型配置。因此,如果基于模型在验证集上的性能来调节模型配置,会很快导致模型在验 证集上过拟合,即使你并没有在验证集上直接训练模型也会如此。

造成这一现象的关键在于信息泄露(information leak)。每次基于模型在验证集上的性能来 调节模型超参数,都会有一些关于验证数据的信息泄露到模型中。如果对每个参数只调节一次, 那么泄露的信息很少,验证集仍然可以可靠地评估模型。但如果你多次重复这一过程(运行一 次实验,在验证集上评估,然后据此修改模型),那么将会有越来越多的关于验证集的信息泄露 到模型中。

最后,你得到的模型在验证集上的性能非常好(人为造成的),因为这正是你优化的目的。 你关心的是模型在全新数据上的性能,而不是在验证数据上的性能,因此你需要使用一个完全 不同的、前所未见的数据集来评估模型,它就是测试集。你的模型一定不能读取与测试集有关的任何信息,既使间接读取也不行。如果基于测试集性能来调节模型,那么对泛化能力的衡量是不准确的。