Karel版本的nnet1

  • 除了chain,nnet1, nnet2, nnet3训练时调整转移模型,chain模型使用类似与MMI的训练准则
  • 概要

Karel Veselynnet1用到以下技术:

  • 每一层进行预训练,基于RBMs(受限玻尔滋蔓机)
  • 以一帧为单位进行交叉熵训练
  • 序列-辨别性训练,用了lattice框架,以sMBR准则作为优化标准(状态的最小贝叶斯风险)
  • early stopping using a validation

系统是建立在LDA-MLLT-fMLLR特征(从辅助的GMM模型中得到)之上的。整个DNN 的训练用了一个GPU+CUDA,但cuda矩阵库也可以在没有GPU的情况下跑,但速度慢10倍左右。
kaldi CUDA (4.2, 5.0, 5.5)版本上都跑过,测试过。
标准数据库的脚本在egs/{rm,wsj}/s5/local/run_dnn.sh egs/swbd/s5b/local/run_dnn.sh

  • DNN 的训练阶段

0. 40fMLLR特征存储到磁盘中,steps/nnet/make_fmllr_feats.sh

这简化了训练脚本,40维特征是经过CMN变换的MFCC-LDA-MLLT-fMLLR

   

  • 预训练, steps/nnet/pretrain_dbn.sh

每一层的RBM预训练是按照http://www.cs.toronto.edu/~hinton/absps/guideTR.pdf。第一个RBM用的是高斯-伯努力单元,因为DNN输入的高斯特征,首层训练的学习率较小,次数较多,其他的RBM用的是伯努力-伯努力单元。我们用的是对比-散度 Contrastive-Divergence)算法+一步的马尔可夫链蒙特卡洛采样(CD1)。 在脚本中,我们用了L2正则化来提高RBM训练的混合率,在前50个小时的数据上也用了momentum将学习率从0.5线性增长为0.9。通过用一个因素 (1-mmt)来降低学习率来保持有效的学习速率能不变。
     TIMIT上最初实验的迭代次数是50,大约对应200小时的数据。所以,对于switchboard数据库我们每层训练一次。训练数据越多,RBM预训练就越不重要。但却能让我们很好的初始化深度网络,使得反响传播算法能有个好的初始位置。
     RBM训练时,我们在句子级别和帧级别上分别置乱来模仿从训练数据分布里提取样本,每个mini-batch更新一次。训练高斯-伯努力单元时,RBM 对参数爆炸(weight explosion)很敏感,尤其是学习率较大,隐单元较多时。为了避免这种情况,我们比较训练数据的方差和minibatch内的重建,如果两者差异很 大,权重参数会重新调整,学习率会暂时减小。

    2. 帧级别的交叉熵训练, steps/nnet/train.sh
      在这个阶段,我们训练DNN 将所有的帧分到对应的三音子状态中,用了 mini-batch随机梯度下降算法,学习率默认为0.008minibatch的大小是256,没有使用momentum或正则化。
      在开始的几次训练中学习率是常数不变,当神经网络收敛,我们将每次训练的学习率减半,直到网络再次收敛。
      就像用RBM预训练时我们用了句子级别和帧级别的置乱(perturb)来模仿从训练数据分布中日趋样本,在训练工具里就做了帧级别的置乱,在GPU存储空间中。
      一般,所有的训练工具都有选项–feature-transform,这个是个进行临近特征转换的神经网络,是在GPU内完成的。在脚本中,这项是用来给数据做拼接和正则化,但这一项可以做更复杂的转换,如瓶颈特征提取。    

input_transform和训练的DBN功能(即Deep Belief NetworkRBM的堆栈)需要使用选项'-input-transform''-dbn'传递给脚本来启用,只有输出层被随机初始化。我们使用早期停止(early stopping)来防止过度拟合,因此我们在交叉验证集(即延伸集合)上计算目标函数,因此需要两个"<特征-对齐>"的目录来执行监督训练,

<data-train>-<ali-train>

<data-dev>-<ali-dev>dev集,开发集的作用就算用于交叉验证,防止过拟合
   
    3. 4.5.6.序列-辨别型训练(sMBR, steps/nnet/train_mpe.sh
      这个阶段是训练DNN能对整个句子正确分类,比帧级别的训练更接近自动语音识别(ASR)的目标。  sMBR的目标是最大化状态标签(来源于参考标注)的准确性,我们用lattice框架来代表可能的假设。
      用随即梯度下降对每句话进行更新的方式训练,学习率很低,保持1e-5的学习率不变跑3-5次。第一次训练后重新生成lattice,收敛会更快。
      我们支持 MMI, BMMI, MPE sMBR训练。这些标准的结果都很接近,只有sMBR的结果稍好些。在sMBR训练中,我们排除了的无声的帧,更多细节描述见http://www.danielpovey.com/files/2013_interspeech_dnn.pdf

其他有用的顶层脚本:

除了DNN配置外,还有其他的示例脚本:

  • DNNegs / wsj / s5 / local / nnet / run_dnn.sh,(主要的顶层脚本)
  • CNNegs / rm / s5 / local / nnet / run_cnn.sh,(CNN =卷积神经网络,see paper,我们在频率轴上有1D的卷积)
  • 自动编码器训练:egs / timit / s5 / local / nnet / run_autoencoder.sh
  • Tandem系统:egs / swbd / s5c / local / nnet / run_dnn_tandem_uc.sh,(uc =通用上下文网络,see paper)
  • 多语言/多任务:egs / rm / s5 / local / nnet / run_blocksoftmax.sh(具有使用RMWSJ训练的<BlockSoftmax>输出的网络,与SLT2012 paper中使用的相同的C ++设计)


6. a network prototype is generated in utils/nnet/make_nnet_proto.py:

  • each component is on a separate line, where dimensions and initialization hyper-parameters are specified
  • 对于 AffineTransform ,偏差由<BiasMean><BiasRange>给出的均匀分布初始化,而权重由<ParamStddev>指定的高斯分布初始化,
  • note.: if you like to experiment with externally prepared prototypes, use option '–mlp-proto <proto>'

$ cat exp/dnn5b_pretrain-dbn_dnn/nnet.proto
<NnetProto>
<AffineTransform> <InputDim> 2048 <OutputDim> 3370 <BiasMean> 0.000000 <BiasRange> 0.000000 <ParamStddev> 0.067246
<Softmax> <InputDim> 3370 <OutputDim> 3370
</NnetProto>

7. the network is initialized by : nnet-initialize.cc , the DBN gets prepended in the next step using nnet-concat.cc

8. finally the training gets called by running scheduler script steps/nnet/train_scheduler.sh

Note : both neural networks and feature transforms can be viewed by nnet-info.cc, or shown in ascii by nnet-copy.cc


While looking inside steps/nnet/train_scheduler.sh we see:

首先进行交叉验证,然后运行主要部分:做$iter次迭代,并控制学习速率。 通常,train_scheduler.shtrain.sh调用。

默认学习率调度是基于目标函数的相对改进:
最初如果改进(提高)大于'start_halving_impr = 0.01',学习率保持不变,
那么在每次迭代上乘以"halving_factor = 0.5"来减少学习率,
最后,如果改进小于'end_halving_impr = 0.001',则训练终止

神经网络模型存储在$dir/nnet中,日志存储在$dir/log中:

神经网络模型名称包含训练和交叉验证集(即延伸集合)的历元数(迭代数,iter)、学习率和目标函数值的记录
$ ls exp/dnn5b_pretrain-dbn_dnn/nnet
nnet_6.dbn_dnn_iter01_learnrate0.008_tr1.1919_cv1.5895
nnet_6.dbn_dnn_iter02_learnrate0.008_tr0.9566_cv1.5289
nnet_6.dbn_dnn_iter03_learnrate0.008_tr0.8819_cv1.4983
nnet_6.dbn_dnn_iter04_learnrate0.008_tr0.8347_cv1.5097_rejected
nnet_6.dbn_dnn_iter05_learnrate0.004_tr0.8255_cv1.3760
nnet_6.dbn_dnn_iter06_learnrate0.002_tr0.7920_cv1.2981
nnet_6.dbn_dnn_iter07_learnrate0.001_tr0.7803_cv1.2412
...
nnet_6.dbn_dnn_iter19_learnrate2.44141e-07_tr0.7770_cv1.1448
nnet_6.dbn_dnn_iter20_learnrate1.2207e-07_tr0.7769_cv1.1446
nnet_6.dbn_dnn_iter20_learnrate1.2207e-07_tr0.7769_cv1.1446_final_

我们看到学习率从第5次迭代开始(即时期)减半,这是一个常见的情况

每个日志文件都包含管道命令:

$ cat exp/dnn5b_pretrain-dbn_dnn/log/iter01.tr.log
nnet-train-frmshuff --learn-rate=0.008 --momentum=0 --l1-penalty=0 --l2-penalty=0 --minibatch-size=256 --randomizer-size=32768 --randomize=true --verbose=1 --binary=true --feature-transform=exp/dnn5b_pretrain-dbn_dnn/final.feature_transform --randomizer-seed=777 'ark:copy-feats scp:exp/dnn5b_pretrain-dbn_dnn/train.scp ark:- |' 'ark:ali-to-pdf exp/tri4b_ali_si284/final.mdl "ark:gunzip -c exp/tri4b_ali_si284/ali.*.gz |" ark:- | ali-to-post ark:- ark:- |' exp/dnn5b_pretrain-dbn_dnn/nnet_6.dbn_dnn.init exp/dnn5b_pretrain-dbn_dnn/nnet/nnet_6.dbn_dnn_iter01

GPU是否被使用以及使用情况的信息:

LOG (nnet-train-frmshuff:IsComputeExclusive():cu-device.cc:214) CUDA setup operating under Compute Exclusive Process Mode.
LOG (nnet-train-frmshuff:FinalizeActiveGpu():cu-device.cc:174) The active GPU is [1]: GeForce GTX 780 Ti        free:2974M, used:97M, total:3071M, free/total:0.968278 version 3.5

Nnet::InfoPropagateNnet::InfoBackPropagateNnet::InfoGradient来准备神经网络训练的内部统计信息。 它们在迭代开始时被打印一次,在迭代结束时再次打印一次。 注意到,当使用一些新功能来调试NN训练时,这些组件的统计信息非常有用,可以用来与参考值或预期值进行比较:

VLOG[1] (nnet-train-frmshuff:main():nnet-train-frmshuff.cc:236) ### After 0 frames,

VLOG[1] (nnet-train-frmshuff:main():nnet-train-frmshuff.cc:237) ### Forward propagation buffer content :

[1] output of <Input> ( min -6.1832, max 7.46296, mean 0.00260791, variance 0.964268, skewness -0.0622335, kurtosis 2.18525 )

[2] output of <AffineTransform> ( min -18.087, max 11.6435, mean -3.37778, variance 3.2801, skewness -3.40761, kurtosis 11.813 )

[3] output of <Sigmoid> ( min 1.39614e-08, max 0.999991, mean 0.085897, variance 0.0249875, skewness 4.65894, kurtosis 20.5913 )

[4] output of <AffineTransform> ( min -17.3738, max 14.4763, mean -2.69318, variance 2.08086, skewness -3.53642, kurtosis 13.9192 )

[5] output of <Sigmoid> ( min 2.84888e-08, max 0.999999, mean 0.108987, variance 0.0215204, skewness 4.78276, kurtosis 21.6807 )

[6] output of <AffineTransform> ( min -16.3061, max 10.9503, mean -3.65226, variance 2.49196, skewness -3.26134, kurtosis 12.1138 )

[7] output of <Sigmoid> ( min 8.28647e-08, max 0.999982, mean 0.0657602, variance 0.0212138, skewness 5.18622, kurtosis 26.2368 )

[8] output of <AffineTransform> ( min -19.9429, max 12.5567, mean -3.64982, variance 2.49913, skewness -3.2291, kurtosis 12.3174 )

[9] output of <Sigmoid> ( min 2.1823e-09, max 0.999996, mean 0.0671024, variance 0.0216422, skewness 5.07312, kurtosis 24.9565 )

[10] output of <AffineTransform> ( min -16.79, max 11.2748, mean -4.03986, variance 2.15785, skewness -3.13305, kurtosis 13.9256 )

[11] output of <Sigmoid> ( min 5.10745e-08, max 0.999987, mean 0.0492051, variance 0.0194567, skewness 5.73048, kurtosis 32.0733 )

[12] output of <AffineTransform> ( min -24.0731, max 13.8856, mean -4.00245, variance 2.16964, skewness -3.14425, kurtosis 16.7714 )

[13] output of <Sigmoid> ( min 3.50889e-11, max 0.999999, mean 0.0501351, variance 0.0200421, skewness 5.67209, kurtosis 31.1902 )

[14] output of <AffineTransform> ( min -2.53919, max 2.62531, mean -0.00363421, variance 0.209117, skewness -0.0302545, kurtosis 0.63143 )

[15] output of <Softmax> ( min 2.01032e-05, max 0.00347782, mean 0.000296736, variance 2.08593e-08, skewness 6.14324, kurtosis 35.6034 )

 

VLOG[1] (nnet-train-frmshuff:main():nnet-train-frmshuff.cc:239) ### Backward propagation buffer content :

[1] diff-output of <AffineTransform> ( min -0.0256142, max 0.0447016, mean 1.60589e-05, variance 7.34959e-07, skewness 1.50607, kurtosis 97.2922 )

[2] diff-output of <Sigmoid> ( min -0.10395, max 0.20643, mean -2.03144e-05, variance 5.40825e-05, skewness 0.226897, kurtosis 10.865 )

[3] diff-output of <AffineTransform> ( min -0.0246385, max 0.033782, mean 1.49055e-05, variance 7.2849e-07, skewness 0.71967, kurtosis 47.0307 )

[4] diff-output of <Sigmoid> ( min -0.137561, max 0.177565, mean -4.91158e-05, variance 4.85621e-05, skewness 0.020871, kurtosis 7.7897 )

[5] diff-output of <AffineTransform> ( min -0.0311345, max 0.0366407, mean 1.38255e-05, variance 7.76937e-07, skewness 0.886642, kurtosis 70.409 )

[6] diff-output of <Sigmoid> ( min -0.154734, max 0.166145, mean -3.83602e-05, variance 5.84839e-05, skewness 0.127536, kurtosis 8.54924 )

[7] diff-output of <AffineTransform> ( min -0.0236995, max 0.0353677, mean 1.29041e-05, variance 9.17979e-07, skewness 0.710979, kurtosis 48.1876 )

[8] diff-output of <Sigmoid> ( min -0.103117, max 0.146624, mean -3.74798e-05, variance 6.17777e-05, skewness 0.0458594, kurtosis 8.37983 )

[9] diff-output of <AffineTransform> ( min -0.0249271, max 0.0315759, mean 1.0794e-05, variance 1.2015e-06, skewness 0.703888, kurtosis 53.6606 )

[10] diff-output of <Sigmoid> ( min -0.147389, max 0.131032, mean -0.00014309, variance 0.000149306, skewness 0.0190403, kurtosis 5.48604 )

[11] diff-output of <AffineTransform> ( min -0.057817, max 0.0662253, mean 2.12237e-05, variance 1.21929e-05, skewness 0.332498, kurtosis 35.9619 )

[12] diff-output of <Sigmoid> ( min -0.311655, max 0.331862, mean 0.00031612, variance 0.00449583, skewness 0.00369107, kurtosis -0.0220473 )

[13] diff-output of <AffineTransform> ( min -0.999905, max 0.00347782, mean -1.33212e-12, variance 0.00029666, skewness -58.0197, kurtosis 3364.53 )

 

VLOG[1] (nnet-train-frmshuff:main():nnet-train-frmshuff.cc:240) ### Gradient stats :

Component 1 : <AffineTransform>,

linearity_grad ( min -0.204042, max 0.190719, mean 0.000166458, variance 0.000231224, skewness 0.00769091, kurtosis 5.07687 )

bias_grad ( min -0.101453, max 0.0885828, mean 0.00411107, variance 0.000271452, skewness 0.728702, kurtosis 3.7276 )

Component 2 : <Sigmoid>,

Component 3 : <AffineTransform>,

linearity_grad ( min -0.108358, max 0.0843307, mean 0.000361943, variance 8.64557e-06, skewness 1.0407, kurtosis 21.355 )

bias_grad ( min -0.0658942, max 0.0973828, mean 0.0038158, variance 0.000288088, skewness 0.68505, kurtosis 1.74937 )

Component 4 : <Sigmoid>,

Component 5 : <AffineTransform>,

linearity_grad ( min -0.186918, max 0.141044, mean 0.000419367, variance 9.76016e-06, skewness 0.718714, kurtosis 40.6093 )

bias_grad ( min -0.167046, max 0.136064, mean 0.00353932, variance 0.000322016, skewness 0.464214, kurtosis 8.90469 )

Component 6 : <Sigmoid>,

Component 7 : <AffineTransform>,

linearity_grad ( min -0.134063, max 0.149993, mean 0.000249893, variance 9.18434e-06, skewness 1.61637, kurtosis 60.0989 )

bias_grad ( min -0.165298, max 0.131958, mean 0.00330344, variance 0.000438555, skewness 0.739655, kurtosis 6.9461 )

Component 8 : <Sigmoid>,

Component 9 : <AffineTransform>,

linearity_grad ( min -0.264095, max 0.27436, mean 0.000214027, variance 1.25338e-05, skewness 0.961544, kurtosis 184.881 )

bias_grad ( min -0.28208, max 0.273459, mean 0.00276327, variance 0.00060129, skewness 0.149445, kurtosis 21.2175 )

Component 10 : <Sigmoid>,

Component 11 : <AffineTransform>,

linearity_grad ( min -0.877651, max 0.811671, mean 0.000313385, variance 0.000122102, skewness -1.06983, kurtosis 395.3 )

bias_grad ( min -1.01687, max 0.640236, mean 0.00543326, variance 0.00977744, skewness -0.473956, kurtosis 14.3907 )

Component 12 : <Sigmoid>,

Component 13 : <AffineTransform>,

linearity_grad ( min -22.7678, max 0.0922921, mean -5.66685e-11, variance 0.00451415, skewness -151.169, kurtosis 41592.4 )

bias_grad ( min -22.8996, max 0.170164, mean -8.6555e-10, variance 0.421778, skewness -27.1075, kurtosis 884.01 )

Component 14 : <Softmax>,

具有所有集合对应目标函数的值的汇总日志,其步长1h生成进度向量,帧精度:

a summary log with the whole-set objective function value, its progress vector generated with 1h steps, and the frame accuracy:

   

LOG (nnet-train-frmshuff:main():nnet-train-frmshuff.cc:273) Done 34432 files, 21 with no tgt_mats, 0 with other errors. [TRAINING, RANDOMIZED, 50.8057 min, fps8961.77]

LOG (nnet-train-frmshuff:main():nnet-train-frmshuff.cc:282) AvgLoss: 1.19191 (Xent), [AvgXent: 1.19191, AvgTargetEnt: 0]

progress: [3.09478 1.92798 1.702 1.58763 1.49913 1.45936 1.40532 1.39672 1.355 1.34153 1.32753 1.30449 1.2725 1.2789 1.26154 1.25145 1.21521 1.24302 1.21865 1.2491 1.21729 1.19987 1.18887 1.16436 1.14782 1.16153 1.1881 1.1606 1.16369 1.16015 1.14077 1.11835 1.15213 1.11746 1.10557 1.1493 1.09608 1.10037 1.0974 1.09289 1.11857 1.09143 1.0766 1.08736 1.10586 1.08362 1.0885 1.07366 1.08279 1.03923 1.06073 1.10483 1.0773 1.0621 1.06251 1.07252 1.06945 1.06684 1.08892 1.07159 1.06216 1.05492 1.06508 1.08979 1.05842 1.04331 1.05885 1.05186 1.04255 1.06586 1.02833 1.06131 1.01124 1.03413 0.997029 ]

FRAME_ACCURACY >> 65.6546% <<

日志以CUDA剖析信息结尾,CuMatrix::AddMatMat是矩阵乘法,占用了大部分GPU时间

[cudevice profile]
Destroy        23.0389s
AddVec        24.0874s
CuMatrixBase::CopyFromMat(from other CuMatrixBase)        29.5765s
AddVecToRows        29.7164s
CuVector::SetZero        37.7405s
DiffSigmoid        37.7669s
CuMatrix::Resize        41.8662s
FindRowMaxId        42.1923s
Sigmoid        48.6683s
CuVector::Resize        56.4445s
AddRowSumMat        75.0928s
CuMatrix::SetZero        86.5347s
CuMatrixBase::CopyFromMat(from CPU)        166.27s
AddMat        174.307s
AddMatMat        1922.11s

直接运行steps/nnet/train_scheduler.sh

  • 脚本train_scheduler.sh可以在train.sh之外调用,它允许修改默认的NN输入和NN目标输出流,这很有用。
  • 然而,脚本假设一切都正确设置,几乎没有健全检查,这使得它仅适用于更高级的用户。
  • 强烈建议您在尝试直接调用train_scheduler.sh之前先查看一下代码通常是如何被调用的

   

Nnet1相关二进制文件位于src/nnetbin中,重要工具有:

  • nnet-train-frmshuff.cc:最常用的NN训练工具,执行一次训练迭代。
    • 流程是:
      • 根据–feature-transform进行即时的特征扩展,
      • NN输入-输出对的每一帧进行打乱,使其无序,
      • 小批次随机梯度下降(mini-batch SGD)训练,
    • 支持的每一帧级别的目标函数(通过–objective-function来指定):
  • nnet-forward.cc:将数据数据输入到神经网络中,默认使用CPU
    • 查看选项:
      • -apply-log:产生NN输出的日志(即获取对数后验概率)
      • -no-softmax:从模型中移除softmax层(使用pre-softmax值进行解码可以产生对数后验概率相同的lattice
      • -class-frame-counting:指定对数先验的值,从声学得分中减去该值(混合解码中的典型技巧)。
  • rbm-train-cd1-frmshuff.cc:使用CD1(对比散度)训练RBM,将训练数据多次通过RBM,同时在内部调度学习率和动量
  • nnet-train-mmi-sequential.ccMMI / bMMI DNN训练
  • nnet-train-mpe-sequential.ccMPE / sMBR DNN训练
  • nnet-info.cc打印人类可读的有关神经网络的信息
  • nnet-copy.cc通过使用-binary = falsennet转换为ASCII格式,也可用于删除组件

nnet-info.cc打印的信息显示了当指定"-feat-type plain"时的"feature_transform",它包含3个组件:

  • <Splice> 通过使用相对于中心帧偏移的帧来拼接特征以包含左/右上下文的功能,如[-5 -4 -3 -2 -1 0 1 2 3 4 5]
  • <Addshift>做特征变换,使得变换后特征的均值为零
  • <Rescale>可以缩放特征,使其具有单位方差(如,方差=1

注意:我们从磁盘读取低维特性,通过"feature_transform"即可实现扩展到高维特征,从而节省了硬盘空间和读取吞吐量

$ nnet-info exp/dnn5b_pretrain-dbn_dnn/final.feature_transform

num-components 3

input-dim 40

output-dim 440

number-of-parameters 0.00088 millions

component 1 : <Splice>, input-dim 40, output-dim 440,

frame_offsets [ -5 -4 -3 -2 -1 0 1 2 3 4 5 ]

component 2 : <AddShift>, input-dim 440, output-dim 440,

shift_data ( min -0.265986, max 0.387861, mean -0.00988686, variance 0.00884029, skewness 1.36947, kurtosis 7.2531 )

component 3 : <Rescale>, input-dim 440, output-dim 440,

scale_data ( min 0.340899, max 1.04779, mean 0.838518, variance 0.0265105, skewness -1.07004, kurtosis 0.697634 )

LOG (nnet-info:main():nnet-info.cc:57) Printed info about exp/dnn5b_pretrain-dbn_dnn/final.feature_transform

下一个打印显示了一个具有6个隐藏层的神经网络:

  • 每个层由2个组件组成,通常为<AffineTransform>和非线性<Sigmoid><Softmax>
  • 对于每个<AffineTransform>,对于权重和偏差,分别显示了一些统计信息(最小值,最大值,均值,方差,...

$ nnet-info exp/dnn5b_pretrain-dbn_dnn/final.nnet

num-components 14

input-dim 440

output-dim 3370

number-of-parameters 28.7901 millions

component 1 : <AffineTransform>, input-dim 440, output-dim 2048,

linearity ( min -8.31865, max 12.6115, mean 6.19398e-05, variance 0.0480065, skewness 0.234115, kurtosis 56.5045 )

bias ( min -11.9908, max 3.94632, mean -5.23527, variance 1.52956, skewness 1.21429, kurtosis 7.1279 )

component 2 : <Sigmoid>, input-dim 2048, output-dim 2048,

component 3 : <AffineTransform>, input-dim 2048, output-dim 2048,

linearity ( min -2.85905, max 2.62576, mean -0.00995374, variance 0.0196688, skewness 0.145988, kurtosis 5.13826 )

bias ( min -18.4214, max 2.76041, mean -2.63403, variance 1.08654, skewness -1.94598, kurtosis 29.1847 )

component 4 : <Sigmoid>, input-dim 2048, output-dim 2048,

component 5 : <AffineTransform>, input-dim 2048, output-dim 2048,

linearity ( min -2.93331, max 3.39389, mean -0.00912637, variance 0.0164175, skewness 0.115911, kurtosis 5.72574 )

bias ( min -5.02961, max 2.63683, mean -3.36246, variance 0.861059, skewness 0.933722, kurtosis 2.02732 )

component 6 : <Sigmoid>, input-dim 2048, output-dim 2048,

component 7 : <AffineTransform>, input-dim 2048, output-dim 2048,

linearity ( min -2.18591, max 2.53624, mean -0.00286483, variance 0.0120785, skewness 0.514589, kurtosis 15.7519 )

bias ( min -10.0615, max 3.87953, mean -3.52258, variance 1.25346, skewness 0.878727, kurtosis 2.35523 )

component 8 : <Sigmoid>, input-dim 2048, output-dim 2048,

component 9 : <AffineTransform>, input-dim 2048, output-dim 2048,

linearity ( min -2.3888, max 2.7677, mean -0.00210424, variance 0.0101205, skewness 0.688473, kurtosis 23.6768 )

bias ( min -5.40521, max 1.78146, mean -3.83588, variance 0.869442, skewness 1.60263, kurtosis 3.52121 )

component 10 : <Sigmoid>, input-dim 2048, output-dim 2048,

component 11 : <AffineTransform>, input-dim 2048, output-dim 2048,

linearity ( min -2.9244, max 3.0957, mean -0.00475199, variance 0.0112682, skewness 0.372597, kurtosis 25.8144 )

bias ( min -6.00325, max 1.89201, mean -3.96037, variance 0.847698, skewness 1.79783, kurtosis 3.90105 )

component 12 : <Sigmoid>, input-dim 2048, output-dim 2048,

component 13 : <AffineTransform>, input-dim 2048, output-dim 3370,

linearity ( min -2.0501, max 5.96146, mean 0.000392621, variance 0.0260072, skewness 0.678868, kurtosis 5.67934 )

bias ( min -0.563231, max 6.73992, mean 0.000585582, variance 0.095558, skewness 9.46447, kurtosis 177.833 )

component 14 : <Softmax>, input-dim 3370, output-dim 3370,

LOG (nnet-info:main():nnet-info.cc:57) Printed info about exp/dnn5b_pretrain-dbn_dnn/final.nnet

帧加权训练

调用steps/nnet/train.sh

选项:
--frame-weights <weights-rspecifier>
其中<weights-rspecifier>通常是具有每帧权重的浮点型向量的ark文件,

  • 权重用于缩放在单帧上计算的梯度,这在置信加权半监督训练中是有用的,
  • 或者,权重可以用来屏蔽我们不想训练的帧,通过生成由0,1组成的向量

     

用其他目标培训

调用steps/nnet/train.sh

选项
--label <posterior-rspecifier> --num-tgt <dim-output>
ali-dirslang-dir则成为虚拟目录。"<posterior-rspecifier>"通常是存储Posterior (后验)的ark文件,"<dim-output>"是神经网络输出的维数。这里的后验不具有概率意义,它只是用于表示目标的数据类型载体,目标值可以是任意浮点数。

当以帧为单位进行训练(即1-hot encoding)时,可以准备一个与输入特征同维数的整型向量的ark文件。该整型向量的元素是目标类的索引的编码,神经网络输出向量的索引位置的值为1。使用ali-to-post.cc将整型向量转换为Posterior,整型向量的格式很简单:

utt1 0 0 0 0 1 1 1 1 1 2 2 2 2 2 2 ... 9 9 9
utt2 0 0 0 0 0 3 3 3 3 3 3 2 2 2 2 ... 9 9 9

在多个非零目标的情况下,可以直接以ascii格式指定Posterior

  • 每个非零目标值由<int32float>编码,其中int32NN输出的索引(从0开始),float是目标值
  • 每个帧(即数据点)由括号[...]中的值表示,<int32float>首位相连接

    utt1 [0 0.9991834 64 0.0008166544] [11] [0 1] [111 1] [0 1] [63 1] [0 1] [135 1] [0 1] [162 1] [0 1] [1 0.9937257 12 0.006274292] [0 1]

    外部目标用于自动编码器的示例:egs/timit/s5/local/nnet/run_autoencoder.sh

均方误差(MSE)训练

调用steps/nnet/train.sh

选项
--train-tool"nnet-train-frmshuff --objective-function = mse"
--proto-opts"--no-softmax --activation-type = <Tanh> --hid-bias-mean = 0.0 --hid-bias-range = 1.0"


在自动编码器示例例如egs/timit/s5/local/nnet/run_autoencoder.sh中使用均方误差训练


tanh激活函数训练

调用steps/nnet/train.sh

选项:
--proto-opts"--activation-type = <Tanh> --hid-bias-mean = 0.0 --hid-bias-range = 1.0"

最佳学习率低于sigmoia,通常为0.00001


nnet1 - > nnet2之间的DNN模型转换

Kaldi中,有KarelDan编写的两种DNN。相互之间不兼容,可以将KarelDNN(nnet1)转换为DanDNN(nnet2)

  • 示例脚本是:egs/rm/s5/local/run_dnn_convert_nnet2.sh
  • 模型转换脚本是:steps/nnet2/convert_nnet1_to_nnet2.sh,调用了模型转换程序:nnet1-to-raw-nnet.cc
  • 有关支持的组件的列表,请参阅ConvertComponent.


Nnet1代码位于src/nnet,工具位于src/nnetbin。它基于src/cudamatrix


神经网络表示

神经网络由称为组件的构建块组成,其可以是例如AffineTransform或非线性SigmoidSoftmax。单个DNN"层"通常由两个组件组成:AffineTransform和非线性。

表示神经网络的类:Nnet保存组件指针Nnet :: components_的向量。 Nnet的重要函数(方法)是:

为了调试,可以通过Nnet :: GetComponentNnet :: PropagateBufferNnet :: BackpropagateBuffer访问组件和缓冲区。


通过新组件扩展网络

创建新Component时,需要使用以下两个接口之一:
1.Component:一个构建块,不包含训练的参数(参见实现的例子:nnet-activation.h
2. UpdatableComponentComponent的子接口,含有训练参数的构建块(参见实现的例子:nnet-affine-transform.h

重要的虚函数的实现有(不是完整的列表):
 

通过新的组件扩展NN框架并不难,您需要:
1.定义Component::ComponentType的新条目
2.Component::kMarkerMap表中定义一个新行
3.添加一个"新组件",使其调用类工厂的函数Component::Read
4.实现接口Component or UpdatableComponent的所有虚拟方法

原文地址:https://www.cnblogs.com/JarvanWang/p/7499581.html