深度学习优化
一、参数初始化+激活函数
1.深度学习优化:标准化
1.1 什么是激活
什么是激活?
将输入映射为特定分布的输出,完成非线性变换

1、人脑的细胞接受刺激从而产生活动,需要一定的阈值,没有达到阈值,几乎没用。
2、不同的刺激产生的输出也是不同的,达到一定值后就饱和了,再加大也没用。
激活函数的简单例子
几种常见的输入输出激活关系

网络的表达能力
如果没有非线性激活函数:增加网络层数模型仍然是线性的

1.2 S型激活函数
Logistic函数(常被代指Sigmoid函数)与Tanh函数

S型激活函数特点

1.3 ReLU激活函数
Rectified Linear Unit,修正线性单元,正区间恒等变换,负区间为0

优点:计算简单,导数恒定;拥有稀疏性,符合人脑的神经元活跃特性
缺点:非零中心化,没有负激活值,影响梯度下降效率;如果一次不怡当的参数更新后,所有数据都不能使某个神经元激活,则其对应的参数梯度为0,以后也无法激活,陷入‘死亡’(Dead ReLU)
ReLU激活函数的改进
统一形式:**max{αx,x}:**解决ReLU函数"负区间的零激活问题
- α取固定值则为Leaky ReLU(简称LReLU),为可以学习的参数则为Parametric ReLU(简称PreLU)为随机值则为Random ReLU(简称RreLU)。

Exponential Linear Unit, 简称ELU


优点:被证实有较高的噪声鲁棒性,能够使得神经元的平均激活均值趋近为0。
缺点:由于需要计算指数,计算量较大。
1.4 Maxout激活函数
从多个输入中取最大值,求导非常简单,只在最大值的一路有梯度

优点:整体学习输入到输出的非线性映射关系,拟合能力非常强
缺点:计算量增加,增加了k-1个神经元
自动学习的激活函数代表:Swish函数

2.深度学习优化:泛化与正则化
2.1 参数初始化
深度学习兴起的开端:逐层无监督预训练方法,解决深度模型初始化、训练不稳定的问题

- 逐层无监督预训练玻尔兹曼机,首先把数据向量x和第一层隐藏层作为一个RBM,训练出该RBM的参数。然后固定训练好的参数,将h1视作可见向量,把h2视作隐藏向量,训练第二个RBM,依次类推。
- 利用无监督的RBM网络来预训练一个深度信念网络,然后将其作为一个多层前馈神经网络的初始化权重,再使用反向传播算法微调,**“预训练+微调”**有效解决深层模型难以训练的问题。
什么是好的参数初始化
各层激活值不为0也不出现饱和;每层的权重方差、梯度与层数无关,更有利于优化

2.2 常见初始化方法
简单初始化
- 全零初始化与随机初始化方法
- 全零初始化:在第一次更新的时候,除了输出层之外,所有的中间层的节点的值都为零。一般神经网络拥有对称的结构,导致进行第一次误差反向传播时,更新后的网络参数将会相同,在下一次更新时,相同的网络参数提取不到有用的特征。即使是对于非对称的网络结构,这样的随机参数也不利于接下来的优化。
- 随机初始化:np.random.randn(n),用随机值进行初始化。参数的初始值不能取得太小,因为较小的参数在反向传播时会导致过小的梯度,会产生梯度弥散问题,降低参数的收敛速度。而过大不仅会造成震荡,对于Sigmoid等激活函数也会进入梯度饱和区。
标准初始化
固定方差的初始化方法:输出方差与输入方差有稳定的关系
训练时需要配合归一化方法使用


Xavier 初始化
方差缩放(Variance Scaling)的初始化方法
Glorot条件:各层的激活值和梯度的方差在传播过程中保持一致,激活函数对称,每层的输入均值都是0。

根据神经元数量自动调整均勻初始化方差分布
不同激活函数与分布下的激活形式

MSRA初始化
更适合ReLU的初始化

思考
- 如何获得更好的初始化?

二、标准化方法+正则化
1.标准化方法
1.1 什么是标准化
数据标准化(Normalization)或归一化可以增强信息的辨识度A

神经网络中标准化的作用
去除量纲干扰,保证数据的有效性,稳定数据分布
去除量纲的干扰,防止数值过小的特征被淹没
- [年龄:30身高:170性别:1年薪:500,000.....]
保证数据的有效性
稳定前向传播激活值和反向传播过程中的梯度

稳定数据分布
- 当深层网络中数据分布有明显的偏移,不利于网络学习
1.2 常见标准化方法
BN
批标准化方法(Batch Normalization,简称BN)



BN的作用
提高训练速度,稳定模型训练
- 减轻了对参数初始化的依赖,前向激活值与反向梯度更加有效。
- 平滑了优化目标函数曲面,梯度更稳定,可以使用更高的学习率,从而跳出局部极值,增强了泛化能力。

BN的缺点
要求固定的Batch长度与均匀采样;batch过小数值计算不稳定

BN的改进
Batch Renormalization,增加样本相关的变换,让每个batch的均值和方差逼近真实分布

实际使用: (1)先使用BN训练到一个相对稳定的状态 (2)稳定后再使用Batch Renormalization,r和d在一定大小范围内迭代
常见标准化方法的对比
令输入数据维度为(N,C,H,W),区别在于计算的数据维度不同

2.正则化
2.1 什么是泛化&正则化
什么是泛化
所谓泛化(Generalization),模型不仅在训练集表现良好,在未知的数据(测试集)也表现良好,即具有良好的泛化能力

泛化不好的后果
模型性能不稳定,容易受到攻击

什么是正则化
所谓正则化(Regularization),目标就是要同时让经验风险和模型复杂度都较小,是对模型的一种规则约束

f即预测结果函数,V即损失函数。R(f)是一个跟模型复杂度相关的单调递增函数,用于约束模型的表达能力。
2.2 正则化方法
正则化方法分类
- 显式正则化(经验正则化,参数正则化)
- 网络结构,损失函数的修改,模型使用方法的调整
- 隐式正则化
- 没有直接对模型进行正则化约束,但间接获取更好的泛化能力
显式方法-提前终止
提前终止模型的训练

显式方法-模型集成
模型集成(Ensemble):多次训练不同的模型进行结果融合

模型集成(Ensemble):多次使用不同的数据训练模型进行结果融合

显式方法-Maxout
Maxout,取N个激活的最大值

显式方法-Dropout
训练时按照概率p随机的丢弃一部分节点,测试时不丢弃,输出结果乘以p

有n个节点的神经网络,可以看做是2^n个模型的集成,获得神经元的稀疏性
Dropout带来更稀疏的激活模式,更多接近于0的激活值

Dropout带来更低的泛化误差与更好的特征提取器

显式方法-Dropconnect
Dropconnect,随机去掉连接

显式方法-参数正则化


- 参数空间(w1,w2)是一个二维平面,蓝色部分是一个平方损失函数,黄色部分是正则项。
- L2正则化的最优交点使得w1或者w2特别小。
- L1正则化的最优交点使得w1或者w2等于0,获得所谓的稀疏化。
隐式正则化方法-数据标准化
数据标准化平滑了优化目标函数曲面

隐式正则化方法-数据增强
扩大数据集规模

隐式正则化方法-随机参数更新
随机梯度下降算法,每次选取不同的样本,在不同的优化过程会获得不同结果

隐式正则化方法-标签平滑
标签平滑(label smoothing)

通过加入噪声,减少了真实样本标签的类别在计算损失函数时的权重,最终起到抑制过拟合的效果。
三、学习率与最优化方法
1.学习率与最优化方法
1.1 最优化概述
最优化是应用数学的分支,主要研究在特定情况下最大化或最小化函数或变量

凸优化与非凸优化目标
优化目标有凸函数和非凸函数两种

极值点与鞍点
低维空间中,局部极小值很常见。高维空间中,鞍点(横截面上的局部极小值,某一些方向梯度下降,另一些方向梯度上升)更加常见

1.2 梯度下降算法与学习率
学习率是梯度下降算法中参数更新的步长(乘因子)

学习率迭代策略
学习率在训练过程中不会一直保持不变.

1.3 最优化方法分类
- 常用的一阶优化方法

随机梯度下降算法
Stochastic gradient descent(SGD),沿着梯度反方向进行更新

动量法Momentum
加速的SGD方法,积累了之前梯度指数级衰减的移动平均,并且继续沿该方向移动。


1.4 NAG法与Adagrad法
NAG法
Nesterov accelerated gradient,在动量法中添加了一个校正因子

要求梯度下降更快,更加智能,直接先按照前一次梯度方向更新一步将它作为当前的梯度
Adagrad法
自适应地为各个维度的参数分配不同的学习率

优点:gt较小的时候,能够放大梯度,gt较大的时候,能够约束梯度(激励+惩罚)
缺点:梯度累积导致学习率单调递减,后期学习率非常小,需要设置一个合适的全局初始学习率
1.5 Adam算法
对梯度的一阶和二阶都进行了估计与偏差修正,使用梯度的一阶矩估计和二阶矩估计来动态调整每个参数的学习率

优点:对学习率没有那么敏感,学习步长有一个确定的范围,参数更新比较稳。
缺点:学习率在训练的后期仍然可能不稳定导致无法收敛到足够好的值**,泛化能力较差。**
将Adam使用的二阶矩变成更高阶,就成了Adamax算法。
Nadam算法
NAG加上Adam,就成了Nadam方法,即带有动量项的Adam。

二阶优化方法为何不用?
- 优点:二阶的方法因为使用了导数的二阶信息,因此其优化方向更加准确,速度也更快
- 缺点:二阶方法通常需要直接计算或者近似估计Hessian矩阵,一阶方法一次迭代更新复杂度为O(N),二阶方法就是O(N*N), 计算量大
