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

Karel Vesely的nnet1用到以下技术:

  • 每一层进行预训练,基于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. 将40维fMLLR特征存储到磁盘中,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.008,minibatch的大小是256,没有使用momentum或正则化。
      在开始的几次训练中学习率是常数不变,当神经网络收敛,我们将每次训练的学习率减半,直到网络再次收敛。
      就像用RBM预训练时我们用了句子级别和帧级别的置乱(perturb)来模仿从训练数据分布中日趋样本,在训练工具里就做了帧级别的置乱,在GPU存储空间中。
      一般,所有的训练工具都有选项–feature-transform,这个是个进行临近特征转换的神经网络,是在GPU内完成的。在脚本中,这项是用来给数据做拼接和正则化,但这一项可以做更复杂的转换,如瓶颈特征提取。

input_transform和训练的DBN功能(即Deep Belief Network,RBM的堆栈)需要使用选项'-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配置外,还有其他的示例脚本:

  • DNN:egs / wsj / s5 / local / nnet / run_dnn.sh,(主要的顶层脚本)
  • CNN:egs / 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(具有使用RM和WSJ训练的<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.sh从train.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::InfoPropagate,Nnet::InfoBackPropagate和Nnet::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.cc:MMI / bMMI DNN训练
  • nnet-train-mpe-sequential.cc:MPE / sMBR DNN训练
  • nnet-info.cc打印人类可读的有关神经网络的信息
  • nnet-copy.cc通过使用-binary = false将nnet转换为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-dirs和lang-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

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

    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中,有Karel和Dan编写的两种DNN。相互之间不兼容,可以将Karel的DNN(nnet1)转换为Dan的DNN(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或非线性Sigmoid,Softmax。单个DNN"层"通常由两个组件组成:AffineTransform和非线性。

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

  • Nnet::Propagate:将输入传播到输出,同时保留梯度计算所需的每个组件的缓冲区
  • Nnet::Backpropagate:反向传播损失函数的导数,以更新权重
  • Nnet::Feedforward:传播,同时使用两个翻转缓冲区来节省内存
  • Nnet::SetTrainOptions:设置训练的参数(即学习率,动量,L1,L2代价)

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

通过新组件扩展网络

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

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

  • Component::PropagateFnc:forward-pass函数
  • Component::BackpropagateFnc:反向传递函数(使用链规则的一个步骤,将损失函数的导数与前向函数的导数相乘)
  • UpdatableComponent::Update:梯度计算和权重更新

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

转载于:https://www.cnblogs.com/JarvanWang/p/7499581.html

Karel版本的nnet1相关推荐

  1. 拉勾教育 | Java 性能优化实战 21 讲

    开篇词 开篇词 | Java 性能优化,是进阶高级架构师的炼金石 你好,我是李国.作为<Java 性能优化与面试 21 讲>这个课程的作者,我先来简单介绍下自己. 我曾任京东金融.陌陌科技 ...

  2. 发那科karel机器人环境配置_Fanuc-你没用到的Karel编译方式

    你是如何将Karel程序编译为.pc文件?ROBOGUIDE里编辑器的Build按钮?来吧,我们来捣鼓点快乐的东西! 当我们完整安装ROBOGUIDE软件以后,在ROBOGUIDE安装位置有WinOL ...

  3. Stanford公开课《Programming Methodology》里面的Karel机器人的配置方法

    From:http://muthafucka.diandian.com/post/2012-06-28/40027277434 最近在看Mehran Sahami教授主讲的<Programmin ...

  4. Dan版本的nnet2

    除了chain,nnet1, nnet2, nnet3训练时调整转移模型,chain模型使用类似与MMI的训练准则 Dan's setup does not uses pre-training. Da ...

  5. Fanuc机器人 Karel 编程学习(一)---ROBOGUIDE创建WorkCell

    Fanuc虚拟机器人的创建 软件:FANUC ROBOGUIDE(V9.10) 新建cell 第一步:根据需要选择作业类型,我这里选择的是"HandingPRO",选择好之后点击按 ...

  6. gcc 自动识别的文件扩展名,gcc/g++ -x 选项指定语言,不同 gcc 版本 -std 编译选项支持列表

    对于执行 C 或者 C++ 程序,需要借助 gcc(g++)指令来调用 GCC 编译器. 对于以 .c 为扩展名的文件,GCC 会自动将其视为 C 源代码文件 对于以 .cpp 为扩展名的文件,GCC ...

  7. 多版本python共存,安装三方库到指定python版本 多Python版本和虚拟环境

    多个Python版本:在同一台机器上安装不同的Python,例如2.7和3.4. 虚拟环境:独立的环境,既可以同时安装特定版本的Python,也可以安装任何特定于项目的软件包,而不会影响任何其他项目. ...

  8. virtualenv创建虚拟环境为主_多版本

    20210821 指定python版本安装 20201223 进入虚拟环境之后 如果在其他虚拟环境的目录下 则会首先找到 其他环境的pip 并列出软件版本 如果要查看当前真实环境的情况 用下面的命令 ...

  9. windows下多版本python安装与pip安装和pip使用 吐血总结

    https://blog.csdn.net/silence2015/article/details/56483892/ 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附 ...

最新文章

  1. gram矩阵的性质_线性代数(十五)标准正交基(Orthonormal Bases)和Gram-Schmidt正交化...
  2. git常见使用场景总结
  3. 利用WCF的callback机制开发一个简单的多人游戏模型
  4. Vue.js 从 Vue 1.x 迁移
  5. 前端学习(1893)vue之电商管理系统电商系统之自定义状态列的效果
  6. linux I/O 栈 预习(上)
  7. 如何创建一个特定版本的python虚拟环境
  8. jQuery 去除表单空值 serialize how to eliminate empty fields
  9. 使用.NET 5自动查找代码中的潜在错误
  10. 一个企业为什么执行不力?
  11. Eclipse用法和技巧十六:自动添加未实现方法2
  12. 04-07递归解法问题
  13. 数学建模之马尔可夫链模型详解(附详细Matlab程序)
  14. 伺服舵机带参方向控制
  15. Git 使用之鉴权失败
  16. java int short区别_Java基础之数据比较Integer、Short、int、short
  17. Far planner之 障碍物的图搜索
  18. 38年来,NBA最有价值球员|数据分析
  19. 比较出名的几种美国主机
  20. 淘宝直通车为什么要低价引流,低价引流的原理、低价引流的具体操作

热门文章

  1. 2021-11-14 2021年煤矿采煤机(掘进机)操作考试资料及煤矿采煤机(掘进机)操作免费试题
  2. [系统安装] 装机员U盘安装原版系统
  3. 【PID】PID的调整方法
  4. 施耐德服务器显示a320,A320S在STATUS SD页面上允许显示AIR BLEED MAINTENANCE信息的MEL保留M项操作.docx...
  5. nuclei程序运行时的过程解决
  6. 迷你世界api 系统事件
  7. 内码转换表的来源与制作
  8. 广和通入驻中国联通5G物联网OpenLab开放实验室,携手共赴5G扬帆新征程
  9. 绝地求生刺激战场 4倍镜怎么压枪 刺激战场 4倍镜压枪技巧一览
  10. python爬虫学习(十八)人人网cookie登录