机器学习-过拟合的诊断与预防
本文最后更新于 1764 天前,其中的信息可能已经有所发展或是发生改变。

我下面的总结是根据吴恩达视频针对线性回归的过拟合问题,神经网络部分还未学。关于更全面的见其他大神所写的:机器学习中防止过拟合的处理方法 – 一只鸟的天空


1. 过拟合的诊断

吴恩达视频第10章《Advice for applying machine learning》,讲述的是关于模型的诊断,里面详细讲述了过拟合以及此情况下的误差曲线,见下图figure 1,此图来自于《10-4 Diagnosing Bias VS. Variance》

1541381433535

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)的三层人工神经网络:

1541383525504

figure 2

对于上图所示的网络,在训练开始时,随机得删除一些(可以设定为一半,也可以为1/3,1/4等)隐藏层神经元,即认为这些神经元不存在,同时保持输入层与输出层神经元的个数不变,这样便得到如下的神经网络(figure 3):

1541383564038

figure 3

然后按照 BP 学习算法对网络中的参数进行学习更新(虚线连接的单元不更新,因为认为这些神经元被临时删除了)。这样一次迭代更新便完成了。下一次迭代中,同样随机删除一些神经元,与上次不一样,做随机选择。重复过程直到训练结束。

评论

  1. root 博主
    5年前
    2018-12-02 19:35:28

    使用 KaTex 解析 LaTex 的话,多行代码一定要使用 \begin{} \end{}且不能使用 align,应该使用 aligned。这个问题浪费了我一个多小时。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇