当前位置:首页 > 数码 > NLP疑问实战-和Transformer模型-基于LSTM-RNN (nlp问题)

NLP疑问实战-和Transformer模型-基于LSTM-RNN (nlp问题)

admin5个月前 (05-07)数码18

译者|朱先忠

审校|重楼

简介

GPT等言语模型最近变得十分盛行,并被运行于各种文本生成义务,例如在或其他会话人工默认系统中。理论,这些言语模型规模渺小,经常经常使用超越数百亿个参数,并且须要少量的计算资源和资金来运转。

在英语模型的背景下,这些庞大的模型被适度参数化了,由于它们经常使用模型的参数来记忆和学习咱们这个环球的各个方面,而不只仅是为英语建模。假设咱们要开发一个运行程序,要求模型只了解言语及其结构,那么咱们或者会经常使用一个小得多的模型。

留意:您可以在本文提供的Jupyter笔记本上找到在训练好的模型上运转推理的完整源代码。

疑问形容

假定咱们正在构建一个滑动键盘系统,该系统试图预测你下一次性在手机上键入的单词。基于滑动形式跟踪的形式,用户想要的单词存在很多或者性。但是,这些或者的单词中有许多并不是英语中的实践单词,可以被删除。即使在这个最后的修剪和消弭步骤之后,仍有许多候选者,咱们须要为用户选用其中之一作为倡导。

为了进一步修剪这个候选词列表,咱们可以经常使用基于深度学习的言语模型,该模型能够检查所提供的高低文,并通知咱们哪一个候选者最有或者成功句子。

例如,假设用户键入句子I’vescheduledthis(我曾经布置好了),而后按如下图所示滑动一个形式:

而后,用户或者想要的一些英语单词是:

但是,假设咱们细心想想,很或者用户的意思是散会,而不是捣鬼,由于句子前半局部有scheduled(预约)一词。

思考到目前为止咱们所知道的一切,咱们可以选用什么打算以便经过编程启动调整呢?让咱们在上方的部散施展头脑风暴,想出一些处置打算。

头脑风暴处置打算

算法和数据结构

经常使用第一性原理(firstprinciples),从数据语料库开局,找到组合在一同的成对单词,并训练一个马尔可夫模型()来预测句子中出现成对单词的概率,这仿佛是正当的。但是,您会留意到这种方法存在两个关键疑问。

接上去,让咱们把重点转移到应用英语实质的处置打算上,看看这能否能对咱们有所协助。

人造言语处置

从历史上看,NLP(人造言语处置)畛域触及了解句子的词性,并经常使用这些信息来口头这种修剪和预测决策。可以构想这样的情景:经常使用与每个单词关系联的一个POS标签来确定句子中的下一个单词能否有效。

但是,计算一个句子的词性的环节自身就是一个复杂的环节,须要对言语有专门的了解,正如NLTK的词性标志页面所证实的那样。

接上去,让咱们来看一种基于深度学习的方法,它须要更多的标志数据,但不须要那么多的言语专业常识来构建。

深度学习(神经网络)

深度学习的出现推翻了NLP畛域。随着基于LSTM和Transformer的言语模型的发明,处置打算理论包括向模型抛出一些高品质的数据,并对其启动训练以预测下一个单词。

从实质上讲,这就是GPT模型正在做的事件。GPT模型总是被始终训练来预测给定句子前缀的下一个单词(标志)。

例如,给定句子前缀Itissowouldawould,模型很或者会为句子前面的单词提供以下高概率预测。

以下单词成功句子前缀的概率也或者较低。

Transformer模型体系结构(hine_learning_model)是ChatGPT等系统的外围。但是,关于学习英语语义的更受限度的运行场景,咱们可以经常使用更廉价的运转模型架构,例如LSTM(长短期记忆)模型。

LSTM模型

接上去,让咱们构建一个便捷的LSTM模型,并训练它来预测给定标志(token)前缀的下一个标志。如今,你或者会问什么是标志。

符号化

理论,关于言语模型,标志可以示意:

将单个字符(或字节)映射到标志是十分有限度的,由于咱们要重载该标志,以保留关于它出现位置的少量高低文。这是由于,例如,c这个字符出如今许多不同的单词中,在咱们看到c之后预测下一个字符须要咱们仔细观察疏导高低文。

将一个单词映射到一个标志也是有疑问的,由于英语自身有25万到100万个单词。此外,当一个新词被减少到言语中时会出现什么呢?咱们须要回去从新训练整个模型来解释这个新词吗?

子词标志化(Sub-wordtokenization)被以为是2023年的行业规范。它将频繁出如今一同的字节的子字符串调配给惟一的标志。理论,言语模型有几千(比如4000)到数万(比如60000)个共同的标志。确定什么导致标志的算法由BPE(字节对编码:Bytepairencoding)算法确定。

要选用词汇表中惟一标志的数量(称为词汇表大小),咱们须要留意以下几点:

因此,咱们须要在选用词汇量时启动平衡。在本例中,咱们选取6600个标志,并用6600的词汇大小训练咱们的标志生成器。接上去,让咱们来看看模型定义自身。

PyTorch模型

模型自身十分便捷。咱们创立了以下几个层:

整个模型具备约31M个可训练参数,总大小约为120MiB。

上方给出的是模型的PyTorch代码。

classWordPredictionLSTMModel(nn.Module):def__init__(self,num_embed,embed_dim,pad_idx,lstm_hidden_dim,lstm_num_layers,output_dim,dropout):super().__init__()self.vocab_size=num_embedself.embed=nn.Embedding(num_embed,embed_dim,pad_idx)self.lstm=nn.LSTM(embed_dim,lstm_hidden_dim,lstm_num_layers,batch_first=True,dropout=dropout)self.fc=nn.Sequential(nn.Linear(lstm_hidden_dim,lstm_hidden_dim*4),nn.LayerNorm(lstm_hidden_dim*4),nn.LeakyReLU(),nn.Dropout(p=dropout),nn.Linear(lstm_hidden_dim*4,output_dim),)#defforward(self,x):x=self.embed(x)x,_=self.lstm(x)x=self.fc(x)x=x.permute(0,2,1)returnx##

以下是经常使用torchinfo库输入的模型摘要信息。

LSTM模型摘要

=================================================================Layer(type:depth-idx)Param#=================================================================WordPredictionLSTMModel-├─Embedding:1–13,379,200├─LSTM:1–24,087,200├─Sequential:1–3-│└─Linear:2–12,474,328│└─LayerNorm:2–26,288│└─LeakyReLU:2–3-│└─Dropout:2–4-│└─Linear:2–520,757,000=================================================================Totalparams:30,704,016Trainableparams:30,704,016Non-trainableparams:0=================================================================

解释准确性:在P100GPU上对该模型启动了约8小时的12M英语句子训练后,咱们取得了4.03的损失值、29%的前1名准确率和49%的前5名准确率。这象征着,29%的期间中该模型能够正确预测下一个标志,而49%的期间中训练集中的下一个标志是该模型的前5个预测之一。

那么,咱们的成功目的应该是什么?虽然咱们模型的前1名和前5名精度数字并不令人印象深入,但它们对咱们的疑问并不那么关键。咱们的候选单词是一小组合乎滑动形式的或者单词。咱们宿愿咱们的模型能够选用一个现实的候选者来成功句子,使其在语法和语义上连接分歧。由于咱们的模型经过训练数据学习言语的性质,咱们宿愿它能为连接句子调配更高的概率。例如,假设咱们有一个句子Thebaseballplayer(棒球静止员)和或者的补全词(ran、swim、hid),那么ran这个词比其他两个词更适宜后续经常使用。因此,假设咱们的模型预测单词ran的概率比其他单词高,那么它对咱们来说是有效的。

解释损失值:损失值4.03象征着,预测的负对数或者性为4.03;这象征着,正确预测下一个标志的概率为e^-4.03=0.0178或1/56。随机初始化的模型理论具备大概8.8的损失值,即-log_e(1/6600),由于该模型随机预测1/6600个标志(6600是词汇表大小)。虽然4.03的损失值仿佛不大,但关键的是要记住,经过训练的模型比未经训练(或随机初始化)的模型好大概120倍。

接上去,让咱们看看如何经常使用此模型来改良滑动键盘的倡导。

经常使用模型修剪有效倡导

让咱们来看一个实在的例子。假定咱们有一个局部成功的句子Ithink,用户做出上方蓝色所示的滑动形式,从o开局,在字母c和v之间,并在字母e和v之间完结。

可以用这种滑动形式示意的一些或者的单词是:

在这些倡导中,最有或者的或者是I’ve。让咱们将这些倡导输入到咱们的模型中,看看它会发生什么结果。

[Ithink][I've]=0.00087[Ithink][over]=0.00051[Ithink][ice]=0.00001[Ithink][Oct]=0.00000

=符号后的值是单词有效成功句子前缀的概率。在这种状况下,咱们看到我曾经这个词被赋予了最高的概率。因此,它是最有或者跟在句子前缀Ithink前面的词。

下一个疑问是:咱们如何计算下一个单词的概率。

计算下一个单词的概率

为了计算一个单词是句子前缀的有效成功的概率,咱们在eval(推理)形式下运转模型,并输入标志化的句子前缀。在为单词减少空白前缀后,咱们还将该单词标志化。这样做是由于HuggingFace预标志化器在单词扫尾用空格分隔单词,所以咱们宿愿确保咱们的输入与HuggingFace标志化器经常使用的标志化战略分歧。

让咱们假定候选单词由3个标志T0、T1和T2组成。

probs列表蕴含按顺序生成标志T0、T1和T2的各个概率。由于这些标志对应于候选词的标志化,咱们可以将这些概率相乘,获取候选词成功句子前缀的组合概率。

用于计算成功概率的代码如下所示。

defget_completion_probability(self,input,completion,tok):self.model.eval()ids=tok.encode(input).idsids=torch.tensor(ids,device=self.device).unsqueeze(0)completion_ids=torch.tensor(tok.encode(completion).ids,device=self.device).unsqueeze(0)probs=[]foriinrange(completion_ids.size(1)):y=self.model(ids)y=y[0,:,-1].softmax(dim=0)#prob是成功的概率。prob=y[completion_ids[0,i]]probs.end(prob)ids=torch.cat([ids,completion_ids[:,i:i+1]],dim=1)#returntorch.tensor(probs)#

咱们可以在上方看到更多的例子。

[Thatice-creamlooks][really]=0.00709[Thatice-creamlooks][delicious]=0.00264[Thatice-creamlooks][absolutely]=0.00122[Thatice-creamlooks][real]=0.00031[Thatice-creamlooks][fish]=0.00004[Thatice-creamlooks][paper]=0.00001[Thatice-creamlooks][atrocious]=0.00000[Sincewe'reheading][toward]=0.01052[Sincewe'reheading][away]=0.00344[Sincewe'reheading][against]=0.00035[Sincewe'reheading][both]=0.00009[Sincewe'reheading][death]=0.00000[Sincewe'reheading][bubble]=0.00000[Sincewe'reheading][birth]=0.00000[DidImake][a]=0.22704[DidImake][the]=0.06622[DidImake][good]=0.00190[DidImake][food]=0.00020[DidImake][color]=0.00007[DidImake][house]=0.00006[DidImake][colour]=0.00002[DidImake][pencil]=0.00001[DidImake][flower]=0.00000[Wewantacandidate][with]=0.03209[Wewantacandidate][that]=0.02145[Wewantacandidate][experience]=0.00097[Wewantacandidate][which]=0.00094[Wewantacandidate][more]=0.00010[Wewantacandidate][less]=0.00007[Wewantacandidate][school]=0.00003[Thisisthedefinitiveguidetothe][the]=0.00089[Thisisthedefinitiveguidetothe][complete]=0.00047[Thisisthedefinitiveguidetothe][sentence]=0.00006[Thisisthedefinitiveguidetothe][rapper]=0.00001[Thisisthedefinitiveguidetothe][illustrated]=0.00001[Thisisthedefinitiveguidetothe][extravagant]=0.00000[Thisisthedefinitiveguidetothe][wrapper]=0.00000[Thisisthedefinitiveguidetothe][miniscule]=0.00000[Pleasecanyou][check]=0.00502[Pleasecanyou][confirm]=0.00488[Pleasecanyou][cease]=0.00002[Pleasecanyou][cradle]=0.00000[Pleasecanyou][laptop]=0.00000[Pleasecanyou][envelope]=0.00000[Pleasecanyou][options]=0.00000[Pleasecanyou][cordon]=0.00000[Pleasecanyou][corolla]=0.00000[Ithink][I've]=0.00087[Ithink][over]=0.00051[Ithink][ice]=0.00001[Ithink][Oct]=0.00000[Please][can]=0.00428[Please][cab]=0.00000[I'vescheduledthis][meeting]=0.00077[I'vescheduledthis][messing]=0.00000

这些例子显示了单词在它之前成功句子的概率。候选词按概率递减的顺序陈列。

由于Transformer正在缓缓取代基于序列的义务的LSTM和RNN模型,让咱们来看看针对相反目的的Transformer模型会是什么样子。

一种Transformer(转换器)模型

基于转换器的模型是一种十分盛行的架构,用于训练言语模型来预测句子中的下一个单词。咱们将经常使用的详细技术是因果留意(causalattention)机制。咱们将经常使用因果留意来训练PyTorch中的转换器编码器层。因果留意象征着:咱们将准许序列中的每个标志只检查其之前的标志。这相似于单向LSTM层在仅向前训练时经常使用的信息。

咱们将在这里看到的Transformer模型间接基于nn.TransformerEncoder和PyTorch中的nn.TransformerEncoderLayer。

importmathdefgenerate_src_mask(sz,device):returntorch.triu(torch.full((sz,sz),True,device=device),diagnotallow=1)#classPositionalEmbedding(nn.Module):def__init__(self,sequence_length,embed_dim):super().__init__()self.sqrt_embed_dim=math.sqrt(embed_dim)self.pos_embed=nn.Parameter(torch.empty((1,sequence_length,embed_dim)))nn.init.uniform_(self.pos_embed,-1.0,1.0)#defforward(self,x):returnx*self.sqrt_embed_dim+self.pos_embed[:,:x.size(1)]##classWordPredictionTransformerModel(nn.Module):def__init__(self,sequence_length,num_embed,embed_dim,pad_idx,num_heads,num_layers,output_dim,dropout,norm_first,activation):super().__init__()self.vocab_size=num_embedself.sequence_length=sequence_lengthself.embed_dim=embed_dimself.sqrt_embed_dim=math.sqrt(embed_dim)self.embed=nn.Sequential(nn.Embedding(num_embed,embed_dim,pad_idx),PositionalEmbedding(sequence_length,embed_dim),nn.LayerNorm(embed_dim),nn.Dropout(p=0.1),)encoder_layer=nn.TransformerEncoderLayer(d_model=embed_dim,nhead=num_heads,dropout=dropout,batch_first=True,norm_first=norm_first,activatinotallow=activation,)self.encoder=nn.TransformerEncoder(encoder_layer,num_layers=num_layers)self.fc=nn.Sequential(nn.Linear(embed_dim,embed_dim*4),nn.LayerNorm(embed_dim*4),nn.LeakyReLU(),nn.Dropout(p=dropout),nn.Linear(embed_dim*4,output_dim),)#defforward(self,x):src_attention_mask=generate_src_mask(x.size(1),x.device)x=self.embed(x)x=self.encoder(x,is_causal=True,mask=src_attention_mask)x=self.fc(x)x=x.permute(0,2,1)returnx##

咱们可以用这个模型替代咱们之前经常使用的LSTM模型,由于它是API兼容的。关于相反数量的训练数据,该模型须要更长的期间来训练,并且具备可比拟的性能。

Transformer模型更适宜长序列。在咱们的例子中,咱们有长度为256的序列。口头下一个单词补全所需的大少数高低文往往是本地的,所以咱们在这里并不真正须要借助转换器的力气。

论断

在本文中,咱们学习了如何经常使用基于LSTM(RNN)和Transformer模型的深度学习技术来处置十分实践的NLP疑问。并不是每个言语义务都须要使用具备数十亿参数的模型。须要建模言语自身而不须要记忆少量信息的专业运行程序可以经常使用更小的模型来处置,这些模型可以比咱们如今看到的大规模言语模型更容易、更高效地部署。

注:本文中一切图片均由作者自己创作。

译者引见

朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教员,自在编程界老兵一枚。

原文题目:LanguageModelsforSentenceCompletion,作者:DhruvMatani


NLP

RNN的研究发展过程

1982年,美国加州理工学院物理学家John hopfield 发明了一种单层反馈神经网络 Hopfield network,用来解决组合优化问题。 这是最早的RNN的雏形。 86年,michael I. Jordan 定义了recurrent的概念,提出 Jordan network。 1990年, 美国认知科学家Jeffrey L. Elman 对jordan network进行了简化,并采用BP算法进行训练,便有了如今最简单的包含单个自连接节点的RNN 模型。 但此时RNN由于梯度消失(gradient vanishing)及梯度爆炸(gradient exploding)的问题,训练非常困难,应用非常受限。 直到1997年,人工智能研究所的主任Jurgen Schmidhuber 提出长短期记忆(LSTM),LSTM使用门控单元及记忆机制大大缓解了早期RNN训练的问题。 同样在1997年,Mike Schuster 提出双向RNN模型(Bidirectional RNN)。 这两种模型大大改进了早期RNN结构,拓宽了RNN的应用范围,为后续序列建模的发展奠定了基础。 此时RNN虽然在一些序列建模任务上取得了不错的效果,但由于计算资源消耗大,后续几年一直没有太大的进展。 2010年,Tomas Mikolov对bengio提出的feedforward Neural network language model (NNLM) 进行了改进,提出了基于RNN的语言模型(RNN LM),并将其用在语音识别任务中,大幅提升了识别精度。 再此基础上Tomas Mikolov于2013年提出了大名鼎鼎的word2vec,与NNLM及RNNLM不同,word2vec的目标不再专注于建模语言模型,而是如何利用语言模型学习每个单词的语义化向量(distributed representation),其中distributed representation概念最早要来源于Hinton 1986年的工作。 Word2vec引发了深度学习在自然语言处理领域的浪潮,除此之外还启发了knowledge representation,network representation等新的领域。 另一方面,2014年,Bengio团队与google几乎同时提出了seq2seq架构,将RNN用于机器翻译。 没过多久,Bengio团队又提出attention机制,对seq2seq架构进行改进。 自此机器翻译全面进入到神经机器翻译(NMT)的时代,NMT不仅过程简单,而且效果要远超统计机器翻译的效果。 目前主流的机器翻译系统几乎都采用了神经机器翻译的技术。 除此之外,attention机制也被广泛用于基于深度学习的各种任务中。 近两年,相关领域仍有一些突破性进展,2017年,facebook人工智能实验室提出基于卷积神经网络的seq2seq架构,将rnn替换为带有门控单元的cnn,提升效果的同时大幅加快了模型训练速度,此后不久,google提出transformer架构,使用self-attention代替原有的RNN及CNN,更进一步降低了模型复杂度。 在词表示学习方面,Allen人工智能研究所2018年提出上下文相关的表示学习方法ELMo,利用双向LSTM语言模型对不同语境下的单词学习不同的向量表示,在6个nlp任务上取得了提升。 OpenAI团队在此基础上提出预训练模型GPT,把LSTM替换为transformer来训练语言模型,在应用到具体任务时,与之前学习词向量当作特征的方式不同,GPT直接在预训练得到的语言模型最后一层接上softmax作为任务输出层,然后再对模型进行微调,在多项任务上GPT取得了更好的效果。 不久之后,Google提出BERT模型,将GPT中的单向语言模型拓展为双向语言模型(Masked Language Model),并在预训练中引入了sentence prediction任务。 BERT模型在11个任务中取得了最好的效果,是深度学习在nlp领域又一个里程碑式的工作。

AI干货分享:PaddlePaddle官方九大NLP模型盘点

引言自然语言处理(NLP)主要是研究实现人与计算机之间用自然语言进行有效通信的各种理论和方法。 基于神经网络的深度学习技术具有强大的表达能力、端到端解决问题的能力,因而在NLP任务的应用上越来越广泛和有效。 近日,网络PaddlePaddle开源了语义表示模型ERNIE,在多个中文NLP任务上表现超越了谷歌的BERT(请参考链接),展示了网络在NLP技术的领先能力,同时也表明PaddlePaddle作为国内目前唯一功能完备的深度学习平台,在不断得夯实框架能力,并引领技术进步。 实际上除了ERNIE,PaddlePaddle官方还有很多其他的NLP模型,覆盖了包括语义表示、语义匹配、阅读理解、机器翻译、语言模型、情感倾向分析、词法分析等各项NLP任务。 本文将对这些模型做一些梳理和介绍。 语义表示-ERNIE知识增强的语义表示模型ERNIE(EnhancedRepresentationthroughkNowledgeIntEgration)通过对词、实体等语义单元的掩码,使得模型学习完整概念的语义表示。 相较于BERT学习原始语言信号,ERNIE直接对先验语义知识单元进行建模,增强了模型语义表示能力。 ERNIE模型本身保持基于字特征输入建模,使得模型在应用时不需要依赖其他信息,具备更强的通用性和可扩展性。 相对词特征输入模型,字特征可建模字的组合语义,例如建模红色,绿色,蓝色等表示颜色的词语时,通过相同字的语义组合学到词之间的语义关系。 此外,ERNIE的训练语料引入了多源数据知识。 除了百科类文章建模,还对新闻资讯类、论坛对话类数据进行学习,这里重点介绍下论坛对话建模。 对于对话数据的学习是语义表示的重要途径,往往相同回复对应的Query语义相似。 基于该假设,ERINE采用DLM(DialogueLanguageModel)建模Query-Response对话结构,将对话Pair对作为输入,引入DialogueEmbedding标识对话的角色,利用DialogueResponseLoss学习对话的隐式关系,通过该方法建模进一步提升模型语义表示能力。 ERNIE在语言推断、语义相似度、命名实体识别、情感分析、问答匹配等自然语言处理(NLP)各类中文任务上的验证显示,模型效果全面超越BERT,如下表所示。 项目地址:ERNIE:语义匹配-DAM,AnyQ-SimNet语义匹配是一种用来衡量文本相似度的NLP任务。 很多NLP的任务可以转化为语义匹配问题。 比如搜索可以认为是查询词与文档之间的语义匹配问题,对话系统、智能客服可以认为是问题和回答之间的语义匹配问题。 PaddlePaddle官方提供了两种语义匹配相关的模型:DAM和AnyQ-SimNet。 深度注意力匹配网络DAM(DeepAttentionMatchingNetwork)DAM是一个完全基于Attention机制的神经匹配网络。 DAM的动机是为了在多轮对话中,捕获不同颗粒度的对话元素中的语义依赖,从而更好地在多轮上下文语境中回复。 它可用于检索式聊天机器人多轮对话中应答的选择。 DAM受启发于机器翻译的Transformer模型。 将Transformer关键的注意力机制从两个方面进行拓展,并将其引入到一个统一的网络之中。 (1)自注意力机制(Self-Attention)通过从词嵌入中叠加注意力机制,逐渐捕获不同颗粒度的语义表示。 这些多粒度的语义表示有助于探索上下文和回答的语义依赖。 (2)互注意力机制(Cross-Attention)贯穿于上下文和回答的注意力机制,可以捕获不同语段对的依赖关系,从而在多轮上下文的匹配回答中为文本关系提供互补信息。 DAM模型网络结构该模型在Ubuntu和豆瓣对话两个语料库上测试了多轮对话任务,如下表所示,相比其他模型有最优的效果。 DAM模型的效果对比PaddlePaddle开源的DAM项目提供了数据准备、模型训练和推理等详细的应用步骤。 该项目的地址为:是网络自主研发的语义匹配框架,该框架在网络内有广泛的应用,主要包括BOW、CNN、RNN、MM-DNN等核心网络结构形式,同时基于该框架也集成了学术界主流的语义匹配模型。 使用SimNet构建出的模型可以便捷的加入AnyQ系统中,增强AnyQ系统的语义匹配能力。 Paddle版本Simnet提供了BOW,CNN,LSTM及GRU四种网络实现,可以通过配置文件的形式灵活选择您需要的网络,损失函数,训练方式。 PaddlePaddle官方提供了完整的数据准备、训练和推理的相关使用方法。 SimNet项目链接:阅读理解-DuReader机器阅读理解是指让机器像人类一样阅读文本,提炼文本信息并回答相关问题。 对人类而言,阅读理解是获取外部知识的一项基本且重要的能力。 同样,对机器而言,机器阅读理解能力也是新一代机器人应具备的基础能力。 DuReader是一个解决阅读理解问题的端到端模型,可以根据已给的文章段落来回答问题。 模型通过双向Attention机制捕捉问题和原文之间的交互关系,生成Query-Aware的原文表示,最终基于Query-Aware的原文表示通过PointNetwork预测答案范围。 DuReader模型在最大的中文MRC开放数据集——网络阅读理解数据集上,达到了当前最好效果。 该数据集聚焦于回答真实世界中开放问题,相比其他数据集,它的优点包括真实的问题、真实的文章、真实的回答、真实的场景和翔实的标注。 DuReader受启发于三个经典的阅读理解模型(Bi-DAF、Match-LSTM和R-NET),是一个双向多阶段模型,共有5层:词嵌入层——用预训练词嵌入模型将每一个词映射到一个向量上编码层——用双向LSTM网络为每一个问题和段落的位置抽取上下文信息Attentionflow层——耦合问题和上下文向量,为上下文中的每一个词生成query-aware特征向量Fusion层——利用双向LSTM网络捕获上下文的词之间的相互信息解码层——通过问题的attention池化的answerpoint网络定位答案在段落中的位置。 PaddleGithub链接:机器翻译-TransformerTransformer最早是谷歌提出的一种用以完成机器翻译等Seq2Seq学习任务的一种全新网络结构,它完全使用Attention机制来实现序列到序列的建模,相比于以往NLP模型里使用RNN或者编码-解码结构,具有计算复杂度小、并行度高、容易学习长程依赖等优势,整体网络结构如图1所示。 图1:Transfomer模型结构Encoder由若干相同的layer堆叠组成,每个layer主要由多头注意力(Multi-HeadAttention)和全连接的前馈(Feed-Forward)网络这两个sub-layer构成。 Multi-HeadAttention在这里用于实现Self-Attention,相比于简单的Attention机制,其将输入进行多路线性变换后分别计算Attention的结果,并将所有结果拼接后再次进行线性变换作为输出。 参见图2,其中Attention使用的是点积(Dot-Product),并在点积后进行了scale的处理以避免因点积结果过大进入softmax的饱和区域。 Feed-Forward网络会对序列中的每个位置进行相同的计算(Position-wise),其采用的是两次线性变换中间加以ReLU激活的结构。 图2:多头注意力(Multi-HeadAttention)此外,每个sub-layer后还施以ResidualConnection和LayerNormalization来促进梯度传播和模型收敛。 PaddlePaddle官方提供了该模型的数据准备、训练和推理等方法。 目前在未使用modelaverage的情况下,英德翻译basemodel和bigmodel八卡训练100K个iteration后测试BLEU值如下表所示:Transformer模型支持同步或者异步的分布式训练。 Paddle官方提供了详细的配置方法。 Github项目地址:语言模型-LSTM,GRURNN、LSTM和GRU是深度学习在NLP中应用的基础语言模型。 RNN模型在同一个单元中,每个时刻利用当前和之前输入,产生当前时刻的输出,能够解决一定时序的问题,但是受到短时记忆影响,很难将信息从较早的时间传到较晚的时间。 LSTM通过引入门结构(forget,input,output三种门结构),能够将序列的信息一直传递下去,能够将较早的信息也引入到较晚的时间中来,从而客服短时记忆。 GRU与LSTM非常相似,但是只有两个门(update,reset),因而参数更少,结构简单,训练更简单。 Paddle提供了基于PennTreeBank(PTB)数据集的经典循环神经网络LSTM语言模型实现,通过学习训练数据中的序列关系,可以预测一个句子出现的的概率。 Paddle也提供了基于PennTreeBank(PTB)数据集的经典循环神经网络GRU语言模型实现,在LSTM模型基础上做了一些简化,保持效果基本持平的前提下,模型参数更少、速度更快。 Github链接:情感倾向分析-Senta情感倾向分析针对带有主观描述的中文文本,可自动判断该文本的情感极性类别并给出相应的置信度。 情感类型分为积极、消极、中性。 情感倾向分析能够帮助企业理解用户消费习惯、分析热点话题和危机舆情监控,为企业提供有力的决策支持。 Senta模型是目前最好的中文情感分析模型,可自动判断中文文本的情感极性类别并给出相应的置信度。 它包含有以下模型:?Bow(BagOfWords)模型--是一个非序列模型。 使用基本的全连接结构。 ?浅层CNN模型--是一个基础的序列模型,能够处理变长的序列输入,提取一个局部区域之内的特征。 ?单层GRU模型--序列模型,能够较好地解序列文本中长距离依赖的问题。 ?单层LSTM模型--序列模型,能够较好地解决序列文本中长距离依赖的问题。 ?双向LSTM模型--序列模型,通过采用双向LSTM结构,更好地捕获句子中的语义特征。 网络AI平台上情感倾向分析模块采用此模型进行训练和预测。 下图展示了这种模型的原理。 基于Bi-LSTM的情感分类模型总体来说,基于Bi-LSTM的情感分类模型包括三层:单词语义层,句子语义层,输出层。 1.单词语义层,主要是将输入文本中的每个单词转化为连续的语义向量表示,也就是单词的Embedding。 2.句子语义层,通过Bi-LSTM网络结构,将单词语义的序列转化为整个句子的语义表示。 3.输出层,基于句子语义计算情感倾向的概率。 在PaddlePaddle的该模型项目地址上,给出来在C-API目录下给出了bilstm_net模型的下载脚本,可供用户下载使用(模型可支持C-API、python两种预测方式),该模型在网络自建数据集上的效果分类准确率为90%。 Github项目地址:中文词法分析-LACLAC是一个联合的词法分析模型,能够整体性地完成中文分词、词性标注、专名识别等NLP任务。 LAC既可以认为是LexicalAnalysisofChinese的首字母缩写,也可以认为是LACAnalyzesChinese的递归缩写。 中文分词--是将连续的自然语言文本,切分成具有语义合理性和完整性的词汇序列的过程词性标注(Part-of-Speechtagging或POStagging)--是指为自然语言文本中的每个词汇赋予一个词性的过程命名实体识别(NamedEntityRecognition简称NER)--即专名识别,是指识别自然语言文本中具有特定意义的实体,主要包括人名、地名、机构名、时间日期等LAC基于一个堆叠的双向GRU结构(Bi-GRU-CRF),在长文本上准确复刻了网络AI开放平台上的词法分析算法。 网络结构如下图所示。 用两个Bi-GRU堆叠的Bi-GRU-CRF网络Bi-GRU是GRU网络的一种拓展,由一个反向的GRU与一个正向的GRU耦合而成,将一个完整的句子作为。 两个GRU的输入相同,但是训练方向相反。 两个网络的结果拼接以后作为输出。 堆叠多个Bi-GRU可以形成深度的网络,从而能够促进语义的表示能力。 本模型堆叠了两层Bi-GRU。 之后,将Bi-GRU的输出连到一个全连接层。 它将Bi-GRU层的输出转为一个多维度向量,向量的维度是所有可能标签的数量。 整个网络最上方,使用了CRF(条件随机场)对最后的标签做联合解码。 效果方面,分词、词性、专名识别的整体准确率95.5%;单独评估专名识别任务,F值87.1%(准确90.3,召回85.4%),总体略优于开放平台版本。 在效果优化的基础上,LAC的模型简洁高效,内存开销不到100M,而速度则比网络AI开放平台提高了57%。 Github链接:官方模型库Github地址项目地址:

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: NLP