• 除了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 :: GetComponent,Nnet :: PropagateBuffer,Nnet :: BackpropagateBuffer访问组件和缓冲区。

通过新组件扩展网络

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

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

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

Karel版本的nnet1的更多相关文章

  1. 介绍 32 位和 64 位版本的 Microsoft Office 2010

    在使用 64 位版本的 Office 2010 运行现有解决方案时存在两个基本问题: Office 2010 中的本机 64 位进程无法加载 32 位二进制文件.在使用现有 Microsoft Act ...

  2. Dan版本的nnet2

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

  3. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  4. ABP入门系列(2)——通过模板创建MAP版本项目

    一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...

  5. 理解Maven中的SNAPSHOT版本和正式版本

    Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...

  6. MIP 官方发布 v1稳定版本

    近期,MIP官方发布了MIP系列文件的全新v1版本,我们建议大家尽快完成升级. 一. 我是开发者,如何升级版本? 对于MIP页面开发者来说,只需替换线上引用的MIP文件为v1版本,就可以完成升级.所有 ...

  7. 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

    前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...

  8. DBImport V3.7版本发布及软件稳定性(自动退出问题)解决过程分享

    DBImport V3.7介绍: 1:先上图,再介绍亮点功能: 主要的升级功能为: 1:增加(Truncate Table)清表再插入功能: 清掉再插,可以保证两个库的数据一致,自己很喜欢这个功能. ...

  9. Windows 7上执行Cake 报错原因是Powershell 版本问题

    在Windows 7 SP1 电脑上执行Cake的的例子 http://cakebuild.net/docs/tutorials/getting-started ,运行./Build.ps1 报下面的 ...

随机推荐

  1. python logging日志模块

    一.logging模块的简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不 ...

  2. 原生JS实现$.ajax

    function ajax(obj){ obj=obj||{}; obj.type=(obj.type||'GET').toUpperCase(); obj.dataType=obj.dataType ...

  3. 为什么fork()2次会避免产生僵尸进程

    什么是僵尸进程:用fork()创建子进程后,子进程已终止但父进程没有对它进行善后处理,那么子进程的进程描述符就一直保存在内存中,子进程就是僵尸进程. 怎么产生僵尸进程: 1.父进程没有SIGCHLD信 ...

  4. css 中 position属性

    position属性详解 文档流 1.html中的布局方式分为三种: 标准流(顺序布局):因为html中的元素大体可以分为两大类(a:块级元素:div .H1-H6. table表格  有序级无序列表 ...

  5. 【简单易用的傻瓜式图标设计工具】Logoist 3.1 for Mac

    [简介] Logoist 是一款Mac上强大易用的傻瓜式图标设计制作工具,通过使用内置模板和预设效果,您可以立即创建高质量的图形内容和艺术作品.通过使用该应用程序,可用于制作图标LOGO. 一款用于创 ...

  6. puppeteer端对端测试demo

    1. 下载pupperteer npm i puppeteer 2. 启动一个本地服务 localhost 3. 开启测试 const puppeteer = require('puppeteer') ...

  7. 信用评分卡 (part 4 of 7)

    python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...

  8. Hbase_02、Hbase的常用的shell命令&Hbase的DDL操作&Hbase的DML操作(转)

    阅读目录 前言 一.hbase的shell操作 1.1启动hbase shell 1.2执行hbase shell的帮助文档 1.3退出hbase shell 1.4使用status命令查看hbase ...

  9. JAVA核心技术I---JAVA基础知识(格式化相关类)

    一:格式化相关类 (一)java.text包java.text.Format的子类 –NumberFormat:数字格式化,抽象类 DecimalFormat –MessageFormat:字符串格式 ...

  10. 9.组合模式(Composite Pattern)

    动机(Motivate):    组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素 ...