《三两下实现NLP训练和预测这四个框架你要知道.docx》由会员分享,可在线阅读,更多相关《三两下实现NLP训练和预测这四个框架你要知道.docx(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、三两下实现NLP训练和预测,这四个框架你要知道|狄东林刘元兴朱庆福胡景雯编辑|刘元兴崔一鸣来源|哈工大SCIRID:HIT_SCIR)引言随着人工智能的开展越来越多深度学习框架如雨后春笋般涌现例如PyTorch、TensorFlow、Keras、MXNet、Theano以及PaddlePaddle等。这些根底框架提供了构建一个模型需要的根本通用工具包。但是对于NLP相关的任务我们往往需要自己编写大量比拟繁琐的代码包括数据预处理以及训练经过中的工具等。因此大众通常基于NLP相关的深度学习框架编写自己的模型如OpenNMT、ParlAI以及AllenNLP等。借助这些框架三两下就可以实现一个NLP
2、相关根底任务的训练以及预测。但是当我们需要对根底任务进展改动时又被代码封装束缚举步维艰。因此本文主要针对于怎样使用框架实现自定义模型帮助大众快速解析框架的使用方法。我们首先介绍广泛用于NLP/CV领域的TensorFlow框架Tensor2Tensor该框架提供了NLP/CV领域中常用的根本模型。然后介绍NLP领域的AllenNLP框架该框架基于PyTorch平台开发为NLP模型提供了统一的开发架构。接着在介绍NLP领域中重要的两个子领域神经机器翻译以及对话系统常用的框架OpenNMT以及ParlAI。通过这四个框架的介绍祈望能帮助大众解析不同开发平台不同领域下的NLP框架的使用方式。一、Te
3、nsor2TensorTensor2Tensor1是一个基于TensorFlow的较为综合性的库既包括一些CV以及NLP的根本模型如LSTMCNN等也提供一些略微高级一点的模型如各式各样的GAN以及Transformer。对NLP的各项任务支持得都比拟全面很方便容易上手。由于该资源库仍处于不断开发经过中截止目前为止已经有3897次commit66个release版本178contributors。在2018年度?Attentionisallyouneed?这个全网热文中该仓库是官方提供的Transformer模型版本后面陆陆续续其余平台架构才逐渐补充完成。Tensor2TensorTransf
4、ormer使用方法注意有可能随着版本迭代更新的经过中会有部分改动安装环境1.安装CUDA9.0一定是9.0不能是9.22.安装TensorFlow如今是1.123.安装Tensor2Tensor(参考官网安装)开场使用1.数据预处理这一步骤是根据自己任务自己编写一些预处理的代码比方字符串格式化生成特征向量等操作。2.编写自定义problem编写自定义的problem代码一定需要在自定义类名前加装饰器registry.registry_problem。自定义problem的类名一定是驼峰式命名py文件名一定是下划线式命名且与类名对应。一定需要继承父类problemt2t已经提供用于生成数据的pr
5、oblem需要自行将自己的问题人脑分类找到对应的父类主要定义的父类problem有运行t2t-datagen可以查看到problemlist。一定需要在_init_.py文件里导入自定义problem文件。3.使用t2t-datagen将自己预处理后的数据转为t2t的格式化数据集【注意途径】运行t2t-datagen-help或者t2t-datagen-helpfull。例如cdscriptsamp;amp;t2t-datagen-t2t_usr_dir./-data_dir./train_data-tmp_dir./tmp_data-problemmy_problem假如自定义problem
6、代码的输出格式不正确那么此命令会报错4.使用t2t-trainer使用格式化的数据集进展训练运行t2t-trainer-help或者t2t-trainer-helpfull。例如1cdscriptsamp;amp;t2t-datagen-t2t_usr_dir./-data_dir./train_data-tmp_dir./tmp_data-problemmy_problem5.使用t2t-decoder对测试集进展预测【注意途径】假如想使用某一个checkpoint时的结果时需要将checkpoint文件中的第一行:model_checkpoint_path:“model.ckpt-xxxx
7、的最后的序号修改即可。例如cdscriptsamp;amp;t2t-decoder-t2t_usr_dir./-problemmy_problem-data_dir./train_data-modeltransformer-hparams_settransformer_base-output_dir./output-decode_hparamsbeam_size5,alpha0.6-decode_from_file./decode_in/test_in.txt-decode_to_file./decode_out/test_out.txt6.使用t2t-exporter导出训练模型7.分析结果
8、附:(整体代码)#codingutf-8fromtensor2tensor.utilsimportregistryfromtensor2tensor.data_generatorsimportproblem,text_problemsregistry.register_problemclassAttentionGruFeature(text_problems.Text2ClassProblem):ROOT_DATA_PATH./data_manager/PROBLEM_NAMEattention_gru_featurepropertydefis_generate_per_split(self)
9、:returnTruepropertydefdataset_splits(self):returnsplit:problem.DatasetSplit.TRAIN,shards:5,split:problem.DatasetSplit.EVAL,shards:1,propertydefapprox_vocab_size(self):return2*10#8kvocabsufficesforthissmalldataset.propertydefnum_classes(self):return2propertydefvocab_filename(self):returnself.PROBLEM_
10、NAME.vocab.%d%self.approx_vocab_sizedefgenerate_samples(self,data_dir,tmp_dir,dataset_split):deldata_dirdeltmp_dirdeldataset_split#withopen(self_antecedent_generate_sentences.pkl.format(self.ROOT_DATA_PATH),rb)asf:#getallthesentencesforantecedentidentification#_sentencespickle.load(f)#for_sentin_sen
11、tences:#sumpooling,FloatTensor,Size:400#_sent.input_vec_sum#sumpoolingwithfeature,FloatTensor,Size:468#_sent.input_vec_sum_feature#GRU,FloatTensor,Size:6100#_sent.input_vec_hidden#GRUwithfeature,FloatTensor,Size:6168#_sent.input_vec_hidden_feature#AttentionGRU,FloatTensor,Size:1600#_sent.input_vec_a
12、ttention#AttentionGRUwithfeature,FloatTensor,Size:1668#_sent.input_vec_attention_feature#tag(1forpositivecase,and0fornegativecase),Int,Size:1#_sent.antecedent_label#tag(1forpositivecase,and0fornegativecase),Int,Size:1#_sent.trigger_label#triggerwordfortheerroranalysis,Str#_sent.trigger#triggerwordau
13、xiliarytypefortheexperiment,Str#_sent.aux_type#theoriginalsentencefortheerroranalysis,Str#_sent.sen#yield#inputs:_sent.input_vec_attention_feature,#label:_sent.antecedent_label#withopen(./prep_ante_data/antecedent_label.txt)asantecedent_label,open(./prep_ante_data/input_vec_attention_gru_feature.txt
14、)asinput_vec:forlabalinantecedent_label:yieldinputs:input_vec.readline().strip()1:-2,label:int(labal.strip()antecedent_label.close()input_vec.close()#PROBLEM_NAMEattention_gru_feature#DATA_DIR./train_data_atte_feature#OUTPUT_DIR./output_atte_feature#t2t-datagen-t2t_usr_dir.-data_dir$DATA_DIR-tmp_dir
15、./tmp_data-problem$PROBLEM_NAME#t2t-trainer-t2t_usr_dir.-data_dir$DATA_DIR-problem$PROBLEM_NAME-modeltransformer-hparams_settransformer_base-output_dir$OUTPUT_DIRTensor2Tensor使用总结T2T是Google非官方提供的仓库是社区广阔爱好者共同努力建立的简单入门型框架底层封装TF能知足大局部CV以及NLP的任务很多主流成熟的模型也已经都有实现。直接继承或者实现一些框架内预设的接口就可以完成很多任务。入门起来非常友好并且文档更新
16、也较为及时。认真浏览文档或者浏览报错信息就可以解析并使用该框架方便许多非大幅创新模型的复现。二、AllenNLPAllenNLP是一个基于PyTorch的NLP研究库可为开发者提供语言任务中的各种业内最正确训练模型。官网提供了一个很好的入门教程2可以让初学者在30分钟内就解析AllenNLP的使用方法。AllenNLP使用方法由于AllenNLP已经帮我们实现很多费事琐碎的预处理以及训练框架我们实际需要编写的只有1.DatasetReaderDatasetReader的例如代码如下所示。fromtypingimportDict,Iteratorfromallennlp.dataimportIn
17、stancefromallennlp.data.fieldsimportTextFieldfromallennlp.data.dataset_readersimportDatasetReaderfromallennlp.data.token_indexersimportTokenIndexer,SingleIdTokenIndexerfromallennlp.data.tokenizersimportWordTokenizer,TokenizerDatasetReader.register(custom)classCustomReader(DatasetReader):def_init_(se
18、lf,tokenizer:TokenizerNone,token_indexers:Dictstr,TokenIndexerNone)-None:super()._init_(lazyFalse)self.tokenizertokenizerorWordTokenizer()self.word_indexerstoken_indexersorword:SingleIdTokenIndexer(word)deftext_to_instance(self,_input:str)-Instance:fieldstokenized_inputself.tokenizer.tokenize(_input
19、)fieldsinputTextField(tokenized_input,self.word_indexers)returnInstance(fields)def_read(self,file_path:str)-IteratorInstance:withopen(file_path)asf:forlineinf:yieldself.text_to_instance(line)首先需要自定义_read函数写好读取数据集的方式通过yield方式返回构建一个instance需要的文本。然后通过text_to_instance函数将文本转化为instance。在text_to_instance函数
20、中需要对输入的文本进展切分然后构建fileld。self.tokenizer是用来切分文本成Token的。有Word级别的也有Char级别的。self.word_indexers是用来索引Token并转换为Tensor。同样TokenIndexer也有很多种在实现自己的模型之前可以看看官方文档有没有比拟符合自己需要的类型。假如你需要构建多个Vocabulary比方源语言的vocab以及目的语言的vocab就需要在这里多定义一个self.word_indexers。不同indexers在vocab中是通过SingleIdTokenIndexer函数初始化的namespace来区分的也就是15行代
21、码中最后一个的word。2.Model与PyTorch实现model的方式一样但需要注意的是Model.register()注册之后可以使用JsonNet进展模型选择假如你有多个模型可以直接修改Json值来切换不需要手动修改代码。由于AllenNLP封装了Trainer所以我们需要在model内实现或选择已有的评价指标这样在训练经过中就会自动计算评价指标。详细方法是在_init_方法中定义评价函数可以从在官方文档3上看看有没有假如没有的话就需要自己写。self.accCategoricalAccuracy()然后在forward方法中调用评价函数计算指标self.acc(output,labe
22、ls)最后在model的get_metrics返回对应指标的dict结果就行了。defget_metrics(self,reset:boolFalse)-Dictstr,float:returnacc:self.acc.get_metric(reset)3.Trainer一般来讲直接调用AllenNLP的Trainer方法就可以自动开场训练了。但是假如你有一些特殊的训练步骤比方GAN4你就不能单纯地使用AllenNLP的Trainer得把Trainer翻开进展每步的迭代可以参考4中trainer的写法。AllenNLP使用总结关于AllenNLP的学习代码可以参考5。由于AllenNLP是基于
23、PyTorch的代码风格以及PyTorch的风格根本一致因此假如你会用PyTorch那上手AllenNLP根本没有什么障碍。代码注释方面也比拟全模块封装方面比拟灵敏。AllenNLP的代码非常容易改动就像用纯的PyTorch一样灵敏。当然灵敏也就意味着很多复杂的实现AllenNLP目前还没有大局部可能都需要自己写。AllenNLP依赖了很多Python库近期也在更新。三、OpenNMTOpenNMT6是一个开源的神经机器翻译neuralmachinetranslation工程采用目前普遍使用的编码器-解码器encoder-decoder构造因此可以以用来完成文本摘要、回复生成等其他文本生成任务
24、。目前该工程已经开发出PyTorch、TensorFlow两个版本用户可以按需选取。本文以PyTorch版本7为例进展介绍。OpenNMT使用方法1.数据处理作为一个典型的机器翻译框架OpenNMT的数据主要包含source以及target两局部对应于机器翻译中的源语言输入以及目的语言翻译。OpenNMT采用TorchText中的Field数据构造来表示每个局部。用户自定义经过中如需添加source以及target外的其他数据可以参照sourcefield或者targetfield的构建方法如构建一个自定义的user_data数据fieldsuser_datatorchtext.data.Fi
25、eld(init_tokenBOS_WORD,eos_tokenEOS_WORD,pad_tokenPAD_WORD,include_lengthsTrue)其中init_token、eos_token以及pad_token分别为用户自定义的开场字符、完毕字符以及padding字符。Include_lengths为真时会同时返回处理后数据以及数据的长度。2.模型OpenNMT实现了注意力机制的编码器-解码器模型。框架定义了编码器以及解码器的接口在该接口下进一步实现了多种不同构造的编码器解码器可供用户按需组合如CNN、RNN编码器等。如用户需自定义特定构造的模块可以以遵循该接口进展设计以保证得到
26、的模块可以以及OpenNMT的其他模块进展组合。其中编码器解码器接口如下classEncoderBase(nn.Module):defforward(self,input,lengthsNone,hiddenNone):raiseNotImplementedErrorclassRNNDecoderBase(nn.Module):defforward(self,input,context,state,context_lengthsNone):raiseNotImplementedError3.训练OpenNMT的训练由Trainer.py中Trainer类控制该类的可定制化程度并不高只实现了最根
27、本的序列到序列的训练经过。对于多任务、对抗训练等复杂的训练经过需要对该类进展较大的改动。OpenNMT使用总结OpenNMT提供了基于PyTorch以及TensorFlow这两大主流框架的不同实现可以知足绝大多数用户的需求。对于根底框架的封装使得其丧失了一定的灵敏性但是对于编码器-解码器构造下文本生成的任务来讲可以省去数据格式、接口定义等细节处理将精力更多集中在其自定义模块上快速搭建出需要的模型。四、ParlAIParlAI是Facebook公司开发出的一个专注于对话领域在很多对话任务上共享训练以及评估对话模型的平台8。这个平台可以用于训练以及测试对话模型在很多数据集上进展多任务训练并且集成了
28、AmazonMechanicalTurk以便数据采集以及人工评估。ParlAI中的根本概念world定义了代理彼此交互的环境。世界必须施行一种parley方法。每次对parley的调用都会进展一次交互通常每个代理包含一个动作。agent可以是一个人一个简单的机器人可以重复它听到的任何内容完美调整的神经网络读出的数据集或可能发送消息或者与其环境交互的任何其他内容。代理有两个他们需要定义的主要方法defobserve(self,observation):用观察更新内部状态defact(self):根据内部状态生成动作observations是我们称之为代理的act函数返回的对象并且因为它们被输入到
29、其他代理的observe函数而被命名。这是ParlAI中代理与环境之间传递消息的主要方式。观察通常采用包含不同类型信息的python词典的形式。teacher是特殊类型的代理人。他们像所有代理一样施行act以及observe功能但他们也会跟踪他们通过报告功能返回的指标例如他们提出的问题数量或正确答复这些问题的次数。ParlAI的代码包含如下几个主要的文件夹9core包含框架的主要代码agents包含可以以及不同任务交互的代理examples包含不同循环的一些根本例如tasks包含不同任务的代码mturk包含设置MechanicalTurk的代码及MTurk任务样例。ParlAI使用方法Parl
30、AI内部封装了很多对话任务如ConvAI2以及评测如F1值以及hits1等等。使用ParlAI现有的数据代码和模型进展训练以及评测可以快速实现对话模型中的很多baseline模型。但由于代码封装性太强不建议使用它从头搭建自己的模型。想在根底上搭建自己的模型可以详细参考官网中的教程10。这里简单介绍直接利用内部的数据代码和模型进展训练以及评测的一个简单例子TrainaTransformeronTwitter1.打印一些数据集中的例子pythonexamples/display_data.py-ttwitter*#displayfirstexamplesfromtwitterdataset*2.训
31、练模型pythonexamples/train_model.py-ttwitter-mf/tmp/tr_twitter-mtransformer/ranker-bs10-vtim3600-candsbatch-ecandsbatch-data-parallelTrue#traintransformerranker3.评测之前训练出的模型pythonexamples/eval_model.py-ttwitter-mlegacy:seq2seq:0-mfmodels:twitter/seq2seq/twitter_seq2seq_model#Evaluateseq2seqmodeltrainedo
32、ntwitterfromourmodelzoo4.输出模型的一些预测pythonexamples/display_model.py-ttwitter-mf/tmp/tr_twitter-ecandsbatch#displaypredictionsformodelsavedatspecificfileontwitterParlAI使用总结ParlAI有自己的一套形式例如world、agent以及teacher等等。代码封装性十分好代码量宏大假如想查找一个中间结果需要一层一层查看调用的函数不容易进展修改。ParlAI中间封装了很多现有的baseline模型对于对话研究者可以快速实现baseline
33、模型。目前ParlAI还在更新不同版本之间的代码可能构造略有不同但是ParlAI的核心使用方法大致一样。五、总结本文介绍了四种常见框架构建自定义模型的方法。Tensor2Tensor涵盖比拟全面但是只支持TensorFlow。AllenNLP最大的优点在于简化了数据预处理、训练以及预测的经过。代码改起来也很灵敏但是一些工具目前官方还没有实现需要自己写。假如是比拟传统的编码器-解码器构造下文本生成任务使用OpenNMT能节省很多时间。但是假如是构造比拟新颖的模型使用OpenNMT搭建模型照旧是一个不小的挑战。ParlAI内部封装了很多对话任务方便使用者快速复现相关的baseline模型。但由于代
34、码封装性太强以及其特殊的形式使用ParlAI从头搭建自己的模型具有一定的挑战性。每个框架都有各自的优点以及弊端大众需结合自身情况以及使用方式进展选择。但是不建议每个框架都试一遍毕竟掌握每个框架还是需要一定时间本钱的。参考资料1s:/github/tensorflow/tensor2tensor 2s:/allennlp.org/tutorials 3s:/allenai.github.io/allennlp-docs/api/allennlp.training.metrics.html 4:/realworldnlpbook/blog/training-a-shakespeare-reciti
35、ng-monkey-using-rl-and-seqgan.html 5s:/github/mhagiwara/realworldnlp 6:/ 7s:/github/OpenNMT/OpenNMT-py 8:/parl.ai.s3-website.us-east-2.amazonaws/docs/tutorial_quick.html 9s:/ 10:/parl.ai.s3-website.us-east-2.amazonaws/docs/tutorial_basic.html (*本文为AI科技大本营转载文章转载请联络原)福利时刻入群介入每周抽奖扫码添加小助手回复大会参加福利群介入抽奖送礼AIProCon大会优惠票限时抢购中识别海报二维码即刻购票推荐浏览IBM重磅开源Power芯片指令集国产芯迎来新机遇你点的每个“在看我都认真当成了喜欢