NPL基于词典分词(四)

前言

NPL基于词典分词(三)》介绍第一个基于序列标注的中文分词器-隐马尔可夫模型,然而效果并不理想。事实上,隐马尔可夫模型假设人们说的话仅仅取决于一个隐藏的{B.M,E,S序列,这个假设太单纯了,不符合语言规律。语言不是由这么简单的标签序列生成,语言含有更多特征.

线性模型

为了利用更多的特征,线性模型( linear model )应运而生。线性模型由两部分构成: 一系列用来提取特征的特征函数 φ,以及相应的权重向量 w。

线性分类模型

分类指的是预测样本所属类别的一类问题。

  • 二分类,将类型class1看作正样本,其他类型全部看作负样本,然后我们就可以得到样本标记类型为该类型的概率 p1。

  • 任意类别数的多分类, 在二分类基础上将另外类型class2看作正样本,其他类型全部看作负样本,同理得到 p2。以此循环,我们可以得到该待预测样本的标记类型分别为类型 class i 时的概率 pi,
    在这里插入图片描述
    最后我们取 pi 中最大的那个概率对应的样本标记类型作为我们的待预测样本类型。总之还是以二分类来依次划分,并求出最大概率结果。

线性分类模型

线性模型是传统机器学习方法中最简单最常用的分类模型。如图直线将平面分割为两部分,分别对应男女。

在这里插入图片描述
假设样本为姓名,计算它落入哪个区域,就能预测它的性别。这样的区域称为决策区域,它们的边界称为决策边界。二维空间中,如果决策边界是直线,则称为线性分类模型:
y = w x + b y= wx + b y=wx+b

把二维空间提升到任意维度空间,线性决策边界统称为分离超平面
∑ i D w i x i + b = 0 \sum_i^Dw_ix_i+b=0 iDwixi+b=0
其中,w 是权重,b 偏置(截距),可以写成向量的形式:
w = [ w 1 . . . w D , b ] ; x = [ x 1 . . . x D , 1 ] w=[w_1...w_D, b];x=[x_1...x_D,1] w=[w1...wD,b];x=[x1...xD,1]
所以判断是否为正样本
在这里插入图片描述

ps:sign(x)叫做符号函数,当x<=0,即=-1,反之=1

感知机算法

如果我们知道分离超平面,我们就能快速的判断样本的真假, 找出这个分离超平面其实就是感知机算法。

感知机算法是一种迭代式的算法:在训练集上运行多个迭代,每次读入一个样本,执行预测,将预测结果与正确答案进行对比,计算误差,根据误差更新模型参数,再次进行训练,直到误差最小为止。

下图给出了感知机参数学习的过程
在这里插入图片描述
其中红色实心为正例,蓝色空心点为负例。黑色箭头表示权重向量,红色虚线箭头表示权重的更新方向。

  1. 图1,发现估值错误,则以w向量*正例向量,线性决策边界向正例靠
  2. 图2,发现估计错误,则以w向量*反例向量,线性决策边界向反例靠

其学习的过程
在这里插入图片描述

  • 损失函数: 从数值优化的角度来讲,迭代式机器学习算法都在优化(减小)一个损失函数( loss function )。损失函数 J(w) 用来衡量模型在训练集上的错误程度,自变量是模型参数 w,因变量是一个标量,表示模型在训练集上的损失的大小。
  • 梯度下降: 给定样本,其特征向量 x 只是常数,对 J(w) 求导,得到一个梯度向量 Δw,它的反方向一定是当前位置损失函数减小速度最快的方向。如果参数点 w 反方向移动就会使损失函数减小,叫梯度下降。
  • 学习率: 梯度下降的步长叫做学习率。
  • 随机梯度下降(SGD): 如果算法每次迭代随机选取部分样本计算损失函数的梯度,则称为随机梯度下降。

最终把损失函数降到最低时的“分离超平面”,即为我们所要的。

假如数据本身线性不可分,感知机损失函数不会收敛,每次迭代分离超平面都会剧烈振荡(左飞右,右飞左,稳定不到最低点)。这时可以对感知机算法打补丁,使用投票感知机或平均感知机。

  • 投票感知机:每次迭代的模型都保留,准确率也保留,预测时,每个模型都给出自己的结果,乘以它的准确率加权平均值作为最终结果。但要求存储多个模型及加权,计算开销较大.
  • 平均感知机:取多个模型的权重的平均

基于感知机的人名性别分类

使用感知解决人名性别分类例子:

1. 标注人名分类语料库

赵伏琴,女
钱沐杨,男
孙竹珍,女
李潮阳,男

2. 利用感知机算法训练线性模型
  1. 提取特性,提取陈姓之外字做为特性x

(伏,琴) -1
(沐,杨) 1
(竹,珍) -1
(潮,阳) 1
(潮,珍) 1

  1. 初始化向量表,标量x都为1,只要关注w就行
字符
w 0 0 0 0 0 0 0 0
  1. 输入x[伏,琴]
    s i g n ( ∑ w ) = s i g n ( w [ 伏 ] + w [ 琴 ] ) = s i g n ( 0 ) = 1 sign(\sum w)= sign(w[伏] + w[琴] ) = sign(0) = 1 sign(w)=sign(w[]+w[])=sign(0)=1
    与-1不相等,即增加w-1
字符
w -1 -1 0 0 0 0 0 0
  1. 循环2次最终得
字符
w -1 -1 0 0 -1 0 1 0
3. 利用线性模型给人名分类。

输入x[沐,琴]
s i g n ( ∑ w ) = s i g n ( w [ 沐 ] + w [ 琴 ] ) = s i g n ( − 1 ) = − 1 sign(\sum w)= sign(w[沐] + w[琴] ) = sign(-1) = -1 sign(w)=sign(w[]+w[])=sign(1)=1

结构化感知机算法

对应到自然语言处理问题中,仅依赖标量x进行分类会显不那么准确,往往会伴随结构化预测。现在的自然语言处理中有许多任务是结构化,比如序列标注预测结构是一整个序列,句法分析预测结构是一棵句法树,以及前文提到的中文分词隐马乐可夫{B,M,E,S} 。

{B,M,E,S}标签可有上线的线性模块判断,但也必须必须考虑结构整体的合理程度

要让线性模型支持结构化预测,必须先设计打分函数。打分函数的输入有两个缺一不可的参数: 特征 x 和结构 y。但之前介绍的线性模型的“打分函数”只接受一个自变量 x。
做法是定义新的特征函数 ϕ(x,y),把结构 y 也作为一种特征,输出新的“结构化特征向量”。新特征向量与权重向量做点积后,就得到一个标量,将其作为分数:
s c o r e ( x , y ) = w ϕ ( x , y ) score(x,y) = wϕ(x,y) score(x,y)=wϕ(x,y)
有了每个标签在不同结构的分数,再结结合整个结构算出最大值,取分值最大的结构作为预测结果,得到结构化预测函数:
在这里插入图片描述
预测函数与线性分类器的决策函数很像,都是权重向量点积特征向量。那么感知机算法也可以拓展复用,得到线性模型的结构化学习算法。

  1. 读入样本 (x,y),进行结构化预测
  2. 与正确答案相比,若不相等,则更新参数: 奖励正确答案触发的特征函数的权重,否则进行惩罚.
    在这里插入图片描述

结构化感知机与序列标注

上面已经讲了结构化感知机的模型公式,看如何运用到序列标注上,我们知道序列标注最大的结构特点就是标签相互之间的依赖性,这种依赖性利用初始状态概率想俩狗和状态转移概率矩阵体系那,那么对于结构化感知机,就可以使用转移特征来表示
在这里插入图片描述
其中,Yt 为序列第 t 个标签,Si 为标注集第 i 种标签,N 为标注集大小。
状态特征如下,类似于隐马尔可夫模型的发射概率矩阵,状态特征只与当前的状态有关,与之前的状态无关:
在这里插入图片描述
于是,结构化感知机的特征函数就是转移特征和状态特征的合集,我们统一用打分函数来表示:
在这里插入图片描述
下面是基于结构化感知机的中文分词步骤

1.加载语料库

商品 和 服务
商品 和服 物美价廉
服务 和 货币

2.提供结构化感知机的特征,x是字符,y是{B,M,E,S}
转移特征 状态特征
y t − 1 y_{t-1} yt1 x t − 1 x_{t-1} xt1 x t x_{t} xt x t + 1 x_{t+1} xt+1 x t − 2 / x t − 1 x_{t-2}/x_{t-1} xt2/xt1 x t − 1 / x t x_{t-1}/x_{t} xt1/xt x t / x t + 1 x_{t}/x_{t+1} xt/xt+1 x t + 1 / x t + 2 x_{t+1}/x_{t+2} xt+1/xt+2

根据上术规则分析语料特佂,以第一句“商”为例子

x-商 y-B
/1
/商2
/3品
/4
/商5
商/品6
品/和7

3.使用打分公式计算各状态分数

// todo

4. 通过打分公式预测的状态和实际状态不一样,调节状态
5. 1-4步骤循环10次,提高准确率

主要参考

线性模型篇之感知机 (PLA) 数学公式推导
感知机分类与序列标注

猜你喜欢

转载自blog.csdn.net/y3over/article/details/119941793