zoukankan      html  css  js  c++  java
  • 常见算法面试之样本不均衡的解决办法、交叉熵以及HMM、MEMM vs CRF

    ---恢复内容开始---

    1、样本类别不均衡的解决办法

    • 把数据进行采用的过程中通过相似性同时生成并插样“少数类别数据”,叫做SMOTE算法
    • 对数据先进行聚类,再将大的簇进行随机欠采样或者小的簇进行数据生成
    • 把监督学习变成无监督学习,舍弃掉标签把问题转化为一个无监督问题,如异常检测
    • 先对多数类别进行随机的欠采样,并结合boosting算法进行集成学习

    1.1、简单通用的算法有哪些

    • 对较多的那个类别进行欠采样(under-sampling),舍弃一部分数据,使其与较少类别的数据相当
    • 对较少的类别进行过采样(over-sampling),重复使用一部分数据,使其与较多类别的数据相当
    • 阈值调整(threshold moving),将原本默认为0.5的阈值调整到  较少类别 / (较少类别+较多类别) 即可

    很明显可以看出,第一种和第二种方法都会明显的改变数据分布,我们的训练数据不再是真实数据的无偏表述。第一种方法中,我们浪费了很多数据,第二种方法中无中生有或者重复使用了数据,会导致过拟合的发生。

    因此欠采样的逻辑中往往会结合集成学习来有效地使用数据,假设正例数据n,而反例数据m个。我们可以通过欠采样,随机无重复的生成(k=n/m)个反例子集,并将每个子集都与相同正例数据合并生成k个新的训练样本。我们在k个训练样本上分别训练一个分类器,最终将k个分类器的结果结合起来,比如求平均值。这就是Easy Ensemble。

    但其实不难看出,这样的过程是需要花时间处理数据和编程的,对于很多知识和能力有限的人来说难度比较大。特此推荐两个简单有效且效果中上的做法:

    • 简单的调整阈值,不对数据进行任何处理。此处特指将分类阈值从0.5调整到正例比例
    • 使用现有的集成学习分类器,如随机森林或者xgboost,并调整分类阈值

    提出这样建议的原因有很多。首先,简单的阈值调整从经验上来看往往比过采样和欠采样有效。其次,如果对统计学知识掌握有限,而且编程能力一般,在集成过程中容易出错,不如使用现有的集成学习并调整分类阈值。

    1.2、一个简单但有效的方案

    • 不对数据进行过采样和欠采样,但是用现有的集成学习模型,如随机森林
    • 输出随机森林的预测概率,调整阈值得到最终结果
    • 选择合适的评估标准,如precision@n

    这种难度很低,也规避了不少容易出错的地方。我们使用集成学习降低过拟合风险,使用阈值调整规避和采样问题,同时选择合适的评估手段以防止偏见。而且这些都是现成的模型,5-10行的Python就可以实现。

    二、交叉熵函数系列问题?与最大似然函数的关系和区别?

    交叉熵用来衡量在给定的真实分布下,使用非真实分布所指定的策略消除系统的不确定性所需要付出的努力的大小。

    交叉熵的公式为:sum_{k=1}^N p_k log_2 frac{1}{q_k},其中p_k 表示真实分布,q_k 表示非真实分布。

    交叉熵越低,表示非真实分布越接近真实分布,因此,交叉熵越低越好。

    如何去衡量不同策略之间的差异呢?这就需要用到相对熵(KL散度,物理意义就是用来度量两个函数的相似度或者相近程度),用来衡量两个取值为正的函数或概率分布之间的差异,即:

    KL(f(x) || g(x)) =  sum_{ x in X} f(x) * log_2 frac{f(x)}{g(x)}

    现在假设我们想知道某个策略和最优策略之间的差异,我们就可以用相对熵来衡量这两者之间的差异。即,相对熵 = 某个策略的交叉熵 - 信息熵(根据系统真实分布计算而得的信息熵,为最优策略),公式如下:

    KL(p || q) = H(p,q) - H(p) = 

     sum_{k=1}^N p_k log_2 frac{1}{q_k} - sum_{k=1}^N p_k log_2 frac{1}{p_k} = sum_{k=1}^N p_k log_2 frac{p_k}{q_k}

    1)交叉熵损失函数的物理意义:用于描述模型预测值与真实值的差距大小

    2)最小化交叉熵的本质就是对数似然函数的最大化

    3)对数似然函数的本质就是衡量在某个参数下,整体的估计和真实情况一样的概率,越大代表越相近;而损失函数的本质就是衡量预测值和真实值之间的差距,越大代表越不相近。

    三、HMM、MEMM vs CRF 对比

    1、马尔科夫假设

    应该是齐次性假设,这样假设:马尔科夫链(x_{1},cdots,x_{n}) 里的 x_{i}总是只受 x_{i-1} 一个人的影响。马尔科夫假设这里相当于就是1-gram。

    马尔科夫过程:每个状态的转移只依赖于前n个状态,并且只是个n阶的模型。最简单的马尔科夫过程是一阶的,即只依赖于前一个状态。

    2、马尔科夫性

    马尔科夫性是保证或者判断概率图是否为概率无向图的条件

    2.1、判别式模型

    判别模型是直接对P(Y | X)进行建模,就是说,直接根据X特性来对Y建模训练。具体的,我的训练过程是确定构件P(Y | X) 模型里面“复杂映射关系”中的参数,完了再去inference一批新的sample。

    判别式模型的特征总结如下:

    1)对P(Y | X)建模

    2)对所有的样本只构建一个模型,确认总体判别边界

    3)观测到输入什么特征,就预测最可能的label

    4)判别式的优点:对数据量要求没生成式的严格,速度也会快,小数据量下准确率也会好些。

    2.2、生成式模型

    在训练模型中,学习到的是X与Y的联合模型P(X,Y),需要确定维护这个联合概率分布的所有的信息参数。完了之后在inference再对新的sample计算P(Y | X),导出Y。

    学习阶段,建模: P(X,Y)=P(X|Y)P(Y),然后 P(Y|X) = frac{P(X,Y)}{P(X)}

    生成式总结有如下特点:

    1. 对P(X , Y) 建模

    2. 这里主要讲分类问题,要对每个label(y_{i} )都需要建模,最终选择最优概率的label为结果,所以 没有什么判别边界。

    3. 中间生成联合分布,并可生成采样数据。

    4. 生成式模型的优点在于,所包含的信息非常齐全,我称之为“上帝信息”,所以不仅可以用来输入label,还可以干其他的事情。生成式模型关注结果是如何产生的。但是生成式模型需要非常充足的数据量以保证采样到了数据本来的面目,所以速度相比之下,慢。

     2.3 序列建模

    序列包括时间序列以及general sequence,但两者无异。连续的序列在分析时也会先离散化处理。常见的序列有如:时序数据、本文句子、语音数据、等等

    广义下的序列有这些特点:

    • 节点之间有关联依赖性/无关联依赖性
    • 序列的节点是随机的/确定的
    • 序列是线性变化/非线性的
    • .......

    对不同的序列有不同的问题需求,常见的序列建模方法总结如下:

    1.拟合,预测未来节点(或走势分析):

      a. 常规序列建模方法:AR、MA 、ARMA 、ARIMA

      b. 回归拟合

      c. Neural Networks

    2. 判断不同序列类别,及分类问题:HMM、CRF、General Classifier (ML models、NN models)

    3. 不同时序对应的状态的分析,及序列标注问题:HMM、CRF、RecurrentNNs

    3. HMM

    3.1 理解HMM

    实际上我们碰到的更多的使用HMM的场景是每个节点Xi 下还附带着另一个节点 Y_{i},正所谓隐含马尔科夫模型,那么除了正常的节点,还要将隐含状态节点也得建模进去。正儿八经地,将X_{i} 、 Y_{i}  换成i_{i} 、o_{i} ,并且他们的名称变为状态节点、观测节点。状态节点正是我们的隐状态。

    HMM属于典型的生成式模型。对照2.1的讲解,应该是要从训练数据中学到数据的各种分布,那么有哪些分布呢以及是什么呢?直接正面回答的话,正事HMM的5要素,其中有3个就是整个数据的不同角度的概率分布:

    N,隐藏状态 N = {q1,...,qN},隐藏节点不能随意取,只能限定取包含在隐藏状态集中的符号。

    M,观测集 M = lbrace v_{1}, cdots, v_{M} 
brace ,同样我的观测节点不能随意取,只能限定取包含在观测状态集中的符号。

    A,状态转移概率矩阵,这个就是其中一个概率分布。他是个矩阵, A= [a_{ij}]_{N 	imes N} (N为隐藏状态集元素个数),其中 a_{ij} = P(i_{t+1}|i_{t}), i_{t} 即第i个隐藏状态节点,即所谓的状态转移。

    B,观测概率矩阵,这是另一个概率分布。 B = [b_{ij}]_{N 	imes M}(N为隐藏状态集元素个数,M为观测集元素个数),其中 b_{ij} = P(o_{t}|i_{t}), o_{t}即第i个观测节点, i_{t}即第i个隐状态节点,即所谓所谓的观测概率(发射概率)。

    π ,在第一个隐状态节点i_{t} ,我得人工单独赋予,我第一个隐状态节点的隐状态是N中的每一个的概率分别是多少,然后π 就是其概率分布

    所以图看起来是这样的:

    模型先去学习要确定以上5要素,之后在inference阶段的工作流程是:首先,隐状态节点i_{t}是不能直接观测到的数据节点,o_{t} 才是能观测到的节点,并且注意箭头的指向表示了依赖生成条件关系,i_{t} 在A的指导下生成下一个隐状态节点i_{t+1},并且i_{t} 在B的指导下生成依赖于该i_{t}的观测节点 o_{t},并且我们只能观测到序列(o_{1}, cdots, o_{i}) 。

    下面来点高层次的理解:

    1. 根据概率图分类,可以看到HMM属于有向图,并且是生成式模型,直接对联合概率分布建模P(O,I) = sum_{t=1}^{T}P(O_{t} | O_{t-1})P(I_{t} | O_{t}) (注意,这个公式不在模型运行的任何阶段能体现出来,只是我们都去这么来表示HMM是个生成式模型,他的联合概率P(O , I)就是这么计算的)。

    2. 并且B中b_{ij} = P(o_{t}|i_{t}) ,这意味着o对i有依赖性。

    3. 在A中a_{ij} = P(i_{t+1}|i_{t}),也就是说只遵循了一阶马尔科夫假设,1-gram。如果数据依赖超过1-gram,那肯定HMM是考虑不进去的。

    3.2 模型运行过程

    模型的运行过程(工作流程)对应了HMM的3个问题。

    3.2.1 学习训练过程

    对照2.1的讲解,HMM学习训练的过程,就是找出数据的分布情况,也就是模型参数的确定。

    主要学习算法按照训练数据除了观测状态序列(o_{1}, cdots, o_{i}) 是否还有隐状态序列(i_{1}, cdots, i_{i}) 分为:

    • 极大似然估计,with 隐状态序列
    • Baum-Welch(前向后向),without 隐状态序列 

    1. 极大似然估计

    一般做NLP的序列标注等任务,在训练阶段肯定有隐状态序列的。

    • step 1.算A

           hat{a_{ij}} = frac{A_{ij}}{sum_{j=1}^{N}A_{ij}}

    • step 2. 算B

      hat{b_{j}}(k) = frac{B_{jk}}{sum_{k=1}^{M}B_{jk}}  

    • step 3. 直接估计π

    2. Baum-Welch(前向后向)

    就是一个EM的过程,EM的过程就是初始化一套值,然后迭代计算,根据结果再调整,再迭代,最后收敛。。。。。因为没有隐状态序列(i_{1}, cdots, i_{i}) 信息,所以必须先给初值a_{ij}^{0}, b_{j}(k)^{0}, pi^{0} ,初步确定模型,然后再迭代计算出a_{ij}^{n}, b_{j}(k)^{n}, pi^{n} ,中间计算过程会用到给出的观测状态序列(o_{1}, cdots, o_{i})。另外,收敛性由EM的XXX定理保证。

    3.2.2 序列标注(解码)过程

    学习完了HMM的分布参数,也就确定了一个HMM模型。需要注意的是,这个HMM是对我这一批全部的数据进行训练所得到的参数。序列标注问题也就是“预测过程”,通常称为解码过程。对应了序列建模问题3.对于序列标注问题,我们只需要学习出一个HMM模型即可,后面所有的新的sample都用这个HMM去apply。

     目的是,在学习后已知了P(Q,O) ,现要求出P(Q|O) ,进一步

    Q_{max} = argmax_{allQ}frac{P(Q,O)}{P(O)}

    在直白点就是,现在要在给定的观测序列下找出一条隐状态序列,条件是这个隐状态序列的概率是最大的那个。

    具体地,都是用Viterbi算法解码,是用DP思想减少重复的计算。viterbi算法其实就是多步骤每步多选择模型的最优选择问题,其在每一步的所有选择都保存了前序所有步骤到当前步骤当前选择的最小总代价(或者最大价值)以及当前代价的情况下前继步骤的选择。依次计算完所有步骤后,通过回溯的方法找到最优选择路径。

    回溯方法的基本思想就是按照输入数组的顺序,每一层递归处理一个元素,当处理最后一层的时候,也就是把数组中的所有元素都处理完的时候,把当前结果加入到最后的返回结果中。值得注意的是,每次在递归到下一层之前,我们加入了某个要处理的元素X,在下一层递归返回之后,我们要还会加入新的元素Y。那么在这一层递归中就相当于处理了不止一个新的元素。

    Viterbi计算有向无环图的一条最大路径,应该还好理解,如图:

    关键是注意,每次工作热点区只涉及到t 与 t - 1,这对应了DP的无后效性的条件。

    3.2.3 序列概率过程

    实际上,序列概率过程对应了序列建模问题2,即序列分类。

    在3.2.2第一句话有说,在序列标注问题中,用一批完整的数据训练出了一支HMM模型即可。但,在序列分类问题中就不是训练一个HMM模型了。应该这么做(结合语音分类识别的例子):

    目标:识别声音是A发出的还是B发出的。

    HMM建模过程:

    1. 训练:将所有A说的语音数据作为dataset_A,将所有B说的语音数据作为dataset_B(当然,先要分别对dataset_A、dataset_B做预处理encode为元数据节点,形成sequences),然后分别用dataset_A、dataset_B去训练出HMM_A / HMM_B

    2. inference:来了一条新的sample(sequence),我不知道是A的还是B的,没问题,分别用HMM_A / HMM_B计算一遍序列的概率得到P_{A}(S)、P_{B}(S) ,比较两者大小,那个概率大说明哪个更合理,更大概率作为目标类别。

    所以,本小节的理解重点在于,如何对一条序列计算其整体的概率。即目标是计算出P(O|λ) 。详情可见李航老师整理的:

    • 直接计算法(穷举搜索)
    • 前向算法
    • 后向算法

    后面两个算法采用了DP思想,减少计算量,每一直接引用前一个时刻的计算结果以避免重复计算,跟Viterbi一样的技巧。

    4、MEMM

    MEMM,即最大熵马尔科夫模型,属于判别式模型。

    4.1 理解MEMM

    MEMM正因为是判别模型,所以上来就直接为了确定边界而去建模,比如说序列求概率(分类)问题,直接考虑找出函数分类边界。

    HMM中,观测节点o_{i} 依赖隐藏状态节点i_{i},也就意味着我的观测节点只依赖当前时刻的隐藏状态。但在更多的实际场景下,观测序列是需要很多特征来刻画的,比如说,在做NER时,标注i_{i}不仅跟当前状态o_{i}相关,还跟前后标注o_{j}(j 
eq i)相关,比如字母大小写、词性等等。

    为此,提出来的MEMM模型就是能够直接允许“定义特征”,直接学习条件概率,即P(i_{i}|i_{i-1},o_{i}) (i = 1,cdots,n),总体为:

    P(I|O) = prod_{t=1}^{n}P(i_{i}|i_{i-1},o_{i}), i = 1,cdots,n

    并且,P(i|i^{'},o) 这个概率通过最大熵分类器建模(取名MEMM的原因):

    P(i|i^{'},o) = frac{1}{Z(o,i^{'})} exp(sum_{a})lambda_{a}f_{a}(o,i)

    重点来了,这是ME的内容,也是理解MEMM的关键:Z(o,i^{'}) 这部分是归一化;f_{a}(o,i) 是特征函数,具体点,这个函数是需要去定义的;λ 是特征函数的权重,这是个未知参数,需要从训练阶段学习得到。

    比如可以这么定义特征函数:

    egin{equation} f_{a}(o,i) = egin{cases} 1& 	ext{满足特定条件},\ 0& 	ext{other} end{cases} end{equation}

    其中,特征函数 f_{a}(o,i) 个数可任意制定,(a = 1, cdots, n)

    所以总体上,MEMM的建模公式这样:

    P(I|O) = prod_{t=1}^{n}frac{ exp(sum_{a})lambda_{a}f_{a}(o,i) }{Z(o,i_{i-1})} , i = 1,cdots,n

    MEMM需要注意两点:

     

    1. 与HMM的 o_{i} 依赖 i_{i} 不一样,MEMM当前隐藏状态 i_{i} 应该是依赖当前时刻的观测节点o_{i}和上一时刻的隐藏节点 i_{i-1}

    2. 需要注意,之所以图的箭头这么画,是由MEMM的公式决定的,而公式是由creator定义出来的。

    走一遍完整的流程:

    step 1. 先定义特征函数f_{a}(o,i)

    step 2. 在给定的数据上,训练数据,确定参数,即确定了MEMM模型

    step 3. 用确定的模型做序列标注问题或者序列求概率问题

    4.2 模型运行过程

    MEMM模型的工作流程也包括了学习训练问题、序列标注问题、序列求概率问题。

    4.2.1 学习训练过程

    一套MEMM由一套参数唯一确定,同样地,我需要通过训练数据学习这些参数。MEMM模型很自然需要学习里面的特征权重λ。

    不过跟HMM不同的是,因为HMM是生成式模型,参数即为各种概率分布元参数,数据量足够可以用最大似然估计。而判别式模型是用函数直接判断,学习边界,MEMM即通过特征函数来界定。但同样,MEMM也有极大似然估计法、梯度下降、牛顿迭代法、拟牛顿下降、BFGS、L-BFGS等等。

    4.2.2 序列标注过程

    还是跟HMM一样,用学习好的MEMM模型,在新的sample(观测序列  o_{1}, cdots, o_{i})上找出一条概率最大最可能的隐状态序列i_{1}, cdots, i_{i} 。

    只是现在的图中的每个隐状态节点的概率求法有一些差异而已,正确将每个节点的概率表示清楚,路径求解过程还是一样,采用viterbi算法。

    4.2.3 序列求概率过程

    跟HMM举的例子不一样,也是分别去为每一批数据训练构建特定的MEMM,然后根据序列在每个MEMM模型的不同得分概率,选择最高分数的模型为wanted类别。

    4.3 标注偏置

    1. 现象

    由于局部归一化问题,MEMM倾向于选择拥有更少转移的状态。

     

    用viterbi算法解码MEMM,状态1倾向于转换到状态2,同时状态2qingxi倾向于保留在状态2.解码过程细节(需要会viterbi算法这个前提):

    P(1-> 1-> 1-> 1)= 0.4 x 0.45 x 0.5 = 0.09 ,
    P(2->2->2->2)= 0.2 X 0.3 X 0.3 = 0.018,
    P(1->2->1->2)= 0.6 X 0.2 X 0.5 = 0.06,
    P(1->1->2->2)= 0.4 X 0.55 X 0.3 = 0.066
    但是得到的最优的状态转换路径是1->1->1->1,为什么呢?因为状态2可以转换的状态比状态1 要多,从而使转移概率降低,即MEMM倾向于选择拥有更少转移的状态。
     
    2.解释原因
    MEMM公式:

     P(I|O) = prod_{t=1}^{n}frac{ exp(sum_{a})lambda_{a}f_{a}(o,i) }{Z(o,i_{i-1})} , i = 1,cdots,n

    ∑ 求和的作用在概率中是归一化,但是这里归一化放在了指数内部,管这叫local归一化。viterbi求解过程,是用dp的状态转移公式(MEMM的没展开,参考下面的CRF公式),因为是局部归一化,所以MEMM的viterbi的转移公式的第二部分出现了问题,导致dp无法正确的递归到全局最优。

      delta_{i+1} = max_{1 le j le m}lbrace delta_{i}(I) + sum_{i}^{T}sum_{k}^{M}lambda_{k}f_{k}(O,I_{i-1},I_{i},i) 
brace

    5、CRF

     5.1 理解CRF

    请看第一张概率图模型架构图,CRF上面是马尔科夫随机场(马尔科夫网络),而条件随机场是在给定的随机变量X(具体对应观测序列o_{1}, cdots, o_{i} )条件下,随机变量Y(具体对应隐状态序列 i_{1}, cdots, i_{i} 的马尔科夫随机场)

     广义的CRF的定义是:满足P(Y_{v}|X,Y_{w},w 
eq v) = P(Y_{v}|X,Y_{w},w sim v) 的马尔科夫随机场叫做条件随机场(CRF)

    不过一般说CRF为序列建模,就专指CRF线性链:

    在2.1.2中有提到过,概率无向图的联合概率分布可以在因子分解下表示为:

    P(Y | X)=frac{1}{Z(x)} prod_{c}psi_{c}(Y_{c}|X ) = frac{1}{Z(x)} prod_{c} e^{sum_{k}lambda_{k}f_{k}(c,y|c,x)} = frac{1}{Z(x)} e^{sum_{c}sum_{k}lambda_{k}f_{k}(y_{i},y_{i-1},x,i)}

    在线性链CRF示意图中,每一个(I_{i} sim O_{i} )对为一个最大团,即在上式中c = i。并且线性链CRF满足P(I_{i}|O,I_{1},cdots, I_{n}) = P(I_{i}|O,I_{i-1},I_{i+1})  。

    所以CRF的建模公式如下:

    P(I | O)=frac{1}{Z(O)} prod_{i}psi_{i}(I_{i}|O ) = frac{1}{Z(O)} prod_{i} e^{sum_{k}lambda_{k}f_{k}(O,I_{i-1},I_{i},i)} = frac{1}{Z(O)} e^{sum_{i}sum_{k}lambda_{k}f_{k}(O,I_{i-1},I_{i},i)}

    CRF的重点概念:判别式模型、特征函数

    1. 特征函数

    P(I | O)=frac{1}{Z(O)} e^{sum_{i}^{T}sum_{k}^{M}lambda_{k}f_{k}(O,I_{i-1},I_{i},i)}

    • 下标 i 表示当前所在的节点(token)位置
    • 下标 k 表示这是第几个特征函数,并且每个特征函数都附属一个权重 lambda_{k},每个团里面,将为 token 构造 M 个特征,每个特征执行一定的限定作用,然后建模时再为每个特征函数加权求和。
    • Z(O) 是用来归一化的,为了形成概率值
    • P (I | O)表示了在给定的一条观测序列 O=(o_{1},cdots, o_{i}) 条件下,用CRF所求出来的隐状态序列I=(i_{1},cdots, i_{i}) I=(i_{1},cdots, i_{i})的概率,这里的 / 是一条序列,有多个元素(一组随机变量),而至于观测序列O=(o_{1},cdots, o_{i}) ,它可以是一整个训练语料的所有观测序列;也可以是在inference阶段的一句sample,比如说对于序列标注问题,对一条sample进行预测,可能能得到P_{j}(I | O)(j=1,…,J)J条隐状态  I  ,但我肯定最终选的是最优概率那条。

    对于CRF,可以为他定义两款特征函数:转移特征&状态特征。建模总公式展开:

    P(I | O)=frac{1}{Z(O)} e^{sum_{i}^{T}sum_{k}^{M}lambda_{k}f_{k}(O,I_{i-1},I_{i},i)}=frac{1}{Z(O)} e^{ [ sum_{i}^{T}sum_{j}^{J}lambda_{j}t_{j}(O,I_{i-1},I_{i},i) + sum_{i}^{T}sum_{l}^{L}mu_{l}s_{l}(O,I_{i},i) ] }

    其中:

    • t_{j} 为 i 处的转移特征,对应权重 lambda_{j},每个 token 都有 J 个特征,转移特征针对的是前后token 之间的限定。
    • 举个例子:

    egin{equation} t_{k=1}(o,i) = egin{cases} 1& 	ext{满足特定转移条件,比如前一个token是‘I’},\ 0& 	ext{other} end{cases} end{equation}

    • sl 为 i 处的状态特征,对应权重μl,每个token 都有L个特征
    • 举个例子:
    • egin{equation} s_{l=1}(o,i) = egin{cases} 1& 	ext{满足特定状态条件,比如当前token的POS是‘V’},\ 0& 	ext{other} end{cases} end{equation}

    一般情况下,不把两种特征区分开,而是合在一起:

    P(I | O)=frac{1}{Z(O)} e^{sum_{i}^{T}sum_{k}^{M}lambda_{k}f_{k}(O,I_{i-1},I_{i},i)}

    满足特征条件就取值为1,否则没贡献

    再进一步理解的话,需要把特征函数部分拿出来:

    Score = sum_{i}^{T}sum_{k}^{M}lambda_{k}f_{k}(O,I_{i-1},I_{i},i)

    为 token_{i} 打分,满足条件的就有所贡献。最后将所得的分数进行log线性表示,求和后归一化,即可得到概率值......

    P(y|x;omega) = frac{ exp(omega·phi(x,y)) }{ sum_{y^{'}in Y }exp(omega·phi(x,y^{‘})) }

    CRF完美的满足这个形式,所以又可以归入到 log-linear models 之中。

    5.2  模型运行过程

    • step1. 先预定特征函数 f_{a}(o,i)
    • step2. 在给定数据上,训练模型,确定参数lambda_{k}
    • step3. 用确定的模型做序列标注问题或者序列求概率问题。

    5.2.1 学习训练过程

    一套CRF由一套参数λ唯一确定(先定义好各种特征函数)。

    同样,CRF用极大似然估计方法、梯度下降、牛顿迭代、拟牛顿迭代、IIS、BFGS、L-BFGS等等。能用在log-linear models 上的求参方法都可以用过来

    5.2.2 序列标注过程

    和HMM一样,用学习好的CRF模型,在新的sample(观测序列o_{1}, cdots, o_{i})上找出一条概率最大最可能的隐状态序列i_{1}, cdots, i_{i} 。

    只是现在的图中每个隐状态节点的概率求法有一些差异而已,正确将每个节点的概率表示清楚,路径求解过程还是一样,用viterbi算法

    我们就定义 i 处的局部状态为 delta_{i}(I) ,表示在位置 i 处的隐状态的各种取值可能为 I ,然后递推位置 i+1 处的隐状态,写出来的DP转移公式为:

    delta_{i+1} = max_{1 le j le m}lbrace delta_{i}(I) + sum_{i}^{T}sum_{k}^{M}lambda_{k}f_{k}(O,I_{i-1},I_{i},i) 
brace

    5.2.3 序列求概率过程

    跟HMM举的例子一样,也是分别为每一批数据训练构建特定的CRF,然后根据序列在每个MEMM模型的不同得分概率,选择最高分数的模型为wanted类别。只是貌似很少看到拿CRF或者MEMM来做分类的,直接用网络模型.......

    5.3 CRF++ 分析

    1. 定义模板

    在CRF++下,应该是先定义特征模板,然后用模板自动批量产生大量的特征函数。每一条模板将在每一个token处生产若干个特征函数。

    CRF++的模板(template)有U系列(unigram)、B系列(bigram),不过U模板都可以完成2-gram的作用。

    2. 产生特征函数

    CRF++会产生大量的特征。每个特征都会try每个标注label ,总共将生成N * L = i * k^{'} * L个特征函数以及对应的权重出来。N表示每一套特征函数N= i * k^{'} ,L表示标注集元素个数。

    3. 求参

    对上述的各个特征以及初始权重进行迭代参数学习。

    6. 总结:HMM vs. MEMM vs. CRF 

    首先,CRF,HMM,MEMM都常用来做序列标注的建模,像分词、词性标注、以及命名实体标注

    隐马模型一个最大的缺点就是由于其输出独立性假设,导致其不能考虑上下文的特征,限制了特征的选择,最大熵隐马模型则解决了隐马的问题,可以任意选择特征,但由于其在每一节都要进行归一化,所以只能找到局部最优值,同时也带来了标记偏置问题,即凡是训练语料中未出现的情况全都忽略掉。条件随机场很好的解决了这一问题,他并不在每一个节点进行归一化,而是所有特征进行归一化,因此可以求得全局的最优值。

    1. HMM -> MEMM: HMM模型中存在两个假设:一是输出观察值之间严格独立,二是状态的转移过程中当前状态只与前一状态有关。但实际上序列标注问题不仅和单词相关,而且和观察序列的长度,单词的上下文,等等相关。MEMM解决了HMM输出独立性假设的问题。因为HMM只限定了在观测与状态之间的依赖,而MEMM引入自定义特征函数,不仅可以表达观测之间的依赖,而MEMM引入自定义特征函数,不仅可以表达观测之间的依赖,还可以表示当前观测与前后多个状态之间的复杂依赖。

    2. MEMM->CRF:

    • CRF不仅解决了HMM输出独立性假设的问题,还解决了MEMM的标注偏置问题,MEMM容易陷入局部最优是因为只在局部做归一化,而CRF统计了全局概率,在做归一化时考虑了数据在全局的分布,而CRF统计了全局概率,在做归一化时考虑了数据在全局的分布,而不是仅仅在局部归一化,这样就解决了MEMM中的标记偏置问题。使得序列标注的解码变得最优解。
    • HMM、MEMM属于有向图,所以考虑了x与y的影响,但没将x当做整体考虑进去(这点问题应该只有HMM)。CRF属于无向图,没有这种依赖性,克服此问题。
  • 相关阅读:
    centos7 安装RabbitMQ
    idea 好用的java插件
    eureka 创建服务注册中心
    服务治理 1.注册中心知多少
    服务治理组件比较
    springboot 引入 fastDFS
    centos7 安装 fastDFS
    2、常用查询
    1-库表查看及常用数据类型
    报错:is not allowed to connect tothis mmysql server(mysql无法链接外网)
  • 原文地址:https://www.cnblogs.com/liuerdou/p/10664185.html
Copyright © 2011-2022 走看看