这次课,小哥哥回来了,小姐姐走了
一、 更好的优化
- 神经网络的训练,其实是一个优化的过程
- 假设在二维的情况下,我们只要确定最优的W_1 和 W_2就可以了
- 我们使用的最简单的优化方法是随机梯度下降,只有三行代码,如图:
![](https://img.haomeiwen.com/i3559582/d362f604b68528e6.png)
随机梯度下降在实际中的问题
问题1
- 在二维情况下,当损失在一个方向上敏感,而在另一个方向不敏感时,随机梯度下降会成之字形变化,在水平方向上变化很慢
- 在高纬度的情况下,这种情况会更严重
![](https://img.haomeiwen.com/i3559582/742b61f5f4f8e37b.png)
问题2
- 局部极小值或鞍点
- 在高纬度这种情况很严重
![](https://img.haomeiwen.com/i3559582/80bb0e4a295778fb.png)
问题3
- 梯度下降很曲折,很缓慢
![](https://img.haomeiwen.com/i3559582/b77b6e04650bee28.png)
SGD+Momentum
- 在随机梯度下降中,加入一个动量项
- 保持一个不随时间变化的速度,并且将梯度估计添加到这个速度上,在这个速度方向上步进,而不是在梯度反向
- 我们还引入一个超参数,使用这个超参数来对速度进行衰减
- 这种方法,解决了SGD的所有问题
![](https://img.haomeiwen.com/i3559582/1692390c955395d4.png)
- 当它下降的时候,会加速,这样就越过了局部极小值和鞍点(类似给了它惯性)
- 右图中,黑色时SGD,蓝色是加了动量的,表现更好
![](https://img.haomeiwen.com/i3559582/a65bebb82cb7ce5c.png)
- 图中可以看到,我们实际的移动方向,是速度和梯度的综合
![](https://img.haomeiwen.com/i3559582/067856d88febb48c.png)
- Nesterov Momentum,如图,我们根据速度,沿着一个方向移动,然后再计算出梯度
![](https://img.haomeiwen.com/i3559582/bf42e1494dc29898.png)
- 通过变量的替换,我们可以使得公式更加优美
![](https://img.haomeiwen.com/i3559582/9f6544fa67d6b73f.png)
- 图中比较了三中方式
![](https://img.haomeiwen.com/i3559582/c6e46c5ef0aaaad6.png)
AdaGrad算法
- 在训练中保持一个梯度平方项,一直累加梯度的平方到这个平方项
- 更新参数时,除以这个平方项
![](https://img.haomeiwen.com/i3559582/8cbba5e5d099da1a.png)
- 这样会使不敏感的那个方向的速度变快
- 使敏感的方向的速度变慢
- 随着时间的推移,梯度会越来越小,参数更新会越来越慢,可能会困在局部最小值
RMSProp算法-AdaGrad的变体
- 这种算法依然是保持一个平方项,但是会对它进行缩减
- 会导致训练变慢
![](https://img.haomeiwen.com/i3559582/1bc40b687684095f.png)
![](https://img.haomeiwen.com/i3559582/12fefc6712847b05.png)
Adam(almost)算法
- 结合了上面两种优化方式的策略
- 引入两个动量
- 会导致第一步(前几步)的步长很大,因为第二个动量的初始值很小,除法后就会变得很大(这是我们不想看到的)
![](https://img.haomeiwen.com/i3559582/e5676a0fa10ec47b.png)
Adam(full form)算法
- 引入第一动量和第二动量的无偏估计
- 它在实际应用中表现良好的算法
![](https://img.haomeiwen.com/i3559582/7f763053401a711a.png)
- 可以看到Adam表现很好
![](https://img.haomeiwen.com/i3559582/ec3d87d5665c265a.png)
学习率
- 在任何的算法中,都会有学习率这个超参数,该如何选择超参数呢?
- 可以随着训练的推进,减小学习率的值
![](https://img.haomeiwen.com/i3559582/091d0376fb170a71.png)
- 右图中,损失的阶段性递减,是由于使用了学习率递减
- 那些骤降的节点,是由于学习率乘上了某个因子
![](https://img.haomeiwen.com/i3559582/3843235f4661a287.png)
一阶优化算法
- 用到一阶导数
- 一阶泰勒逼近
![](https://img.haomeiwen.com/i3559582/9b6da46fe65a265d.png)
二阶优化算法
- 用到一阶导数和二阶导数
- 二阶泰勒逼近
![](https://img.haomeiwen.com/i3559582/cbbbd6b179fe4bbb.png)
- 这样的优点是没有超参数,没有学习率
![](https://img.haomeiwen.com/i3559582/547674b24e5eabc7.png)
- 对于深度学习,这个方法是不实际的,内存存不下
![](https://img.haomeiwen.com/i3559582/d420fd281c02bf7c.png)
- 人们会使用类牛顿算法,来减小内存的耗费
![](https://img.haomeiwen.com/i3559582/6700a40ab17586f5.png)
L_BFGS是一个二阶逼近算法
- 有些实际中会用到
- 但是一般不常用,不做深入研究
![](https://img.haomeiwen.com/i3559582/37dab661bf48e968.png)
实际中优化算法的选择
- 实际中,Adam算法是很好的选择
- 在某些情况下,L_BFGS也会是好的选择
![](https://img.haomeiwen.com/i3559582/09d0a091f076ef35.png)
减小训练误差后的事
- 在实际中,我们真正关心的不是训练误差,而是测试误差,以及训练误差与验证误差之间的差距
![](https://img.haomeiwen.com/i3559582/b83466c1ca3d3b1d.png)
解决方法就是模型集成
- 在随机的初始值上,进行不同的模型训练
- 将不同模型的测试结果求平均
![](https://img.haomeiwen.com/i3559582/fd4e80ae487ae056.png)
使用多个学习率
![](https://img.haomeiwen.com/i3559582/f84fe466ebdc1392.png)
Polyak
![](https://img.haomeiwen.com/i3559582/006f19a3d81a38ce.png)
后边很多没搞懂,以后遇到了再仔细研究吧
二、正则化
- 如何提高单一模型的效果?——正则化
-
防止模型的过拟合
提高单一模型效果
在损失函数中加一项
![](https://img.haomeiwen.com/i3559582/ece63517be2d5f31.png)
Dropout
![](https://img.haomeiwen.com/i3559582/003cb01eeaf28407.png)
-
向前传播时,在每一层,随机的将一些神经元置为0
-
为什么Dropout有作用?
- 避免了特征间的相互适应,某种程度上抑制了过拟合
- dropout使一个单一的网络变成了多个子网络
-
在测试时的情况:
- dropout使得输出随机化,积分无法求
- 使用局部逼近来求积分,为每个神经元乘以一个丢弃率
-
批量归一化 ,数据增强 ,部分最大池化等都是类似的作用
三、迁移学习
- 训练一个卷积网络需要大量的数据
- 当你的数据不够的时候,可以使用迁移学习
![](https://img.haomeiwen.com/i3559582/395ee14e87396eff.png)
![](https://img.haomeiwen.com/i3559582/2e063920906eacdf.png)
网友评论