博客
关于我
HERest源码解析
阅读量:666 次
发布时间:2019-03-16

本文共 2538 字,大约阅读时间需要 8 分钟。

HMM模型训练是语音识别领域中的关键算法,涉及复杂的前向和后向计算。在前面的解析中,我们简单介绍了HCompV源码的基本功能,其主要用于初始化HMM模型的参数和相关宏设置,而模型的核心训练算法尚未深入探讨。本文将详细剖析HMM模型训练的过程,重点分析关键代码段及其逻辑结构。

模型训练的核心函数:DoForwardBackward

DoForwardBackward 函数负责执行前向和后向算法,具体实现如下:

void DoForwardBackward(FBInfo *fbInfo, UttInfo *utt, char *datafn, char *datafn2) {    // 初始化相关数据结构    // 加载音锚样本和特征数据    // 调用 FBFile 函数进行前向和后向计算    // 更新最终的HMM参数    // 返回处理结果}

该函数接受多个参数,包括特征文件的路径、数据文件路径以及当前 utterance 的信息。其主要工作可以分为几步:

  • 加载数据:包括音级标注文件和特征文件。
  • 初始化:为当前 utterance 初始化观测数据。
  • 执行前向算法:通过 FBFile 函数计算前向传播概率矩阵 alphat
  • 执行后向算法:计算后向传播概率矩阵 beta
  • 更新模型:根据前后向概率更新HMM模型参数,生成新的 hmmdefs 文件。
  • 功能细节:FBFile 函数

    FBFile 函数负责完成前向和后向算法的执行:

    Boolean FBFile(FBInfo *fbInfo, UttInfo *utt, char *datafn) {    // 调用 StepBack 函数执行后向算法    if (StepBack(fbInfo, utt, datafn)) {        // 调用 StepForward 函数执行前向算法        StepForward(fbInfo, utt);    }    // 打印统计信息    #ifdef PDE_STATS    PrintPDEstats();    #endif    // 重置数据结构缓存    ResetStacks(fbInfo->ab);    return success;}

    详细步骤:StepBack 函数

    后向算法的实现主要在 StepBack 函数中:

    static Boolean StepBack(FBInfo *fbInfo, UttInfo *utt, char *datafn) {    // 初始化相关数据结构    // 调用 CreateInsts 发现模型实例    // 初始化 pruning 信息和 Beta 矩阵    // 迭代调整 pruneThresh 直到满足条件    return TRUE;}

    函数从头开始初始化相关数据结构,包括 AlphaBeta 类型的内存堆和 pruning 信息。通过迭代调整 pruneThresh,确保在允许的误差范围内完成后向计算。最终返回成功标志。

    详细步骤:StepForward 函数

    前向算法的实现主要在 StepForward 函数中:

    void StepForward(FBInfo *fbInfo, UttInfo *utt) {    // 初始化当前 utterance 的观测数据    // 调用 CreateAlpha 创建 alpha 表    // 调用 StepAlpha 进行动态规划计算    // 累积统计数据    // 处理特征和辅助统计}

    函数从头开始初始化当前 utterance 的观测数据,调用 CreateAlpha 函数创建初始概率矩阵 alphat。接着,通过 StepAlpha 函数完成动态规划计算,估计每个状态的最大概率。同时,处理特征数据和相关辅助统计,更新模型参数。

    AlphaBeta 结构体

    AlphaBeta 结构体是整个训练过程中的核心数据类型,主要包含以下成员:

  • MemHeap abMem:用于管理关系式内存分配,支持动态扩展。
  • *PruneInfo pInfo:存储 pruning 设置和相关参数,用于优化计算。
  • *HLink up_qList 和 *HLink al_qList:分别存储当前 utterance 的上层和连结的 Hidden Markov Model (HMM) 实例。
  • *LabId qIds:记录每个状态对应的 HMM 名称,便于索引。
  • 输入层特征short *qDms 存储最小模型时长,用于剪枝优化。
  • 状态概率矩阵DVector *alphat 存储前向传播概率,DVector **beta 存储后向传播概率。
  • 显存的状态概率表float *****otprob 存储侧向传播概率。
  • 统计信息LogDouble pr 存储当前 utterance 的对数概率,如字母态转换等。
  • 该结构体通过多层指针和矩阵形式实现了HMM的嵌入式训练,Q 是当前 utterance 的 HMM 状态数,Nq 为每个HMM的状态数。

    HMM 嵌入式训练流程

    HMM 模型的嵌入式训练遵循以下步骤:

  • 初始化:加载特征文件和音锚样本,初始化模型参数。
  • 执行 StepBack:执行后向传播更新 Beta 矩阵。
  • 执行 StepForward:执行前向传播更新 Alpha 矩阵。
  • 更新统计数据:累积传输概率和其他相关统计信息。
  • 迭代训练:重复上述步骤,直至完成所有训练数据的处理。
  • 该过程确保模型逐步收敛,最终达到最佳拟合训练数据。通过动态调整 pruning 停顿阈值(pruneThresh),系统能够在一定误差范围内优化模型参数,提高训练效率和质量。

    总结

    HMM模型训练是一个复杂的过程,涉及前向和后向算法的深度协同。在本文中,我们详细分析了 DoForwardBackward 函数及其关键组件 FBFileStepBackStepForward。通过理解 AlphaBeta 结构体以及其嵌套的数据矩阵,能够更好地掌握HMM模型的训练工作 原理。

    转载地址:http://qclqz.baihongyu.com/

    你可能感兴趣的文章
    自动化测试——UI自动化测试的痛点
    查看>>
    如何将萌推商品主图、属性图、详情图批量保存到电脑的方法
    查看>>
    2021年N1叉车司机模拟考试及N1叉车司机考试软件
    查看>>
    【奇淫巧技】Java动态代理(JDK和cglib)
    查看>>
    2021-05-11 现代操作系统 《现代操作系统 第4版》第3章 内存管理——总结(分段,分页,段页)(转载)
    查看>>
    MP4修改元数据日志记录
    查看>>
    WebView使用
    查看>>
    【Stimulsoft Reports.Net教程】使用DesignerFx
    查看>>
    攻防世界 Pwn 新手
    查看>>
    mybtis-plus 出现 Wrong namespace
    查看>>
    2008年7月20日星期日
    查看>>
    c#启动本机程序
    查看>>
    用户登陆的验证码的制作
    查看>>
    判断远程文件是否存在
    查看>>
    升级java11后,maven命令打包报错
    查看>>
    springboot redis key乱码
    查看>>
    Win10禁用自带的笔记本键盘
    查看>>
    insmod模块的几种常见错误
    查看>>
    shell及脚本4——shell script
    查看>>
    写时复制集合 —— CopyOnWriteArrayList
    查看>>