bilstm是谁发明的的简单介绍
本篇百科问答的知识要给大家谈谈bilstm是谁发明的,以及对应的知识点,希望对学习有所帮助。
文章目录:
自然语言处理(NLP)的基础难点:分词算法
自然语言处理(NLP,Natural Language Processing)是人工智能领域中的一个重要方向,主要研究人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理的底层任务由易到难大致可以分为词法分析、句法分析和语义分析。分词是词法分析(还包括词性标注和命名实体识别)中最基本的任务,也是众多NLP算法中必不可少的第一步,其切分准确与否往往与整体结果息息相关。
金融领域分词的难点
分词既简单又复杂。简单是因为分词的算法研究已经很成熟了,大部分的算法(如HMM分词、CRF分词)准确率都可以达到95%以上;复杂则是因为剩下的5%很难有突破,主要可以归结于三点:
▲粒度,即切分时的最小单位,不同应用对粒度的要求不一样,比如“融资融券”可以是一个词也可以是两个词
▲歧义,比如“恒生”一词,既可指恒生公司,又可指恒生指数
▲未登录词,即未出现在算法使用的词典中的词,比如不常见的专业金融术语,以及各种上市公司的名称
在金融领域中,分词也具有上述三个难点,并且在未登录词方面的难点更为突出,这是因为金融类词汇本来就多,再加上一些专有名词不仅有全称还有简称,这就进一步增大了难度。
在实际应用中,以上难点时常会造成分词效果欠佳,进而影响之后的任务。尤其是在一些金融业务中,有许多需要与用户交互的场景,某些用户会用口语化的词汇描述业务,如果分词错误会影响用户意图的解析,这对分词的准确性提出了更高的要求。因此在进行NLP上层应用开发时,需要对分词算法有一定的了解,从而在效果优化时有能力对分词器进行调整。接下来,我们介绍几种常用的分词算法及其应用在金融中的优劣。
几种常见的分词算法
分词算法根据其核心思想主要分为两种:
第一种是基于字典的分词,先把句子按照字典切分成词,再寻找词的最佳组合方式,包括最大匹配分词算法、最短路径分词算法、基于N-Gram model的分词算法等;
第二种是基于字的分词,即由字构词,先把句子分成一个个字,再将字组合成词,寻找最优的切分策略,同时也可以转化成序列标注问题,包括生成式模型分词算法、判别式模型分词算法、神经网络分词算法等。
最大匹配分词寻找最优组合的方式是将匹配到的最长词组合在一起,主要的思路是先将词典构造成一棵Trie树(也称为字典树),Trie树由词的公共前缀构成节点,降低了存储空间的同时可以提升查找效率。
最大匹配分词将句子与Trie树进行匹配,在匹配到根结点时由下一个字重新开始进行查找。比如正向(从左至右)匹配“他说的确实在理”,得出的结果为“他/说/的确/实在/理”。如果进行反向最大匹配,则为“他/说/的/确实/在理”。
这种方式虽然可以在O(n)时间对句子进行分词,但是只单向匹配太过绝对,尤其是金融这种词汇较丰富的场景,会出现例如“交易费/用”、“报价单/位”等情况,所以除非某些词的优先级很高,否则要尽量避免使用此算法。
最短路径分词算法首先将一句话中的所有词匹配出来,构成词图(有向无环图DAG),之后寻找从起始点到终点的最短路径作为最佳组合方式,例:
我们认为图中每个词的权重都是相等的,因此每条边的权重都为1。
在求解DAG图的最短路径问题时,总是要利用到一种性质:即两点之间的最短路径也包含了路径上其他顶点间的最短路径。比如S-A-B-E为S到E到最短路径,那S-A-B一定是S到B到最短路径,否则会存在一点C使得d(S-C-B)d(S-A-B),那S到E的最短路径也会变为S-C-B-E,这就与假设矛盾了。利用上述的最优子结构性质,可以利用贪心算法或动态规划两种求解算法:
(1)基于Dijkstra算法求解最短路径,该算法适用于所有带权有向图,求解源节点到其他所有节点的最短路径,并可以求得全局最优解;
(2)N-最短路径分词算法,该方法是对Dijkstra算法的扩展,在每一步保存最短的N条路径,并记录这些路径上当前节点的前驱,在最后求得最优解时回溯得到最短路径。这种方法的准确率优于Dijkstra算法,但在时间和空间复杂度上都更大。
相较于最大匹配分词算法,最短路径分词算法更加灵活,可以更好地把词典中的词组合起来,能更好地解决有歧义的场景。比如上述“他说的确实在理”这句话,用最短路径算法的计算结果为“他/说/的/确实/在理”,避免了正向最大匹配的错误。但是对于词典中未存在的词基本没有识别能力,无法解决金融领域分词中的“未登录词”难点。
N-Gram(又称N元语法模型)是基于一个假设:第n个词出现与前n-1个词相关,而与其他任何词不相关。在此种假设下,可以简化词的条件概率,进而求解整个句子出现的概率。
现实中,常用词的出现频率或者概率肯定比罕见词要大。因此,可以将求解词图最短路径的问题转化为求解最大概率路径的问题,即分词结果为“最有可能的词的组合“。
计算词出现的概率,仅有词典是不够的,还需要充足的语料,所以分词任务已经从单纯的“算法”上升到了“建模”,即利用统计学方法结合大数据挖掘,对“语言”(句子出现的概率)进行建模。
我们将基于N-gram模型所统计出的概率分布应用到词图中,可以得到词的概率图。对该词图用最短路径分词算法求解最大概率的路径,即可得到分词结果。
相较于前两种分词算法,基于N-Gram model的分词算法对词频进行了统计建模,在切分有歧义的时候力求得到全局最优值,比如在切分方案“证券/自营/业务”和“证券/自/营业/务”中,统计出“证券/自营/业务”出现的概率更大,因此结果有更高的准确率。但也依然无法解决金融场景中未登录词的问题。
生成式模型主要有隐马尔可夫模型(HMM,Hidden Markov Model)、朴素贝叶斯分类等。HMM是常用的分词模型,基于Python的jieba分词器和基于Java的HanLP分词器都使用了HMM。
HMM模型认为在解决序列标注问题时存在两种序列,一种是观测序列,即人们显性观察到的句子,另一种是隐状态序列,即观测序列的标签。假设观测序列为X,隐状态序列是Y,则因果关系为Y-X。因此要得到标注结果Y,必须对X的概率、Y的概率、P(X|Y)进行计算,即建立P(X,Y)的概率分布模型。
HMM算法可以在一定程度上解决未登录词的问题,但生成式模型的准确率往往没有接下来要谈到的判别式模型高。
判别式模型主要有感知机、支持向量机(SVM,Support Vector Machine)、条件随机场(CRF,Conditional Random Field)、最大熵模型等,其中感知机模型和CRF模型是常用的分词模型。
(1)平均感知机分词算法
感知机是一种简单的二分类线性模型,通过构造超平面,将特征空间(输入空间)中的样本分为正负两类。通过组合,感知机也可以处理多分类问题。但由于每次迭代都会更新模型的所有权重,被误分类的样本会造成很大影响,因此采用平均的方法,在处理完一部分样本后对更新的权重进行平均。
(2)CRF分词算法
CRF可以看作一个无向图模型,假设给定的标注序列为Y,观测序列为X,CRF对条件概率P(Y|X)进行定义,而不是对联合概率建模。
平均感知机算法虽然速度快,但仍不够准确。适合一些对速度要求高、对准确性要求相对不那么高的场景。CRF分词算法可以说是目前最常用的分词、词性标注和实体识别算法,它对未登陆词也有很好的识别能力,是目前在速度、准确率以及未登录词识别上综合表现最突出的算法,也是我们目前所采用的解决方案,但速度会比感知机慢一些。
在NLP中,最常用的神经网络为循环神经网络(RNN,Recurrent Neural Network),它在处理变长输入和序列输入问题中有着巨大的优势。LSTM(Long Short-Term Memory,长短期记忆网络)为RNN变种的一种,在一定程度上解决了RNN在训练过程中梯度消失和梯度爆炸的问题。
目前对于序列标注任务,业内公认效果最好的模型是BiLSTM+CRF。相比于上述其它模型,双向循环神经网络BiLSTM,可以更好地编码当前字等上下文信息,并在最终增加CRF层,核心是用Viterbi算法进行解码,以得到全局最优解,避免B,S,E这种不可能的标记结果的出现,提高准确率。
神经网络分词虽然能在准确率、未登录词识别上有更好的表现,但RNN无法并行计算,在速度上没有优势,所以该算法通常在算法研究、句子精确解析等对速度要求不高的场景下使用。
分词作为NLP底层任务之一,既简单又重要,很多时候上层算法的错误都是由分词结果导致的。因此,对于底层实现的算法工程师,不仅需要深入理解分词算法,更需要懂得如何高效地实现和调试。
而对于上层应用的算法工程师,在实际分词时,需要根据业务场景有选择地应用上述算法,比如在搜索引擎对大规模网页进行内容解析时,对分词对速度要求大于精度,而在智能问答中由于句子较短,对分词的精度要求大于速度。
文章自动打分算法
文章自动打分简称 AES (Automated Essay Scoring),AES 系统利用 NLP 技术自动对文章进行打分,可以减轻阅卷人员的负担。目前有不少大型的考试都采用了 AES 算法进行作文打分,例如 GRE 考试,GRE 考试会有一位阅卷老师和 AES 系统一起打分,如果 AES 的分数和阅卷老师的分数相差过大,才有再增加一位阅卷老师进行打分。本文主要介绍两种比较经典的自动打分算法。
自动打分算法从优化目标或者损失函数来说大致可以分为三种:
传统的自动打分算法通常会人工设置很多特征,例如语法错误,N 元组,单词数量,句子长度等,然后训练机器学习模型进行打分。目前也有很多使用了神经网络的方法,通过神经网络学习出文章的特征。
下面介绍两种打分算法:
出自论文《Regression based Automated Essay Scoring》。给定很多需要打分的文章后,首先需要构造出文章的特征,用到了人工设置特征和向量空间特征。
拼写错误 Spelling Errors :使用 pyenchant 包统计出拼写错误单词数量占总单词数量的比例。
统计特征 Statistical Features :统计字符数量,单词数量,句子数量,段落数量,停止词数量,命名实体数量,标点符号数量 (反映文章的组织情况),文本长度 (反映写作流畅程度),不同词汇的数量与总单词数的占比 (反映词汇量水平)。
词性统计 POS count :统计各种词性出现的频率,例如名词,动词,形容词,副词等,词性通过 nltk 包获取。
语法流畅特征 Grammatical Fluency :使用 link grammar (链语法) 解析句子,然后统计 links 的个数;统计 n 元组出现的概率;统计词性 n 元组出现的概率。
可读性 Readability :可读性分数是衡量文本组织以及文本句法和语义复杂程度的一个指标。采用了 Kincaid 可读性分数作为一个特征,计算公式如下
本体特征 Ontological Features :为每个句子打上标签,例如研究、假设、主张、引用、支持和反对等。
可以将一篇文章投影到一个向量空间模型中 (VSM),此时文章可以用向量空间中的一个特征向量表示,例如可以用 one-hot 编码表示一篇文章,长度等于词汇表长度,如果一个单词出现在文章中,则对应的位置置为 1,如下:
另外也可以使用 TF-IDF 向量表示文本,但是采用这种表示方式单词之间不存在任何关联,为了解决这个问题,文章中使用了一个单词相关性矩阵 W 加上线性变换从而引入单词之间的相关性。
单词的相关性矩阵 W 通过 word2vec 生成的词向量计算,即 W (i,j) = 单词 i 和单词 j 词向量的余弦相似度。
最后,为了考虑文章中单词的顺序问题,将文章拆分成 k 个段落,然后分别计算向量空间特征,融合在一起。
得到上述特征之后,采用 SVR 算法进行回归学习。数据集是 kaggle ASAP 比赛数据集,数据集包含 8 个集合的文章,评价指标采用 KAPPA 和相关系数,以下是一些实验效果。
这是在 8 个集合上分别使用 linear kernel 和 rbf kernel 的效果。
这是和人类打分者的对比。
以下内容出自论文《Neural Networks for Automated Essay Grading》,可以采用回归或者分类的方法进行训练,模型如下图所示。
论文中主要使用了三种方法构造出文章的特征向量:
论文中主要用了三种神经网络结构,NN (前向神经网络),LSTM 和 BiLSTM。所有的网络都会输出一个向量 h(out),根据 h(out) 构造出损失函数,下面分别是回归和分类的损失函数。
回归损失
分类损失
第一种模型:NN (前向神经网络)
使用了两层前向神经网络,网络输入的文章特征向量是 Glove 词向量的平均值或者训练的词向量平均值。h(out) 的计算公式如下。
第二种模型:LSTM
LSTM 模型接受的输入是文章所有单词的词向量序列,然后将 LSTM 最后输出的向量作为文章的特征向量 h(out)。
第三种模型:BiLSTM
因为文章通常比较长,单向的 LSTM 容易丢失前面的信息,因此作者也使用了 BiLSTM 模型,将前向 LSTM 和后向 LSTM 模型的输出加在一起作为 h(out)。
添加 TF-IDF 向量
以上模型的输出 h(out) 都可以再加上 TF-IDF 向量提升性能,首先需要对 TF-IDF 向量降维,然后和模型的输出拼接在一起,如下图所示 (BiLSTM 为例子)。
《Regression based Automated Essay Scoring》
《Neural Networks for Automated Essay Grading》
bilstm模型结构
biLSTM即双向LSTM,它是由两个单独的两个lstm组合合成,为了更直观的理解,我画了下面的图
组合起来就是下面的图
注意上图只是一层的bilstm,如果是多层的bilstm,则是两个不同方向的多层lstm按照上图拼接在一起
最终的每个时间步i输出hi = [hi,hi^],[ ]表示拼接操作,即如果lstm的隐层维度是50,那么bilstm的维度为100
基于BiLSTM-CNN-CRF的中文分词(一)
在序列标注任务(中文分词CWS,词性标注POS,命名实体识别NER等)中,目前主流的深度学习框架是BiLSTM+CRF。其中BiLSTM融合两组学习方向相反(一个按句子顺序,一个按句子逆序)的LSTM层,能够在理论上实现当前词即包含历史信息、又包含未来信息,更有利于对当前词进行标注。BiLSTM在时间上的展开图如下所示。
若输入句子由120个词组成,每个词由100维的词向量表示,则模型对应的输入是(120,100),经过BiLSTM后隐层向量变为T1(120,128),其中128为模型中BiLSTM的输出维度。如果不使用CRF层,则可以在模型最后加上一个全连接层用于分类。设分词任务的目标标签为B(Begin)、M(Middle)、E(End)、S(Single),则模型最终输出维度为(120,4)的向量。对于每个词对应的4个浮点值,分别表示对应BMES的概率,最后取概率大的标签作为预测label。通过大量的已标注数据和模型不断迭代优化,这种方式能够学习出不错的分词模型。
然鹅,虽然依赖于神经网络强大的非线性拟合能力,理论上我们已经能够学习出不错的模型。但是,上述模型只考虑了标签上的上下文信息。对于序列标注任务来说,当前位置的标签L_t与前一个位置L_t-1、后一个位置L_t+1都有潜在的关系。
例如,“我/S 喜/B 欢/E 你/S”被标注为“我/S 喜/B 欢/B 你/S”,由分词的标注规则可知,B标签后只能接M和E,因此上述模型利用这种标签之间的上下文信息。因此,自然语言处理领域的学者们提出了在模型后接一层CRF层,用于在整个序列上学习最优的标签序列。添加CRF层的模型如下图所示。
上述图片出自 。
模型通过下述公式计算最优标注序列,A矩阵是标签转移概率,P矩阵是BiLSTM的预测结果。
模型训练的时候,对于每个序列 y 优化对数损失函数,调整矩阵A的值。
当模型训练完成,模型预测的时候,按如下公式寻找最优路径:
Y_x表示所有可能的序列集合,y*表示集合中使得Score函数最大的序列。
(以上为论文的核心部分,其它细节请参阅原文)
至此,我们已经大致了解BiLSTM-CRF的原理。对于分词任务,当前词的标签基本上只与前几个和和几个词有关联。BiLSTM在学习较长句子时,可能因为模型容量问题丢弃一些重要信息,因此我在模型中加了一个CNN层,用于提取当前词的局部特征。CNN用于文本分类的模型如下。
设句子输入维度为(120,100),经过等长卷积后得到T2(120,50),其中50为卷积核个数。对于当前词对应的50维向量中,包含了其局部上下文信息。我们将T1与T2拼接,得到T3(120,178),T3通过全连接层得到T4(120,4),T4输入至CRF层,计算最终最优序列。最终模型BiLSTM-CNN-CRF如下。
本文模型并不复杂,下文将讲述一下我实现时的一些细节。主要包括:
1. 模型输入需要固定长度,如何解决
2. 如何做好模型的实时训练
3. 与结巴分词的性能比较
4. 如何做成微信分词工具、分词接口服务
Bert加bilstm和crf做ner的意义
bert为什么加不加crf都行,加crf好处在哪?
加crf:相当于是显式地去捕捉标签之间的依赖关系。
但是为什么很多人说bert和bert+crf效果差不多,我觉得bert能够表达的语义空间足够丰富,去捕捉到标签之间的依赖关系。也有人说bert+crf还是会好一些,我认为可能是数据集相关特性的关系,或者调参等等原因。
1.BERT+BiLSTM+CRFBiLSTM+CRF
多了一层BERT初始化word embedding,比随机初始化肯定要好,这个就不多解释了。
2.BERT+BiLSTM+CRFBERT+CRF
首先BERT使用的是transformer,而transformer是基于self-attention的,也就是在计算的过程当中是弱化了位置信息的(仅靠position embedding来告诉模型输入token的位置信息),而在序列标注任务当中位置信息是很有必要的,甚至方向信息也很有必要(我记得复旦大学去年的一篇NER论文TENER当中有提到过这一点,感兴趣可以直接知乎搜TENER),所以我们需要用LSTM习得观测序列上的依赖关系,最后再用CRF习得状态序列的关系并得到答案,如果直接用CRF的话,模型在观测序列上学习力就会下降,从而导致效果不好。(纯属个人见解)
关于bilstm是谁发明的和的介绍到此就结束了,不知道你从中找到你需要的知识了吗?如果你还想了解更多百科问答相关的内容,记得收藏关注本站。
版权声明
本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。
评论