• 1.你用你识别错的句子和正确的句子对比,感觉一下是发音还是词链接问题。

    2.都会有影响,要看具体任务。几个公开数据集合字典去重后并集,或者自己收集字典条目(e.g.字典网站所有词条趴下来),一般商用级别的字典几百万条的公开很少。

  • 1)你这里标注文本是指test dataset的ground truth么?我觉得你LM在test集合的ground truth上ppl越低,应该可以认为这个LM越适合对这批数据解码,over-fitting越大。如果你是同音词,那么acoustic score应该帮助不大。但是你可以试试confidence measure,比如生成lattice,看看同音词是否有竞争路径,来判断你生成这个词的置信度高不高。

    2)成本也还可以接受,也不是完全的重新训练,之前模型的拓扑和参数还是可以用的,只能算是fine tune吧。有了DNN之后,数据越多,效果越好。现在商用的数据都是几千到几万小时,所以这一部分相比起来成本还好。

  • PPL公式中N=单词数+句子数-OOV数

  • 你有了LM,有了test的句子,直接计算就可以。

    比如你是个2-gram,然后句子是<s> a b </s>。 P(句子) = P(a|<s>) * P(b|a) * P(</s>|b),会看LM的定义。

  • 正常你只用把数据放到一个文件里,做好分词就更简单了,而不用-read。当然两者都可以。例如:

    ngram-count -text /home/Ch7/lm/train -order 3 -limit-vocab -vocab /home/Ch7/lm/wordlist -unk -map-unk "<UNK>" -ukndiscount -interpolate -lm ./a

    出现问题,加上'-debug N'来调试,你会发现问题。

    -kndiscount是modifying的KN算法,由goodman他们提出的,-ukndiscount是原始的。他们会统计出现过N词的n-gram计数,就是good-turing里面那个计数。对于原始版本,会统计n1,n2然后D= n1/(n1 + 2n2);对于modifying版本,会统计n1,n2,n3,n4。Y=n1/(n1 + 2n2), D1=1-2*Y*n2/n1, D2=2-3*Y*n3/n2, D3plus = 3-4*Y*n4/n3。

    有的时候数据集太小,或者人为写的,通常会发现对于高阶N-gram出现没有n_x统计计数。这时候常换为witten bell。

  • 这个可以就是你的字典第一列,所有的word。你也可以自己手中指定你想统计的word。

    主要是因为单纯的文本,相对于音频和对照抄本对来说,更容易获得,所以LM通常可以在一个更大的语料库里训练得到。就像你看用的thchs30自带的语言模型就是集外大的文本语料上训练的。

  • Viterbi算法的目标是找到这条最优的隐变量序列,回溯过程就是帮助你拿到它。

    确实最优路径是在地推过程中逐步得到的,但是你只有走完最后一帧,你才能知道全局最优的那条路径。

  • 并不是,通常会包括所有的1-gram到N-gram。你想,并不是所有N元词序列都会出现,比如P(w_i | w_{i-N+1}^{i-1})=0,那么它就不会出现在N-gram这条里,而是出现在N-1-gram或者更低的条目中。

  • 不,这里说的不是这个意思。

    对于这种插值模型,实际上你只要单独记录lamda值在一个单独文件,然后其它的最大似然概率,记录在arpa file里就可以了,这种插值模型英语说应该是"a mixture of models"。

    但是这里主要强调的是"a single interpolated model"这种插值模型,比如插值的Kneser-Ney模型。它也可以表示为:seen events概率(absolute discounting打折概率与前一阶的P_KN插值),词序列,插值系数(即归一化系数)来表示。

  • 这里beta会在arpa最后的回退系数那里

  • 对的,你应该还可以在wikipedia上找到高阶的KN公式,对于第N阶KN=绝对打折和(N-1)阶进行插值。

  • 1.我觉得你前半句的理解是正确的,就是说我在统计N-gram时候,有的N元词序列没出现过,那么我从整体的概率统计量里分出来一小份,也给他们一点概率。后半句"那这些词在语言模型中是不是可以理解为只有1-gram"我没有看懂。比如说1-gram,你就是统计词典里每个词出现的概率,你从语料里计数,然后有的词出现过,你P_ML(w_i)= c(w_i) /N,有些词没出现过P_ML(w_i)=0,你把出现过的分一点,让没出现过的P_ML(w_i)不为0。所以不懂啥叫可以理解为只有1-gram。

    2.本质上这只是一个记号,alpha就是用来归一化的,你需要理解,它保证最后是概率,sum_wi[ P_absolute(wi|w_{i-1}) ] = 1,就可以了。

    对于katz平滑,你可以看ppt21页,算系数的时候,相当于把wi加掉(换句话说你把平滑后的N阶概率加一起就可以了),如果你记成了alpha(w_{i-N+1}到w_i),认为算系数时候w_i限制了大于0,我更喜欢。尊重原文我保留了这种记法。这里absolute算法也是类似,当然写成alpha(w_{i-1})可能更统一。

  • 实际上,你做解码的时候还是有限制的--和你做对齐一样,它都需要有一个图。只是对齐的时候图是由抄本扩充的,比较小;而你解码时候图是从LM得到的,你可以简单的理解成字典里任意两个词跳转(当然词典里不是任意两个词都有跳转关系,所以稍微小一点),比较大。显然的它规定了你解码的范围,不会超出你字典里的词。这样理论上,你在每个word对应的HMM链后面加一个word的终止状态,你就能知道这个word对应的音素结束了。实际情况里,为了简化图,会合并公共前缀,然后加消歧义符"#..."。

  • 1.这里图就是HMM链,对齐之前你要把标注抄本扩展成HMM链,我们实际工程一般用wfst图表示,所以也称之为图。解码时候也有这样一张wfst的图,称之为解码图。

    2.实际上根本就不需要加,我只是给你一种你可以思考的方式。你解码是在解码图上搜索,你从一个统一的初始状态,跳到各个词的第一个状态里,你当然知道这个词是什么,有哪些音素。然后在各个词的HMM链里往下走,走到这个链条的结尾,就准备跳到下一个word。解码感觉上是从特征->隐状态->音素->词->句子这种回溯上去,但是理解成 “LM->词->音素->状态的解码图 + 特征->解码图上受限的隐状态"配合得到结果。

    你想想,如果没有一个图限制你每一帧状态的取值范围,那么你每一帧的隐状态可以是任意音素的任意状态,把他们连接起来,你99.99%以上形成不了一个合理的音素序列吧。所以你至少已经理解到了,你用每个phone的HMM来限制搜索范围。那么你把LM扩展成word,再扩展成phone限制搜索范围是不是顺理成章呢,这样你找到word就自然而然了。

    解码和对齐的过程本质是一样的。你把他们对比着琢磨琢磨。你有兴趣可以看看解码的内容。

  • 实际操作和你这思路不一样,请你看看前面的回答,然后多思考一下。解码它就不是一个一股脑完全自底向上的东西,我说了它也是要有搜索范围的,需要LM形成的图来约束。只是表面上粗略理解为自下向上。

    如果你非要这么干的话:

    已知:每个隐状态的取值范围是状态(某一个音素的某一个状态,然后受HMM约束)。你有了隐状态序列,它对应的状态序列自然是确定的,它对应的音素序列自然确定。

    【从你的描述里,我认为你是不能理解这个已知的。你拿出一个状态的时候,你是知道他是哪个音素的!此外不是任意三个状态就能拼成音素。你要有音素约束。但是你如果能理解音素约束(即一个phone的HMM控制了各状态的链接),我不明白你为什么理解不了word扩展成phone,再扩展成HMM约束呢。】

    【在解码里我会讲:让我们看看没约束的情况:你有一串MFCC,你每次都把一帧MFCC带进所有状态的GMM算概率。这样你能得到这一帧最可能属于哪个状态。比如第一帧最高的是a音素2状态,第二帧是b音素1状态。他们是连不成一个音素的!所以你要约束,让第一帧是某个音素(e.g. a)的第一个状态,然后第二帧只能是该音素(e.g. a)的第一状态或者第二状态,依次类推。所以你要有一个由各个音素的HMM约束的解码图,既然你可以有这种图,相似的你也可以有由各个词约束的解码图。】

    问题:根据已知,你提的这个问题就不成立了。只能说,假定你已经有了一个音素序列(a b c d e f)。它应该对应哪个词序列。

    方法:枚举所有的可能性,然后把LM概率加进去,看看哪个最可能。按照这个思路,在搜索字典时主要问题是同音异形字(e.g. A对应a b c; B对应a b c)或者某个音素是另一个音素的前缀(e.g. A对应a b c, C对应a,b)。已知字符串和映射字典,用队列去找所有可能。

  •  

    1. "从你的描述里,我认为你是不能理解这个已知的。"    "不,这个已知我是知道的"

    如果你知道"已知",你为什么还在问"每次拿出状态的开始位置和长度"?不应该是"音素"?

    2. "问题:根据已知,你提的这个问题就不成立了。" "哪个不成立?"

    问题应该变成"音素"而不是"状态"

    3. 我想说的HMM约束,就是从左到右的HMM。举个例子就是"让第一帧是某个音素(e.g. a)的第一个状态,然后第二帧只能是该音素(e.g. a)的第一状态或者第二状态"

    4. "不是任意的三个隐状态就可以组成一个音素"

    (1)请你写的时候认真的区分好"隐状态"和"状态"。三个隐状态可能是"a_1,a_1,a_1",它还没走完一个完整的音素。"隐状态"序列的长度和input的帧数是相等的,你的隐状态序列可能是这样的"a_1, a_1, a_1, a_2, a_2, a_3, b_1, b_2, b_2, b_3, b_3",就是说你第一帧在a音素的第一个状态,然后发生了自跳转,第二帧还在a音素的第一个状态,然后还是自跳转,第三帧还在a音素的第一个状态,之后发生了前跳,第四帧到了a音素的第2个状态,以此类推。(2)每个HMM几状态是自己定义的,3只是经验值,你可以让a是3状态,b是4状态也没有问题。(3)假设a,b都是3状态,上面这个例子,通过你走过的"隐状态"序列,你显然可以知道对应的音素序列是ab。

    5. "1.这里图就是HMM链,对齐之前你要把标注抄本扩展成HMM链," "我们一直在说解码的事情,把标注抄本扩展成HMM链,我怎么感觉这是训练。"

    读完那句话,你上一个问题里问什么是图,我在给你解释什么是图。而且训练获得对齐和解码的过程本质就是一样的,都是在某个图上用viterbi算法,不同的是获得对齐的图来自标注,解码的图来自LM。

  • 嗯,kaldi里管这个由LM扩展到hmm-state的wfst叫decoding graph。

    我觉得这么做也可以,你这属于完全的自底向上。但是,你这个做的时候为了"隐状态"能对应phone,就使得你要还是有一个小的HMM约束图。并且,你要额外获得从一种音素到另一种音素的跳转概率。你这个思路可以做,但是识别率应该会差。(就说你学的这个音素概率,但是实际上,如果是标准的LM开始扩展下来到phone,这个音素间跳转概率,发生word尾部时是由LM决定的,在word内,是由字典决定的,所以一个音素跳到另一个音素概率很显然要很多值才对。)

    实际上的做法是LM扩展成图,然后feature在这个图上跑,形成隐状态序列,有点像两头同时出发,然后中间夹出来结果,这么个感觉。

     

  • 1)对 2)就是HMM链,颗粒度是状态 3)对 4)不叫更新在LM里面,LM就是语言模型。解码器里会讲,HMM转移概率整合到wfst图中,GMM参数不会。5)utils/mkgraph.sh 6)viterbi解码是在HMM上找最优路径,只考虑每帧求最大概率不叫viterbi解码。

  • 第四章讲的是HMM,你算i_t,自然要考虑HMM结构。我觉得你6)这句话没啥毛病。建议你看看解码中trellis那部分。

  • 1)我有提到<unk>,没出现的词在文本归一化时候统一映射成<unk>。

    2)你可以再听一遍那里,我觉得你没有仔细的听调整计数是什么。我用add-one举的例子,用add-one smoothing之前是P(wi)= C(wi) / N;用了之后是P(wi) = C(wi) + 1/ (N+V)。分子分母都变了。调整计数时候说分母不变,只变分子,这样可以比较好的和原来比较。所以你可以把平滑后表示成 P(wi) = 分子[(C(wi) + 1) * N / (N+V)]  / 分母[N]。这样你比较前后,相当于计数从C(wi)变成了(C(wi) + 1) * N / (N+V),直观看出来打折多少。

    3)你这俩公式是哪里整的?好像不是我写的?而且你不觉得你俩公式是一个意思么?我在课件里给出的是调整计数,结合问题2)。如果你单纯的使用good-turing smoothing的话,你二元词对的总计数N没有变,你调整计数除以N就是概率。

    4)这个例子里是9个参数。那个ppt是个笔误,还是lamda_1^(k), lamda_2^(k), lamda_3^(k),谢谢。P_ML是最大似然,和17页里的一样,是数数得到的。

    5)and后面应该变成C(w_{i-1}^i),我觉得你应该是理解了的。