1、HMM三个问题 1、知道HMM的参数 λ = (A, B, π) 和观测序列O = {o1,o2, …, oT} ,如何计算模型 λ 下观测序列O出现的概率P(O | λ)。
2、HMM的参数如何确定? 比如:对于刚才的中文分词的小例子。 初始概率分布π好确定:是不是终结词的概率各是0.5。 观测矩阵B也好确定:1/65535嘛 但状态转移矩阵怎么确定?我怎么知道下个词是终结词的概率是多少?
- 知道HMM的参数 λ = (A, B, π) 和观测序列O = {o1,o2, …, oT},如何计算给定观测序列条件概率P(I|O, λ )最大的状态序列I,即:
对于中文分词,我想到底如何分的词。
第一个问题被称为:概率计算问题。 解决办法:前向-后向算法(一种动态规划算法)。
第二个问题被称为:学习问题。 解决办法:如果状态序列已知,那用最大似然估计就好了,但HMM的状态序列未知,即含有隐变量,所以要使用Baum-welch算法(其实其本质就是EM算法)。
第三个问题被称为:预测问题/解码问题。 解决办法:Viterbi算法(一种动态规划算法)。
2、chain model chain model是DNN-HMM模型的一种,使用nnet3结构
使神经网络的输出的帧率缩小三倍,明显的缩小了测试时的计算量,使实时解码更加容易 模型从一开始就用序列级目标函数(正确序列概率的对数)进行训练。MMI在GPU上的实现没有使用Lattices(词图),而是通过在解码图中进行一个完整的前向后向过程实现,这个解码图来源于音素的n-gram语言模型。
因为缩小了帧率,所以需要使用非传统的HMM拓扑结构(允许在单一状态下遍历HMM,可以看一下kaldi的HMM-topology,了解一下kaldi中的HMM拓扑结构)。 在HMM中使用固定的转移概率,并且不训练转移概率(将来可能会训练它们,但是一般来说,神经网络的输出概率可以代替转移概率,具体取决于拓扑结构) 目前只有nnet3支持chain model,并且在线解码还没有实现(这个‘目前’时kaldi官方文档说的前,指的y应该时2016年,现今是否支持在线解码还不了解) 目前比传统DNN-HMMs的结果要稍微好一点(大概提升了5%),但是解码速度比以前快了三倍;训练速度应该也加快了一些,训练速度的提升程度并没有进行精确的计算。
3、L1、L2正则化
L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。
L1正则化是指权值向量w中各个元素的绝对值之和,通常表示为||w||_1
L2正则化是指权值向量w中各个元素的平方和然后再求平方根(可以看到Ridge回归的L2正则化项有平方符号),通常表示为||w||_2
L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合
4、CTC模型
CTC的全称是Connectionist Temporal Classification,中文翻译大概是连接时序分类。它要达到的目标就是直接将语音和相应的文字对应起来,实现时序问题的分类。
用公式来描述的话,CTC的公式推导如下:
在基于CD-DNN-HMM架构的语音识别声学模型中,训练DNN通常需要帧对齐标签。在GMM中,这个对齐操作是通过EM算法不断迭代完成的。
E-step:估计(重估)GMM参数
M-step:使用BW(Baum-Welch算法)对齐
此外对于HMM假设一直受到诟病,等到RNN出现之后,使用RNN来对时序关系进行描述来取代HMM成为当时的热潮。
随着神经网络优化技术的发展和GPU计算能力的不断提升,最终使用RNN和CTC来进行建模实现了end-to-end语音识别的声学模型。