本次修炼方法请往下查看
🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 免费获取相关内容文档关注:微信公众号,发送 pandas 即可获取
🎇 相关内容视频讲解 B站
🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验。
🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100% 。
📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。
🌵文章目录🌵
- 🎯 1. 基本介绍
- 💡 2. 原理介绍
- 2.1 标注模型发展状况
- 2.2 HMM算法知识点总结
- 两个假设问题
- 预测问题
- viterbi算法理解
- 模型建模理解
- 2.3 memm算法介绍
- 2.4 CRF算法原理
- 🔍 3. 代码实践
- 3.1 HHM实践
- 3.1 CRF实践
- 🔍 4. 注意事项
- 🔍 5. 总结
下滑查看解决方法
加粗样式
🎯 1. 基本介绍
判别式模型举例:要确定一个羊是山羊还是绵羊,用判别模型的方法是从历史数据中学习到模型,然后通过提取这只羊的特征来预测出这只羊是山羊的概率,是绵羊的概率。生成式模型举例:利用生成模型是根据山羊的特征首先学习出一个山羊的模型,然后根据绵羊的特征学习出一个绵羊的模型,然后从这只羊中提取特征,放到山羊模型中看概率是多少,在放到绵羊模型中看概率是多少,哪个大就是哪个。
假设你现在有一个分类问题,x是特征,y是类标记。用生成模型学习一个联合概率分布P(x,y),而用判别模型学习一个条件概率分布P(y|x)
💡 2. 原理介绍
2.1 标注模型发展状况
从朴素贝叶斯去理解hmm模型, 对于朴素贝叶斯之所以叫“朴素”,是因为这里做了一个比较强的假设,即 x i ⊥ x j ∣ y ( i ≠ j ) x_i⊥x_j|y(i≠j) xi⊥xj∣y(i=j),就是在给定y的情况下, x i x_i xi与 x j x_j xj是相互独立的,因此可以简写NB假设为: P ( X ∣ y = 1 / 0 ) = ∏ P ( x i ∣ y = 1 / 0 ) P(X|y=1/0)=∏P(x_i|y=1/0) P(X∣y=1/0)=∏P(xi∣y=1/0), 而hmm模型可以理解为贝叶斯模型y为0/1的扩展到seq(序列)的过程,因此这里hmm也有两个假设条件:齐次Markov假设;观测独立假设;, 其中x为观测变量,y为隐变量;同时二者还有个区别就是贝叶斯是判别模型,而hmm为生成模型;
hmm与memm的对比,由于hmm模型的两个假设再现实生活中不符合,对于一个x2标注的词性y2并不单单与x2有关,也与上下文x1、x3有关,因此假设更加合理,同时相对于hmm计算联合分布,memm借鉴lr的思想,将其转化为判别模型来进行建模在复杂度上会小很多;同时在HMM中,观测变量是隐变量的输出;在MEMM中,观测变量变成输入了;
memm与crf的对比,crf相对比memm算法的主要改进就是针对其标准偏差问题 进行改进,为了打破MEMM的标注偏差问题,将MEMM中的有向变成了无向,解决了局部归一化问题,变成了全局归一化。
2.2 HMM算法知识点总结
- hmm模型早期常用于分词和词性标注问题,主要包括2个假设和2个问题;
两个假设问题
- 齐次1阶马尔科夫: 这个的意思就是y3只和y2有关,y2只和y1有关,同时在马尔科夫链{y1,y2,…,yn}中,马氏链中的任意yt转移到yt+1所服从的概率分布是相同的;
- 观测独立假设: 在给定 y t y_t yt的情况下, x t x_t xt与其他的 x k ( k ≠ t ) x_k(k≠t) xk(k=t)全都无关。
- 具体的数学表达式为:
p ( x t ∣ y 1 : t , x 1 : t ) = p ( x t ∣ y t ) p(x_t|y_{1:t},x_{1:t})=p(x_t|y_t) p(xt∣y1:t,x1:t)=p(xt∣yt)
预测问题
- hmm算法是生成模型算法,他最终需要解决的问题就是,给定一个观测序列,怎么求解状态序列的过程;它主要由三部分组成,第一步,先随机初始化参数 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π),然后求得此刻观测序列的概率P(O|λ),第二步,不断的通过em算法迭代参数,得到序列O出现的概率最大的参数,第三步,通过得到的最优参数和观测序列O得到最优的状态序列I。
- 观察序列概率预测问题: 即给定模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π)和观测序列 O = o 1 , o 2 , . . . o T O={o_1,o_2,...o_T} O=o1,o2,...oT,计算在模型λ下观测序列O出现的概率P(O|λ)。这个问题的求解需要用到前向后向算法,我们在这个系列的第二篇会详细讲解。这个问题是HMM模型三个问题中最简单的。
- 模型参数学习问题: 即给定观测序列 O = o 1 , o 2 , . . . o T O={o_1,o_2,...o_T} O=o1,o2,...oT,估计模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π)的参数,使该模型下观测序列的条件概率P(O|λ)最大。这个问题的求解需要用到基于EM算法的鲍姆-韦尔奇算法, 我们在这个系列的第三篇会详细讲解。这个问题是HMM模型三个问题中最复杂的。
- 预测问题: 也称为解码问题。即给定模型 λ = ( A , B , π ) \lambda=(A,B,\pi) λ=(A,B,π)和观测序列 O = o 1 , o 2 , . . . o T O={o_1,o_2,...o_T} O=o1,o2,...oT,求给定观测序列条件下,最可能出现的对应的状态序列,这个问题的求解需要用到基于动态规划的维特比算法,我们在这个系列的第四篇会详细讲解。这个问题是HMM模型三个问题中复杂度居中的算法。
- HMM常用于分词处理,jieba分词的内部原理就是使用的HMM算法来进行处理的,其本的原理如下,给定训练样本,比如每个词对应的标注:{B,E,M,S},起始,结尾,中间,单个的label,然后给定一个query(观测序列),求此刻的状态序列I每个词的label的概率。
viterbi算法理解
-
viterbi算法解决的是篱笆型的图的最短路径问题,图的节点按列组织,每列的节点数量可以不一样,每一列的节点只能和相邻列的节点相连,不能跨列相连,节点之间有着不同的距离,具体如下图所示:
-
对于上图,寻找一条最短的路径,我们从s节点出发,可以有三条路径,然后对于b列,对于每一个节点:b1,b2,b3找到最短的一条路径,同样的原理对于c列也是挑选从b节点到c节点最短的一列出来,最后再到e节点,然后在从所有的路径中选择出最短的路径出来;
模型建模理解
- 如下图所示为hmm的算法的框架图,对于图中的虚线圈内即为每个时间t所需要建模的状态,因此对于生成模型,具体表达式为
p ( x , y ∣ λ ) = ∏ t = 1 T p ( x t , y t ∣ λ ) p(x,y|\lambda)= \prod_{t=1}^{T}p(x_t,y_t|\lambda) p(x,y∣λ)=t=1∏Tp(xt,yt∣λ)
p ( x , y ∣ λ ) = ∏ t = 1 T p ( x t ∣ y t , λ ) p ( y t ∣ y t − 1 , λ ) p(x,y|\lambda)= \prod_{t=1}^{T}p(x_t|y_t,\lambda)p(y_t|y_{t-1},\lambda) p(x,y∣λ)=t=1∏Tp(xt∣yt,λ)p(yt∣yt−1,λ)
_url=image-11.png&pos_id=img-okOEsns5-1722233419045) - 举个简单的例子,假设我们要通过观察MaxMa的心情来推测今天的天气。也就是说,上面的天气变化(晴天变为阴天)是随机变化,MaxMa的心情(由天气导致的心情变化)也是随机变化,整个的过程就是所谓的双重随机过程。上面的过程有两个特点:输出(MaxMa的心情)依然只和当前的状态(今天的天气)有关想要计算观察的序列(知道MaxMa连续好多天的心情,推算出最可能的连续几天的天气情况),只需要依照最大似然概率计算即可
- 用 O i O_i Oi表示观察值(MaxMa的心情),用 S i S_i Si表示中间隐状态(天气状况),概率计算公式为:
p ( o 1 , o 2 , . . . . , o t ) = p ( o 1 ∣ s 1 ) p ( o 2 ∣ s 2 ) . . . . p ( o t ∣ s t ) p(o_1,o_2,....,o_t)=p(o_1|s_1)p(o_2|s_2)....p(o_t|s_t) p(o1,o2,....,ot)=p(o1∣s1)p(o2∣s2)....p(ot∣st) - 如果计算出隐变量的转移矩阵和当前的状态矩阵就可以得出相关联合概率分布
2.3 memm算法介绍
-
对于hmm算法来说,状态之间相互独立在现实生活中,一个句子,上下文附加了很多的有用信息,因此,这种假设不是很符合现实,同时通过求联合分布在计算量上有较大的缺点,故,提出打破状态之间相互独立的假设同时借鉴最大熵模型的求解方法,因此,具体的表达式如下所示:
p ( y ∣ x , λ ) = ∏ t = 1 T p ( y t ∣ y t − 1 , x 1 : t , λ ) p(y|x,\lambda)= \prod_{t=1}^{T}p(y_t|y_{t-1},x_{1:t},\lambda) p(y∣x,λ)=t=1∏Tp(yt∣yt−1,x1:t,λ) -
虽然改算法相对于hmm算法来说更加的适用实际情况,但是同样存在一个标注偏差问题,具体如下图所示:
-
由于每次进行状态转移的时候,状态之和为1,英雌,当从e节点到o节点是,此时的转移概率就是1,而且当到达e节点的时候,下一个节点的转移一定是o,不会受到观测变量的影响,因此,不符合实际情况
2.4 CRF算法原理
-
随机场(RF)
“随机场”的名字取的很玄乎,其实理解起来不难。随机场是由若干个位置组成的整体,当给每一个位置中按照某种分布(或者是某种概率)随机赋予一个值之后,其全体就叫做随机场。 -
以词性标注为例:
假如我们有10个词形成的句子需要做词性标注。这10个词每个词的词性可以在我们已知的词性集合(名词,动词…)中去选择。当我们为每个词选择完词性后,这就形成了一个随机场。 -
马尔科夫随机场(MRF)
马尔科夫随机场是随机场的特例,它假设随机场中某一个位置的赋值仅仅与和它相邻的位置的赋值有关,和与其不相邻的位置的赋值无关。
换一种表示方式,把马尔科夫随机场映射到无向图中。此无向图中的节点都与某个随机变量相关,连接着节点的边代表与这两个节点有关的随机变量之间的关系。 -
CRF是马尔科夫随机场的特例,它假设马尔科夫随机场中只有𝑋和𝑌两种变量,𝑋一般是给定的,而𝑌一般是在给定𝑋的条件下我们的输出。这样马尔科夫随机场就特化成了条件随机场。
-
在我们10个词的句子词性标注的例子中,𝑋是词,𝑌是词性。因此,如果我们假设它是一个马尔科夫随机场,那么它也就是一个CRF。
-
对于CRF,我们给出准确的数学语言描述:设X与Y是随机变量,P(Y|X)是给定X时Y的条件概率分布,若随机变量Y构成的是一个马尔科夫随机场,则称条件概率分布P(Y|X)是条件随机场。
-
对于上述的crf公式来说,前面一项是节点特征函数,后面一项为局部特征函数,用来提取节点上下文的信息,其中T为各个序列的节点和局部特征求和个数,K为各个局部特征和节点特征之和,因此,从另一个角度来讲,crf也是一种融合模型;
-
对于crf的参数求和就和lr的方法基本类似,通过极大似然估计算法来对其进行参数求解,而对于给定观测变量x,求满足p(y|x)的最大序列y
🔍 3. 代码实践
3.1 HHM实践
我们构造数据对其进行实践,具体的代码流程如下所示:
from sklearn_hmm import hmm# 创建HMM实例
model = hmm.GaussianHMM(n_components=3, covariance_type="full")# 训练模型
model.fit([[1, 2, 3], [1, 2, 3], [4, 5, 6]])# 预测观测序列的最可能状态序列
hidden_states = model.predict([[1, 2, 3], [4, 5, 6], [7, 8, 9]])print(f"Hidden states: {hidden_states}")
3.1 CRF实践
具体的代码流程如下所示:
from sklearn_crfsuite import CRF# 创建CRF实例
crf = CRF(algorithm='lbfgs', max_iterations=100, all_possible_transitions=True)# 训练模型
X_train = [(['word1', 'word2', 'word3'], ['tag1', 'tag2', 'tag3']) for _ in range(10)]
y_train = [([1, 2, 3] for _ in range(10))]
crf.fit(X_train, y_train)# 预测标签序列
X_test = [(['hello', 'world'], ['O', 'O'])]
y_pred = crf.predict(X_test)print(f"Predicted tags: {y_pred}")
🔍 4. 注意事项
- HMM和CRF都是序列标注任务中常用的模型,但它们的应用场景和性能可能有所不同。
- HMM更适合处理具有明显状态转移特性的序列数据,而CRF可以处理更复杂的标注任务。
- 在使用CRF时,特征工程是关键,需要根据任务设计合适的特征函数。
🔍 5. 总结
HMM和CRF是两种强大的序列标注模型,它们在自然语言处理和其他领域中有着广泛的应用。通过本博客的代码示例,我们学习了如何在Python中使用这些模型进行训练、预测和评估。希望这篇博客能够帮助你更好地理解HMM和CRF,并将其应用于实际的序列标注任务中。