答蓝蓝天上vzh
路径π和B变换:
在实际训练中并不知道每一帧对应的音素,因此进行训练比较困难。可以先考虑一种简单的情况,已知每一帧的音素的标签z′, 即训练样本为x和z′,其中z′不再是简单的[n,i,h,a,o]标签,而是:
[图片]
在我们的例子中, z′=[n,n,n,n,n,n,n,i,i,i,i,i,i,h,h,h,h,h,h,h,a,a,a,a,a,a,o,o,o,o,o,o,o], z′包含了每一帧的标签。在这种情况下有:
[图片]
(1)
该值即为后验概率图中用黑线圈起来的部分相乘。我们希望相乘的值越大越好,因此,数学规划可以写为:
[图片]
(2)
[图片]
(3)
目标函数对于后验概率矩阵y中的每个元素
[图片]
的偏导数为:
[图片]
也就是说,在每个时刻t(对应矩阵的一列),目标只与
[图片]
是相关的,在这个例子中是与被框起来的元素相关。
其中Nw可以看做是RNN模型,如果训练数据的每一帧都标记了正确的音素,那么训练过程就很简单了,但实际上这样的标记过的数据非常稀少,而没有逐帧标记的数据很多,CTC可以做到用未逐帧标记的数据做训练。
首先定义几个符号:
[图片]
表示所有音素的集合
[图片]
表示一条由L中元素组成的长度为T的路径,比如z′就是一条路径,以下为几个路径的例子:
[图片]
这6条路径中,
π1可以被认为是“今夜无人入睡”, π2可以被认为是在说“你好”,π3可以被认为是在说“好你”,π4,π5,π6都可以认为是在说“你好”。
定义B变换,表示简单的压缩,例如:
B(a,a,a,b,b,b,c,c,d)=(a,b,c,d)
以上6条路径为例:
B(π1)=(j,i,n,y,e,w,u,r,e,n,r,u,s,h,u,i)
B(π2)=(n,i,h,a,)
B(π3)=(h,a,o,n,i)
B(π4)=(n,i,h,a,o)
B(π5)=(n,i,h,a,o)
B(π6)=(n,i,h,a,o)
因此,如果有一条路径π有B(π)=(n,i,h,a,o),则可以认为π是在说“你好”。即使它是如π4所示,有很多“o”的音素,而其他音素很少。路径π=(π1,π2,...,πT)的概率为它所经过的矩阵y上的元素相乘:
[图片]
因此在没有对齐的情况下,目标函数应该为{π|B(π)=z}中所有元素概率之和。 即:
[图片]
在T=30,音素为[n,i,h,a,o]的情况下,共有C529≈120000条路径可以被压缩为[n,i,h,a,o]。 路径数目的计算公式为C音素个数T−1,量级大约为(T−1)音素个数。一段30秒包含50个汉字的语音,其可能的路径数目可以高达108,显然这么大的路径数目是无法直接计算的。因此CTC方法中借用了HMM中的向前向后算法来计算。