模型的泛化能力
机器学习的目标是发现模式(pattern)。
所以这需要确定模型是真正发现了泛化的模式还是简单的记住了数据。
先讲个小故事,我们大三那年参加比赛,用机器学习写了个语言识别,虽然准确率很低,只有50%。当时比赛一个评委不信那是机器学习写的,一口咬定我们是写的数据库比对……
泛化和记住数据有什么区别呢?
就好像给AB两个学生一堆数学资料让他学习。期末考试的时候,如果出原题,两个人都能答100分,这个你没办法区别他们学的好坏。但是如果重新出题,A不及格B90分,那你就可以确定:A只是死记硬背记住原题,而B是真正地理解了解题思路。
A就是记住数据,B就是泛化。
训练误差和泛化误差
训练误差(training error)是指:我们的模型在训练数据集上计算得到的误差。
泛化误差(generalization error)是指:当我们将模型应用在同样从原始样本的分布中抽取的无限多的数据样本时,我们模型误差的期望。
泛化误差我们无法准确计算,因为面对未知的期末考试题,你永远不可能知道自己能得几分。
模型复杂性
训练样本可以理解为给你多少学习资料。而模型规模可以理解为你的背题能力。记住是背题能力不是理解能力。现在可以认为$背题能力+理解能力=1$。当你的精力都去背题了,你就无暇顾及去理解了。
当我们的训练样本和模型规模相匹配的时候,我们或许能可以让训练误差和泛化误差相接近。
但是当模型过于复杂而样本很少的时候,我们预计训练误差会下降,但泛化误差会增大。(过拟合)
就相当于你都去背题了,面对原题答得很好。但是理解能力不行,不出原题你就分很低。
影响模型泛化的因素
- 可调整参数的数量。当可调整参数的数量很大时,模型往往更容易过拟合。
- 参数采用的值。当权重的取值范围较大时,模型可能更容易过拟合。
- 训练样本的数量。即使你的模型很简单,也很容易过拟合只包含一两个样本的数据集。而过拟合一个有数百万个样本的数据集则需要一个极其灵活的模型。
缩小训练误差和泛化误差的差异
为了缩小训练和测试性能之间的差距。其实现实来讲,欠拟合和过拟合我们更应该考虑怎么防止过拟合。所以这个标题就可以改为怎么防止过拟合。
-
针对可调整参数的数量:
可调参数数量越多就是模型越复杂。维持模型的简单性就是模型以较小维度的形式出现。选择模型的时候要选择适宜维度的模型。
-
训练样本的数量。这个和第一个一样,针对训练样本规模选择合适的模型。
-
参数采用的值:
另一个简单性就是限制参数的取值范围,那就涉及到正则化。
-
补充:还有另一个角度,是保持平滑性,即函数不应该对其输入的微小变化敏感。即dropout。
正则化 | 权重衰退推导
这一部分我是参考的《动手学深度学习》。原书写的是weight decay,也就是权重衰退,我是自己把标题加了正则化。因为我入门看的是吴恩达,李沐老师讲了半天之后我发现?恩?不是和吴恩达讲正则化那部分讲的同一个东西吗,所以我就自己加上了正则化。
不过这里用到的$L_2$范数只是正则化的一种。
在训练参数化机器学习模型时,权重衰减(通常称为$L_2$正则化)是最广泛使用的正则化的技术之一。
就是给损失函数加上其权重的$L_2$范数,将原来的训练目标最小化训练标签上的预测损失,调整为最小化预测损失和惩罚项之和。
为了让求导之后更好看,我们也给正则项前变加上二分之一。 $$ L(\mathbf{w}, b) + \frac{\lambda}{2} |\mathbf{w}|^2 $$
其中 $$ L(\mathbf{w}, b) = \frac{1}{n}\sum_{i=1}^n \frac{1}{2}\left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)^2. $$
对mini-batch来说权重更新过程如下: $$ \begin{aligned} \mathbf{w} \leftarrow \mathbf{w} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{\mathbf{w}} l^{(i)}(\mathbf{w}, b) = \mathbf{w} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \mathbf{x}^{(i)} \left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)\end{aligned} $$
推导一下:
$L_2$范数为$|w|_2$简写为$|w|$。$|w|^2$就是其平方。
$$ \begin{aligned} &\because|w|=|w|{2}=\sqrt{w{1}^{2}+w_{2}^{2}+\cdots+w_{n}^{2}}=\sqrt{\sum_{i=1}^{n} w_{i}^{2}} \ &\therefore|w|^{2}=\sum_{i=1}^{n} w_{i}^{2} \end{aligned} $$
对$|w|^{2}$ 求导: $$ \frac{\partial|w|^{2}}{\partial w}=2 \sum_{j=1}^{n} w_{i} $$
带入到mini-batch的权重更新:
$$ \begin{aligned} &w-\frac{\eta}{|B|}\left(\sum_{i \in B} x^{(i)}\left(w^{\top} x^{(i)}+b-y^{(i)}\right)+\frac{\lambda}{2} \cdot 2 \sum_{i \in B} w^{(i)}\right)\ &=w-\frac{\eta}{|B|}\left(\sum_{i \in B} x^{(i)}\left(w ^{\top} x^{(i)}+b-y^{(i)}\right)+\lambda \sum_{i \in B} w^{(i)}\right)\ &=w-\eta \lambda w-\frac{\eta}{|B|} \sum_{i \in B} x^{(i)}\left(w ^{\top} x^{(i)}+b-y^{(i)}\right) \end{aligned} $$
即:
$$ \begin{aligned} \mathbf{w} & \leftarrow \left(1- \eta\lambda \right) \mathbf{w} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \mathbf{x}^{(i)} \left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right). \end{aligned} $$
dropout
接模型泛化的补充“平滑性”。**
平滑性,即函数不应该对其输入的微小变化敏感。
也就是说一个好的模型需要对输入数据的扰动鲁棒。分为以下两个方面。
1. 使用有噪音的数据等价于Tikhonov正则
1995年,克里斯托弗·毕晓普证明了具有输入噪声的训练等价于Tikhonov正则化[Neural Networks for Pattern Recognition
]
《深度学习》第七章的7.5写:对于某些模型而言,向输入添加方差极小的噪声等价于对权重施加范数惩罚(Bishop,1995a, b)。
-
Tikhonov正则化(吉洪诺夫正则化)
作为最小二乘方法的代价函数 $\frac{1}{2}|\boldsymbol{A} \boldsymbol{x}-\boldsymbol{b}|{2}^{2}$ 的改进, Tikhonov于 1963 年提出使 用正则化最小二乘代价函数 $$ J(x)=\frac{1}{2}\left(|A x-b|{2}^{2}+\lambda|x|_{2}^{2}\right) $$ 式中 $\lambda \geqslant 0$ 称为正则化参数 (regularization parameters)。
-
也就是说对输入添加极小的噪声可以认为和$L_2$正则化是一样的。也就是上一节的内容。
2. 丢弃法:在层之间加入噪音
在一般情况下,噪声被添加到隐藏单元时鲁棒性会更加强大。向隐藏单元添加噪声就是Dropout算法的主要发展方向。
在2014年,斯里瓦斯塔瓦等人[Dropout: a simple way to prevent neural networks from overfitting
]结合毕晓普的想法,并将其应用于到网络的内部层之间。在训练过程中,在计算后续层之前向网络的每一层注入噪声。他们意识到,当训练一个有多层的深层网络时,注入噪声只会在输入-输出映射上增强平滑性。
这种方法之所以被称为dropout ,因为我们从表面上看是在训练过程中丢弃(drop out)一些神经元。 在整个训练过程的每一次迭代中,dropout包括在计算下一层之前将当前层中的一些节点置零。
在每次训练迭代中,产生扰动点$\mathbf{x}'$。并要求$E[\mathbf{x}'] = \mathbf{x}$。(E是期望)
在标准dropout正则化中,通过按保留(未丢弃)的节点的分数进行归一化来消除每一层的偏差。如下所示:
$$ \begin{aligned} h' = \begin{cases} 0 & \text{ 概率为 } p \ \frac{h}{1-p} & \text{ 其他情况} \end{cases} \end{aligned} $$
根据设计,期望值保持不变,即$E[h'] = h$。
比如:$\begin{aligned} E\left[x_{i}'\right] &=p \cdot 0+(1-p) \frac{x_{i}}{1-p} =x_{i} \end{aligned}$
实践中的dropout
$$ \begin{aligned} &\mathbf{h} =\sigma\left(\mathbf{W}{1} \mathbf{x}+\mathbf{b}{1}\right) \\ &\mathbf{h}^{\prime}=\operatorname{dropout}(\mathbf{h}) \\ &\mathbf{o} =\mathbf{W}{2} \mathbf{h}^{\prime}+\mathbf{b}{2} \\ &\mathbf{y} =\operatorname{softmax}(\mathbf{o}) \end{aligned} $$
当我们将dropout应用到隐藏层,以$p$的概率将隐藏单元置为零时,结果可以看作是一个只包含原始神经元子集的网络。在下图中,删除了$h_2$和$h_5$。因此,输出的计算不再依赖于$h_2$或$h_5$,并且它们各自的梯度在执行反向传播时也会消失。这样,输出层的计算不能过度依赖于$h_1, \ldots, h_5$的任何一个元素。
《退学率》