【CS231n】六&七、CNN训练方法学习笔记

1、Gradient Descent(梯度下降算法)
(1)、Mini-batch SGD(stochastic gradient descent) 小批量随机梯度下降
loop: 
1> sample a batch of data; 
2> forward prop it through the graph, get loss;
3> Backprop to calculate the gradients;
4> update the parameters using the gradient;
根据CS229课程内容总结的GD:
batch GD(批量梯度下降算法,即常规的算法):
其思想是计算所有样本loss的平均值,并沿其负梯度下降,梯度项需要计算所有loss的总和,当训练样 本非常多的时候,其计算效率非常低,每一步递降都要花费大量时间计算。
【CS231n】六&七、CNN训练方法学习笔记

stochastic GD(随机梯度下降):
这种方法,每次参数沿某一单个样本loss的值,沿其负梯度下降,由于样本的随机性,其下降方向不 一定沿着最快速的下降梯度,但是通过对每一个样本进行迭代,总体下降的方向是大致相同的。其好处是下 降更迅速,但是精度更差,容易陷入局部最小,在全局最小处紊动。
【CS231n】六&七、CNN训练方法学习笔记


mini-batch stochastic GD(小批量梯度下降算法):
即结合了上面两种方法的优缺点,每次计算一定小批量的样本的loss平均值,沿其负梯度下降。
【CS231n】六&七、CNN训练方法学习笔记

2、activation functions

【CS231n】六&七、CNN训练方法学习笔记

sigmoid函数的问题:
1> saturated neurons kill the gradients 梯度消失问题,导致反向传播算法中的loss无法回传
2> sigmoid outputs are not zero-centered 比如f(sum(wi*xi)+b),如果xi都是正数,则局部偏导数(df/dwi)=xi都是正数/负数,导致梯度更新的方向受到限制。
【CS231n】六&七、CNN训练方法学习笔记

ReLU函数(Rectified Linear Unit)的优点:
1> Dose not saturate (in +region);
2> Very computationally efficient;
3> Converges much faster than sigmoid/tanh (6x);
4> Actually more biologically plausible than sigmoid;
缺点:
1> Not zero-centered output;
2> An annoyance
所以研究者倾向于用较小的正偏置值来初始化ReLU。
实践中最推荐使用ReLU。
【CS231n】六&七、CNN训练方法学习笔记

Leaky ReLU函数:f(x)=max(0.01x,x)
Parametric Rectifier (PReLU):f(x) =  max (ax,x)

3、Data Preprocessing
第一步:
【CS231n】六&七、CNN训练方法学习笔记
另外还有PCA(Principal Component Analysis 详见CS229)以及Whitening等方法。
这些处理过程,不仅要处理trainning set,同样也要处理test set。

4、Weight Initialization
(1)初始值全部设为零,有什么问题? 会有symmetry问题,即产生同样的输出,用同样的gradient下降。
(2)Small random numbers:W = 0.01* np.random.randn(D , H) 可以用在小的网络中,但是在更深的网络中会产生一些问题。activations快速缩小到0,每一层的输入都很小接近0,遇到了反向传播中的更新流过小的问题。
【CS231n】六&七、CNN训练方法学习笔记
(3)那使用更大的weight呢? W = np.random.randn(D, H)。 那就有可能遇到saturate问题
(4)比较好的方式:Xavier initialization。
W = np.random.randn( fan_in, fan_out ) / np.sqrt( fan_in )
输入少,分母小,得到较大的初始化权重;输入多,分母大,得到较小的权重值。
以上的讨论是在tanh作为激活函数的情况。当使用ReLU的情况下,首先抹去了一半小于零的输入,系数分布仍然会collapse,集体趋于零。这种情况会使用,W = np.random.randn( fan_in, fan_out ) / np.sqrt( fan_in/2 )  He et al., 2015

5、Batch Normalization(不是很懂)
想要让 a batch of activations 的输入满足 gaussian 分布?有什么好处?
【CS231n】六&七、CNN训练方法学习笔记
【CS231n】六&七、CNN训练方法学习笔记

通常在全连接层(fully connected)后,在非线性层前。
【CS231n】六&七、CNN训练方法学习笔记


6、超参(hyperparameter)优化
learning rate 大致在 [1e-3~1e-5]
使用 cross-validation 策略

7、SGD优化
加上动量(momentum)的概念。可以避免局部最小、鞍点等问题。(可以想象一个球从山上滚下来)
【CS231n】六&七、CNN训练方法学习笔记
另一种动量的介入方式,
【CS231n】六&七、CNN训练方法学习笔记
收敛表现:
【CS231n】六&七、CNN训练方法学习笔记

8、另一种优化策略:AdaGrad 及其优化 RMSProp
AdaGrad:grad_squard = 梯度平方的累加,下一步 (更新项 - 学习律 *(dx/sqrt(g_s)+1e-7),这一项中的dx/(sqrt(g_s)+1e-7),g_s积累的越来越大,则梯度下降的每次更新的速度越来越慢。比如有x,y两个梯度方向,则梯度大(更抖)的那一个方向梯度衰减更快。
(实际训练CNN中,很少使用AdaGrad)

RMSProp:即多了一项衰减系数,其思想与SGD+Momentum的方法有一定的相同点。衰减系数乘以上一次的累积项,并(正则地)加上衰减系数乘以新梯度的平方。衰减系数同样常为0.9或0.99。

【CS231n】六&七、CNN训练方法学习笔记

【CS231n】六&七、CNN训练方法学习笔记

9、Adam (almost)
想法是:结合RMSProp和Momentum两种方法的优点,得到类似Adam算法的方法,暂时称之为Adam。因为和TensorFlow里面的tf.AdamOptimizer有一些区别。
【CS231n】六&七、CNN训练方法学习笔记
Adam with beta1 =0.9, beta2=0.999, and learning_rate = 1e-3 or 5e-4 is often used.

添加Bias修正:
【CS231n】六&七、CNN训练方法学习笔记

10、超参优化:学习律衰减
这是很常见的促进算法收敛的计算方法。(启发:其他类的试参方法是不是也可以使用,比如(遗传算法))
【CS231n】六&七、CNN训练方法学习笔记

11、2阶近似优化
前面的所有方法都是基于一阶梯度的优化方法,若采用函数的二阶泰勒展开近似,这种优化方法的精度更高。
牛顿法(Newton Method):需要计算Hessian矩阵。然而不适用于深度学习。高阶的计算复杂度。
【CS231n】六&七、CNN训练方法学习笔记

所以使用改进的方法:Quasi-Newton methods(BGFS most popular)
【CS231n】六&七、CNN训练方法学习笔记



以上的所有优化方法,都旨在减少训练产生误差,然而我们想要减少训练模型和测试集模型的差距。可以使用一下的策略:
1、Model Ensembles
Train multiple independent models
At test time average their results
# Enjoy 2% extra performance
2、如何提高单一mode 的表现
(1)正则化:在loss函数后添加正则项 + lambda*R(w);具体方法和介绍可以参看CS229,有详细的讲解。
【CS231n】六&七、CNN训练方法学习笔记
(2)Dropout(神经网络中非常常用):
模型:
【CS231n】六&七、CNN训练方法学习笔记
代码:
【CS231n】六&七、CNN训练方法学习笔记

这样做的原因: 
一个模型不一定要依赖于所有的特征  才能做出正确的判决。同时,通过随机的dropout一些特征,可 以有效防止模型的过拟合。(不止在全连接层,卷积层也可以随机扔掉一些feature map)
同时,dropout可以有非常非常多的排列组合,相当于对于一个单一模型,通过不同的dropout,使 用大型的ensemble。(同上1、述)

【CS231n】六&七、CNN训练方法学习笔记
dropout在test time有什么影响:
【CS231n】六&七、CNN训练方法学习笔记
这是非常麻烦的输出模型,所以想要给一个确定的预测,就想要对于z求平均值:
【CS231n】六&七、CNN训练方法学习笔记
但是z的可能性非常非常多,这个积分很难求,就要使用一些近似的方法,研究以下的简单结构:
【CS231n】六&七、CNN训练方法学习笔记
只有四种可能的dropout,则各可能的输出平均值是原预测值的1/2(即dropout的概率p)。所以在测试 中,往往使用全部neurons,输出直接乘以概率p以代替dropout的过程。
【CS231n】六&七、CNN训练方法学习笔记


(3)batch normalization 
在训练过程中,批量正则化,给重复正则的point提供了不同的随机噪声,而在test阶段,这种随机噪 声就被平均取值给抹平了。
(这种思想和dropout很类似,提供噪声并在测试阶段取平均。不同在于dropout有一个超参p可以调节)

(4)Data Augmentation
取ruandom crops and scales,即剪切、缩放、调节对比度、饱和度、亮度。

(5)Drop Connect
如名字所示,令一些权重系数为0。
(6)Stochastic Depth  
randomly drop layers from the network (training阶段)
(总结图)
【CS231n】六&七、CNN训练方法学习笔记



迁移学习:
(这堂课的内容有点杂乱)
(有一个small data set,容易过拟合overfit,一种方法是regularization,另一种方法是迁移学习Transfer Learning)
原话:迁移学习打破了需要大数据集来训练CNN的魔咒。

以下图的VGGNet为例:
【CS231n】六&七、CNN训练方法学习笔记


比如原来用ImageNet数据集来训练这样的VGGNet,那么最后全连接层(FC)是1000类:矩阵尺寸4096*1000。

可以通过迁移学习,用一个小的数据集来训练VGG,中间层不做改变,将FC层改为4096*10,然后重新初始化训练这个分类器。

若有一个更大的训练集(内容较为相像),这种情况下,可能参数集只需要做一些微小的变化,可以选择用旧参数集重新训练。

思考方式:
【CS231n】六&七、CNN训练方法学习笔记



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值