7 优化、正则化、迁移学习
7.1 更好的优化
SGD
缺点:不能跨过局部极小值点,或者鞍点
SGD+Momentum: 梯度+当前的动量方向为下一步的方向
Nester+Momentum:先按动量方向前进然后找当前位置的梯度方向,然后回到起点向前两个的方向加起来前进(或者在第一步前进后的位置上向当前梯度的方向前进)。
AdaGrad:每一步累加梯度的平方项,然后在更新的时候除以这个和的梯度平方项。可以使多个维度的梯度方向均匀,例如两个方向,一个梯度大一个梯度小,大的累计就大,然后除以累计的结果后就会变小。
不过会到导致步长越来越小。凸函数好用。RMSProp:AdaGrad的改进
累加时乘一个衰减率,$sum=\rho*sum+(1-\rho)dx^2$Adam
结合了SGD+Momentum和AdaGrad,梯度和梯度的平方1
2
3
4
5
6
7
8
9
10first_moment = 0
second_moment = 0
for t in range(num):
dx = compute_gradient(x)
first_moment = beta1 * first_moment + (1 - beta1) * dx #累计动量
second_moment = beta2 * second_moment + (1 - beta2) * dx * dx 累计动量的平方
# 防止直接乘除步长太
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)
7.2 正则化
L1、L2正则化
加一项参数$W$的L1范数或者L2范数Dropout
随即将一层中的神经元的值置为0
为什么有用:- 一个解释是每个神级元学到的特征不一样,不加dropout时需要将这些特征全部组合在一起才可以判断出来结果,加上以后就可以分别用单个的特征来判断,避免了过拟合。
- 第二种解释是加入的dropout以后相当于去掉了一些神经元,变成了一个子网络,所有的dropout形成的子网络成了在一个模型中的集成学习
Batch Normalization(批量标准化)
Data Augmentation(数据增强)
翻转、随机剪裁、增加对比度、改变颜色等
7.3 迁移学习
更改一个训练好的模型中的一部分,例如如果之前的模型是分1000类的,现在要分10类,则可以冻结前面的特征提取的层,只需将最后的全连接层重新训练即可;
如果是有更多的数据,则可以微调整个模型,降低一下学习率再训练。