深度学习优化方式

在这里插入图片描述

训练集上表现不好(high bias)

  1. 尝试使用更复杂更大的网络结构(增加单元数、增加层数,或者更改结构)
  2. 增加训练次数

更换激活函数

sigmoid 函数

在这里插入图片描述
sigmoid 缺点:

  1. 梯度消失
    如图sigmoid函数导数处在0-0.4间 而且很大范围内都趋近于零。那么在反向传播的过程中梯度越传越小,造成前几层的梯度特别小。
    2. 非中心对称
    在这里插入图片描述
    sigmoid 的值恒大于0,那么对于下一层来说,它的输入永远是正数,反向求导时,对于所有参数来说,
    在这里插入图片描述 =这层输入永远是正数,更新方向取决于回传的梯度,不同参数无法沿不同方向更新。容易出现zigzag现象。
    3. 计算量大

tanh

在这里插入图片描述
解决了非原点对称问题,但是还是有梯度消失问题

ReLU

在这里插入图片描述
优点:

  1. 实验效果证明收敛较快
  2. 符合人的神经节运作方式
  3. 解决梯度消失问题
    缺点:
    由于当输出恒为负时回传梯度为0,会出现dead ReLU现象

Leakly ReLU & Parametric ReLU

在这里插入图片描述
解决了dead ReLU 问题

Exponential ReLU

在这里插入图片描述
可以看做介于relu和LeakyReLU之间。需要计算exp,从而计算量上更大一些。

Maxout

在这里插入图片描述
相当于一个group(输出节点数)中学习k组参数,然后从中选出激活值最大的作为这个节点的输出。
其实是一个k段的分段函数,理论上可以拟合任意凸函数
参数量x k倍。

学习率优化

学习率衰减

  1. 等间隔调整学习率 StepLR
  2. 多间隔调整学习率 MultiStepLR
  3. 指数衰减调整学习率 ExponentialLR
  4. 余弦退火函数调整学习率:CosineAnnealingLR
  5. 根据指标调整学习率 ReduceLROnPlateau
    当某指标(loss或accuracy)在最近几个epoch中都没有变化(下降或升高超过给定阈值)时,调整学习率。

自适应学习率调整(学习率优化)

传统SGD的缺点,为什么提出学习率优化

  1. 学习率大小和策略选择困难
  2. 学习率不够智能,对所有参数一视同仁。
  3. 同时面临局部极值和鞍点的问题。

Momentum 动量法

协同参考之前累积的的梯度方向
在这里插入图片描述
在这里插入图片描述

Nesterov牛顿动量法(根据累计梯度计算提前点)

先按照动量方向前进到点C,再根据C点的梯度进行梯度下降,相比动量法
在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/20200222102352360.png

Adagrad(累计梯度反比)

对于不同的参数动态的采取不同的学习率,让目标函数更快的收敛。
将每一个参数的累计梯度平方和开方,用基础学习率除以这个数,来做学习率的动态更新。
adagrad算法一开始是激励收敛,到了后面就慢慢变成惩罚收敛,速度越来越慢。
why?
不同维度变量的梯度变化率不一致,更新的步长不仅要与函数值变化率(一次微分)成正比,还要与导数变化率(二次微分)成反比,因为曲线曲率越大,那么导数变得快,到极值点的距离就越小,曲线曲率越小,导数变得慢,到极值点的距离越大。
这里用累计梯度平方和来近似二次微分。

在这里插入图片描述
在这里插入图片描述

RMSprop(滑动窗口)

上述Adagrad 分母项为前序梯度的累加值,会出现学习率越来越小,造成学习停滞问题。很可能出现早期迭代到不好的极值点之后,由于学习率太小而无法冲出这个极值点导致最后收敛到的解不优。RMSprop采用指数加权移动平均的方法解决。(滑动窗口思想)
在这里插入图片描述

AdaDelta(自适应学习率)

使用上次的近似变化量来近似学习率

在这里插入图片描述在这里插入图片描述

Adam算法

= 动量法+RMSProp
在这里插入图片描述

测试集上表现不好(high varience)

  1. 收集更多的训练数据
  2. 降低模型复杂度

降低参数空间的维度

剪枝 参数共享

降低每个维度上的有效规模(正则化)

L1、L2正则化

为什么减小参数大小->泛化能力好
如果参数绝对值都非常大,这种现象直观表现在图上就是曲线(曲面)不光滑,凹凸不平,很复杂;相反,如果w的各个分量的绝对值都很小,在0附近,那么曲线(曲面)就会显得很平滑。很显然,在机器学习中,我们更希望拟合出的曲线(曲面)更为平滑,因为这样的曲线(曲面)是具有较好的泛化能力的。

  • L2 正则化
    在这里插入图片描述
    在这里插入图片描述
    每次乘一个恒小于1的项,导致越来越小,趋近于0,但是由于符合高斯分布,并不真正衰减为0。L2正则化对于绝对值较大的权重予以很重的惩罚,对于绝对值很小的权重予以非常非常小的惩罚,当权重绝对值趋近于0时,基本不惩罚。
    这样有利于处理共线性强的特征。
    但是不能获得较为稀疏的网络(权重!=0)。
  • L1 正则化
    在这里插入图片描述
    在这里插入图片描述
    那么w原来是负数就+,原来是正数就-,整体优化方向=0
    相对L2来说,面对不同的w值梯度恒等,那么有利于较小值归零,完成稀疏化,用于特征选取。但是一开始值比较大的话对该权重的约束就不大了。
    缺点:对于共线性强的特征只留一个,但是有可能这几个特征对于决策都有用。
    在这里插入图片描述

Early Stopping

训练中计算模型在验证集上的表现,当模型在验证集上的表现开始下降的时候,停止训练,这样就能避免继续训练导致过拟合的问题
理论训练误差曲线

在这里插入图片描述
早停标准:

  • st:泛化误差大 , 泛化损失=泛化误差/目前的最低的误差-1(gl)
  • st:训练误差。解释:当训练的速度很快的时候,我们可能希望模型继续训练。因为如果训练错误依然下降很快,那么泛化损失有很大概率被修复。度量进展=平均训练错误/目前最小的训练错误-1(pq)
  • 泛化错误的变化,即当泛化错误在连续ss个周期内增长的时候停止(up)
    参考early stopping

Dropout

  • 原理:
  • ensemble解释
    当作一种集成化方法,假设该层神经元的数量为n,那么如果dropout=50% 相当于同时训练了2^n个共享参数的网络,每个网络使用一个mini-batch(1 iter中)训练。测试的时候用所有节点均值来近似所有网络均值
  • 减少神经元之间复杂的共适应关系
    不一定每次dropout的时候两个神经元都共存
  • 生物学角度
  • 物种为了生存往往会倾向于适应这种环境,环境突变则会导致物种难以做出及时反应,性别的出现可以繁衍出适应新环境的变种,有效的阻止过拟合,即避免环境改变时物种可能面临的灭绝。
    2.方法
    训练的时候以p(一般取0.5使得可得到的网络结构数最大)的概率选取神经元,测试时使用所有神经元,权重x(1-p)。(学得的w是偏大的,为了使得训练和测试时的输出预期相近)

BN

为啥做BN

  • 对于神经网络的每一层来说,它的输入相当于上一层的输出,那么在不使用RMSProp的情况下,每个参数的学习率一致,为了使得各参数的梯度变化大致相似,先归一化
  • 随着层数的深入,如果是用sigmoid 或者tanh 作为激活函数的话,输出值会越来越小,导致梯度消失,先归一化之后使得输出靠近0附近(上述两个激活函数梯度敏感范围),减轻梯度消失问题
  • 论文中的说法,减缓Internal covariate shift:每一层的输入相当于上层输出,而由于上层影响,在训练过程中,每训练一轮参数就会发生变化,对于一个网络相同的输入,但n-1层的输出却不一样,这就导致对于相同输入第n层的输入也不一样,这层输入的分布一直在变,不利于网络学习

咋做BN

训练:

  1. 转化为均值为0,方差为1的标准分布
    每个 x i = ( x i u ) / ( s q r t ( v 2 ) + e ) x_i = (x_i – u) / (sqrt(v^2)+ e) e是一个小小偏置,防止分母趋向于0.
  2. 加scale和偏置
    x i = s c a l e x i + s h i f t x_i = scale*x_i + shift
    为啥加?之前都归一化到标准分布会使得网络趋于线性,没有好的表达能力,为了保证非线性。
  3. 注意!BN层在bp的时候也要考虑,可以把它看成一层网络。
  • 测试:
    使用训练时累计得到的均值方差统计量来近似
    具体到pytorch中
    利用一个动量参数维护一个动态均值与动态方差
    在这里插入图片描述

BN的优点

  1. 解决上述的 Internal convariate shift;
  2. 一定程度上减缓梯度消失,加速训练
  3. 防止overfitting:在训练中,BN的使用使得一个mini-batch中的所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果。
  4. 减弱对初始化参数选取的要求

BN 的bp推导

由后向前根据链式法则来 参考知乎大佬链接

Normolization 对比

  • BN: 在NHW上归一化,得到C组var mean 值,batch size 小的时候效果不好,也不适合用在RNN上
  • LN:在CHW上归一化,得到N组var mean值,通常用在RNN上
  • IN:Instance Norm在HW上归一化,得到NXC组 var mean值,通常用在风格迁移上
  • GN:GroupNorm将channel分组,然后再做归一化;
  • SN: SwitchableNorm, 将BN、LN、IN结合,赋予权重,由神经网络自行学习使用哪一种
    在这里插入图片描述
发布了35 篇原创文章 · 获赞 2 · 访问量 1429

猜你喜欢

转载自blog.csdn.net/qq_30776035/article/details/104440116