基于概率的和弦识别方法——隐马尔可夫模型

什么是HMM

假设我手里有三个不同的骰子。第一个骰子是我们平常见的骰子(称这个骰子为D6),6个面,每个面(1,2,3,4,5,6)出现的概率是1/6。第二个骰子是个四面体(称这个骰子为D4),每个面(1,2,3,4)出现的概率是1/4。第三个骰子有八个面(称这个骰子为D8),每个面(1,2,3,4,5,6,7,8)出现的概率是1/8。

基于概率的和弦识别方法——隐马尔可夫模型_第1张图片

假设我们开始掷骰子,我们先从三个骰子里挑一个,挑到每一个骰子的概率都是1/3。然后我们掷骰子,得到一个数字,1,2,3,4,5,6,7,8中的一个。不停的重复上述过程,我们会得到一串数字,每个数字都是1,2,3,4,5,6,7,8中的一个。例如我们可能得到这么一串数字(掷骰子10次):1 6 3 5 2 7 3 5 2 4这串数字叫做 可见状态链。但是在隐马尔可夫模型中,我们不仅仅有这么一串可见状态链,还有一串 隐含状态链。在这个例子里,这串隐含状态链就是你用的骰子的序列。比如,隐含状态链有可能是:D6 D8 D8 D6 D4 D8 D6 D6 D4 D8。

一般来说,HMM中说到的隐马尔可夫链其实是指隐含状态链。隐含状态(骰子)之间存在转换概率(transition probability),可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(emission probability)。就我们的例子来说,六面骰(D6)产生1的输出概率是1/6。产生2,3,4,5,6的概率也都是1/6。

基于概率的和弦识别方法——隐马尔可夫模型_第2张图片
隐马尔可夫模型状态图

其实对于我们上述的HMM来说,如果提前知道所有隐含状态之间的转换概率和所有隐含状态到所有可见状态之间的输出概率,做模拟是相当容易的。但是应用HMM模型时候呢,往往是缺失了一部分信息的,有时候你知道骰子有几种,每种骰子是什么,但是不知道掷出来的骰子序列;有时候你只是看到了很多次掷骰子的结果,剩下的什么都不知道。如果应用算法去估计这些缺失的信息,就成了一个很重要的问题。这些算法我会在下面详细讲。

和HMM模型相关的算法主要分为三类,分别解决三种问题:
1)知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道每次掷出来的都是哪种骰子(隐含状态链)。
这个问题呢,在语音识别领域呢,叫做解码问题。这个问题其实有两种解法,会给出两个不同的答案。每个答案都对,只不过这些答案的意义不一样。这里只给出第一种解法。这种解法叫做求最大似然状态路径,说通俗点呢,就是我求一串骰子序列,这串骰子序列产生观测结果的概率最大。

2)还是知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道掷出这个结果的概率。
看似这个问题意义不大,因为你掷出来的结果很多时候都对应了一个比较大的概率。问这个问题的目的呢,其实是检测观察到的结果和已知的模型是否吻合。如果很多次结果都对应了比较小的概率,那么就说明我们已知的模型很有可能是错的,有人偷偷把我们的骰子給换了。

3)知道骰子有几种(隐含状态数量),不知道每种骰子是什么(转换概率),观测到很多次掷骰子的结果(可见状态链),我想调节每种骰子是什么(转换概率)来让出现这种结果的概率最大。
这个问题很重要,因为这是最常见的情况。很多时候我们只有可见结果,不知道HMM模型里的参数,我们需要从可见结果得到出这些参数,使这个模型是一个最优的模型,这是建模的一个必要步骤。

正式定义

好了直观的理解完成了,我们来给出音隐马尔可夫模型的基本定义
我们将上述直观的理解抽象表达一下:

  • 基本元素
    隐马尔可夫模型可以用5个基本元素来描述,包括两个状态集和三个状态矩阵
    1)隐含状态S
    例如S = [S1, S2, S3]
    2)可观测状态集O
    例如O = [O1, O2, O3, O4, O5]
    (注意:隐含状态集S不一定需要和可观测状态集O的数目一致)
    3)初始状态概率矩阵π
    表示隐含状态S在初始状态时的概率矩阵,例如π = [P(S1), P(S2), P(S3)] = [P1, P2, P3]
    4)隐含状态转移概率矩阵A
    表示各个隐含状态之间的状态转移概率,aij表达t时刻为Si的状态,在t+1时刻变换为Sj的概率。
    基于概率的和弦识别方法——隐马尔可夫模型_第3张图片
    隐含状态转移矩阵

    5)观测状态转移概率矩阵B
    基于概率的和弦识别方法——隐马尔可夫模型_第4张图片
    观测状态转移矩阵

    令N表示隐含状态数目,M表示可观测状态数目,则

Bij = P(Oi | Sj),1<=i<=N, 1<=j<=M

表示着在t时刻,隐含状态为Sj的情况下,可观察状态为Oi的概率,也就是我们上述的输出概率。

总结:一般来说,我们可以使用一个三元组来表示隐马尔可夫模型

λ = (π, A, B)

一旦确定了这个隐马尔可夫模型,我们就可以使用它来解决各种各样的问题了。根据上述说法,我们知道隐马尔可夫模型可以解决的问题有三类,前两类实际上是一个模式识别问题:解码和评估,后一类是模型学习问题。

相关算法

  • viterbi算法
  • 前向算法
  • EM

如何使用隐马尔可夫模型进行和弦识别

《Chord Segmentation and Recognition using EM-Trained Hidden Markov Models》这篇论文中,使用每个和弦对应一个隐藏状态(隐藏状态数量已知),每一帧的PCP谱图作为可见状态(可见状态链),我们采用EM算法训练模型。在得到HMM之后之后,我们就可以采用viterbi方法求出概率最大的隐藏序列(最大似然路径),并对齐到每个时间帧上。最后,阐述一种基于旋转PCP的加权平均算法来处理原始的PCP,这种方法计算所有音级的加权平均值(通过标注和弦出现的频率进行加权),然后将加权平均PCP向量解旋回到它们的原始位置,并为每个和弦构建新的,正则化的模型的位置。


基于概率的和弦识别方法——隐马尔可夫模型_第5张图片
image.png

之后《A System for Acoustic Chord Transcription and Key Extrac- tion from Audio Using Hidden Markov Models Trained on Synthe- sized Audio》和《Acoustic Chord Transcription and Key Extraction from Audio Using Key-Dependent HMMs Trained on Synthesized Audio》这两篇论文根据和弦的基音区分方法,定义 24 个基音,为每个基音建立一个 HMM,构造 Key-Dependent HMM 模型. 对于输入的音乐信号,系统利用 Viterbi 解码在 24 个模型中选择一个最大可能的基调模型,从而确定输入音乐的基调,并从对应于这个基调模型的最优状态路径来得到和弦序列.


搬运:https://www.zhihu.com/question/20962240/answer/33438846

你可能感兴趣的:(基于概率的和弦识别方法——隐马尔可夫模型)