模型结构的改变和超参数调节技巧
通俗解释: 训练误差就是由训练集上表现出的误差, 而泛化误差为测试集上表现出的误差.
由于训练误差是在训练集上通过最小化训练误差不断迭代得到的, 所以训练误差的期望<=泛化误差的期望.
所以训练集上的模型表现一般会优于测试集上的表现. 因此, 一味地降低训练误差并不意味着泛化误差一定会降低.
机器学习模型应关注降低泛化误差!
通常需要评估若干候选模型的表现并从中选择模型。这一过程称为模型选择(model selection)
可供选择的候选模型可以是有着不同超参数的同类模型.
比如可以选择隐藏层的个数
, 每个隐藏层中隐藏单元个数和激活函数
.
训练集: 在实际中获取的真实数据集合.
测试集: 在训练集中分割出来一部分作为测试集, 验证模型的精度.
验证集: 严格意义上来讲, 测试集只能使用一次, 而不能调参, 所以再扣除测试集和训练集之后, 也会分割出一部分作为验证集.
K折交叉验证: 防止预留太多验证数据(测试数据) , 而导致训练数据不够所采用的一种方法.
在K-折交叉验证中,我们把原始训练数据集分割成K个不重合的子数据集,然后我们做K次模型训练和验证。每一次,我们使用一个子数据集验证模型,并使用其他K−1个子数据集来训练模型。在这K次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这K次训练误差和验证误差分别求平均。
模型训练中经常出现两类经典问题:
欠拟合: 模型无法得到较低的训练误差.
过拟合: 模型的训练误差远小于它在测试数据集上的误差.
有很多因素可能导致这两种拟合问题, 这里重点讨论以下两个因素: 模型的复杂度和训练数据集的大小
.
关于模型复杂度和训练集大小对学习的影响的详细理论分析可参见这篇博客
以一个高阶多项式函数模型为例, 它的模型参数更多, 模型函数的选择空间更大, 所以高阶多项式函数比低阶多项式函数的复杂度更高.
模型复杂度对欠拟合和过拟合的影响图如下:
从上图可以看出, 给定训练数据集,如果模型的复杂度过低,很容易出现欠拟合;如果模型复杂度过高,很容易出现过拟合。应对欠拟合和过拟合的一个办法是针对数据集选择合适复杂度的模型。
影响欠拟合和过拟合的另一个重要因素是训练数据集的大小.
一般来说,如果训练数据集中样本数过少,特别是比模型参数数量(按元素计)更少时,过拟合更容易发生.
所以在计算资源允许的范围内, 训练数据集越大越好
.
前面几节里我们使用了小批量随机梯度下降的优化算法来训练模型。
在实现中,我们只提供了模型的正向传播(forward propagation)的计算,即对输入计算模型输出,然后通过autograd模块来调用系统自动生成的backward函数计算梯度;
基于反向传播(back-propagation)算法的自动求梯度极大简化了深度学习模型训练算法的实现;
在训练深度学习模型时,“正向传播和反向传播之间相互依赖"。
正向传播沿着从输入层到输出层的顺序,依次计算并存储神经网络的中间变量。
正向传播的计算可能依赖于模型参数的当前值,而这些模型参数是在反向传播的梯度计算后通过优化算法迭代的.
反向传播沿着从输出层到输入层的顺序,依次计算并存储神经网络中间变量和参数的梯度。
反向传播的梯度计算可能依赖于各变量的当前值,而这些变量的当前值是通过正向传播计算得到的.
`因此,在模型参数初始化完成后,我们交替地进行正向传播和反向传播,并根据反向传播计算的梯度迭代模型参数。`
深度模型有关数值稳定性的典型问题是衰减(vanishing)和爆炸(explosion)。
1. 当神经我那个罗的层数较多时, 模型的数值稳定性容易变差;
2. 通常将神经网络的模型参数、特别是权重参数,需要进行随机初始化(系统随机初始化,或Xavier随机初始化);