转自:http://blog.csdn.net/xmdxcsj/article/details/54695506html
overview
type |
author |
CPU/GPU |
feature |
nnet1 |
Karel |
GPU单卡训练 |
使用pre-training,使用early stopping |
nnet2 |
Dan |
支持多GPU训练,以及多CPU多线程 |
使用固定epoch个数,最后几个epoch参数平均 |
nnet3 |
Dan |
是nnet2的扩展 |
支持更多的网络类型(好比RNN/LSTM) |
Karel’s DNN和Dan’s DNN格式不兼容,可使用egs/rm/s5/local/run_dnn_convert_nnet2.sh进行格式转化。网络
nnet1
训练流程
- steps/nnet/make_fmllr_feats.sh
获取特征
- steps/nnet/pretrain_dbn.sh
rbm预训练
- steps/nnet/train.sh
使用mini-batch SGD进行训练
- steps/nnet/train_mpe.sh
sMBR序列区分性训练,学习率固定设为1e-5,训练3-5epoch;在第一个epoch之后从新产生lattice能够更快的收敛;计算准确率的时候排除silience帧。
nnet2
训练流程
- initialization
使用nnet-am-init读取配置文件
- training
使用nnet-train-parallel训练,使用参数平均的并行训练方式,结合preconditioned SGD训练。
- final model combination
将最后几个(好比20)iteration的模型按照必定比例combine获得最后的model。具体作法:每一个模型的每一个component的weight做为学习的对象,而后使用训练数据的子集,结合传统的目标函数,优化方法使用L-BFGS。
- mixing-up
假设最后输出的目标个数为1483,而网络的softmax层节点的个数却为4000(大于输出个数),须要将softmax的输出进行group(通常大小设为1-6)做为最后的输出目标。
- shrinking和fixing
p-norm网络不使用,通常用在tanh网络或者包含sigmoid激活函数的网络。详细介绍参考这篇文章
shrinking是指对网络不通layer的参数进行scale,scale的参数由训练数据的非线性优化得到。由于通常scale的参数小于1,因此称之为shrinking。
fixing目的是为了解决训练过程当中神经元over-saturated问题:即神经元的导数值小于特定门限(好比0.1),此时须要减少weight和bias。
训练参数
-
job number
通常GPU设为4,CPU设为8或者16,由于GPU的训练速度比CPU快20%到50%。
minibatch的大小跟-num-jobs-nnet有关,若是使用多线程(好比n个线程)更新参数的方式,那么minibatch size至关于变成了原来的n倍。
学习率的设置跟-num-jobs-nnet有关,若是咱们jobs变为原来的n倍,那么学习率也要变为原来的n倍。由于并行使用的是n个模型参数平均的方式。可是学习率不能设置过大,否者会引发训练的不稳定。多线程
-
隐层数量
通常tanh网络是2到5层,p-norm网络是2到4层,增长层数的时候通常保持节点数不变函数
- 节点数
通常是512/1024/2048,通常1024的网络就比较大了,最可能是2048。和训练数据量的增长成二次关系,好比数据量变为原来的10倍,节点数变为原来的2倍。
- 学习率
小数据量(几个小时)的初始值和结束值分为设为0.04和0.004;数据量变大之后,学习率要调低。
能够经过绘制目标函数和时间的关系图来判断学习率是否合适。若是学习率太大,一开始目标函数值提高很快,可是最终值缺不理想,或者发生震荡,目标函数值忽然变得不好;若是学习率过小,须要花费很长的时间才能得到最优值。
通常来讲网络的最后两层参数学习的速度更快,能够经过–final-learning-rate-factor参数(好比0.5)使得最后两层学习率衰减。
- minibatch size
数值越大训练速度越快,可是数值过大会引发训练的不稳定性。通常设为2的倍数,多线程CPU设为128,GPU设为512.
- max-change
训练的时候若是学习率设置太大,将会致使参数变化量过大,引发训练不稳定。该参数的设置为参数的变化量设定一个上限。当minibatch大小为512,max-change设为40,minibatch大小为128,max-change设为10,max-change和minibatch的大小成正比。
- epoch个数
两个参数–num-epochs(通常15)和–num-epochs-extra(通常5)设置,从0到–num-epochs之间学习率会衰减,最后的–num-epochs-extra学习率保持不变。小数据量通常设置更多的epoch(20+5),大数据量设置更少的epoch。
- feature splice width
对于MFCC+splice+LDA+MLLT+fMLLR这种通过特殊处理的特征,通常设为4,由于LDA+MLLT已是基于spliced(3或者4)的特征了;对于原始的MFCC/fbank特征,通常设为5。
若是数值设置的更大,对于帧准确率是有益的,可是对于语音识别倒是有损的。或许是由于违反了HMM帧独立性的假设。
preconditioned SGD
相比于传统的SGD使用标量做为学习率(即全部的参数使用的学习率都是同样的),preconditioned SGD使用矩阵形式的学习率,学习率矩阵每个minibatch更新一次。这样作的出发点在于减少方差比较大的维度对应参数的学习率,以控制训练的不稳定性以及避免在某个方向上面参数变更太快。学习
异常处理
当训练发散时,下降学习率,或者减少minibatch的大小。大数据
reference
http://kaldi-asr.org/doc/dnn.html优化