训练技巧

1、学习速率。首先设学习速率为一个较大的值,确保training  cost在不断下降。当accuracyy在n个epoch内不再增加时,使得学习速率减小一半。重复迭代,直到学习速率变成原来的1/1024。

2、学习速率要根据训练cost调。但是网络层数和神经元数目,mini-batch size要根据验证集的acc调。

3、关于正则项系数。可以先设为0,选好learning rate,再将正则系数增大或者缩小十倍粗调。大概确定数量级后,再微调。

4、关于mini-batch,如果太小,和On-line learning很接近,加速效果可能不明显。如果太大,权重更新不够频繁,优化过程较长。因此,可以画出验证集准确率和真正时间的曲线,确定一个acceptable mini-batch。

5、避免过拟合的方法有很多:early stopping、数据集扩增(Data augmentation)、正则化(Regularization)包括L1、L2(L2 regularization也叫weight decay),dropout。

6、加上正则项之后,权重会衰减。较小的权重意味着较低的网络复杂度。因为对于过拟合的网络,权重往往振荡较大,很小的区间内函数值变化较大。由于输入可大可小,必须选择权重系数较大。正则化约束了网络的权重,降低了过拟合的情况。

7、加入l2正则化,权重衰减。加入l1正则化,若权重本身为正,会减小,本身为负,会增加。因此,使得权重趋近于零。

8、神经网络参数初始化。传统的方法是从高斯分布中初始化参数,或者全部初始化为0或者1。sigmoid函数为例,为使导数较大,保证输入大概在【-4, 4】之间。获得较快的权重更新速率。因此,可以选择初始权重,使得神经元初始激活函数值落在想要的范围之内。

9、方差损失函数,当神经元实际输出值较大时,损失函数和权重导数值较小。交叉熵损失函数,导数值中不包含损失函数和实际输出导数项,只包含误差项。误差越大,更新越快,误差越小,更新越小。

10、optimizer: adam和adadelta收敛速度都比较快,但是结果来看,sgd和rmsprop的正确率较高。

11、理论上,batch size=1  结果最优。但是验证集准确率容易振荡。

12、优化方法,不同的优化方法对学习率做了不同的变化。

adagrad:累加之前所有梯度的平方。前期可以放大梯度,后期可以约束梯度。适合处理稀疏梯度。后期可能训练提前结束。

adadelta:累加之前梯度平方时不直接加,而是乘以一个权重后再加。训练前期,加速效果很好。训练后期,在局部最小值附近抖动。不依赖全局学习率。

rmsprop:adadelta的特例。权重取0.5,对RNN效果很好。

adam:同时考虑之前梯度的一阶矩和二阶矩,参数比较平稳。

13、这就导致了tanh特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果显示出来,但有是,在特征相差比较复杂或是相差不是特别大时,需要更细微的分类判断的时候,sigmoid效果就好了

为神经网络是不断反复计算,实际上变成了它在尝试不断试探如何用一个大多数为0的矩阵来尝试表达数据特征,结果因为稀疏特性的存在,反而这种方法变得运算得又快效果又好了

原文:https://blog.csdn.net/alwaystry/article/details/60475209 

说明:这个翻译应该是来自原文:http://yyue.blogspot.hk/2015/01/a-brief-overview-of-deep-learning.html

翻译网上的哈,我觉得有很大一部分从没看到过,所以就翻译了下,如有不对的地方,欢迎指正:

1:准备数据:务必保证有大量、高质量并且带有干净标签的数据,没有如此的数据,学习是不可能的

2:预处理:这个不多说,就是0均值和1方差化

3:minibatch:建议值128,1最好,但是效率不高,但是千万不要用过大的数值,否则很容易过拟合

4:梯度归一化:其实就是计算出来梯度之后,要除以minibatch的数量。这个不多解释

5:下面主要集中说下学习率

5.1:总的来说是用一个一般的学习率开始,然后逐渐的减小它

5.2:一个建议值是0.1,适用于很多NN的问题,一般倾向于小一点。

5.3:一个对于调度学习率的建议:如果在验证集上性能不再增加就让学习率除以2或者5,然后继续,学习率会一直变得很小,到最后就可以停止训练了。

5.4:很多人用的一个设计学习率的原则就是监测一个比率(每次更新梯度的norm除以当前weight的norm),如果这个比率在10-3附近,如果小于这个值,学习会很慢,如果大于这个值,那么学习很不稳定,由此会带来失败。

6:使用验证集,可以知道什么时候开始降低学习率,和什么时候停止训练。

7:关于对weight初始化的选择的一些建议:

7.1:如果你很懒,直接用0.02*randn(num_params)来初始化,当然别的值你也可以去尝试

7.2:如果上面那个不太好使,那么久依次初始化每一个weight矩阵用init_scale / sqrt(layer_width) * randn,init_scale可以被设置为0.1或者1

7.3:初始化参数对结果的影响至关重要,要引起重视。

7.4:在深度网络中,随机初始化权重,使用SGD的话一般处理的都不好,这是因为初始化的权重太小了。这种情况下对于浅层网络有效,但是当足够深的时候就不行了,因为weight更新的时候,是靠很多weight相乘的,越乘越小,有点类似梯度消失的意思(这句话是我加的)

8:如果训练RNN或者LSTM,务必保证gradient的norm被约束在15或者5(前提还是要先归一化gradient),这一点在RNN和LSTM中很重要。

9:检查下梯度,如果是你自己计算的梯度。

10:如果使用LSTM来解决长时依赖的问题,记得初始化bias的时候要大一点

12:尽可能想办法多的扩增训练数据,如果使用的是图像数据,不妨对图像做一点扭转啊之类的,来扩充数据训练集合。

13:使用dropout

14:评价最终结果的时候,多做几次,然后平均一下他们的结果。

猜你喜欢

转载自blog.csdn.net/zhuimengshaonian66/article/details/83650576