我下面的总结是根据吴恩达视频针对线性回归的过拟合问题,神经网络部分还未学。关于更全面的见其他大神所写的:机器学习中防止过拟合的处理方法 – 一只鸟的天空
1. 过拟合的诊断
吴恩达视频第10章《Advice for applying machine learning》,讲述的是关于模型的诊断,里面详细讲述了过拟合以及此情况下的误差曲线,见下图figure 1,此图来自于《10-4 Diagnosing Bias VS. Variance》。
figure 1
过拟合外在表现就是,训练的模型在训练集上表现良好,但是在测试集上误差非常大。
通常原因有:
- 数据集太小;
- 特征量过多;
- 模型复杂度过高(比如多项式次数过高)。
2. 防止过拟合的处理方法
2.1 Early stopping
Early stopping是一种通过截断迭代次数来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。
Early stopping方法的具体做法是,在每一个 Epoch 结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算 validation set 的 accuracy (后面的accurary 都是指validation set 的 accuracy),当 accuracy 不再提高时,就停止训练。这种做法很符合直观感受,因为 accurary 都不再提高了,在继续训练也是无益的,只会提高训练的时间。那么该做法的一个重点便是怎样才认为 accurary 不再提高了呢?并不是说 accuracy一降下来便认为不再提高了,因为可能经过这个Epoch后,accuracy降低了,但是随后的Epoch又让 accuracy 又上去了,所以不能根据一两次的连续降低就判断不再提高。一般的做法是,在训练的过程中,记录到目前为止最好的 accuracy,当连续10次Epoch(或者更多次)没达到那个最高 accuracy 时,则可以认为 accuracy 不再提高了。此时便可以停止迭代了(Early Stopping)。这种策略也称为“No-improvement-in-n”,n即Epoch的次数,可以根据实际情况取,如10、20、30……
2.2 数据集扩增
数据集太小也是导致过拟合的一个原因。吴恩达机器学习 10-6 Learning Curves在此视频中可以看到样本数量和 training error 与 validation error 的关系图。
数据集扩增,就是获取更多的符合要求的数据一般有以下方法:
- 从数据源头采集更多数据
- 复制原有数据并加上随机噪声
- 重采样
- 根据当前数据集估计数据分布参数,使用该分布产生更多数据等
在分类问题中需要制作数据集的 label 所以更加耗费人力,此时多采用方法二,即复制原数据并加上随机噪声。
2.3 正则化方法
正则化方法是指在进行目标函数或代价函数优化时,在目标函数或代价函数后面加上一个正则项,使模型复杂度降低,一般有 L1 正则与 L2 正则。
2.3.1 L1正则
L1正则是基于L1范数,即在目标函数后面加上参数的L1范数和项,即参数绝对值和与参数的积项: $C = C_0 + \frac{\lambda}{m}\sum_{w}\vert w\vert$,其中 $C$ 为正则化后的损失函数,$C_0$为原损失函数,$\lambda$为正则化系数,$m$为样本数量。
在 L1 线性回归(又称Lasso
回归)中,代价函数为:
$$
J(\theta) = \frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)} – y^{(i)})^2 + \frac{\lambda}{m}\sum_{j=1}^n\vert\theta_j\vert
$$
上面式子中 $j \neq 0$,不对偏置做正则化。使用梯度下降法更新:
$$
\begin{aligned}
\theta_0 &= \theta_0 – \alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)} – y^{(i)})^2 x_0^{(i)}\
\theta_j &= \theta_j – \alpha[\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)} – y^{(i)})^2 x_j^{(i)} + \frac{\lambda}{m}sgn(\theta_j)], j=1,2,…,n
\end{aligned}
$$
其中,$\alpha > 0, \lambda > 0$,$sgn$ 是符号函数,即 $sgn(z)\vert_{z>0}=1, sgn(z)\vert_{z<0}=-1$,上面第二式化简后有:
$$
\begin{aligned}
\theta_j &= (\theta_j – \alpha\frac{\lambda}{m}) – \alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)} – y^{(i)})^2 x_j^{(i)}, \theta_j > 0\
\theta_j &= (\theta_j + \alpha\frac{\lambda}{m}) – \alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)} – y^{(i)})^2 x_j^{(i)}, \theta_j < 0
\end{aligned}
$$
显然 $\alpha \frac{\lambda}{m} > 0 $ ,当 $\theta_j > 0$ 时,减掉一个正数,当 $\theta < 0$ 时,加上一个正数。即L1正则项是为了使得那些原先处于零(即 $\vert\theta_j\vert \approx0$)附近的参数 $\theta_j$ 往零移动,使得部分参数为零,从而降低模型的复杂度(模型的复杂度由参数决定),从而防止过拟合,提高模型的泛化能力。
其中,L1 正则中有个问题,便是 L1 范数在 0 处不可导,即 $\vert\theta_j\vert$ 在 0 处不可导,因此在 $\theta_j$ 为0时,使用原来的未经正则化的更新方程来对 $\theta_j$ 进行更新,即令 $sgn(0)=0$,这样即:
$$
sgn(\theta_j)\vert_{\theta_j>0}=1, sgn(\theta_j)\vert_{\theta_j<0}=-1, sgn(\theta_j)\vert_{\theta_j=0}=0
$$
2.3.2 L2正则
视频资料地址:吴恩达机器学习 7-3 Regularized linear regression
L2正则是基于L2范数,即在目标函数后面加上参数的L2范数和项,即参数的平方和与参数的积项,即:$C = C_0 + \frac{\lambda}{2n}\sum_{w}w^{2}$ ,其中 $C$ 为正则化后的损失函数,$C_0$为原损失函数,$\lambda$为正则化系数,$m$为样本数量。 $\frac{1}{2}$是为了求导后公式美观。
在 L2 线性回归(又称Ridge
回归)中,代价函数为:
$$
J(\theta) = \frac{1}{2m}\sum_{i=1}^m(h_\theta(x^{(i)} – y^{(i)})^2 + \frac{\lambda}{2m}\sum_{i=1}^n \theta^2
$$
上面式子中 $j \neq 0$,不对偏置做正则化。使用梯度下降法更新:
$$
\begin{aligned}
\theta_0 &= \theta_0 – \alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)} – y^{(i)})^2 x_0^{(i)}\
\theta_j &= \theta_j – \alpha[\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)} – y^{(i)})^2 x_j^{(i)} + \frac{\lambda}{m}\theta_j], j \neq 0
\end{aligned}
$$
其中,$\alpha > 0$, $\lambda > 0$,上面第二式化简后有:
$$
\theta_j = \theta_j(1 – \alpha\frac{\lambda}{m}) – \alpha\frac{1}{m}\sum_{i=1}^{m}(h_\theta(x^{(i)} – y^{(i)})^2 x_j^{(i)}, j \neq 0
$$
显然 $\alpha\frac{\lambda}{m} > 0$ ,$1- \alpha\frac{\lambda}{m} < 1$,在每次更新时额外地减小权值,更小的权值意味着模型复杂度更低。这样减小各个权值,也就降低了模型复杂度,也就能防止过拟合。
4. Dropout
在神经网络中,防止过拟合常用Dropout,该方法是通过修改神经网络本身结构(临时随机删减 隐含层神经元)来实现。例如对于如下所示(figure 2)的三层人工神经网络:
figure 2
对于上图所示的网络,在训练开始时,随机得删除一些(可以设定为一半,也可以为1/3,1/4等)隐藏层神经元,即认为这些神经元不存在,同时保持输入层与输出层神经元的个数不变,这样便得到如下的神经网络(figure 3):
figure 3
然后按照 BP 学习算法对网络中的参数进行学习更新(虚线连接的单元不更新,因为认为这些神经元被临时删除了)。这样一次迭代更新便完成了。下一次迭代中,同样随机删除一些神经元,与上次不一样,做随机选择。重复过程直到训练结束。
使用 KaTex 解析 LaTex 的话,多行代码一定要使用
\begin{} \end{}
且不能使用align
,应该使用aligned
。这个问题浪费了我一个多小时。