防止过拟合的方法,及dropout实现原理 - 面试篇

这个比较简单,但也记录一下。(要深入起来也不容易呀)

问:怎么防止过拟合?[头条,百度,boss直聘]

  1. 早停 Early stopping
    Early stopping方法的 具体做法 是,在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算validation data的accuracy,当accuracy不再提高时,就停止训练。
    一般的做法是,在训练的过程中,记录到目前为止最好的validation accuracy,当连续10次Epoch(或者更多次)没达到最佳accuracy时,则可以认为accuracy不再提高了。此时便可以停止迭代了(Early Stopping)。

  2. 数据集扩增
    “有时候往往拥有更多的数据胜过一个好的模型。” 因为我们在使用训练数据训练模型,通过这个模型对将来的数据进行拟合,而在这之间又一个假设:训练数据与将来的数据是独立同分布的。
    更多的数据有时候更优秀。但是往往条件有限,如人力物力财力的不足,而不能收集到更多的数据。
    (问:采用什么样的方法可以降低获取数据的成本?)
    半监督,或无监督学习。先聚类得到大致的类别,再人工标注。
    常见的六大聚类算法
    (有机会我再总结一下)

    数据集扩增 需要得到更多的 和已有的数据是独立同分布的,或者近似独立同分布的数据。
    一般有以下方法:
    a 从数据源采集更多数据
    b 复制原有数据并加上随机噪声
    (有时候噪声是有用的,可以防止过拟合,因为它更能模拟真实的输入,比如手写数字样本,有的人数字写的不好,但又不能算错)<个人理解>
    c 重采样
    d 根据当前数据集估计数据分布参数,使用该分布产生更多数据等
    e 如果是图片,可以做一些旋转,镜像,缩放等操作。

  3. 正则化
    在进行目标函数或代价函数优化时,在目标函数或代价函数后面加上一个正则项,一般有L1正则与L2正则等。
    线性回归中,L1正则线性回归即为Lasso回归。L2正则线性回归即为Ridge回归,岭回归。
    (面试时会什么,就扯什么,把时间耗完没问到很多不会的就是胜利。)
    (面试官见你说起线性回归,问:你对线性回归熟吗?它和逻辑斯蒂回归有什么区别? 可看我另一篇博客:线性回归和逻辑斯蒂回归 - 面试篇)

    a. L1正则
    L1正则是基于L1范数,即在目标函数后面加上参数的L1范数和项,即参数绝对值的和。
    因此L1正则项是为了使得那些原先处于零(即|w|≈0)附近的参数w往零移动,使得部分参数为零,从而降低模型的复杂度(模型的复杂度由参数决定),从而防止过拟合。
    但L1正则中有个问题,L1范数在0处不可导,即|w|在0处不可导。我觉得可以将0点单独拿出来,其余部分照样求导。 细节可以看 知乎答案

    b. L2正则
    L2正则是基于L2范数,即在目标函数后面加上参数的L2范数和项,即参数的平方和。
    L2项的参数乘了1/2,因为平方项求导有个2,正好消掉,体现美感。
    L2正则项起到使得参数w变小加剧的效果,更小的参数值w意味着模型的复杂度更低,不会过分拟合训练数据,从而防止过拟合,以提高模型的泛化能力。

    从 另 一 个 角 度 上 来 讲 \color{blue}从另一个角度上来讲 ,正则化即是假设模型参数服从先验概率,即为模型参数添加先验,只是不同的正则化方式的先验分布是不一样的。L1正则是拉普拉斯先验,而L2正则则是高斯先验。
    这样就规定了参数的分布,使得模型的复杂度降低(限定条件多了,模型的复杂度字然就降低了),这样模型对于噪声与异常点的抗干扰性的能力增强,从而提高模型的泛化能力。
    还 有 个 解 释 便 是 \color{blue}还有个解释便是 便,从贝叶斯学派来看:加了先验,在数据少的时候,先验知识可以防止过拟合;从频率学派来看:正则项限定了参数的取值,从而提高了模型的稳定性,而稳定性强的模型不会过拟合,即控制模型空间。
    图像解释[百度问过]:
    防止过拟合的方法,及dropout实现原理 - 面试篇_第1张图片
    上图中的模型是线性回归,有两个特征,要优化的参数分别是w1和w2,左图的正则化是L2,右图是L1。蓝色线就是优化过程中遇到的等高线,一圈代表一个目标函数值,圆心就是样本观测值(假设一个样本),半径就是误差值,受限条件就是红色边界(就是正则化那部分),二者相交处,才是最优参数。可见右边的最优参数只可能在坐标轴上,所以就会出现0权重参数,使得模型稀疏。

  4. dropout
    在神经网络中,有一种方法是通过修改神经网络本身结构来实现的,叫做Dropout。
    在训练开始时,随机得删除一些(dropout_rate)隐藏层神经元,即认为这些神经元不存在。
    然后按照BP学习算法对ANN中的参数进行学习更新(被dropout的单元不更新,因为认为这些神经元被临时删除了)。下一次迭代中,同样随机删除一些神经元,与上次不一样,做随机选择。

问:dropout的实现原理是什么?[头条]
也就是问 具体怎么让某些神经元以一定的概率停止工作?
n重伯努利:防止过拟合的方法,及dropout实现原理 - 面试篇_第2张图片
伯努利分布,又叫二项分布,0-1分布。
代码层面实现让某个神经元以概率p停止工作,其实就是让它的激活函数值以概率p变为0。比如我们某一层网络神经元的个数为1000个,其激活函数输出值为y1、y2、y3、…、y1000,我们dropout比率选择0.4,那么这一层神经元经过dropout后,1000个神经元中会有大约400个的值被置为0。(也就是 激活函数->dropout->下一层输入)

	retain_prob = 1. - level
    # 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
    # 硬币 正面的概率为p,n表示每个神经元试验的次数
    # 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
    random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
    x *= random_tensor
    # 函数中,x是本层网络的激活值。Level就是dropout就是每个神经元要被丢弃的概率。

注意: 经过上面屏蔽掉某些神经元,使其激活值为0以后,我们还需要对向量y1……y1000进行缩放,也就是乘以1/(1-p)。如果你在训练的时候,经过置0后,没有对y1……y1000进行缩放(rescale),那么在测试的时候,就需要对权重进行缩放。(这块没太懂,可以看原文:这里)

问:为什么dropout可以防止过拟合?[同学说头条碰到过]

  1. 取平均的作用
    dropout过程就相当于对很多个不同的神经网络取平均。
    我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。
  2. 减少神经元之间复杂的共适应关系
    dropout导致两个神经元不一定每次都在一个dropout网络中出现。这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,迫使网络去学习更加鲁棒的特征 。
  3. Dropout类似于性别在生物进化中的角色
    物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。
    (这什么鬼,都能扯到进化,我反正不懂。)

参考资料:
防止过拟合
深度学习中Dropout原理解析

你可能感兴趣的:(机器学习,算法,面试,深度学习)