目录
1. dropout
使用 L1 和 L2 正则去限制神经网络连接的 weights 权重
在深度学习中,最流行的正则化技术,它被证明非常成功,即使在顶尖水准的神经网络中也可以带来 1%到 2%的准确度提升,这可能乍听起来不是特别多,但是如果模型已经有了 95%的准确率,获得 2%的准确率提升味着降低错误率大概 40%,即从 5%的错误率降低到 3%的错误率
在每一次训练 step 中,每个神经元,包括输入神经元,但是不包括输出神经元,有一个概率神经元被临时的丢掉,意味着它将被忽视在整个这次训练 step 中,但是有可能下次再被激活。
例比:公司每天投掷硬币只要一半的员工上班,或许带来的公司收入更高?公司或许因为这个被迫调整组织结构,也许员工一人会多个任务,而不是未来受制于一俩个员工的缺席,这里的员工类比到神经元
keep_prob 是保留下来的比例,1-keep_prob 是 dropout rate当训练的时候,把 is_training 设置为 True,测试的时候,设置为 False
2. 数据增强
从现有的数据产生一些新的训练样本,人工增大训练集,这将减少过拟合。
TensorFlow 提供一些图片操作算子,例如 transposing(shifting),rotating,resizing,
flipping,cropping,adjusting brightness(自适应亮度),contrast(对比度),saturation(饱和度),hue
3. 优化器
SGD stochastic gradient descent,即随机梯度下降,
对于训练数据集,我们首先将其分成 n 个 batch,每个 batch 包含 m 个样本。我们每次更新都利用一个 batch 的数据,而非整个训练集。
η为学习率,gt 为 x 在 t 时刻的梯度.
当训练数据太多时,利用整个数据集更新往往时间上不现实。batch 的方法可以减少机器的压力,并且可以更快地收敛.
Momentum
SGD 方法的一个缺点是,其更新方向完全依赖于当前的 batch,因而其更新十分不稳
定。解决这一问题的一个简单的做法便是引入 momentum,
模拟的是物体运动时的惯性,更新的时候在一定程度上保留之前更新的方向,同时利用当前 batch 的梯度微调最终的更新方向,
这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力,
保留一定的上一次的更新量,ρ 即 momentum,表示要在多大程度上保留原来的更新方向,
Adagrad
自适应的调整学习率
Adagrad 会累加之前所有的梯度平方,
对 g_t 从 t 进行一个递推形成一个约束项
ε用来保证分母非 0,
前期 g_t 较小的时候, regularizer 较大,能够放大梯度,
后期 g_t 较大的时候,regularizer 较小,能够约束梯度
Adadelta
Adadelta 是对 Adagrad 的扩展,最初方案依然是对学习率进行自适应约束,但是进行了计算上的简化。Adagrad 会累加之前所有的梯度平方,而 Adadelta 只累加固定大小的项,并且也不直接存储这些项,仅是近似计算对应的平均值,
上一次和本次的g_t**2根据权重v取一个平均
特点:
训练初中期,加速效果不错,很快
训练后期,反复在局部最小值附近抖动
RMSprop
特点:
其实 RMSprop 依然依赖于全局学习率
RMSprop 算是 Adagrad 的一种发展,和 Adadelta 的变体,效果趋于二者之间
适合处理非平稳目标- 对于 RNN 效果很好
Adam
Adam(Adaptive Moment Estimation)本质上是带有动量项的 RMSprop
特点
结合了 Adagrad 善于处理稀疏梯度和 RMSprop 善于处理非平稳目标的优点
对内存需求较小
为不同的参数计算不同的自适应学习率
也适用于大多非凸优化- 适用于大数据集和高维空间