调参
-
死亡的神经元占的比例
-
RELU
文中给出了一种针对ReLU神经元的特殊初始化,并给出结论:网络中神经元的方差应该是代码为w = np.random.randn(n) * sqrt(2.0/n)。这个形式是神经网络算法使用ReLU神经元时的当前最佳推荐。
输入方差是1,经过权重之后计算之后输出方差为1的变量,然后再往后传一直是1,所以这样做的目的是什么嗯、
最后一句话总结:批量归一化可以理解为在网络的每一层之前都做预处理,只是这种操作以另一种方式与网络集成在了一起。搞定!
- 白化操作
-
l1,l2 正则化,
有点像是最优化里的方法, 就是求最优解的时候加一个限定条件。这个时候最有解一般在交界处。除非最优解在原点位置。并且大多数时候,l2正则化与其他权重的交点都是权重相等的。而l1正则化的各个方向不是相同。最有可能与等高线相交的是在坐标轴是。以两个数值为例,可能直接一个有值,另一个为0.
范数的表示 -
BatchNorm
在实现层面,应用这个技巧通常意味着全连接层(或者是卷积层,后续会讲)与激活函数之间添加一个BatchNorm层
- 过拟合
在图中,蓝色的验证集曲线显示相较于训练集,验证集的准确率低了很多,这就说明模型有很强的过拟合。遇到这种情况,就应该增大正则化强度(更强的L2权重惩罚,更多的随机失活等)或收集更多的数据
- 每层的激活数据及梯度分布
一个不正确的初始化可能让学习过程变慢,甚至彻底停止。还好,这个问题可以比较简单地诊断出来。其中一个方法是输出网络中所有层的激活数据和梯度分布的柱状图。直观地说,就是如果看到任何奇怪的分布情况,那都不是好兆头。比如,对于使用tanh的神经元,我们应该看到激活数据的值在整个[-1,1]区间中都有分布。如果看到神经元的输出全部是0,或者全都饱和了往-1和1上跑,那肯定就是有问题了。
- 动量更新
- Momentum,当前位置的向梯度和之前速度方向的合并
v = mu * v - learning_rate * dx # 与速度融合
x += v # 与位置融合
-
Nesterov 向前看的一种方式,
image.png
x_ahead = x + mu * v
# 计算dx_ahead(在x_ahead处的梯度,而不是在x处的梯度)
v = mu * v - learning_rate * dx_ahead
x += v
- 学习率退火
如果学习率很高,系统的动能就过大,参数向量就会无规律地跳动,不能够稳定到损失函数更深更窄的部分去。
随步数赛衰减
指数衰减
t衰减
- 自适应调参
- Adagrad
# 假设有梯度和参数向量x
cache += dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
注意,变量cache的尺寸和梯度矩阵的尺寸是一样的,还跟踪了每个参数的梯度的平方和。这个一会儿将用来归一化参数更新步长,归一化是逐元素进行的。注意,接收到高梯度值的权重更新的效果被减弱,而接收到低梯度值的权重的更新效果将会增强。有趣的是平方根的操作非常重要,如果去掉,算法的表现将会糟糕很多。用于平滑的式子eps(一般设为1e-4到1e-8之间)是防止出现除以0的情况。Adagrad的一个缺点是,在深度学习中单调的学习率被证明通常过于激进且过早停止学习。
- RMS
cache = decay_rate * cache + (1 - decay_rate) * dx**2
x += - learning_rate * dx / (np.sqrt(cache) + eps)
更新cache的方法:cache减小一点往dx方向增加一点。
- adam
m = beta1*m + (1-beta1)*dx
v = beta2*v + (1-beta2)*(dx**2)
x += - learning_rate * m / (np.sqrt(v) + eps)