lecture7
梯度检查
梯度检查很简单,将分析梯度与数字梯度相比较。事实上,很容易出错。
- 利用中心化梯度公式。
计算两次损失函数耗时更久一些,但梯度计算准确。
- 利用相对误差比较
如果数字梯度 f′n f n ′ 和分析梯度 f′a f a ′ 差值超过一定限度,你可能将此定义为梯度检验失败,这有问题。定义相对误差更合理。
相对误差<1e-4,如果有不可导函数还可以,否则太高。
相对误差<1e-7,很好。
- 利用双精度。
- 保持浮点附近的有效范围。如果梯度很小,如小于1e-10,归一化后更小,会造成很多数值问题。如果过小,利用常数将损失函数数值范围扩大到更好的范围。
- 注意目标函数的不可导点。使用少量数据点越过不可导点。
- 数值精度,步长h一般在1e-4到1e-6。
- 网络学习预热一会儿再开始梯度检查。
- 不要让正则化吞没数据,关掉正则化对数据损失单独检查,再对正则化做单独检查。
- 梯度检查关闭随机失活和数据扩张。
- 有选择的检查少量维度的梯度。
合理性检查
- 特定情况的正确损失值,如softmax十分类器初始损失值2.302。
- 对小数据集训练,正则化强度为0,能确保损失值为0。
- 观察不同学习率的损失函数曲线,学习率低导致改善是线性的,过高导致损失值下降太快,停在不好的损失值上。
- 每个参数集更新比例大约在1e-3,据此调整学习率。
- 不正确初始化可以通过输出所有层激活函数和梯度分布柱状图来发现,如果是图像,可以可视化图像
参数更新方法
- 普通梯度下降更新。
- 动量更新。最优化过程模拟质点在地形上滚动。质点所受力就是损失函数负梯度,梯度与质点的加速度成比例。梯度影响速度,速度影响位置。变量mu被看作动量,一般设为0.9,与摩擦系数意义一致,一般取值为[0.5,0.9,0.95,0.99]中的一个。
# 动量更新
v = mu*v - learning_rate*dx
x +=v
- Nesterov动量,对凸函数得到更好的收敛。核心思路是,当参数位于某个位置x时,动量通过mu*v稍微改变参数向量,要计算梯度,可以将未来的近似位置计算梯度。
v_pred=v
v = mu*v - learning_rate*dx_ahead
x +=-mu*v_pred+(1+mu)*v
学习率退火
知道什么时候开始衰减学习率是有技巧的。
- 随步数衰减。典型每5个周期学习率减少一半,每20周期减少到之前的0.1.使用固定的学习率训练同时观察验证集错误率,每当验证集错误率停止下降,就乘以0.5降低学习率。
- 指数衰减,t是迭代次数,
α=α0e−kt
α
=
α
0
e
−
k
t
。
- 1/t衰减,
α=α01+kt
α
=
α
0
1
+
k
t
。
实践中,随步数衰减的随机失活更受欢迎。
二阶方法(不常用)
基于牛顿法优化。hessian矩阵是函数的二阶偏导数的平方矩阵,反应损失函数的局部曲率,曲率小的时候大步前进。但计算hessian矩阵耗时,所以出现各种拟牛顿法。比较流行的是L-BFGS,随时间的梯度中的信息隐式近似。
各参数适应学习率方法
- AdaGrad,接收高梯度值的权重更新会减弱,低梯度值的权重会增强,但单调变小的学习率被证明过于激进且早停。RMSprop是一个高效的改进,使用梯度平方的滑动平均。eps是平滑式子,一般在1e-4到1e-8之间。
cache = decay_rate*cache + (1-decay_rate)*dx**2
x += -learning_rate*dx/(np.sqrt(cache)+eps)
decay_rate常用值[0.9,0.99,0.999]。
- Adam。像是RMSProp的动量版,建议Adam作为默认算法,或者SGD+Nesterov动量。eps=1e-8,beta1=0.9,beta2=0.999.完整Adam包含一个偏置矫正机制。
first_moment=0
second_moment=0
for t in range(1,num_iterations):
dx= compute_gradient(x)
first_moment = beta1*first_moment + (1-beta1)*dx
second_moment = beta2*second_moment +(1-beta2)*(dx**2)
first_unbias = first_moment/(1-beta1**t)
second_unbias = second_moment/(1-beta2**t)
x +=-learning_rate*first_unbias/(np.sqrt(second_unbias)+1e-7)
Tips
- 从粗到细搜索,随机搜索优于网格搜索。
- 模型集成获得额外的性能提高。集成方法有:
- 同一个模型,不同初始化。
- 使用交叉验证发现最好的几个模型。
- 一个模型在多个时间留下记录点,再做模型集成。
- 如果损失值相较于前一次指数下降,备份网络权重,对前几次循环中的参数求平均值。