• 如果你字典里完全没有这个词,那么你不得不在字典里加入,否则你的解码是无法识别出来这个词的。

    而且你的LM也要重新训练,使得LM有新词的语言模型概率。或者你可以指定一个较高的概率给它。

    确实重训语言模型和重构图都会比较消耗时间。一个大概的数字,从几十G的文本,百万条字典,来统计一个3-gram可能要十几个小时(当然取决于机子);然后重构也大概是十几小时。

    当然,解码器里有动态解码器,使用on-the-fly的compostiont操作,例如把HCL和G分成两部分,等等。但是缺点在于速度要慢于完整构图的HCLG,而且路径扩展等也有一定麻烦。所以一般会选择重新构建HCLG。(如果你想动态的处理lexicon,你可以看看"Transducer composition for“on-the-fly”lexicon and language model integration")

  • 通常都是先获得没有标点的识别结果,然后CRF或其它模型加标点。可以搜搜之前会议的论文,会有人做标点预测。

  • 1)是的

    2)epsilon就是不接收/输出任何符号。2-gram不存在,回退到1-gram,这个arc只是用来乘以回退系数的,所以什么也不接受,什么也不输出。

  • 1. 首先你要知道,我们使用WFST-based解码器,构建HCLG的目的是把所有hmm跳转,音素上下文,字典,语言模型的所有信息统一的构建到一张网络里。这样形成一个搜索网络后,我们只需要在这个网络上搜索跳转,除了发射概率的p(o|s)从GMM或者DNN得到,其它的我们都可以在这个网络里得到,而不依赖任何外部信息。这样快速,简便,统一。所以构建G.fst的时候,我们把所有n-gram的信息都构建到图上。G.fst等价的表示了n-gram,为什么我们还要麻烦的把回退系数单独存到一个文件呢?在视频里我解释了怎么等价的把一个n-gram信息(即arpa file存的所有信息)转化到G.fst上(即wfst的形式表示)。

    2. G.fst完全等价的表示了n-gram的所有信息。显然WFST上每一条通路都相当于一组概率相乘,在WFST是⊕操作,你会发现<cay>的arch概率是一样的,显然0-3-4-2的概率更高,也就是有2-gram我们会走2-gram,没有2-gram时候我们才回退到1-gram。而且你要注意你看到G.fst是把n-gram的信息直译的结果,方便理解,后面还会确定话最小化,来适合机器进行运算跳转,你就很难看到这种路径了。(当然,你这是一个非常棒的问题,核心在于P(w2|w1)是否大于P(w1)P(w2)。所以这样转化标准的说是一个近似。在绝大多数情况下,高阶n-gram的weight会优于低阶进行backoff的结果。所以基本没有问题。当然G.fst还有其它转化方法,有兴趣你可以看"“Generalized algorithms for constructing statistical language models",这种表示更准确,但是要更多的states和transitions,所以导致图会变大。但是最终结果基本没有差异。)

  • fstaddselfloops是kaldi的binary,只要你正确安装了kaldi,在src/fstbin下面会有。你可能是分步执行的时候没有". ./path.sh",使得系统无法找到binary。

  • 不是,Viterbi算法是动态规划算法,它的动态规划原理表明,如果最优路径在t时刻经过了结点i_t,那么这一路径从结点i_t到终点i_T的部分路径,对于从i_t到i_T的所有可能的部分路径,是最优的。只是实际过程中的剪枝会造成不精确。

  • @yafuilee 之前没明白你的意思。你说的这种近似确实是对的,viterbi算法算出的是单一 路径的概率,而forward算法算出的是all paths的概率,如果你用一个孤立词去试试,你会发现概率差的还是比较多大。但是解码中你无法使用"forward算法",在实际该过程中你往往要解决的是找到最优的word sequence而不是single word。当你找word sequence时候,假设你还是用trellis,横轴为frame(T),纵轴为所有的word的state(N),你可能认为算法复杂度是O(N^2T),但实际不是。举个例子,当两个词w1,w2都到了结尾状态,他们都要跳到w3,此时,如果你用的是"forward算法",你前向累加出来的概率是P(o|w1w3)+P(o|w2w3),依次类推,越往后你越是所有可能路径的概率和。所以你如果想用"forward算法",你要分别对都有可能的word sequence进行求解,可以说这有无数种可能,这是指数级的算法复杂度,而且你无法估测有多少词。所以你只能用"Viterbi算法"近似,这样保证算法复杂度是O(N^2T),才是可行的解法。

  • d_c计算不是N,你带入laplace平滑的例子就很显然,用图中c_i^*除以c_i和N,V都有关。

  • 1.每次compose之后都会进行确定话和最小化,我在倒数第4页ppt有讲到,比如L和G进行compose之后,就要确定化,最小化。然后再和C进行后续处理。

    2.transducer主要是转换,acceptor主要是接受判断。

    3.看确定化定义,weight的前移和后移都没有问题,只要保证是等价的fst就可以。

    4.看最小化的定义,目标是创建等价fst,并且有做少的state和arc。只要能达到这个目的,weight的前后移动并没有关系。

  • WFST上面的weight就是LM概率,transition概率等的组合,存在图上的时候是-ln域。

    likelihood是贝叶斯公式里的通常叫法,还有先验prior,后验posterior。把特征帧带入GMM获得的是likelihood,把特征带入NN获得的是posterior,然后转化为likelihood给解码使用。通常是ln域的。用作cost时候取负数即可。

    cost,顾名思义,就是花费代价,越大越差。-ln域的值就是这个特点,值越大,概率越低。

  • 1.可以。

    2.G中存在,你在做语言模型的时候用的也是这个字典,会因为打折算法给这些unseen event一个概率。字典中有这个word,自然L.fst中有它和音素的映射关系。

  • 1.有

    2.构建C的时候会需要你三音素的位置信息(宽度和中心音素位置),构建H的时候需要tree,帮你决定pdf(每个状态的发射概率密度函数)和cd-phone的对应关系。

    3.不用

    4.H是输入transition-id输出cd-phone-id,C是输入cd-phone-id输出phone-id,L是输入phone-id输出word-id,G是输入输出word-id。为了能进行C和L的compose,你需要让C的olabel是合理的phone-id。具体输出中心phone-id还是右边phone-id,只是不同工具的作者不同的选择。

  • 1. 我在课程里说过了,三元组是旧的kaldi,现在用到四元组。可以在回去听一下H.fst那页的ppt视频。

    2. 是,决策树就是决定哪些音素的哪些状态共享同一个pdf。

  • 1. 这是翻译Takaaki Hori的书啊,你可以在网上搜搜。原本最直接的想法是,把输入的speech信号转化成context-dependent phone(也就是图中的'x'转化成(s)s(t)这种上下文相关的phone),然后weight来表示transition概率和发射概率。但是这种无法形成,所以拆分成了图里的(a)和(b)两部分。这里很关键的一点你要注意,(a)是实际的自动机,而(b)只是decoder里面的一段代码,画出来只是帮助你理解,它类似于自动机,"实际不存在"。这里(a)类似于我们使用的H.fst,把input的状态(e.g. S4)映射到了cd phone(e.g. (s)s),然后把transition概率编码到weight上。就像课件里讲的,这里input给出状态,实际是为了找到对应pdf-id,从而计算"虚拟的"(b)中的发射概率;再加上pdf-id与HMM状态是一对多的。所以我们介绍的H.fst的input label是transition-id,然后output label是cd phone,weight编码了transition概率,类似于(a)。而(b)这部分,实际上你有了transition-id,就找到了pdf-id,就能求出发射概率,只是代码里LogLikelihood做的事情。

    2. 我觉得你应该理解了。就像我视频了说的,WFST相当于从LM扩展下来的,中间以来了Lexicon,HMM topo。所以你解码是约束在wfst解码图里的,每个"组件"都有在做这种约束。

    3. (更新)理解正确。每当获得新模型或者使用新LM等后都需要用utils/mkgraph.sh构图,之后才能解码。

  • 哦,你指的是这个,那你说的没错,。这和你每次更细模型之后都要调用utils/mkgraph.sh一个道理,你需要对新的模型执行make-h-transducer等操作,然后重新构图。

  • 1&2. 直接在HCLG上运行跳转。所有LM,转移概率都在HCLG的weight上,而每个arc的input是transition-id可以找到对应的pdf-id。

    粗略的说:一帧数据来了,HCLG上要从一个状态跳转到另一个状态,他么之间有一个arc,从input label的transition-id找到对应的pdf-id,你就能算出来acoustic score, 然后arc上的weight就是graph score(相当于LM score,多音字概率,转移概率等)。这就相当于你HMM发生了一次跳转。

    3.我在课程里讲H的时候有解释过transition-id的结构。pdf-id到transition-id是一对多,但是transition-id到pdf-id是一对一。

  • 神经网络的输出是posterior,通常你要减去prior,然后拿到pdf-id对应的输出结点的值才是acoustic score。

  • 对于tri-gram,你是P(w3|w1w2),如果w1w2都不存在,w1w2w3也肯定不存在,对这个没有打折的说法了,不存在除零。你打折为了剩下 一部分概率给unseen events,即这些出现为0次的。所以你打折是在出现过的seen events上打折。

  • 不会,解码会限制在解码图里,由LM扩展而来,不是一个纯逆向过程,看一下第八章开始。

  • 上面同学帮忙解答了。

    1. LM训练时候字典可以是你自己指定的,不一定是train集合里提取的

    2&3. thch30提供的语言模型时候从一个外部的大语料库里训练的,并且它用的字典更大。从OOV你就可以看出来,之前字典某些词是没有的。引入大字典后,概率相当于稀疏了。

    工具包里实际计算N时候N=word数+sentence数-OOV数(250 sentences, 4917 words, 18oovs,表示总共250个句子,4917个词,这4917个词中有18个oov词)。一般会引入一个<unk>解决OOV。

    你可以自己设计一个小一点的集合,比如一句话,来理解各个参数的用处。