Hidden Markov Models

转载:

https://www.cnblogs.com/skyme/p/4651331.html

https://www.zhihu.com/question/20962240

An Introduction to Hidden Markov Models and Bayesian Networks by ZOUBIN GHAHRAMANI

HMM(隐马尔可夫模型

Hidden Markov models fall in a subclass of Bayesian networks known as dynamic Bayesian networks, which are simply Bayesian networks for modeling time series data. Hidden Markov models fall into this class of dynamic Bayesian network. Another very well-known model in this class is the linear-Gaussian state-space model, also known as the Kalman filter, which can be thought of as the continuous-state version of HMMs

隐马尔可夫模型(Hidden Markov Model,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。

image

假设我们开始掷骰子,我们先从三个骰子里挑一个,挑到每一个骰子的概率都是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)。在我们这个例子里,D6的下一个状态是D4,D6,D8的概率都是1/3。D4,D8的下一个状态是D4,D6,D8的转换概率也都一样是1/3。这样设定是为了最开始容易说清楚,但是我们其实是可以随意设定转换概率的。比如,我们可以这样定义,D6后面不能接D4,D6后面是D6的概率是0.9,是D8的概率是0.1。这样就是一个新的HMM。

同样的,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间有一个概率叫做输出概率(emission probability)。就我们的例子来说,六面骰(D6)产生1的输出概率是1/6。产生2,3,4,5,6的概率也都是1/6。我们同样可以对输出概率进行其他定义。比如,我有一个被赌场动过手脚的六面骰子,掷出来是1的概率更大,是1/2,掷出来是2,3,4,5,6的概率是1/10。

image

image

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

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× 
      如果你只想看一个简单易懂的例子,就不需要往下看了。 
     ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× 
    说两句废话,答主认为呢,要了解一个算法,要做到以下两点:会其意,知其形。答主回答的,其实主要是第一点。但是这一点呢,恰恰是最重要,而且很多书上不会讲的。正如你在追一个姑娘,姑娘对你说“你什么都没做错!”你要是只看姑娘的表达形式呢,认为自己什么都没做错,显然就理解错了。你要理会姑娘的意思,“你赶紧给我道歉!”这样当你看到对应的表达形式呢,赶紧认错,跪地求饶就对了。数学也是一样,你要是不理解意思,光看公式,往往一头雾水。不过呢,数学的表达顶多也就是晦涩了点,姑娘的表达呢,有的时候就完全和本意相反。所以答主一直认为理解姑娘比理解数学难多了。

回到正题,和HMM模型相关的算法主要分为三类,分别解决三种问题: 
      1)知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),我想知道每次掷出来的都是哪种骰子(隐含状态链)。 
      这个问题呢,在语音识别领域呢,叫做解码问题。这个问题其实有两种解法,会给出两个不同的答案。每个答案都对,只不过这些答案的意义不一样。第一种解法求最大似然状态路径,说通俗点呢,就是我求一串骰子序列,这串骰子序列产生观测结果的概率最大。第二种解法呢,就不是求一组骰子序列了,而是求每次掷出的骰子分别是某种骰子的概率。比如说我看到结果后,我可以求得第一次掷骰子是D4的概率是0.5,D6的概率是0.3,D8的概率是0.2.第一种解法我会在下面说到,但是第二种解法我就不写在这里了,如果大家有兴趣,我们另开一个问题继续写吧。

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

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

问题阐述完了,下面就开始说解法。(0号问题在上面没有提,只是作为解决上述问题的一个辅助) 
      0.一个简单问题 
其实这个问题实用价值不高。由于对下面较难的问题有帮助,所以先在这里提一下。 
知道骰子有几种,每种骰子是什么,每次掷的都是什么骰子,根据掷骰子掷出的结果,求产生这个结果的概率。

image

解法无非就是概率相乘: 
 
 
1.看见不可见的,破解骰子序列 
      这里我说的是第一种解法,解最大似然路径问题。 
      举例来说,我知道我有三个骰子,六面骰,四面骰,八面骰。我也知道我掷了十次的结果(1 6 3 5 2 7 3 5 2 4),我不知道每次用了那种骰子,我想知道最有可能的骰子序列。

其实最简单而暴力的方法就是穷举所有可能的骰子序列,然后依照第零个问题的解法把每个序列对应的概率算出来。然后我们从里面把对应最大概率的序列挑出来就行了。如果马尔可夫链不长,当然可行。如果长的话,穷举的数量太大,就很难完成了。 
      另外一种很有名的算法叫做Viterbi algorithm. 要理解这个算法,我们先看几个简单的列子。 
      首先,如果我们只掷一次骰子:

image

看到结果为1.对应的最大概率骰子序列就是D4,因为D4产生1的概率是1/4,高于1/6和1/8. 
      把这个情况拓展,我们掷两次骰子:

image

结果为1,6.这时问题变得复杂起来,我们要计算三个值,分别是第二个骰子是D6,D4,D8的最大概率。显然,要取到最大概率,第一个骰子必须为D4。这时,第二个骰子取到D6的最大概率是 
 
 
      同样的,我们可以计算第二个骰子是D4或D8时的最大概率。我们发现,第二个骰子取到D6的概率最大。而使这个概率最大时,第一个骰子为D4。所以最大概率骰子序列就是D4 D6。 
继续拓展,我们掷三次骰子:

image

同样,我们计算第三个骰子分别是D6,D4,D8的最大概率。我们再次发现,要取到最大概率,第二个骰子必须为D6。这时,第三个骰子取到D4的最大概率是 
 
      同上,我们可以计算第三个骰子是D6或D8时的最大概率。我们发现,第三个骰子取到D4的概率最大。而使这个概率最大时,第二个骰子为D6,第一个骰子为D4。所以最大概率骰子序列就是D4 D6 D4。

写到这里,大家应该看出点规律了。既然掷骰子一二三次可以算,掷多少次都可以以此类推。我们发现,我们要求最大概率骰子序列时要做这么几件事情。首先,不管序列多长,要从序列长度为1算起,算序列长度为1时取到每个骰子的最大概率。然后,逐渐增加长度,每增加一次长度,重新算一遍在这个长度下最后一个位置取到每个骰子的最大概率。因为上一个长度下的取到每个骰子的最大概率都算过了,重新计算的话其实不难。当我们算到最后一位时,就知道最后一位是哪个骰子的概率最大了。然后,我们要把对应这个最大概率的序列从后往前推出来。 
2.谁动了我的骰子? 
      比如说你怀疑自己的六面骰被赌场动过手脚了,有可能被换成另一种六面骰,这种六面骰掷出来是1的概率更大,是1/2,掷出来是2,3,4,5,6的概率是1/10。你怎么办么?答案很简单,算一算正常的三个骰子掷出一段序列的概率,再算一算不正常的六面骰和另外两个正常骰子掷出这段序列的概率。如果前者比后者小,你就要小心了。 
      比如说掷骰子的结果是: 
image

要算用正常的三个骰子掷出这个结果的概率,其实就是将所有可能情况的概率进行加和计算。同样,简单而暴力的方法就是把穷举所有的骰子序列,还是计算每个骰子序列对应的概率,但是这回,我们不挑最大值了,而是把所有算出来的概率相加,得到的总概率就是我们要求的结果。这个方法依然不能应用于太长的骰子序列(马尔可夫链)。 
      我们会应用一个和前一个问题类似的解法,只不过前一个问题关心的是概率最大值,这个问题关心的是概率之和。解决这个问题的算法叫做前向算法(forward algorithm)。 
首先,如果我们只掷一次骰子:

image

看到结果为1.产生这个结果的总概率可以按照如下计算,总概率为0.18:

image

把这个情况拓展,我们掷两次骰子:

image

看到结果为1,6.产生这个结果的总概率可以按照如下计算,总概率为0.0175:

P1 * \frac{1}{3} * \frac{1}{6} + P1 * \frac{1}{3} * 0 + P1 * \frac{1}{3} * \frac{1}{8} = 0.0175

继续拓展,我们掷三次骰子:

image

看到结果为1,6,3.产生这个结果的总概率可以按照如下计算,总概率为0.003:

P2 * \frac{1}{3} * \frac{1}{6} + P2 * \frac{1}{3} * \frac{1}{4} + P2 * \frac{1}{3} * \frac{1}{8} = 0.003

多长算多长,再长的马尔可夫链总能算出来的。用同样的方法,也可以算出不正常的六面骰和另外两个正常骰子掷出这段序列的概率,然后我们比较一下这两个概率大小,就能知道你的骰子是不是被人换了。

 

Viterbi algorithm

HMM(隐马尔可夫模型)是用来描述隐含未知参数的统计模型,举一个经典的例子:一个东京的朋友每天根据天气{下雨,天晴}决定当天的活动{公园散步,购物,清理房间}中的一种,我每天只能在twitter上看到她发的推“啊,我前天公园散步、昨天购物、今天清理房间了!”,那么我可以根据她发的推特推断东京这三天的天气。在这个例子里,显状态是活动,隐状态是天气。

任何一个HMM都可以通过下列五元组来描述:

:param obs:观测序列
:param states:隐状态
:param start_p:初始概率(隐状态)
:param trans_p:转移概率(隐状态)
:param emit_p: 发射概率 (隐状态表现为显状态的概率)

6cbb8645gw1egs40a3bpmj208n09574o

伪码如下:

states = ('Rainy', 'Sunny')
 
observations = ('walk', 'shop', 'clean')
 
start_probability = {'Rainy': 0.6, 'Sunny': 0.4}
 
transition_probability = {
    'Rainy' : {'Rainy': 0.7, 'Sunny': 0.3},
    'Sunny' : {'Rainy': 0.4, 'Sunny': 0.6},
    }
 
emission_probability = {
    'Rainy' : {'walk': 0.1, 'shop': 0.4, 'clean': 0.5},
    'Sunny' : {'walk': 0.6, 'shop': 0.3, 'clean': 0.1},
}
 

求解最可能的天气

求解最可能的隐状态序列是HMM的三个典型问题之一,通常用维特比算法解决。维特比算法就是求解HMM上的最短路径(-log(prob),也即是最大概率)的算法。

稍微用中文讲讲思路,很明显,第一天天晴还是下雨可以算出来:

  1. 定义V[时间][今天天气] = 概率,注意今天天气指的是,前几天的天气都确定下来了(概率最大)今天天气是X的概率,这里的概率就是一个累乘的概率了。

  2.     因为第一天我的朋友去散步了,所以第一天下雨的概率V[第一天][下雨] = 初始概率[下雨] * 发射概率[下雨][散步] = 0.6 * 0.1 = 0.06,同理可得V[第一天][天晴] = 0.24 。从直觉上来看,因为第一天朋友出门了,她一般喜欢在天晴的时候散步,所以第一天天晴的概率比较大,数字与直觉统一了。

  3. 从第二天开始,对于每种天气Y,都有前一天天气是X的概率 * X转移到Y的概率 * Y天气下朋友进行这天这种活动的概率。因为前一天天气X有两种可能,所以Y的概率有两个,选取其中较大一个作为V[第二天][天气Y]的概率,同时将今天的天气加入到结果序列中

  4. 比较V[最后一天][下雨]和[最后一天][天晴]的概率,找出较大的哪一个对应的序列,就是最终结果。

算法的代码可以在github上看到,地址为:

https://github.com/hankcs/Viterbi

运行完成后根据Viterbi得到结果:

Sunny Rainy Rainy

Viterbi被广泛应用到分词,词性标注等应用场景。

 

 

转一个知乎例子

作者:神秘的什锦饭
链接:https://www.zhihu.com/question/20962240/answer/48444087
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
 

楼上的大神都说得很好了,我来补充一个有意思HMM的用法,是用来给定钢琴谱,自动决定指法的用法。

这个HMM的应用是来自于東京大学(東大真是所神奇的学校)的一个研究组在IJCAI 2007年的一篇文章,日文版的标题是《隠れマルコフモデルに基づくピアノ運指の自動決定》,英文版的标题是《Automatic Determination of Piano Fingering based on Hidden Markov Model》,论文的网页在这里:Sagayama & Ono Lab。从网页可以知道,这篇文中的工作其实至少从2005年就开始了。

愚以为在我目前能做到的范围内最好的学习一篇论文并让其对自己有用的方法就是重现之,所以此答案也按照现在回看当时重现过程的过程的顺序写。对于这个问题,我觉得比较重要的一点是“如何将HMM模型套用到这个问题上”,什么是HMM中的“因”,什么是HMM中的“果”,这个HMM在解决与琴键指法有关的问题是如何对应到HMM的三大任务=Scoring, Matching, Training的。然后你就很容易知道问题的输入是什么、输出是什么,然后将其转化为一个用程序员思维能解决的问题。

所以就开始俺们的钢琴运指自动决定之旅吧:

为了先有一个印象并明确问题的背景和定义,先看开门见山的介绍图:


这个图的意思是说,“你有一个HMM模型,往里面丢入琴谱,它就能给你输出指法。”
这图,首先大致说明了这个HMM里面有哪些变量
・HMM中的“Hidden State(隐藏状态)”的是右手的五个手指编号(1=大拇指,2=食指,3=中指,4=无名指,5=小指)。
・HMM的“Emission(可见输出状态链)”是“所弹奏出来的音符”。
在这篇论文的问题描述中,“弹奏的音符”是知道的,“所用的指法”是不知道的。因为不知道,所以就需要用算法去算出来。所以这里和事实上的过程其实是反过来的:在此论文中,“指法”是原因,“音符”是结果,“事情发生”就是“指法导致了弹奏出这些音符”;这个过程在英文版论文中称为“fingering-to-performance conversion”,与事情看起来发生的顺序是相反的(一个人是看到琴谱,然后才有指法的,这种现实中的发生顺序来说的过程在英文版论文中称为“score-to-fingering conversion”)。此论文中的概率用贝叶斯术语的名字来说就是:
  ・P(指法)是先验概率(Prior Probability/事前確率=じぜんかくりつ)、
  ・P(音符|指法)是似然度(Likelihood/尤度関数=ゆうどかんすう)、
  ・P(音符,指法)是联合概率(Joint Probability/結合確率=けつごうかくりつ)、
  ・P(音符)是边缘概率(Marginal Probability/周辺確率=しゅうへんかくりつ)、
  ・P(指法|音符)是后验概率(Posterior Probability/事後確率=じごかくりつ)。【通过改变指法来最大化这个概率的过程,就是MAP,即Maximum A-Posteriori过程,即是Viterbi Search法做的事情。】

 

然后,它说明了这个HMM的性质
・这个HMM是一个“Mealy Machine”,因为它是在转换的过程中输出的,而不是当处于某个状态时输出的(在某个状态输出,就应是Moore Machine)。“Mealy Machine”的输出概率函数是关于边的起始结点和终止结点的函数。所以,图右方的“High probability emission”意思是,“当我先用右手无名指弹奏了#F之后,再用右手小指弹奏#F右边的G的概率比较高”;图右下角的“Low probability emission”的意思是,“当我先用右手的无名指弹奏了G之后,再用右手小指弹奏G左边的#F的概率比较低”。
・也就是说,输出某个音符的概率可以写成P(y_i | (y_{i-1}, f_i, f_{i-1})),用语言解释就是“在我现在用第_{f_{i-1}}个手指弹奏_{y_{i-1}}这个音时,我接下来要用第_{f_{i}}个手指奏_{y_{i}}这个音的概率”。[1]
・至于状态转换概率则是不分Moore Machine和Mealy Machine的,都是P(f_i | f_{i-1}),也就是当前用了某个手指之后,会转而使用下一个手指的概率。这个概率表可以用来对某些现象进行建模,譬如说:“中指和无名指连续交替按键很不灵活”,就可以通过使得赋给P(f_3|f_4)P(f_4|f_3)更低的值来达成。

有了这些定义,我们就能知道如何完成HMM中的三个任务
  ・Scoring:给定一个指法,通过打分看它好弹还是不好弹。输入是指法,输出是分数。
  ・Matching:给定一个琴谱,给出最好的指法。输入是琴谱,输出是指法。
  ・Training:给定琴谱和指法组成的测试用例,通过改变HMM中的参数,来使得这个HMM能“学习”到测试用例中潜藏的规则。

首先是Scoring,就是这个HMM是如何计算某个指法安排出现的概率的,以上面的图为例:
・图中的红箭头经过的结点表示状态转换,也就是“5、2、3、1、4、2、1”。在处于某个状态时,所进行的状态转换只依赖于当前的状态是什么。
・红箭头经过的边表示所输出的可见状态,也就是右上角的音符:E5, B4, C5, A4, B4, #G4, E。
・除了第一个音符以外,其它的音符都是按照上面的输出概率公式计算的。比如说用此指法弹奏第二个B4的条件概率就是P(B4 | (E5, 2nd, 5th) )
这就是“给定一个指法和所弹奏的音符,计算出它被弹奏出来的概率是多少”的过程。如果只给定音符,再罗列出所有可能的指法,就能从中计算出概率最大的指法。但是直接罗列速度会慢,所以可以用Viterbi Search来更快地计算出来。

那么就来到了第二点,Matching,就是给定一个谱子后,如何知道在当前的HMM中,最好的指法是什么?这是计算最大后验概率 P(指法|音符) 的问题。如前所述这其实是一个通过动态规划来达到比枚举高效很多的编程问题,其基本的样子是从给定的谱子的第一个音符开始,一直往后走,在每一步都保存“弹到当前的音符时最好的指法是什么”的信息供下一步使用,省掉计算时间的。此算法称为Viterbi Search(Viterbi algorithm),它所搜索的空间可称为Trellis Graph (Trellis (graph))。因为维基百科上的Viterbi算法的Python代码是可以直接拷贝下来运行的,为了有所不同,以下就以图中的片段来举个例子,运行一遍论文中所述的演算法(这里强制第一个音符必须用5指,所以开始概率是设成了{0.01, 0.01, 0.01, 0.01, 1.00}):

图中t表示输出状态链的“时间”,也就是音符的下标,从0开始。
当t=0的时候弹奏的概率就是开始概率。t>0时弹奏的概率就涉及输出概率与转换概率。
以下和论文中一样,只考虑只用右手、只有单音(没有和弦)的情况。

t=[0, 1]时的概率,就表示弹奏前两个音符所用的各种指法的概率。图中的网状图就是一个Trellis graph,每条边对应一次HMM状态转换同时也对应着(在t>0时的)弹出一个音符的动作;每个结点对应着一个手指,也就是能够用以弹奏某个音的某个手指。每条有颜色的路径就表示某个片段中的指法安排。Viterbi算法是一种动态规划,所以它在每一步时都需要把“对于每个手指,从开始到这一步时,这一步必用这个手指的最高的概率和对应的指法”存在动态规划表里,以供下一步的计算使用。
从这个图所反映的动态规划表中可以看出,用右手小拇指弹第一个音E5,然后再用右手食指弹第二个音B4的概率是所有25种可能中概率最高的,其概率高达10^(-2.31009)。这个概率并没有什么实际意义,只在对所有指法间进行比较有意义。相比起来,用右手大拇指弹奏第一个音E5再用右手小拇指弹奏第二个音B4的概率就低多了,只有10^(-13.0603),这是个穿指的动作,而穿指从大拇指穿到小拇指也比从食指、中指和无名指穿到小指要简单,所以指向t=1时的5的箭头是从1指向5的。这是Viterbi算法在构建动态规划表中的规则。
这个表的内容会用到t=[0,1,2]的情况,如下:

指的就是此图在t=[0,1]中的箭头都是在上一张中出现过的箭头的意思。

 

再继续一步:


将这个过程重复到最后,就得到了这一段谱子的指法:

在这张动态规划表中,概率最大的是[5231421]这个指法,也就是图中所示的。
以上就是这篇论文中所描述的“用HMM来计算给定的一段乐谱的最佳指法”的方法。

 

最后,就是Training阶段——如何通过训练HMM参数的方法来“学到”测试用例呢?
在实现此论文的过程中我对于具体计算输出概率的方法是用了一些猜测的,所以与原文可能有所不符,所以将论文中所出现的7个乐谱片段输入后,有3、4个音符的指法与文中提及的结果不同。所以我想通过调整参数的方法让我的HMM的输出结果能与论文中相符。
说是Bonus阶段是,因为论文中没有明示这一阶段是如何做的,但是有提及根据常理是可以把这个训练过程做成的。
这回用于训练用的是随机梯度下降法(Stochastic gradient descent),这种方法可以用于参数都是连续变量、目标函数也是连续变量的模型。其最基本的更新规则是 w = w - \alpha \nabla p(w) ,其中w是参数,alpha是学习速率,p是Viterbi算法算出的最佳指法与训练用例指法的分数之,当梯度下降完成时,训练用例中的指法就会变成所有指法中最优的并被Viterbi找到,也就是p会等于0 。
训练过程中给HMM模型不停地出示正确的指法就像是不停背诵英语单词强化记忆一样。以下示出用论文中出现的7个片段用作训练的样子。训练中能修正的HMM参数有以下这些:
  ・转换概率(25个)
  ・五个手指与黑/白键的接触点的Y轴坐标(10个)
一共是35个可以调整的参数。

在训练前,我们猜测出来的参数做成的HMM输出的指法能够符合这7个训练用例中的5个(以下为论文中的谱子的截图,黑色的圈是在论文中用作指法合理性的讨论的,和此回需要进行的重现算法的任务没有关系):


可以看到图中有两处红字是我们当前的HMM输出的指法与训练用例的指法不同之处。现在将这七个片段放入Stochastic Descent过程中,随着其进行,可以将参数的变化和目标函数的变化画在下图中:

三栏中,最上栏是分数之差,也就是对每个训练用例,给定的训练指法与当前最好的指法的分数之差,为0表示给定的训练指法就是最佳指法。中间栏是转换概率。最下栏是10个接触点的Y轴坐标。
可以看到分数之差随着训练的进行总体上的趋势是在接近0。当训练完成后,这个HMM就能复制出图中所示的7个片段中的指法啦! \^O^/

 

如果再展开还有许多问题:对于Stochastic Descent还可以通过自动调整学习速率的方法来加快计算;训练过程不一定是Consistent的,意即总会到某个时候不可能完全复制出训练用例中的指法;和弦和双手两个声部的处理,但是这些就是不同于此问题的另一问题了,而且我也不是非常理解,所以就不在这里写啦。


[1]:在重现这篇论文的结果时我们认为尽管原论文并没有说,但是y_{i-1}还是有必要出现在竖线的右边的。按我们的理解,原文并非是完全没有说,而是隐含地用了y_{i-1}来得到计算输出概率时高斯分布的中心点的位置。

编辑于 2015-05-20

 

 

隐性状态的表现分布概率也可以用矩阵表示出来,



作者:知乎用户
链接:https://www.zhihu.com/question/20962240/answer/33561657
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值