参考:http://m.blog.csdn.net/fffupeng/article/details/73440929 , http://blog.csdn.net/u012767526/article/details/51407443
为什么不能选择一个小的learning rate 来解决SGD的问题:
因为learning rate会作用于各个梯度,竖直方向震荡小了,但是水平方向的进度也慢了。
momentum update理解:
在某个方向上震荡较大的时候,momentum会进行抵消,震荡较小时,momentum update会进行增加。
可以自己进行一两个iteration进行推到。
直观上理解就是,mu*v就是对gradient step进行一个约束。
v 初始化为0
Nesterov Accelerated Gradient :
就是超前一步。可以参考相关论文
AdaGrad:就是对learning rate进行变化
RMSProp:对AdaGrad进行了一些优化
Adam update: 结合了momentum 和 AdaGrad。 m是用了前面梯度的指数和,稳定梯度,这就是momentum的作用。beta1 0.9,beta2 0.995
一般用这个方法。博客详解Adam 方法:http://blog.csdn.net/bixiwen_liu/article/details/52956727
learning rate: 一般用指数衰减
二阶?复杂。
- models ensemble : 就像 w_test = 0.995*w_test +0.005*w.
课程里面给的的直观理解就是:比如损失函数是一个碗形函数,你的模型在最小值附近跳动。当你取最小值附近的几个点的加权和时,得到的结果离最小值更进一步
- Regularization: Dropout
前向反向都必须在同样的位置做dropout。
减小过拟合
增加冗余表达,因为不知道下一次会多dropout哪些节点,所以网络就会把权重进行分散。
或者说因为每一次前向传播都会dropout不同的节点,每一次迭代就是在用不同的mini-batch训练不同的sub-network,通过这样的迭代,最终参数w就是各种sub-network的一种奇怪的组合。
不同层的的失活数量可以不一样,在CNN中很常见。
有同学问到了Drop Connect(自己看)
At test time: 所有的神经元都是激活的,所以我们需要给每个神经元的激活函数进行scale,以确保在test的时候输出值和train的时候的期望输出值是相等的。
实际上更常用的 inverted dropout: 在training的时候,二进制mask就除以p,在test的时候代码不变。
有同学问到了非线性函数在其中的影响,老师说所以是approximation嘛。
- Gradient Checking