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大道理”,选择“关注”公众号

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

    ​     

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

    投稿吧   | 留言吧

    萍水相逢逢萍水,浮萍之水水浮萍!
  • 相关阅读:
    深入理解JavaScript系列(24):JavaScript与DOM(下)
    大叔手记(20):ASP.NET MVC中使用jQuery时的浏览器缓存问题
    深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP
    深入理解JavaScript系列(21):S.O.L.I.D五大原则之接口隔离原则ISP
    深入理解JavaScript系列(23):JavaScript与DOM(上)——也适用于新手
    深入理解JavaScript系列(25):设计模式之单例模式
    深入理解JavaScript系列(26):设计模式之构造函数模式
    ASP.NET GridView中使用搜索框(SearchableGridView)
    WPF中的图表设计器 – 1
    使用URL Routing进行数据分页
  • 原文地址:https://www.cnblogs.com/AIBigTruth/p/14673400.html
Copyright © 2011-2022 走看看