找回密码
 立即注册
查看: 443|回复: 0

优化算法—总结

[复制链接]
发表于 2022-9-28 21:12 | 显示全部楼层 |阅读模式
1.训练误差和泛化误差

机器学习模型在训练数据集和测试集数据的表现。如果你改变过实验中的模型结构或者超参数,你也许就会发现:模型在训练集上更准确时,在测试集并不一定更准确,这是有原因的;
因为存在着训练误差和泛化误差:

  • 训练误差定义:模型在训练集数据上训练时得到的误差。
  • 泛化误差定义:模型在任意一个测试集数据上表现出的误差的期望,并常常通过测试数据集上的误差来近似。
总结:训练误差的期望小于或等于泛化误差。也就是说,一般情况下,由训练数据集学到的模型参数会使模型在训练数据集上的表现优于或等于测试数据集上的表现。   
注:由于无法从训练误差估计泛化误差,所以一味的降低训练误差并不意味着就一定可以降低泛化误差;因此机器学习模型更应该关注泛化误差。   
参考内容
2.该如何选择模型

导入:在机器学习中,我们通常会评估若干个模型,并从中挑选出一个最优的模型。这一过程称为模型选择(model selection)。可供选择的候选模型可以是有着不同超参数的同类模型。以多层感知机为例,我们可以选择隐藏层的个数,以及每个隐藏层中隐藏单元个数和激活函数。为了得到有效的模型,我们必须在模型选择上下一番功夫,不过这是值得的。
训练、验证、测试集:

  • 训练集:用训练集对算法或模型进行训练过程
  • 验证集:利用交叉验证集或者又称简单交叉验证集进行交叉验证,选择出最好的模型。
  • 测试集:最后利用测试集对模型进行测试,获取模型运行的无偏估计。
划分标准:验证集要和测试集来自于同一分布,这个分布要尽可能接近生产环境;训练集会与验证集、测试造成分布漂移。
2.1验证数据集

从某种意义上来讲,测试集只能在所有超参数和模型参数选定后使用一次。不可以使用测试数据选择模型,如调参,无法从训练误差估计泛化误差,因此不应只依赖训练数据选择模型。鉴于此,我们可以预留一部分在训练数据集和测试数据集以外的数据进行模型选择。这部分数据被称为验证数据集,简称验证集。例如,我们可以从给定的训练集中随机选取一小部分作为验证集,而将剩余部分作为真正的训练集。
可以通过预留这样的验证集来进行模型选择,判断验证集在模型中的表现能力。
为什么验证集和测试集都需要?
因为验证集用来调整模型参数从而选择最优模型,模型本身已经同时知道了输入和输出,所以从验证数据上得到的误差会有偏差,但是我们只用测试集去评估模型的表现,并不会去调整优化模型。
测试集和验证集之间的区别
2.2K折交叉验证

定义:K折交叉验证用于模型调优,找到使得模型泛化性能最优的超参值,在全部训练集上重新训练模型,并使用独立的测试集对模型性能做出最终评价。
由于验证集不需要参与模型训练,当训练数据不够用时,留着大量的验证集显得过于奢侈,有一种可以改善这种现状的方法叫做k折交叉验证(K-fold cross-validation)。在K折交叉验证中,我们把原有的训练数据集分割成k个不重合的子数据集(无重复抽样),这样做的好处是:每次迭代过程中每个样本点只有一次被划入训练集或测试集的机会。然后我们在做K次模型训练和验证的时候。每一次,我们使用一个子数据集验证模型,并使用其他K-1个子数据集来训练模型。在K次训练和验证中,每次用来验证模型的子数据集都不同。最后我们对这K次训练误差和验证误差分别求平均。
K折交叉验证图:



  • 如果训练数据集相对较小,则增大K值

    • 增大K值,可以在每次迭代过程中有很多的数据用于模型训练,能够得到最小偏差,同时算法时间延长。且训练块间高度相似,导致评价结果方差较高。

  • 如果训练数据集相对较大,则减小K值

    • 减少K值,降低模型在不同的数据块上进行重复拟合的性能评估的计算成本,在平均性能的基础上获得模型的准确评估。

K折交叉验证参考
3.欠拟合和过拟合


  • 欠拟合:

    • 定义:欠拟合是指对训练样本的一般性质尚未学好。在训练集和测试集上的效果都不好。
    • 欠拟合的原因:

      • 模型复杂度过低
      • 特征量过少

    • 欠拟合的解决办法:

      • 增加特征数:可以挖掘上下文特征、ID类特征,组合成新的特征,可以取得较好的效果。这属于特征工程相关的内容,如因子分解,梯度提升决策树
      • 增加模型复杂度:可以适当的解决模型复杂度,是模型拥有更强的拟合能力,如:在线性中添加高次项,神经网络中增加网络层数或神经元个数。尝试非线性模型,比如核SVM,决策树,DNN等模型。
      • 减少正则化系数:正则化是防止过拟合的,但是当出现欠拟合时,就有必要针对性地减小正则化系数。
      • Boosting:Boosting往往会有较小的Bias。


  • 过拟合:

    • 定义:

      • 定义1:学习器把训练样本学的“太好了”,把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,模型无法得到较低的训练误差。
      • 定义2:模型在训练集上效果好,在测试集上效果差,模型泛化能力弱。

    • 过拟合的原因:

      • 训练数据中噪音干扰过大,使学习器认为部分噪音是特征从而扰乱学习规则。
      • 建模样本选取有误,如:训练数据太少,抽样方法错误,样本label错误,导致样本不能代表整体
      • 模型不合理,或者假设成立的条件与实际不符
      • 特征维度/参数太多,导致模型复杂度太高。

    • 过拟合的解决办法(过拟合无法避免,只能缓解):

      • 数据:

        • 获取更多的数据
        • 根据当前数据集估计数据分布参数,使用该分布产生更多的数据。不过估计参数分布的过程也会带入抽样误差。
        • 数据增强:通过一定规则增添数据;如:可以通过图像平移、反转、缩放、切割等手段将数据库成倍扩充。
        • 保留验证集
        • 获取额外数据进行交叉验证

      • 模型:

        • 降低模型复杂度:

          • 对于神经网络:减少网络层数,神经元个数等均可以限制网络的拟合能力
          • 对于决策树:限制树深、剪枝,限制叶节点数量
          • 增大分割平面间隔

        • 特征选择、特征降维:
        • early stopping
        • 正则化:将权值的大小作为惩罚项加入到损失函数里。
        • 增加噪声:

          • 在输入中加噪声
          • 在权值上增加噪声
          • 对网络等响应加噪声


      • ensemble:

        • Bagging:从训练集中自助采样,训练多个相互独立的弱学习器,通过一定结合策略形成一个强学习器
        • Boosting:初始化训练一个基学习器->根据表现调整样本分布->训练下一个基学习器->多个学习器加权结合

      • 贝叶斯





如果“贝叶斯误差“大约为15%,那么图中第二种情况就是一种比较好的情况。


  • 正则化

    • 利用正则化解决High variance 的问题,正则化是在Cost function中加入一项正则化项,惩罚模型的复杂度
    • 公式:






  • 为什么正则化可以减小过拟合?


加入正则化项,直观上理解,正则化因子λ设置的足够大的情况下,为了使代价函数最小化,权重矩阵W就会被设置为接近于0的值。则相当于消除了很多神经元的影响,那么图中的大的神经网络就会变成一个较小的网络。应对过拟合问题的常用办法:权重衰减,权重衰减等价于L2范数正则化。正则化通过为模型损失函数添加惩罚项使学出的模型参数值较小,但是实际上隐藏层的神经元依然存在,虽然他们的影响变小了,便不会导致过拟合。


  • 总结:
如果模型的复杂度过低,很容易出现欠拟合;如果模型的复杂度过高,很容易出现过拟合;应对欠拟合和过拟合的一个解决办法就是针对数据集选择合适复杂度的模型;在欠拟合的情况下,出现高偏差的情况;在过拟合的情况下出现高方差。bias和variance的权衡是模型的重要问题。
过拟合与欠拟合参考
4.丢弃法(Dropout)


  • 定义:Dropout(随机失活)就是在神经网络的Dropout层,为每个神经元结点设置一个随机消除的概率,对于保留下来的神经元,我们得到一个节点较少,规模较小的网络进行训练。
除了上面提到的权重衰减之外,深度学习模型常常使用丢弃法(dropout)来应对过拟合问题,丢弃法有一些不同的变体。
回忆下,“多层感知机”描述了个单隐藏层的多层感知机。其中输个数为4,隐藏单元个数为5,且隐藏单元hi(i = 1, . . . , 5)的计算表达式为:


这是激活函数,x1, . . . , x4是输,隐藏单元i的权重参数为w1i, . . . , w4i,偏差参数为bi。当对该隐藏层使丢弃法时,该层的隐藏单元将有定概率被丢弃掉。设丢弃概率为p,那么有p的概率hi会被清零,有1  p的概率hi会除以1  p做拉伸。丢弃概率是丢弃法的超参数。具体来说,设随机变量ξi为0和1的概率分别为p和1  p。使丢弃法时我们计算新的隐藏单元 。




由于E(ξi) = 1  p,因此:


代码实现:
keep_prob = 0.8  # 设置神经元保留概率
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
a3 = np.multiply(a3, d3)

a3 /= keep_prob
即丢弃法不改变其输的期望值。让我们对隐藏层使丢弃法,种可能的结果如下图所,其中h2和h5被清零。这时输出值的计算不再依赖h2和h5,在反向传播时,与这两个隐藏单元相关的权重的梯度均为0。由于在训练中隐藏层神经元的丢弃是随机的,即h1, . . . , h5都有可能被清零,输出层的计算法过度依赖h1, . . . , h5中的任个,从而在训练模型时起到正则化的作,并可以来应对过拟合。在测试模型时,我们为了拿到更加确定性的结果,般不使丢弃法,因为那样会使得预测结果变得随机。
dropout的另一种理解:
加入了Dropout以后,输入的特征都是有可能会被随机清除的,所以该神经元不会再特别依赖于任何一个输入特征,也就是说不会给任何一个输入设置太大的权重。
注:不可以在职场中使用dropout,dropout对loss会有所影响。



  • 其他正则化

    • 数据扩增
    • 标准化

      • 将数据重新压缩到一个新的分布;通常情况下是,0为均值,1位方差;








    • 归一化

      • 不使用归一化和使用归一化前后的函数形状会有很大的区别,在不使用归一化的代价函数中,我们如果设置一个比较小的学习率,那我们就可能需要很多次迭代才能到达代价函数全局最优解;如果使用了归一化,那么无论从哪个位置开始迭代,我们都能以相对很少的迭代次数找到全局最优解。




5.梯度消失/梯度爆炸( Vanishing / Exploding gradients)

训练神经网络,尤其是深度神经所面临的一个问题就是梯度消失或梯度爆炸,也就是你训练神经网络的时候,导数或坡度有时会变得非常大,或者非常小,甚至于以指数方式变小,这加大了训练的难度。
本质上,梯度消失和爆炸是一种情况。在深层网络中,由于网络过深,如果初始得到的梯度过小,或者传播途中在某一层上过小,则在之后的层上得到的梯度会越来越小,即产生了梯度消失。梯度爆炸也是同样的。一般地,不合理的初始化以及激活函数,如sigmoid等,都会导致梯度过大或者过小,从而引起消失/爆炸。
解决方案
预训练加微调
  其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。
  此方法有一定的好处,但是目前应用的不是很多了。
梯度剪切、正则
  梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
  另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization)比较常见的是L1和L2正则。
ReLu、leakReLu等激活函数
  ReLu:其函数的导数在正数部分是恒等于1,这样在深层网络中,在激活函数部分就不存在导致梯度过大或者过小的问题,缓解了梯度消失或者爆炸。同时也方便计算。当然,其也存在存在一些缺点,例如过滤到了负数部分,导致部分信息的丢失,输出的数据分布不在以0为中心,改变了数据分布。
  leakrelu:就是为了解决relu的0区间带来的影响,其数学表达为:leakrelu=max(k*x,0)其中k是leak系数,一般选择0.01或者0.02,或者通过学习而来。
Batch Normalization
  Batch Normalization是深度学习发展以来提出的最重要的成果之一了,目前已经被广泛的应用到了各大网络中,具有加速网络收敛速度,提升训练稳定性的效果,Batch Normalization本质上是解决反向传播过程中的梯度问题。Batch Normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化到均值为0,方差为1保证网络的稳定性。
– 有一些从 0 到 1 而不是从 1 到 1000 的特征值,通过归一化所有的输入特征值,以获得类似范围的值,可以加速学习。所以 Batch 归一化起的作用的原因,直观的一点就是,它在做类似的工作,但不仅仅对于这里的输入值,还有隐藏单元的值。
– 它可以使权重比你的网络更滞后或更深层,比如,第 10 层的权重更能经受得住变化。
残差结构
  残差的方式,能使得深层的网络梯度通过跳级连接路径直接返回到浅层部分,使得网络无论多深都能将梯度进行有效的回传。
LSTM
  LSTM全称是长短期记忆网络(long-short term memory networks),是不那么容易发生梯度消失的,主要原因在于LSTM内部复杂的“门”(gates)。在计算时,将过程中的梯度进行了抵消。
梯度消失或梯度爆炸参考
6.随机梯度下降法(SGD)

随机梯度下降参考
6.1 mini-batch梯度下降

你可以把训练集分割为小一点的子集训练,这些子集被取名为 mini-batch,假设每一个子集中只有 1000 个样本,那么把其中的x (1)到x (1000)取出来,将其称为第一个子训练集,也叫做 mini-batch,然后你再取出接下来的 1000 个样本,从x(1001)到x(2000),然后再取 1000个样本,以此类推。
在训练集上运行 mini-batch 梯度下降法,你运行 for t=1……5000,因为我们有5000个各有 1000 个样本的组,在 for 循环里你要做得基本就是对X{t}和Y{t}执行一步梯度下降法。

  • batch_size=1,就是SGD。
  • batch_size=n,就是mini-batch
  • batch_size=m,就是batch
其中1<n<m,m表示整个训练集大小。
优缺点:

  • batch:相对噪声低些,幅度也大一些,你可以继续找最小值。
  • SGD:大部分时候你向着全局最小值靠近,有时候你会远离最小值,因为那个样本恰好给你指的方向不对,因此随机梯度下降法是有很多噪声的,平均来看,它最终会靠近最小值,不过有时候也会方向错误,因为随机梯度下降法永远不会收敛,而是会一直在最小值附近波动。一次性只处理了一个训练样本,这样效率过于低下。
  • mini-batch:实践中最好选择不大不小的 mini-batch,得到了大量向量化,效率高,收敛快。
  • 首先,如果训练集较小,直接使用 batch 梯度下降法,这里的少是说小于 2000 个样本。一般的 mini-batch 大小为 64 到 512,考虑到电脑内存设置和使用的方式,如果 mini-batch 大小是 2 的n次方,代码会运行地快一些。
6.2 调节 Batch_Size 对训练效果影响到底如何?


  • Batch_Size 太小,模型表现效果极其糟糕(error飙升)。
  • 随着 Batch_Size 增大,处理相同数据量的速度越快。
  • 随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。
  • 由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
  • 由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。
7.优化算法

7.1 动量法(Momentum)

在每次迭代中,梯度下降根据变量当前位置,沿着当前位置的梯度更新变量。然而,如果变量的
迭代向仅仅取决于变量当前位置,这可能会带来些问题。
让我们考虑个输和输出分别为维向量x = [x1, x2]和标量的标函数


这将


系数从1减小到了0.1。下实现基于这个标函数的梯度下降,并演使学习率为0.4时变量的迭代轨迹。


可以看到,同位置上,标函数在竖直向(x2轴向)在平向(x1轴向)的斜率的绝对值更。因此,给定学习率,梯度下降迭代变量时会使变量在竖直向在平向移动幅度更。那么,我们需要个较小的学习率从而避免变量在竖直向上越过标函数最优解。然而,这会造成变量在平向上朝最优解移动变慢。
动量法的提出是为了解决梯度下降的上述问题。由于小批量随机梯度下降梯度下降更为义,本章后续讨论将沿“小批量随机梯度下降”节中时间步t的小批量随机梯度gt的定义。设时间步t的变量为xt,学习率为ηt。在时间步0,动量法创建速度变量v0,并将其元素初始化成0。在时间步t > 0,动量法对每次迭代的步骤做如下修改:


其中,动量超参数γ满0 ≤ γ < 1。当γ = 0时,动量法等价于小批量随机梯度下降。在梯度下降时候使用动量法后的迭代轨迹:


在对应上面的计算公式中将Cost function想象为一个碗状,想象从顶部往下滚球,其中:
微分项dw,db想象为球提供的加速度;
动量项vdw , vdb 相当于速度;
小球在向下滚动的过程中,因为加速度的存在速度会变快,但是由于β的存在,其值小于1,可以认为是摩擦力,所以球不会无限加速下去。


可以看到使较小的学习率η = 0.4和动量超参数γ = 0.5时,动量法在竖直向上的移动更加平滑,且在平向上更快逼近最优解。
所以,在动量法中,变量在各个向上的移动幅度不仅取决当前梯度,还取决于过去的各个梯度在各个向上是否致。在本节之前例的优化问题中,所有梯度在平向上为正(向右),而在竖直向上时正(向上)时负(向下)。这样,我们就可以使较的学习率,从而使变量向最优解更快移动。


在利用梯度下降法来最小化该函数的时候,每一次迭代所更新的代价函数值如图中蓝色线所示在上下波动,而这种幅度比较大波动,减缓了梯度下降的速度,而且我们只能使用一个较小的学习率来进行迭代。
如果用较大的学习率,结果可能会如紫色线一样偏离函数的范围,所以为了避免这种情况,只能用较小的学习率。但是我们又希望在如图的纵轴方向梯度下降的缓慢一些,不要有如此大的上下波动,在横轴方向梯度下降的快速一些,使得能够更快的到达最小值点,而这里用动量梯度下降法既可以实现,如红色线所示。

动量优化参考
7.2 AdaGrad算法

优化算法中,标函数变量的每个元素在相同时间步都使同个学习率来我迭代。在“动量法”我们看到当x1和x2的梯度值有较差别时,需要选择小的学习率使得变量在梯度值较的维度上不发散。但这样会导致变量在梯度值较小的维度上迭代过慢。动量法依赖指数加权移动平均使得变量的更新向更加致,从而降低发散的可能。本节我们介绍AdaGrad算法,它根据变量在每个维度的梯度值的小来调整各个维度上的学习率,从而避免统的学习率难以适应所有维度的问题。
AdaGrad算法会使个小批量随机梯度gt按元素平的累加变量st。在时间步0,AdaGrad将s0中每个元素初始化为0。在时间步t,先将小批量随机梯度gt按元素平后累加到变量st:


其中⊙是按元素相乘。接着,我们将标函数变量中每个元素的学习率通过按元素运算重新调整下:


其中η是学习率,是为了维持数值稳定性而添加的常数,如10的-6次方。这开、除法和乘法的运算都是按元素运算的。这些按元素运算使得标函数变量中每个元素都分别拥有的学习率。
需要强调的是,小批量随机梯度按元素平的累加变量st出现在学习率的分项中。因此,

  • 如果标函数有关变量中某个元素的偏导数直都较,那么该元素的学习率将下降较快;
  • 反之,如果标函数有关变量中某个元素的偏导数直都较小,那么该元素的学习率将下降较慢。
然而,由于st直在累加按元素平的梯度,变量中每个元素的学习率在迭代过程中直在降低(或不变)。所以,当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到个有的解。


AdaGrad算法参考
7.3 RMSProp算法

当学习率在迭代早期降得较快且当前解依然不佳时,AdaGrad算法在迭代后期由于学习率过小,可能较难找到个有的解。为了解决这问题,RMSProp算法对AdaGrad算法做了点小小的修改。
不同于AdaGrad算法状态变量st是截时间步t所有小批量随机梯度gt按元素平和,RMSProp算法将这些梯度按元素平做指数加权移动平均。具体来说,给定超参数0 ≤ γ < 1,RMSProp算法在时间步t > 0计算:


和AdaGrad算法样,RMSProp算法将标函数变量中每个元素的学习率通过按元素运算重新调整,然后更新变量


其中η是学习率,是为了维持数值稳定性而添加的常数,如10的-6次方。因为RMSProp算法的状态变量st是对平项gt ⊙ gt的指数加权移动平均,所以可以看作是最近1/(1  γ)个时间步的小批量随机梯度平项的加权平均。如此来,变量每个元素的学习率在迭代过程中就不再直降低(或不变)。




这里假设参数b的梯度处于纵轴方向,参数w的梯度处于横轴方向(当然实际中是处于高维度的情况),利用RMSprop算法,可以减小某些维度梯度更新波动较大的情况,如图中蓝色线所示,使其梯度下降的速度变得更快,如图绿色线所示。
在如图所示的实现中,RMSprop将微分项进行平方,然后使用平方根进行梯度更新,同时为了确保算法不会除以0,平方根分母中在实际使用会加入一个很小的值如ε = 1 0  8
rmsprop优化器参考
7.4 AdaDelta算法

除了RMSProp算法以外,另个常优化算法AdaDelta算法也针对AdaGrad算法在迭代后期可能较难找到有解的问题做了改进。有意思的是,AdaDelta算法没有学习率这超参数。
AdaDelta算法也像RMSProp算法样,使了小批量随机梯度gt按元素平的指数加权移动平均变量st。在时间步0,它的所有元素被初始化为0。给定超参数0 ≤ ρ < 1(对应RMSProp算法中的γ),在时间步t > 0,同RMSProp算法样计算:


与RMSProp算法不同的是,AdaDelta算法还维护个额外的状态变量xt,其元素同样在时间步0时被初始化为0。我们使xt1来计算变量的变化量:


最后,我们使xt来记录变量变化量


按元素平的指数加权移动平均:
可以看到,如不考虑的影响,AdaDelta算法与RMSProp算法的不同之处在于使


来替代超参数η。
7.5 Adam算法

Adam算法在RMSProp算法基础上对小批量随机梯度也做了指数加权移动平均。
Adam算法使了动量变量vt和RMSProp算法中小批量随机梯度按元素平的指数加权移动平均变量st,并在时间步0将它们中每个元素初始化为0。给定超参数0 ≤ β1 < 1(算法作者建议设为0.9),时间步t的动量变量vt即小批量随机梯度gt的指数加权移动平均:


和RMSProp算法中样,给定超参数0 ≤ β2 < 1(算法作者建议设为0.999),将小批量随机梯度按元素平后的项gt ⊙ gt做指数加权移动平均得到st:


由于我们将 v0 和 s0 中的元素都初始化为 0,在时间步 t 我们得到


。将过去各时间步小批量随机梯度的权值相加,得到


。需要注意的是,当 t 较小时,过去各时间步小批量随机梯度权值之和会较小。例如,当β1 = 0.9时,v1 = 0.1g1。为了消除这样的影响,对于任意时间步 t,我们可以将 vt 再除以


,从而使过去各时间步小批量随机梯度权值之和为1。这也叫作偏差修正。在Adam算法中,我们对变量 vt 和 st 均作偏差修正:




接下来,Adam算法使以上偏差修正后的变量vtst,将模型参数中每个元素的学习率通过按元素运算重新调整:


其中η是学习率,是为了维持数值稳定性而添加的常数,如10的-8次方。和AdaGrad算法、RMSProp算法以及AdaDelta算法样,标函数变量中每个元素都分别拥有的学习率。最后,使


迭代变量:


7.6 局部最优--鞍点问题

在高纬度的情况下:
几乎不可能陷入局部最小值点;
处于鞍点的停滞区会减缓学习过程,利用如Adam等算法进行改善。
一个具有高维度空间的函数,如果梯度为 0,那么在每个方向,它可能是凸函数,也可能是凹函数。如果你在 2 万维空间中,那么想要得到局部最优,所有的 2 万个方向都需要是这样,但发生的机率也许很小,也许是2的-20000次方,你更有可能遇到有些方向的曲线会这样向上弯曲,另一些方向曲线向下弯,而不是所有的都向上弯曲,因此在高维度空间,你更可能碰到鞍点。


而不会碰到局部最优。至于为什么会把一个曲面叫做鞍点,你想象一下,就像是放在马背上的马鞍一样,如果这是马,这是马的头,这就是马的眼睛,画得不好请多包涵,然后你就是骑马的人,要坐在马鞍上,因此这里的这个点,导数为 0 的点,这个点叫做鞍点。我想那确实是你坐在马鞍上的那个点,而这里导数为 0。
鞍点中的平稳段是一个问题,这样使得学习十分缓慢,这也是像 Momentum 或是RMSprop,Adam 这样的算法,能够加速学习算法的地方。在这些情况下,更成熟的优化算法,如 Adam 算法,能够加快速度,让你尽早往下走出平稳段。
7.7指数加权平均











当β=0.9时,指数加权平均最后的结果如图中红色线所示;当β=0.98时,指数加权平均最后的结果如图中绿色线所示;当β=0.5时,指数加权平均最后的结果如下图中黄色线所示;


在我们执行指数加权平均的公式时,当β=0.98时,我们得到的并不是图中的绿色曲线,而是下图中的紫色曲线,其起点比较低。一般会忽略前期均值偏差的影响
指数加权平均参考
7.8学习率衰减

在我们利用 mini-batch 梯度下降法来寻找Cost function的最小值的时候,如果我们设置一个固定的学习速率α ,则算法在到达最小值点附近后,由于不同batch中存在一定的噪声,使得不会精确收敛,而一直会在一个最小值点较大的范围内波动,如下图中蓝色线所示。
但是如果我们使用学习率衰减,逐渐减小学习速率α,在算法开始的时候,学习速率还是相对较快,能够相对快速的向最小值点的方向下降。但随着α的减小,下降的步伐也会逐渐变小,最终会在最小值附近的一块更小的区域里波动,如图中绿色线所示。




8.如何解决训练样本少的问题


  • 利用预训练模型进行迁移微调(fine-tuning),预训练模型通常在特征上拥有很好的语义表达。此时,只需将模型在小数据集上进行微调就能取得不错的效果。CV有ImageNet,NLP有BERT等。
  • 数据集进行下采样操作,使得符合数据同分布。
  • 数据集增强、正则或者半监督学习等方式来解决小样本数据集的训练问题。
9.如何提升模型的稳定性?


  • 正则化(L2, L1, dropout):模型方差大,很可能来自于过拟合。正则化能有效的降低模型的复杂度,增加对更多分布的适应性。
  • 前停止训练:提前停止是指模型在验证集上取得不错的性能时停止训练。这种方式本质和正则化是一个道理,能减少方差的同时增加的偏差。目的为了平衡训练集和未知数据之间在模型的表现差异。
  • 扩充训练集:正则化通过控制模型复杂度,来增加更多样本的适应性。
  • 特征选择:过高的特征维度会使模型过拟合,减少特征维度和正则一样可能会处理好方差问题,但是同时会增大偏差。
10.有哪些改善模型的思路

1.数据角度
  增强数据集。无论是有监督还是无监督学习,数据永远是最重要的驱动力。更多的类型数据对良好的模型能带来更好的稳定性和对未知数据的可预见性。对模型来说,“看到过的总比没看到的更具有判别的信心”。
2.模型角度
  模型的容限能力决定着模型可优化的空间。在数据量充足的前提下,对同类型的模型,增大模型规模来提升容限无疑是最直接和有效的手段。
3.调参优化角度
  如果你知道模型的性能为什么不再提高了,那已经向提升性能跨出了一大步。 超参数调整本身是一个比较大的问题。一般可以包含模型初始化的配置,优化算法的选取、学习率的策略以及如何配置正则和损失函数等等。
4.训练角度
  在越大规模的数据集或者模型上,诚然一个好的优化算法总能加速收敛。但你在未探索到模型的上限之前,永远不知道训练多久算训练完成。所以在改善模型上充分训练永远是最必要的过程。充分训练的含义不仅仅只是增大训练轮数。有效的学习率衰减和正则同样是充分训练中非常必要的手段。
11.如何提高深度学习系统的性能


  • 提高模型的结构。
  • 改进模型的初始化方式,保证早期梯度具有某些有益的性质,或者具备大量的稀疏性,或者利用线性代数原理的优势。
  • 择更强大的学习算法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-7-4 09:27 , Processed in 0.102666 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表