Deep Learning 基础 -- 防止过拟合/预训练模型

Deep Learning 基础 – 防止过拟合/预训练模型

Tags: Deep_Learning


本文主要包含如下内容:


发生过拟合的原因


  过拟合指在模型参数拟合过程中的问题,由于训练数据包含抽样误差,训练时,复杂的模型将抽样也考虑在内,将抽样误差也进行了很好的拟合。具体表现就是最终模型在训练集上效果好;在测试集上效果差。模型泛化能力弱。(模型把训练样本自身的一些特征当作了所有潜在样本都会具有的一般性质,从而导致泛化能力下降)
  训练数据不够,无法对整个数据的分布进行估计
  对模型进行过度训练,导致了模型的过拟合,对于和训练数据的分布稍有不同的数据,错误率就会加大。(学习能力过于强大)


防止过拟合(过拟合无法避免)


  在机器学习和深度学习中,过拟合是一个十分常见的问题,一旦模型过拟合了,可能这个模型就无法适用于业务场景中了。


引入正则化


  正则化的思:由于模型过拟合极有可能是因为我们的模型过于复杂。因此,我们需要让我们的模型在训练的时候,在对损失函数进行最小化的同时,也需要让对参数添加限制,这个限制也就是正则化惩罚项。

L1=i=1k||wi||1 L 1 = ∑ i = 1 k | | w i | | 1

L1=i=1k||wi||22 L 1 = ∑ i = 1 k | | w i | | 2 2

  这里,我们使用了L1正则与L2正则,思想就是不能够一味的去减小损失函数,你还得考虑到模型的复杂性,通过限制参数的大小,来限制其产生较为简单的模型,这样就可以降低产生过拟合的风险。


Dropout


  Dropout是在深度学习中降低过拟合风险的常见方法.在神经网络进行训练的时候,让部分神经元失活,这样就阻断了部分神经元之间的协同作用,从而强制要求一个神经元和随机挑选出的神经元共同进行工作,减轻了部分神经元之间的联合适应性。
  为了解决过拟合问题,一般采用ensemble的方法,即训练多个模型做组合。每次做完dropout之后,相当于从原始网络中找到一个更瘦的网络,即对于一个有N个节点的神经网络,有了dropout之后,就可以看成2^n个模型的集合。


提前终止


  在对模型进行训练时,我们可以将我们的数据集分为三个部分,训练集、验证集、测试集。我们在训练的过程中,可以每隔一定量的step,使用验证集对训练的模型进行预测。当超过一定训练步数后,模型在训练集上的误差虽然还在下降,但是在验证集上的误差却不在下降了。此时我们的模型就过拟合了。因此我们可以观察我们训练模型在验证集上的误差,一旦当验证集的误差不再下降时,我们就可以提前终止我们训练的模型。


交叉验证


  把训练样例分成k份,然后进行k次交叉验证过程,每次使用不同的一份作为验证集合,其余k-1份合并作为训练集合.每个样例会在一次实验中被用作验证样例,在k-1次实验中被用作训练样例;每次实验中,使用上面讨论的交叉验证过程来决定在验证集合上取得最佳性能的迭代次数n*,然后计算这些迭代次数的均值,作为最终需要的迭代次数。


增加样本量(数据增广)


  过拟合可以理解为我们的模型样本量学习的太好了,把一些样本的特殊的特征当做是所有样本都具有的特征。在实际项目中,其实大多数情况都比不上增加样本数据来的实在。

  数据增广的方法:Random Scale(尺度变化)\Random Crop(裁剪\缩放)\Horizontal/Vertical Flip(水平\垂直翻转)\Shift(平移变换)\Noise(高斯噪声\模糊处理)\Rotation/Reflection(旋转\仿射变换)\Color Jittering(图像亮度\饱和度\对比度变化)


批量归一化(BN:Batch Normalization)


  解决在训练过程中,中间层数据分布发生改变的问题,以防止梯度消失或爆炸、加快训练速度.
  归一化后有什么好处呢?原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。
  在使用BN前,减小学习率小心的权重初始化的目的是:使其输出的数据分布不要发生太大的变化。
  BN层的作用:改善流经网络的梯度;允许更大的学习率,大幅提高训练速度;减少对初始化的强烈依赖;改善正则化策略:作为正则化的一种形式,轻微减少了对dropout的需求;
  

Lγ=iLyiyiγ=iLyixˆi(1)(2) (1) ∂ L ∂ γ = ∑ i ∂ L ∂ y i ∂ y i ∂ γ (2) = ∑ i ∂ L ∂ y i x ^ i

Lβ=iLyiyiβ=iLyi(3)(4) (3) ∂ L ∂ β = ∑ i ∂ L ∂ y i ∂ y i ∂ β (4) = ∑ i ∂ L ∂ y i

Lxˆ=Lyyxˆ=Lyγ(5)(6) (5) ∂ L ∂ x ^ = ∂ L ∂ y ∂ y ∂ x ^ (6) = ∂ L ∂ y γ

Lσ=iLyiyixˆixˆiσ=12iLxiˆ(xiμ)(σ+ε)1.5(7)(8) (7) ∂ L ∂ σ = ∑ i ∂ L ∂ y i ∂ y i ∂ x ^ i ∂ x ^ i ∂ σ (8) = − 1 2 ∑ i ∂ L ∂ x i ^ ( x i − μ ) ( σ + ε ) − 1.5

Lμ=Lxˆxˆμ+Lσσμ=iLxˆi1σ+ε+Lσ2Σi(xiμ)N(9)(10) (9) ∂ L ∂ μ = ∂ L ∂ x ^ ∂ x ^ ∂ μ + ∂ L ∂ σ ∂ σ ∂ μ (10) = ∑ i ∂ L ∂ x ^ i − 1 σ + ε + ∂ L ∂ σ − 2 Σ i ( x i − μ ) N

Lxi=Lxiˆxiˆxi+Lσσxi+Lμμxi=Lxˆi1σ+ε+Lσ2(xiμ)N+Lμ1N(11)(12) (11) ∂ L ∂ x i = ∂ L ∂ x i ^ ∂ x i ^ ∂ x i + ∂ L ∂ σ ∂ σ ∂ x i + ∂ L ∂ μ ∂ μ ∂ x i (12) = ∂ L ∂ x ^ i 1 σ + ε + ∂ L ∂ σ 2 ( x i − μ ) N + ∂ L ∂ μ 1 N

  


预训练模型/迁移学习


  迁移学习的基本思路是利用预训练模型,即已经通过现成的数据集训练好的模型(这里预训练的数据集可以对应完全不同的待解问题,例如具有相同的输入,不同的输出)。开发者需要在预训练模型中找到能够输出可复用特征(feature)的层次(layer),然后利用该层次的输出作为输入特征来训练那些需要参数较少的规模更小的神经网络。由于预训练模型此前已经习得了数据的组织模式(patterns),因此这个较小规模的网络只需要学习数据中针对特定问题的特定联系就可以了。

  迁移学习的优点:减少训练数据的规模,加速训练,还可以有效避免过度拟合(overfit),由于迁移学习允许模型针对不同类型的数据展开学习,因此其在捕捉待解问题的内在联系方面的表现也就更优秀.

  fine-tune是应用别人在大数据集合上训练到一定程度的caffemodel,在这进行微调。这比随机化参数要好,因为该模型可能已经接近最优!可以省时间,省资源。也可以克服没有大数据的困扰.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值