自然语言处理–HMM,MEMM,CRF(三)
终于到正题了,现在就来说说HMM, 隐马尔科夫模型!
Hidden Markov Models
HMM 要解决什么问题?
我们在学一个算法之前,我觉得先要了解这个算法压解决什么问题,方法都是为了问题而存在,问题理解的不深刻,要多理解算法也是很难的。
HMM要解决的问题,是在自然语言处理里成为 序列标注问题(Sequence Tagging Problems)的一类问题。序列标注问题是一大类问题,词性标注,句法分析,命名实体识别都是序列标注问题。比如说来一个词性分析:
小明喜欢小丽
输出就是:
小明/n 喜欢/v 小丽/ n
也就是说输入是一个序列,输出也是一个序列。
那么HMM是怎么看待这一问题的呢?HMM认为,此类问题是由一个隐藏的Markov 链随机生成 一个不可观测的(亦即隐藏的)状态随机序列(就是n-v-n),再由此隐藏的随机序列的各个状态生成了一个观测序列(小明喜欢小丽)。
不得不说这种思路真的是清奇,但是,仔细想想,也应该就是如此。我现在把这类问题和分类问题做下类比,分类问题,就比如说文本分类,标签有正面,负面。我们现假定上帝手里有这么一套机制,模型,这套机制、模型里,包含一些参数, 参数是什么,我们不知道,但是我们现在知道的是,这套机制运行起来,产生了如此这般的正面样本和负面样本。好了,我们假设,上帝手里拿的是朴素贝叶斯模型(逻辑回归模型,SVM模型,CART模型,人工神经网络模型,不知道大家明白了没有,我们是用猜的!是用假设!我们工作的第一步是作了一个假设,假设这些样本是有这么个模型产生的!),我们具体地,我们去估计,极大似然啊,最大后验啊,拟合模型的参数。分类模型,我们可看作为,有这些标签生成了这些样本,我们能看到的什么,样本,特征,我们看不到什么,要去求什么?标签! 序列标注也一样啊,我们把小明,小丽,这些词看作为 n 这个标签生成的,喜欢,讨厌,这些词看作为 v 这个标签生成的。这些标签是隐藏起来的,我们看不到的,正如正面,负面这些标签是隐藏起来的,我们看不到的。我觉得,不严谨的说,序列标注问题也可以说是一个分类问题,只不过作用主体换了,以前是给文档分类,图像分类,现在是给一个一个词安排标签,分个类嘛!
那还有,分类问题,标签与标签之间没有制约关系,就是说这个样本判为证明,下个样本判为正还是负,只取决于这个文档是什么,跟上个文档是什么,被判成了什么没有关系。但是序列标注这点就不一样了,比如说,名词后面跟动词概率很大,形容词后面不跟动词,对不对?这就说,当前时刻的判断,不仅和当前时刻的输入有关系,和上下文的输入以及标签都有关系了。
HMM 怎么解决问题
那么,对于这样的问题,HMM给出了什么办法呢?其实这种任务可以看看作是要建模如下的联合概率:
大家看这个熟悉不熟悉啊,这和朴素贝叶斯怎么这么像啊,朴素贝叶斯要建模什么?
这就是我为什么前面花了那么多时间,打了那么多公式就是这个原因啊!
大家可以注意上面的一句话 其实这种任务可以看看作是要建模如下的联合概率。我再说两句类似的
某某任务是要对如下概率进行建模
某某认为其实是要对如下概率进行建模
什么叫统计机器学习?这就是统计机器学习!把一个具体任务从概率角度,统计角度进行抽象!好 如下概率出来了, 建模是怎么一回事? 建模就是:
线性回归
建模就是:
逻辑回归
建模就是:
朴素贝叶斯
什么叫机器学习算法?什么是机器学习算法?这就是机器学习算法!就是对 “如下概率进行建模”! 什么线性回归算法,逻辑回归算啊,应该叫线性回归建模方法, 逻辑回归建模方法!兄弟们,理解了这一点,机器学习这就叫入门了。
好,虽然跑题,但是这题跑的很有意义。
那么HMM是怎么对“ 如下概率进行建模”的?,它是这么建模的:
也就是说,HMM这建模方式提出了两种假设(有没有感觉建模就是提假设的过程):
第一 齐次马尔科夫性假设: 即假设隐藏的马尔科夫链在任意t时刻的状态只依赖于其前一刻的状态,与其他时刻的状态及观测无关。
第二 观测独立性假设 :即假设任意时刻的观测只依赖于该时刻马尔科夫链的状态与与其他时刻的状态及观测无关。
根据定义,具体来说其实模型包含的是以下的参数。
设 Q Q 是所有可能的隐藏状态的集合, 是所有可能的观测状态的集合。
通俗点说,Q就是标签的集合,V就是字/词典
好了,不是说 假设隐藏的马尔科夫链在任意t时刻的状态只依赖于其前一刻的状态,与其他时刻的状态及观测无关吗,那此状态与彼状态之间怎么转换的呢?A是状态转移矩阵:
其中,
同样的,状态与观测之间又有什么转关系呢?
其中,
是在时刻t处于状态 qj的条件下生成 q j 的 条 件 下 生 成 v_k 的概率。当然我们我们还需要一个初始状态概率向量: 的 概 率 。 当 然 我 们 我 们 还 需 要 一 个 初 始 状 态 概 率 向 量 : π=(πi) π = ( π i ) 其中,
我最想聊的第二个和第三个问题。
学习问题
监督学习
假如说我们有大量的标注数据
{(o1,I1),(o2,I2),...,(oT,IT)}
{
(
o
1
,
I
1
)
,
(
o
2
,
I
2
)
,
.
.
.
,
(
o
T
,
I
T
)
}
,那就直接极大似然。结果直接给出来:
初始状态的估计就是看样本中初始状态为 qi q i 的概率(频率)
很熟悉是不是,想起来有标注的朴素贝叶斯也是这个玩法吧?
无监督学习
标注的成本太高了,很多时候是不现实,这个时候只能上无监督学习方法。那这个时候问题变成了什么?我们有很多的观测序列(无标注的原始文本),就是没有标注。这是什么问题?不就是EM算法要解决的问题吗?!这就是费那么大劲说EM 算法的原因啊!
第一步 E步,模型参数了 A, B,
π
π
, 猜此时的状态序列
第二步 M步,极大化Q函数,更新模型参数A, B,
π
π
(关于EM的步骤形式,我就看过三个版本,但是核心都是一样的, 无非是先猜参数求标签,有标签了更新参数,就这样直到迭代完成)
预测算法
这个问题,,关键点在于一个 维特比(Viterbi)算法。
现在,我们模型的参数也已经学到了,在预测阶段,问题变成了找到这样的一个序列
{y1,y2,...,yn}
{
y
1
,
y
2
,
.
.
.
,
y
n
}
:
最狠的办法就是把每个位置上的可能性及概率都列出来,暴力搜索 其中哪条序列概率最大,那就是它了。
显然,这个太反人类了。
维特比算法是属于动态规划里面的一个算法。根据动态规划原理,最优路径具有这样的特性:
假如最优路径经过中间某点,那么最后路径中这个中间点到最终点的路径,对于所有从这个中间点到最终点的可能路径来说,必须是最优的,不然,那说明还有一条更优的。
假如从初始点s到最终点e经过中间某个时刻i, i有k个状态。那么s到i的最优路径肯定就是s 到i时刻k个状态中最短路径的一个。
基于这两点,假定当我们从状态i进入状态i+1时,从S到状态i上各个节的最短路径已经找到,并且记录在这些节点上,那么在计算从起点S到第i+1状态的某个节点Xi+1的最短路径时,只要考虑从S到前一个状态i所有的k个节点的最短路径,以及从这个节点到Xi+1,j的距离即可
好,我说人话给你们听: 要想知道s到e的最优路径,我们需要知道s到e-1 时刻所有状态的最优路径和这些状态到e时刻所有状态的距离,这是理解维特比的关键。递推,要想知道s到e-1的最优路径,我们需要知道s到e-2 时刻所有状态的最优路径和这些状态到e时刻所有状态的距离,如此如此,懂???