我们期望降低的是期望泛化误差,也叫风险。但是我们平时训练时是以训练误差计算,俗称经验风险最小化。可能导致过拟合。
训练方式:
当原问题较难运算时,可以计算对等问题,使用代理损失函数。但是提前终止算法使用的是真实的损失函数一般。
当训练数据过多时,一般每次训练不使用全部样本,而是选取部分批次来训练,大大降低了训练成本,提高训练速度。
但是要注意,选取批次样本时,要先将数据打乱(shuffle),这样选取的批次才具有随机和独立性。
使用单个样本来训练的方式称为在线学习或随机学习。整个训练集的算法称为批量或确定性算法。但是小批量也可简单的称为随机算法。
基于小批量的算法,可以认为每次从同分布数据集中,取出部分数据,这样每次训练样本都不会重复,可以更好的泛化。
神经网络优化中的挑战
梯度范数:
局部极小值:神经网络中存在多个局部极小值点,我们很容易得到局部极小值而造成代价更大。
高原、鞍点和其他平坦区域:
鞍点,某些切面极小值的同时在某些切面极大值。
平台区域也较难找寻极值点,会不断扰动。
悬崖和梯度爆炸:突然很大的斜率。可以使用梯度截断来克服
长期依赖:无法记忆之前神经网络处理的内容,以及层数太多导致梯度消失与梯度爆炸。
非精确梯度:精确梯度难以计算的情况下求近似。
局部和全局结构间的弱对应:局部优化可能较难实现的时候,重点关注参数初始化方式。
基本算法
随机梯度下降:SGD 每次取补丁批量的小样本,计算梯度,然后根据梯度的均值,原有参数减去学习率乘以梯度的均值。
看到一种优化方式,初始时,批量大小逐渐增加,加快初始时训练速度。
动量相关算法(Polyak):动量相关,原有SGD更新梯度的基础上,增加了一个动量,代表本次梯度方向的动量,让模型更稳定,更容易训练。主要解决Hessian的病态条件,和随机梯度的方差。
Nesterov动量算法:动量算法的变种,提高收敛速度,但是没有改进收敛率。计算方式只是改变了其中一部分的运算顺序。
参数初始化策略
均匀初始化和高斯初始化比较常用,目前没有对初始化方式的什么明确要求,主要要求就是不能为一样的值。
自适应学习率算法
AdaGrad:缩放每个参数反比于其所有梯度历史平方之总和的平方根。
RMSProp:带动量的自适应。
自适应这边有一种类似股票均值漂移的方式。
Adam: AdaGrad + RMSProp,这本书和其他地方看的不一样好像
余弦算法:学习率不断减小,向余弦函数一样
重启算法:余弦函数右半段的不断重复,一定程度避免进入局部极小值,当学习率为0后,重启一次,达到原有学习率最高值的一定比率。
二阶近似方法
牛顿法:二阶算法运算量较大,直接迭代计算梯度和二阶Hessian矩阵的逆,通常采用近似的拟牛顿法。
共轭矩阵:
BFGS:计算近似逆矩阵来实现。但需要存储整个逆矩阵,不适合大数据及。
L-BFGS:减小存储空间的方法。
优化策略和元算法
批标准化:每层的输入再做一次标准化,加快运算速度。
坐标下降:将一个最优化问题拆分,循环优化所有变量,而不是同时一次性优化全部变量。通常应用于部分变量不依赖于另一部分变量。这里举例使用的稀疏编码中权重矩阵W和线性解码激活矩阵H,交换固定一个训练另一个,那么生成对抗网络不也是这个意思吗。
Polyak平均:前面说的均值算法,通过多次梯度下降得到的参数,得到此刻的参数为之前几次得到的均值。应用于非凸问题时,使用指数衰减计算平均值:
监督预训练:使用浅层网络的模型训练得到的数据作为辅助帮助复杂模型进行训练。还有就是迁移学习。
延拓法:从简单问题出发,逐渐演变为复杂问题。主要代表为课程学习方法。