zoukankan      html  css  js  c++  java
  • AIBigKaldi(十七)| Kaldi的DNN模型(源码解析)

     本文来自公众号“AI大道理”

    单音素模型词错误率为50.58%,三音子模型词错误率为36.03%,lda-mllt模型词错误率为32.12%,说话人自适应模型词错误率为28.41%,quick模型词错误率为27.94%。

    可见quick模型识别率继续有了一定的提高。

    能否继续优化模型?又要从哪些方面入手进行优化呢?

    火热的深度学习进入了我们的视野。

    第一个被取代的就是对发射概率建模的GMM,即DNN-HMM模型。

    Kaldi 中实现的 dnn 共 4 种:

        a) nnet1 - 基于 Karel's 的实现,特点:简单,仅支持单 GPU, 由 Karel 维护。

        b) nnet2 - 基于 Daniel Povey p-norm 的实现,特点:灵活,支持多 GPU、CPU,由 Daniel 维护。

        c) nnet3 - nnet2 的改进,由 Daniel 维护。

        d.)(nnet3 + chain) - Daniel Povey 改进的 nnet3, 特点:可以实现实时解码,解码速率为 nnet3 的 3~5 倍。

    以kaldi的thchs30为例。

    ​总过程

    ​9 DNN模型训练

    run_dnn.sh

    源码解析:

    DNN模型训练要用到cuda。


    训练过程:

    thchs-30里面的DNN不是完整的nnet1,使用的特征不一样,也没有进行rbm预训练。

    特征提取:

    nnet1一般使用 40 维的 fmllr 特征,但在thchs-30中使用的是fbank特征。

    为了提高神经网络模型的建模能力,通过拼帧的方法提供上下文。

    拼帧后需要进行归一化、去相关操作。若是使用fmllr特征,则在此之前要使用CMVN规整各个维度的均值和方差进行去相关。

    而直接使用fbank特征则不用再进行去相关操作,fbank特征本就是不相关的特征。

    在fbank特征基础上得到的MFCC特征是相关的。

    GMM-HMM模型的假设是输入特征具有独立性,不相关性,上下两帧数据没有关系,因此使用MFCC特征。这个假设本身存在一定问题,不是很合理。

    DNN-HMM模型不需要这个假设,相反提供相关性反而有助于模型的提高,因此使用fbank特征。

    DNN模型初始化:

    在thchs30中,初始化模型在读取一个nnet.proto的文件,这个文件里面每一行都是一个组件component。

    所谓组件就是神经网络中的节点和激活函数。

    多个组件组成网络,组件之间以矩阵传递输入和输出。

    dnn的输出个数对应tree的叶子节点数3456。

    train.sh

    nnet-initialize

    Nnet类函数的实现

    训练:

    训练数据需要进行随机化,否则如果数据具有某种稳定变化的分布,最终输出的网络就会倾向于拟合后面若干批次的训练样本。

    随机化就是打乱训练样本顺序,对于非序列递归的神经网络来说是按帧打乱的,对于序列递归的网络来说以数据块为单位进行随机化,保留数据块内部的时序性。

    nnet1使用单GPU进行训练,读取feats.scp作为训练数据,强制对齐文件作为标签。

    训练完毕。

    训练好的DNN模型:

    DNN模型部分解码识别(词级别):

    真正结果(标签词):

    单音素模型词错误率为50.58%,三音子模型词错误率为36.03%,lda-mllt模型词错误率为32.12%,说话人自适应模型词错误率为28.41%,quick模型词错误率为27.94%。
    DNN模型词错误率为23.33%。

    可见DNN模型识别率继续提高。


    DNN模型部分解码识别(音素级别):

    真正结果(标签音素):

    单音素模型音素错误率为32.43%,三音素模型音素错误率为20.44%,lda-mllt模型音素错误率为17.06%,说话人自适应模型音素错误率为14.98%,quick模型音素错误率为13.53%。
    DNN模型音素错误率为10.15%。

    ​总结

    单音素模型词错误率为50.58%,三音子模型词错误率为36.03%,lda-mllt模型词错误率为32.12%,说话人自适应模型词错误率为28.41%,quick模型词错误率为27.94%。
    DNN模型词错误率为23.33%。

    可见DNN模型识别率继续提高。

       

     ——————

    浅谈则止,细致入微AI大道理

    扫描下方“AI大道理”,选择“关注”公众号

    —————————————————————

    ​     

    —————————————————————

    投稿吧   | 留言吧

    萍水相逢逢萍水,浮萍之水水浮萍!
  • 相关阅读:
    网页加速的14条优化法则 网站开发与优化
    .NET在后置代码中输入JS提示语句(背景不会变白)
    C语言变量声明内存分配
    SQL Server Hosting Toolkit
    An established connection was aborted by the software in your host machine
    C语言程序设计 2009春季考试时间和地点
    C语言程序设计 函数递归调用示例
    让.Net 程序脱离.net framework框架运行
    C语言程序设计 答疑安排(2009春季 110周) 有变动
    软件测试技术,软件项目管理 实验时间安排 2009春季
  • 原文地址:https://www.cnblogs.com/AIBigTruth/p/14673400.html
Copyright © 2011-2022 走看看