线性模型 对于隐马尔科夫模型的优点
隐马模型只能捕捉到当前字符和前一个标签这两个特征.为了能够充分利用文本的结构,提高准确率,可以引入线性模型
线性模型的组成
用于提取特征的特征函数Ø和每个特征的权重w
感知机的引入
通过特征函数抽取出大量样本(特征向量)x,构成样本空间,这时需要将样本空间分类,得出想要的结论。
超平面可以划分样本,方法为为特征向量构造一个对应的权重向量w,x中的每一个元素对应w中的一个权重.
如何分离出超平面呢?感知机是一个不错的选择.
感知机的简单原理
读入训练样本(x, y),通过sign函数预测结果.
如果预测失败,则调整权重向量w += yx,继续训练
这里的x是通过特征模板抽取出来的样本,和权重一样是一个向量,而y是样本的分类
为什么可以这么更新权重向量呢?
预测结果为y=-1,说明w* x<0, 而实际上y=1,w x>0,所以要想办法增大 w(因为x的元素只有0和1,所以增大w** 相当于增大wx).反之亦然.
损失函数与梯度下降
感知机是迭代式算法,迭代次数取决于优化(减小)一个损失函数的次数.损失函数用于度量训练集的错误程度.
对损失函数求导得到梯度向量,其反方向为损失函数减小最快的方向.设置学习率,一步一步地减小损失函数,直到收敛,称为随机梯度下降
线性模型的损失函数为误分点到超平面的距离.
传统的感知机存在问题,即噪声容易导致分离超平面失败
传统感知机的改进
投票感知机
训练多个模型,乘以其准确率加权平均,比较得出最好的结果,可以一定程度抑制噪声的干扰
但是计算开销较大,还可以改进
平均感知机
记录每次迭代时的权重,将其求和并取平均值.
但并不是所有参数都需要调整,全部调整容易降低效率
可以改进,通过增加时间戳,对每个需要调整的参数,不对其求和,而是通过让该参数加上某个固定的时间差乘以该参数,最后处以总时间来进行平均,减少了运算次数.
结构化感知机
结构化预测即给定一系列模型和打分函数,将模型带入函数中,取的分最高的 模型
输入参数为特征x和结构y,这两者都是向量
打分函数需要兼顾两者score(x, y) = w.Ø(x, y), w,x和y均为向量.
结构化感知机实现序列标注
用特征转移矩阵代替状态转移矩阵,状态特征代替发射矩阵,结构化感知机就和隐马尔科夫模型一样,实现序列标注
同样的,对于序列的最优解的搜索,使用维特比算法求出最优解
结构化感知机实现分词
如果预测的结构为{B,M,E,S}结构,那么可以用于分词
Hanlp中已经封装了结构化感知机分词的工具,其特征模板利用了某字符的前后总共七个字符,远远多于隐马尔科夫模型的假设
具体代码如下:
HanLP.Config.ShowTermNature = False
segment = PerceptronLexicalAnalyzer(msr_model).enableCustomDictionary(True)
text = "人与川普通电话"
print(segment.seg(text))
CustomDictionary.insert("川普", "nrf 1")
segment.enableCustomDictionaryForcing(True)
print(segment.seg(text))
hanlp的感知机分词支持在线学习,或者修改/更换 用户词典也可以做到
用户词典位于pyhanlp/static/data/dictionary/custom/CustomDictionary.txt,windows使用listary,linux用fd命令,很快就能找到
感知机在NLP中的运用
可以求出最佳超平面,故可以用于分类问题(如人名性别判别,文档分类).
另外,通过结构化感知机可以实现序列标注和分词,本质是对文本结构进行分类(如{B,M,E,S}结构)