Kaldi的nnet3
Nnet3配置中的上下文和块大小
简介
本页讨论了nnet3配置中关于解码和训练的块大小以及左右上下文的某些术语。这将有助于理解一些脚本。目前,从脚本角度来看,没有任何关于nnet3的"概述"文档,所以这是nnet3唯一的文档。
基础
如果您已阅读了"nnet3"配置的以前的文档,您会发现"nnet3"不仅支持简单的前馈DNN,还可以实现在网络内层进行时间拼接(帧拼接)的时延神经网络(TDNN)并且还用于recurrent拓扑(RNN,LSTM,BLSTM等)。所以nnet3有时间轴的概念。下面我们确定一些术语。
左右上下文
假设我们想要一个网络来计算特定时间索引的输出;具体来说,假设时间t=154,在网络内部进行帧拼接(或任何其他与"t"索引无关的内容),如果没有给出当前帧的左右一定范围的帧,则可能无法计算当前帧的输出。例如,如果没有看到t = 150到t = 157这个范围内的帧,则可能无法计算输出。在这种情况下(掩饰细节),我们会说网络有一个左上下文4和右上下文3。上下文的实际计算有点复杂,因为它必须考虑到特殊情况,例如奇数和偶数"t"值的情况是不同的。
在有recurrent拓扑的情况下,除了"所需的"左右上下文外,训练或解码时,我们还要给予"额外的"上下文。对于这种拓扑,网络可以利用超出所需上下文的上下文。在脚本中,通常会看到名为extra-left-context和extra-right-context的变量,这意味着"除了需要的内容之外,我们将提供的上下文的数量"。
在某些情况下,左上下文和右上下文意味着添加到块(chunk)中的总的左上下文和总的右上下文,即
左上下文=模型左上下文+额外左上下文
右上下文=模型右上下文+额外右上下文
因此,在某些情况下,您需要搞清楚一个变量指的是模型的左右上下文还是数据块的左右上下文。
在Kaldi5.0及更早版本中,数据块中的左右上下文不受块大小在开头或结尾的影响;在最后我们用第一或最后一帧的副本填充输入。这意味着对于recurrent拓扑,我们可能会用很多帧(最多40个左右)来填充语句的开始或结束。这没有意义而且很奇怪。在版本5.1和更高版本中,您可以指定extra-left-context-initial和extra-right-context-final,允许话语的开始/结束具有不同的上下文量。如果您指定这些值,通常将它们都指定为0(即没有额外的上下文)。但是,为了与旧版本的后台兼容,它们通常默认为-1(意思是复制默认的左上方和右上方)。
块大小
块大小是我们在训练或解码中每个数据块的(输出)帧的数量。在get_egs.sh脚本和train_dnn.py中,它也被称为frames-per-eg(在某些上下文中,这与块大小不同;见下文)。在解码中,我们把它称为frame-per-chunk。
非循环,非chain模型的例子
对于使用交叉熵目标函数训练的前馈网络或TDNN等非常简单的网络类型,我们在帧级别上打乱整个数据集,并且我们一次只训练一帧。为了使大部分训练做顺序I/O,需要在帧级别上对数据进行随机化。然而,当需要10帧的左右上下文时,我们必须给出左右上下文中具体是哪些帧,当我们生成训练示例时,数据量会增加20倍左右。为了解决这个问题,我们包括一系列时间值的标签,由frame-per-eg(通常为8)控制,并包括足够的左/右上下文,我们可以在这8个帧中的任何一个上训练。然后,当我们训练模型时,任何给定的训练工作将选择其中一个8帧进行训练。
经常性或连锁案例
在RNN或LSTM模型或"Chain"模型中,我们总是训练相当大的块(通常在40到150帧的范围内)。这被称为块大小。当我们解码时,我们还通常在相当大的数据块(如30,50或100帧)上评估神经网络。这通常被称为每帧的帧。对于经常性网络,我们倾向于确保在训练和解码中大块/每帧/左右上下文和右上下文大致相同,因为这通常给出最佳结果(尽管有时最好使解码中的上下文值稍大一些)。人们可能会期望在解码时间更长的情况下总是会更好,但是并不总是这样(然而,请参见下面的循环解码,我们在这里提到一个方法)。
块大小与帧 - 子采样因子的相互作用
在输出处有帧子采样的情况下(如链模型),块大小仍然以"t"的倍数进行测量,我们确保(通过在代码中舍入),它是帧抽样因子。请记住,如果块大小为90,帧子采样因子为3,那么我们只对每个90帧的块估计30个不同的输出索引(例如t = 0,t = 3 ... t = 87)。
Kaldi的nnet3的更多相关文章
- Xvector in Kaldi nnet3
Xvector nnet Training of Xvector nnet Xvector nnet in Kaldi Statistics Extraction Layer in Kaldi ...
- Kaldi nnet3的fastlstm与标准LSTM
标准LSTM: 与标准LSTM相比,Kaldi的fastlstm对相同或类似的矩阵运算进行了合并. # Component specific to 'projected ...
- Kaldi nnet3的前向计算
根据任务,构建ComputationRequst 编译ComputationRequst,获取NnetComputation std::shared_ptr<const NnetComputat ...
- 对Kaldi nnet3进行奇异值分解(SVD)以减小模型大小
用处 基于SVD实现模型压缩以适配低功耗平台 根据nnet3bin/nnet3-copy,nnet3-copy或nnet3-am-copy的"--edits-config" ...
- kaldi chain模型的序列鉴别性训练代码分析
chainbin/nnet3-chain-train.cc int main(int argc, char *argv[]) { ... Nnet nnet; ReadKaldiObject(nnet ...
- nnet3配置中的上下文和chunk(块)大小
Nnet3配置中的上下文和块大小 简介 本页讨论了nnet3配置中关于解码和训练的块大小以及左右上下文的某些术语.这将有助于理解一些脚本.目前,从脚本角度来看,没有任何关于nnet3的"概述 ...
- nnet3的代码分析
nnet3/nnet-common.h 定义了Index,(n, t, x)三元组,表示第n个batch中第t帧. 并声明了关于Index或Cindex的一些读写操作. nnet3/nnet- ...
- Kaldi中的L2正则化
steps/nnet3/train_dnn.py --l2-regularize-factor 影响模型参数的l2正则化强度的因子.要进行l2正则化,主要方法是在配置文件中使用'l2-regulari ...
- Kaldi中的Chain模型
Chain模型的训练流程 链式模型的训练过程是MMI的无网格的版本,从音素级解码图生成HMM,对其使用前向后向算法,获得分母状态后验,通过类似的方式计算分子状态后验,但限于对应于转录的序列. 对于神经 ...
随机推荐
- (转)C++ 值传递、指针传递、引用传递详解
一直以来对函数的值传递引用传递理解很模糊,这篇文章可以说是给自己扫盲了. 值传递:实参不会发生改变,是因为形参传递的是不是实参的源地址(形参和实参地址不一样).不影响实参 指针传递:本质也是值传递,只 ...
- AndroidStudio快速入门四:打造你的开发工具,settings必备
http://blog.csdn.net/jf_1994/article/details/50085825 前言:这里是使用AS的基本设置,适合新入手的朋友阅读,将这里介绍的设置完基本使用无忧啦. 1 ...
- SSH整合redis和MongoDB错误笔记
由于毕设中做的是图片搜索网站,选择前端框用SSH,因为之间接触过SSH框架,略有了解,但没有深究,现在在整合redis和mongodb的过程中遇到很多错误,也是十分痛苦,只能通过百度和一步步尝试着解决 ...
- (栈)leetcode 946. Validate Stack Sequences
Given two sequences pushed and popped with distinct values, return true if and only if this could ha ...
- CodeForces992E 二分 + 树状数组(线段树)
http://codeforces.com/problemset/problem/992/E 题意:给定一个序列 ai ,记其前缀和序列为 si ,有 q 个询问,每次单点修改,询问是否存在一个 ...
- go tail
安装导入 go get github.com/hpcloud/tail import "github.com/hpcloud/tail" 使用 package main impor ...
- 2017-12-18python全栈9期第三天第一节之昨天内容回顾与作业讲解用户三次机会再试试
#!/user/bin/python# -*- coding:utf-8 -*-username = "zd"password = "123"i = 3whil ...
- Shell命令的执行顺序
shell执行命令的步骤顺序如上图,看起来有些复杂. 当命令行被处理时,每一个步骤都是在Shell的内存里发生的;Shell不会真的把每个步骤的发生显示给你看. 所以,你可以假想这事我们偷窥Shell ...
- Hbase记录-zookeeper部署
#官网下载二进制包解压到/usr/app下,配置/etc/profile: export ZOOKEEPER_HOME=/usr/app/zookeeper export PATH=$PATH:$ZO ...
- C#多线程和异步(二)——Task和async/await详解
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...