参考 https://zhuanlan.zhihu.com/p/33464788
语音识别有时候输入长度远大于输出长度,这是因为语音信号的非平稳性决定的,我们只能做短时傅里叶变换,这就造成了一个句子会有很多帧,即很多时刻。而标签(输出词序列)中的一个词往往对应了好几帧。最后输出的长度会远小于输入的长度。CTC就是为了解决这个问题。
CTC是怎么做的呢?如果不考虑标签的话,使用RNN,每帧语音都会有一个输出,比如输入是200帧,输出有20个词。这样就会得到200个输出序列,这200个输出序列如何与标签的20词计算loss的呢?首先,在多对少的映射中,我们很容易想到应该会有很多重复的词,把这些词去掉就行了,然后因为帧长很短,有些帧的输出没有任何意义,可能只包含静音。所以CTC增加了一个blank标签,也就是每帧softmax的时候增加一个类别(增加一个输出blank的类别)。最后CTC的映射规则就出来了,200->20,去blank+去重。
语言模型的作用之一为消解多音字的问题,在声学模型给出发音序列之后,从候选的文字序列中找出概率最大的字符串序列。
目前使用kenlm(https://github.com/kpu/kenlm)训练bi-gram语言模型。bi-gram表示当前时刻的输出概率只与前一个时刻有关。即
P(X_{n} | X_{n-1},…,X_{1}) = P(X_{n} | X_{n-1}) 。
以上均为训练过程,训练完了声学模型和语言模型就到了测试的过程。也就是本节的解码过程,也可以称为推断过程。与传统的深度学习任务不同,语音识别的解码是一个很复杂的搜索过程。用公式表示为: w^{*} = argmax_{w}{(logP(w|o)} + λlogP_{LM}(w) + γlen(w))
λ是语言模型的权重,λ越大表示越依赖语言模型。正常的想法是遍历所有可能词序列找到概率最大的那个座位输出结果,但是计算量太大。所以就有了各种优化的算法。比如WFST,Beam Search等。WFST是解码(测试)时的优化方法
encoder(x1,x2,x3…) → 语义编码c → decoder(y1,y2,y3…)
语音编码c对不同的x有不同的概率分布值(影响程度)
y1 = f1(c1)
y2 = f2(c2,y1)
y3 = f3(c3,y1,y2)
每个Ci可能对应着不同的源语句子单词的注意力分配概率分布
动态规划算法,用于寻找最有可能产生观测事件序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔可夫模型中。声音信号作为观察到的事件序列,而文本字符串,被看作是隐含的产生声音信号的原因,因此可对声音信号应用维特比算法寻找最有可能的文本字符串。
知道HMM的参数 λ = (A, B, π) 和观测序列O = {o1,o2, …, oT} ,如何计算模型 λ 下观测序列O出现的概率P(O | λ)。
HMM的参数如何确定?
比如:对于刚才的中文分词的小例子。
初始概率分布π好确定:是不是终结词的概率各是0.5。
观测矩阵B也好确定:1/65535嘛
但状态转移矩阵怎么确定?我怎么知道下个词是终结词的概率是多少?
知道HMM的参数 λ = (A, B, π) 和观测序列O = {o1,o2, …, oT},如何计算给定观测序列条件概率P(I|O, λ )最大的状态序列I,即:
对于中文分词,我想到底如何分的词。
第一个问题被称为:概率计算问题。
解决办法:前向-后向算法(一种动态规划算法)。
第二个问题被称为:学习问题。
解决办法:如果状态序列已知,那用最大似然估计就好了,但HMM的状态序列未知,即含有隐变量,所以要使用Baum-welch算法(其实其本质就是EM算法)。
第三个问题被称为:预测问题/解码问题。
解决办法:Viterbi算法(一种动态规划算法)。
https://blog.csdn.net/xueyingxue001/article/details/52396494
语音有很多帧向量,向量与模型的每个状态之间建立对应关系
对齐关系 理解为观测序列Y
GMM:给定状态下,特征的概率
DNN:给定输入下,知道属于哪个特征(多类判决问题)状态的概率分布。
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语音识别的声学模型。
BN原理就是训练时候学习batch样本的均值和标准差,逐batch进行滑动更新,然后根据他们做归一化,结果乘以gamma再加上beta等于输出,gamma和beta就是BN层的待学习参数,等到推断的时候,固定住gamma和beta以及train时候得到的均值和标准差,得到计算结果即可
GMM没有利用帧的上下文信息,GMM不能学习深层非线性特征变换。
https://www.zhihu.com/question/41252833
表示2个函数或概率分布的差异性:差异越大则相对熵越大,差异越小则相对熵越小,特别地,若2者相同则熵为0。
交叉熵可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题,因为学习速率可以被输出的误差所控制。
D(p||q) = H(p,q) - H§ =
任意一个随机变量X的熵(信息量):H(X)=-累加P(x)logP(x)
知道的信息越多,不确定性 就越小,那么这些相关的信息怎么表示呢:条件熵(Conditional Entropy, CE)。
X,Y是两个随机变量,定义在Y的条件下X的条件熵为:H(X|Y)=-累加P(x,y)logP(x|y)。有H(X)>=H(X|Y)
信息的作用在于消除不确定性。找相关信息。
那么这些相关的信息对于减小不确定性有多少帮助呢,减小了多少不确定性的衡量标准为:互信息 I(X;Y)=H(X)-H(X|Y)
取值为1,完全相关;取值为0,完全无关。
交叉熵cross_entropy/相对熵/KL散度:衡量两个取值为正数的函数的相似性
KL(f(x)||g(x)) = -累加f(x)log(f(x)/g(x))
完全相同的函数,交叉熵为0;差异越大交叉熵越大
特征A对训练数据集D的信息增益g(D,A) = H(D) - H(D|A)
由于特征A而使得对数据集D的分类的不确定性减少的程度。信息增益大的特征具有更强的分类能力。
https://blog.csdn.net/jinping_shi/article/details/52433975
L1正则化和L2正则化可以看做是损失函数的惩罚项。所谓『惩罚』是指对损失函数中的某些参数做一些限制。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。
L1正则化是指权值向量w中各个元素的绝对值之和,通常表示为||w||_1
L2正则化是指权值向量w中各个元素的平方和然后再求平方根(可以看到Ridge回归的L2正则化项有平方符号),通常表示为||w||_2
L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合
Boosting 能提升弱分类器性能的原因是降低了偏差;Bagging 则是降低了方差;
偏差与方差分别是用于衡量一个模型泛化误差的两个方面;
偏差用于描述模型的拟合能力;
方差用于描述模型的稳定性。
https://blog.csdn.net/u013569304/article/details/81290281
chain model是DNN-HMM模型的一种,使用nnet3结构
https://github.com/imhuay/Algorithm_Interview_Notes-Chinese/blob/master/A-机器学习/A-机器学习基础.md#生成模型与判别模型
生成式模型(generative model)会对x和y的联合分布p(x,y)进行建模,然后通过贝叶斯公式来求得p(y|x), 最后选取使得p(y|x)最大的yi. 具体地,
判别式模型(discriminative model)则会直接对p(y|x)进行建模.
监督学习模型可分为生成模型与判别模型
http://pelhans.com/2018/01/15/deepspeech-advanced-decode-triphone/#三音子模型
将那些相似的音素归为一类(Cluster)。最常用的方法是决策树。个决策树的训练也和正常的决策树训练类似,对于每个节点,它会考虑新分支将会给训练数据的声学模型似然度带来的影响并选择似然度最大那个节点和问题。如此反复进行迭代制止到达叶子节点。
http://www.kaldi-asr.org/doc/dnn1.html
用SGD with per-utterance updates,低学习率1e-5(学习率保持不变),sigmoids激活函数,run 3-5 epochs