Kaldi中的深度神经网络

翻译:[email protected]

时间:2014年4月,2015年4月重新修改

介绍

深度神经网络已经是语音识别领域最热的话题了。从2010年开始,许多关于深度神经网络的文章在这个领域发表。许多大型科技公司(谷歌和微软)开始把DNN用到他们的产品系统里。

但是,没有一个工具箱像kaldi这样可以很好的提供支持。因为先进的技术无时无刻不在发展,这就意味着代码需要跟上先进技术的步伐和代码的架构需要重新去思考。

我们现在在kaldi里提供两套分离的关于深度神经网络代码。一个在代码目录下的nnet/和nnetbin/,这个是由 Karel Vesely提供。此外,还有一个在代码目录nnet-cpu/和nnet-cpubin/,这个是由 Daniel Povey提供(这个代码是从Karel早期版本修改,然后重新写的)。这些代码都是很官方的,这些在以后都会发展的。

在例子目录下,比如: egs/wsj/s5/, egs/rm/s5, egs/swbd/s5 and egs/hkust/s5b,神经网络的例子脚本都可以找到。 Karel的例子脚本可以在local/run_dnn.sh或者local/run_nnet.sh,而Dan的例子脚本在local/run_nnet_cpu.sh。在运行这些脚本前,为了调整系统,run.sh你必须首先被运行。

我们会很快的把这两个神经网络的详细文档公布。现在,我们总结下这两个的最重要的区别:

  • Karel的代码(nnet1)支持用单卡GPU训练,这使得实现更加简单和相对容易修改。
  • Dan的代码(nnet2)在训练方式上是灵活的:它支持多线程的多GPUs, 或者多CPUs。一般推荐多GPU。它们不必全部是相同的机器上。每一个都可以获得差不多的结果。

在具体的实现中,这两个代码有很多的不同点。举例来说,Karel的部分需要使用预训练,但是Dan的却不需要;Karel部分需要使用一个有效集来早点停止迭代,而Dan在最后几轮迭代训练中使用固定的迭代次数和平均化参数。更多的训练细节(非线性类型,学习率,网络类型,输入特征等) 也不同。

DNN部分最好的描述如下:

这两部分的DNN格式是不兼容的,这里有一个把Karel网络转换为 Dan的格式: Conversion of a DNN model between nnet1 -> nnet2

Karel版本的文档在 Karel's DNN implementation 和Dan版本的文档在 Dan's DNN implementation