时间:2019/4/4
内容:更好的优化、正则化
接上一份学习笔记,继续讲Adam
-
使用Adam,我们使用第一动量和第二动量的估计值。上图红框里,我们让第一动量的估计值等于梯度的加权和。我们有一个第二动量的动态估计值(AdaGrad,
RMSProp),是一个梯度平方的动态近似值,下面我们来看如何更新他们。我们使用第一动量(类似于速度),并除以第二动量平方根 -
在最开始时会得到一个很大的步长,这并不是因为梯度大,而是因为第二向量被人为初始化为0。Adam算法也增加了偏置校正项,来避免出现开始时得到很大步长,见下方图:
-
关于学习率的选择
训练开始时选择较大学习率,训练过程中逐渐衰减,有以下三种衰减策略
注意:带动量SGD的学习率衰减很常见,但是像Adam的优化算法就很少用学习率的衰减;学习率衰减是一个二阶的超参数,一般做法是,先不设置衰减,进设置学习率看会发生什么,观察loss曲线,看看希望在哪个地方开始衰减 -
查阅残差网络相关内容
之前谈到的所有的都是一阶优化算法
上图用二次函数来局部逼近。
推广到多维:
注意到这种方法中没有学习率,我们是做了二阶逼近直接走到这个二次函数的最小值点。但这种算法对深度学习来说有点不切实际,当数据量极大时,构造的海森矩阵很大,内存存不下。
用拟牛顿法来代替牛顿法。不直接求海森矩阵的逆,而是去逼近这个值
L-BFGS是二阶优化器,它是二阶逼近
随机性很小的时候可以用L-BFGS
目前我们讲的优化算法都是在减小训练误差和最小化目标函数。但我们并不在意训练误差,我们更在意在没见过的数据上的表现,我们很在意减小训练误差和测试误差之间的差距,从而在验证集上得到最优的结果,以使得在没见过的数据上表现得更好,一种方法是模型集成(不同模型中的参数有可能不同)
思想:举个例子,比起使用一个模型,我们选择从不同的随机初始值上训练10个不同的模型,到了测试时,我们会在10个模型上运行测试数据,然后平均10个模型的预测结果。把多个模型加在一起能够缓解一点过拟合
Polyak平均:训练模型的时候,对不同时刻的每个模型参数求指数衰减平均值,从而得到网络训练中一个比较平滑的集成模型
课时17:正则化
如何提高单一模型的效果?使用正则化在模型中加入一些成分来防止训练机上的过拟合,从而使测试集上的效果得到提升
- 右边是dropout后的网络,我们只用了其中一部分神经元,而且每次正向传递都是不同的部分。被置零的是激活函数,每一层都是在计算上一个激活函数的结果乘以权重矩阵,得到下一个激活函数前的结果,然后我们计算激活函数,将其中一部分置零
- 一般在全连接层使用dropout,有时卷积层也会用(在卷积层使用时,有时可能并不是随机把某个神经元上激活函数的结果置零,而是随机把整个特征映射置零,也就是说,在卷积神经网络中,有一个维度表示通道,你又可能要把某几条通道整个置零而不是某几个元素)
代码实现:
dropout避免了特征间的相互适应,某种程度上抑制了过拟合
dropout可看作非常多个网络集合在同时被训练
用dropout的概率乘以输出
除了dropout,batch normalization也符合左侧的想法(训练时引入随机,测试时消除);有时使用了BN就不使用dropout了;dropout在某种程度上更好,因为可以通过改变参数b来调整正则化力度,但BN不行
另一种符合这种想法的是数据增强
随机水平翻转
从图像中随机抽取不同尺寸大小的剪裁图像,在测试过程中通过评估一些固定的剪裁图像来抵消这种随机性(通常是四个角落和中间)
以上dropconnect是随机将权重矩阵的一些值置零
以上是部分最大池化,每次池化操作时将随机池化我们池化的区域(但并不常见 )
以上随机深度。在训练时,我们随机的从网络中丢弃部分层,测试时使用全部网络
注意:通常使用BN就够了,有时当发现BN单独使用不太够时,可以增加dropout或其他一些东西