训练类神经网络

发布时间 2023-07-19 18:58:27作者: 天亮yǐ后

结果不理想的检查步骤

情况一:模型问题

  • 所设的模型不包含要找的函数;需要重新修改模型

  • 可以增加模型中特征值,或者增加层数(Deep Learning),以增加模型的复杂度

情况二:优化(optimization)没做好

  • 没有找到模型中解决问题的最好的方法

如何判断问题出自情况一还是二:

上图右边,56层的netWork训练数据得到的数据没有20层的netWork的好,表明56层不是Overfitting的问题,因为56层netWork包含20层netWork,层数越高得到训练数据必然越好,所以这是情况二

情况三:过度拟合(Overfitting)

 例如:

  • 模型的自由度大,就会产生一些奇怪的曲线,导致训练资料的结果好,测试资料上的结果差

解决方法:

  1.  增加训练资料,即使模型的弹性较大,足够多的训练资料也能限制住产生的曲线,如:数据增加(data augmentation),把图片资源上下翻转,左右翻转等。

  2. 缩小模型的弹性,限制模型:如:把高次函数限制函数为二次函数

     限制方法:减少特征值、减少参数,Deep  Learn中减少每层中神经元的个数,模型中共用参数等

过度限制也可能会回到情况一的问题:

情况四:不匹配(mismatch)

特殊情况;训练资料和测试资料的分布不一样。如:

 解决情况二:优化(optimization)问题

  • 原因:由于没有找到该模型中使训练资料得到数据最好的函数,导致训练资料得到的数据不好

 

  • 局部最小值和鞍点处一阶倒数都为0,所以可以根据泰勒展开式,确定周围点与这点值的大小关系,从而区分局部最小值和鞍点

泰勒级数近似(Tayler Series Approximation)

  •  对于鞍点的情况,H可以确定参数更新的方向:

  • 局部最小值的情况在现实中是比较少的:

出现局部最小值的点处在更高维度的模型中很可能只是一个鞍点,并且现实中的模型中参数维度都较高,所以很少出现局部最小值的情况

批处理(Batch)

  • 实际算微分时,不是直接对所有参数算微分,而是把所有的参数分成大小为B的批处理;
  • 每次修改参数的时候,依次拿B资料算出Li,用微分值和η(learning rate)修改参数;全部的Batch都修改一次叫Epoch,每次Epoch后都会重新分Batch

注:左边不分Batch,右边分成了N个Bactch

  左边修改参数时,一次训练只修改一次,修改一次数据要较长时间,并且修改的参数方向准确;

  右边的一次训练要修改N次数据,每次修改参数时间短,但是修改的方向不准确

由于GPU可以同时计算多比数据,所以Batch的个数分的不多时,所需的时间不一定会很长;

例如:训练资料有60000个参数,Batch Size设置为1,一个Epoch要60000个updates;

若Batch Size设置为1000,要60个updates;(同时计算1000比数据)

 注:当Batch Size较大时,也会出现优化失败(optimization fails)的问题

原因是,当Batch较大时,更容易出现微分为0的情况,所以更容易卡在某个点处

  • 有时候会出现较大Batch和较小的Batch在训练资料中数据相近,但测试中较小的Batch得到的数据较差;原因可能训练中的Loss函数中有多个局部最小值,不同的局部最小值周围数据分布平缓程度不一样,而测试资料的Loss函数又和训练的Loss函数有一些差距,此时局部最小值周围数据分布不平缓时,就会导致测试资料数据较差(局部最小值周围数据分布越平缓时,这个局部最小值越好)

动力(Momentum)

  • 可能对抗局部最小值(local minima)和鞍点(saddle point)
  • 概念:Loss函数比作斜坡,参数比作球,把球从斜坡滚下,由于惯性,可能滚过鞍点和局部最小值
  • Gradient Descent(梯度下降法):利用梯度和η(learn rate)改进参数,但由于鞍点和局部最小值处梯度为0,所以容易卡在某个鞍点或者局部最小值点

  • Momentum就是在梯度下降法中修改参数时,另外再加上一次修改参数的方向作为这次参数修改的方向(类似加入惯性)

 

 附加学习效率(Adative Learn Rate)

  • 有时候,梯度不为0,但Loss的值却下降不明显:就是因为η的值不适合

  • 有可能参数在Loss局部最小值的两边来回震荡,这种情况Loss基本不会下降,但实际上并没有卡在鞍点或者局部最小值

这种情况,η(Learn Rate)不变的话,则很难到达目标点,所以就需要自动调整学习速率(某方向上梯度较小时,则η调大,反之调小)

修改η为参数依赖的值

1、  均方根(root mean square),前边的每个梯度权重相同

在接近时,y轴突变导致Loss变大,解决方法是学习速率调度(Learn Rate Scheduling)

  • 学习速率衰变(Learn Rate Decay):让η随时间的增加而减小;  Warm Up:η先变大后变小

2、  PMSProp

  • 用上次的σ和这次的梯度的平方按权重取方差(σ中其实包含之前的所有梯度)

3、  Adam: PMSProp+Momentum

训练数据集和现实全部数据的分布差距

h为模型的一组参数值,

  • 训练集得出理想的最佳h和实际现实的h不同,所以用理想的h用在现实中,差距如何控制在ε内

  • 训练数据有好坏之分,用坏的训练数据,得到的h,即使在训练集中损失值小,但在测试集中损失值也较大

得到坏的训练集的概率:

  • ε为自己定的;|H|为模型中h可选值的数量,也标志着模型的复杂度;N为训练数据总数
  • 所以增加N或者降低|H|都可以使得到坏的训练数据的概率降低
  1. 当|H|较小时,模型的复杂度不够高,得出的最好的函数可能在现实中表现也不好,即使训练集和测试集接近,最终得到的数据也一般
  2. 当|H|较大时,模型的复杂度过高,训练集得的h代入测试集中可能差别较大,最终得到的数据也一般

 

当 |H|过小时,即使找到了模型中的最佳函数,可能也没有大|H|模型中二流函数的测试结果好

如何即让|H|小,训练集和测试集结果接近,也让模型的复杂度高,能确保包含使现实数据较好的函数:深度学习

结:深度学习可以用较少的参数构建出更复杂的模型