Please enable JavaScript.
Coggle requires JavaScript to display documents.
观察“训练误差-迭代“曲线 (多次训练最优解存在差距 (机器学习局部最优解 表现
多次训练得出的最优解有差距
原因
…
观察“训练误差-迭代“曲线
多次训练最优解存在差距
机器学习局部最优解
- 表现
多次训练得出的最优解有差距
- 原因
因为有局部最优解的存在,无法到达全局最优解
- 解决方法
多次随机初始化权重并训练模型,选择最优解
深度学习局部最优解
- 表现
- 因为深度学习参数很多,所以机器学习的局部最优解问题已经很少会出现,但是会出现另一个局部最优解马鞍状,称为saddle point
- 类似马鞍状的plateaus会降低神经网络学习速度。Plateaus是梯度接近于零的平缓区域,如下图所示。在plateaus上梯度很小,前进缓慢,到达saddle point需要很长时间。到达saddle point后,由于随机扰动,梯度一般能够沿着图中绿色箭头,离开saddle point,继续前进,只是在plateaus上花费了太多时间。
原因
因为深度学习中,params比机器学习的多,那么损失函数就有可能形成马鞍状
解决方法
- 只要选择合理的强大的神经网络,一般不太可能陷入local optima
- RMSprop,Adam算法都能有效解决plateaus下降过慢的问题,大大提高神经网络的学习速度。
在最低点附近震荡
表现
在最低点附近震荡,始终无法靠近最低点或离最低点太远
-
解决方法
使用学习率衰减
原理:逐渐减小学习率,最后让它在最低点又较小震荡
个人认为Adam,Monentum训练算法也有用
原理:因为冲量累加下,偏离的向量会抵消掉
误差无法减小
-
存在问题
梯度爆炸
原因
- 训练一个层数非常多的神经网络,而且假设g(z)=z时,Y的公式就会这样
- 当W都大于1(假设为1.1),而且神经网络有50层时,Y_hat = 117.4X, X只要有一点细微变化,Y_hat的变化都会很大
解决方法
控制权重初始化
例子
以单个神经元为例,如果z太大或者太小时,g'(z)会太大或太小(有些导数和z有关),所以z最好在0附近。因为X的值在[-1,1]内,而且做z=w1x1+w2x2+...+wn*xn,是加法,所以w平均值应该为0,stddev为1/n
不同激活函数stddev不同
- ReLU
- np.random.randn(n[l],n[l-1])np.sqrt(2/n[l-1]n[l])
- np.random.randn(n[l],n[l-1])*np.sqrt(2/n[l-1])
- Tanh:
np.random.randn(n[l],n[l-1])*np.sqrt(1/n[l-1])
梯度截断
分类
逐元素截断
概述
在参数更新之前,逐元素截断小批量产生的参数梯度
范数截断
概述
在参数更新之前截断梯度g的范数||g||(就是设置比例,按比例缩放g
-
-
原理
经过梯度范数截断,参数更新的向量范数变得有界
原理
当梯度大小高于阈值是,即使是采取简单的随机步骤往往工作得几乎一样好
检验方法:斜率验证
-
实现
计算近似斜率Theta(approx)和反向传播斜率Theta的差值
注意事项
- 不要在整个训练过程中都进行梯度检查,仅仅作为debug使用
- 如果梯度检查出现错误,找到对应出错的梯度,检查其推导是否出现错误
- 注意不要忽略正则化项,计算近似梯度的时候要包括进去
- 梯度检查时关闭dropout,检查完毕后再打开dropout
- 随机初始化时运行梯度检查,经过一些训练后再进行梯度检查(不常用)
结果
当参数梯度非常大时,梯度下降的参数更新可以将参数抛出很远,进入目标函数较大的区域
初始学习率太大
- 原因:梯度下降时走过了
- 解决方法
减小初始学习速率,作为HyperParameter手工调试,Andrew建议从0.001开始,每次乘以3尝试
梯度消失
解决方法
引导信息流的正则化
概述
即使损失函数只对序列尾部的输出做出惩罚,梯度向量再反向传播时能维持其幅度(就是梯度大小恒定防止过小)
-
概述
当前面隐藏层的学习速率低于后面隐藏层的学习速率,即随着隐藏层数目的增加,分类准确率反而下降了
误差有减小的趋势,但是跳动很大
存在问题
batch_size过小
- 原因:batch_size太小,梯度下降方向不稳定
- 解决办法:增大batch_size或使用Adam optimizer
-
-
-