CS231n 7. Training Neural Networks II 训练神经网络
7.1 更好的优化
随机梯度下降(SGD):在每次迭代中,选取一小部分训练样本,成为minibatch(小批量),用minibatch来估算误差总和L(W)和实际梯度wL(W).这种选取是随机的,当做对真实值期望的蒙特卡洛估计。
SGD存在的问题:
鞍点:既不是极大值点也不是极小值点的临界点
噪声项。。
优化算法:使网络更快收敛
SGD动量法:
加入动量项 初始化为0
Nesterov法
RMSProp法
AdaGrad法:
有两个坐标轴,沿其中一个轴有很高的梯度,另一轴很小梯度,随着累加,会在更新参数除一个很小的数,从而加速了在小梯度维度上的学习速率。
凸函数有利,因为adagrad法的学习率慢慢变小。
1e-7:为了除数不为0
Adam法:(默认使用此算法)
一开始second_moment很小,所以前几步结果很大,步长很大,可能就越过L极小值了
超参数设置:
学习率 learning rate:
学习率用什么值 是最好的呢?
答:变成一个随时间变化的变量!
学习率衰减
先尝试不用衰减,观察loss曲线,看看在哪个地方开始衰减。
以上优化算法都是一阶优化算法
怎么做来减少训练和测试之间的误差差距呢?(差距过大 过拟合)
答:模型集成
模型集成 Model Ensembles
7.2 正则化
提高性能,使网络更快收敛
第一项是能拟合匹配数据。
有正则化方法: L2正则化、dropout、batch normalization(常用)
dropout:正向传播过程中,在全连接层中,随机让某个神经元上的**函数的结果置0.(有时也在卷积层,是随机把整个特征映射置0),然后在测试时被边缘化。
dropput避免了特征间的相互适应
训练中加入一些噪声,在测试时再将噪声边缘化(不是随机的了)。
7.3 迁移学习 Transfer Learning
不需要超大的样本集也能训练神经网络(因为样本数量少,易过拟合,所以要大的样本数)
下载预训练的模型,然后初始化部分模型/在数据上精调模型