在bAbI数据集上训练双分支循环网络

nlp
在bAbI数据集上训练双分支循环网络用于阅读理解。

根据一个故事和一个问题训练两个循环神经网络。然后查询结果合并向量以回答一系列bAbI任务。

结果与Weston等人提供的LSTM模型相当:“面向AI-Complete Question answer: A Set of先决条件玩具任务”http://arxiv.org/abs/1502.05698

任务数量 FB LSTM基线 Keras QA
QA1 -单个支持事实卡塔尔世界杯欧洲预选赛赛程表 50 100.0
两个支持的事实卡塔尔世界杯欧洲预选赛赛程表 20. 50.0
QA3 -三个支持的事实卡塔尔世界杯欧洲预选赛赛程表 20. 20.5
QA4 -两个精氨酸。关系 61 62.9
QA5 -三精氨酸。关系 70 61.9
QA6 -是/否问题 48 50.7
QA7 -计数 49 78.9
《神奇的魁地奇球》第八章-列表/集 45 77.2
QA9 -简单否定 64 64.0
QA10 -无限知识 44 47.7
QA11 -基本的共参考 72 74.9
QA12——连词 74 76.4
q13 -复合共参考 94 94.4
时间推理 27 34.8
QA15 -基本扣除 21 32.4
基本归纳法 23 50.6
QA17 -位置推理 51 49.1
尺寸推理 52 90.8
QA19 -寻径 8 9.0
QA20 -特工的动机 91 90.7

bAbI项目相关资源请参见:https://research.facebook.com/researchers/1543934539189348

注:

图书馆(keras)图书馆(readr)图书馆(stringr)图书馆(purrr)图书馆(宠物猫)图书馆(dplyr)
附加包:“dplyr”
以下对象从'package:stats'被屏蔽:filter, lag
以下对象从'package:base'被屏蔽:intersect, setdiff, setequal, union
#函数定义  -----------------------------------------------------tokenize_words<-函数(x) {x<-x% > %str_replace_all”([[:punct:]] +)”\ \1 ')% > %函数' ')% > %unlist()x (x! =""parse_stories<-函数(线,only_卡塔尔世界杯欧洲预选赛赛程表supporting =) {<-% > %函数”“n =2)% > %map_dfr宠物猫nid =as.integer(以下方式[[1]]),行=以下方式[[2]]))<-% > %变异分=地图(线,函数(以下方式,\ t) [[1]]),q =map_chr(分裂,以下方式(1]),一个=map_chr(分裂,以下方式(2]),卡塔尔世界杯欧洲预选赛赛程表支持=地图(分裂,以下方式(3.% > %函数”“)% > %unlist()% > %as.integer()),story_id =c0cumsum[(国家免疫日-nrow(。)>nid [-1))))% > %选择-分割)故事<-% > %过滤器is.na(一))% > %选择nid_story =story_id nid,故事=问)问题<-% > %过滤器!is.na(一))% > %选择-线)% > %left_join(故事,通过=“story_id”)% > %过滤器(nid_story<nid)如果(only_卡塔尔世界杯欧洲预选赛赛程表supporting) {问题<-问题% > %过滤器map2_lgl(nid_story,支卡塔尔世界杯欧洲预选赛赛程表持,以下方式%, %.y))问题% > %group_by, (story_id国家免疫日问题=问,回答=一)% > %总结故事=粘贴(故事,崩溃=”“),.groups =“保持”)% > %取消组()% > %变异问题=地图(问题,tokenize_words(方式)),故事=地图(故事,tokenize_words(方式)),id =row_number())% > %选择(id,问题,答案,故事)vectorize_stories<-函数(data, vocab, story_maxlen, query_maxlen){问题<-地图(数据问题,函数(x) {map_int(x,哪一个(以下方式= =词汇)})故事<-地图(数据的故事,函数(x) {map_int(x,哪一个(以下方式= =词汇)})# ""表示填充答案<-酸式焦磷酸钠c""词汇)函数(x) {as.integer(x= =数据回答)})列表问题=pad_sequences(问题,maxlen =query_maxlen),故事=pad_sequences(故事,maxlen =story_maxlen),答案=答案)#参数  --------------------------------------------------------------max_length<-99999embed_hidden_size<-50batch_size<-32时代<-40#数据准备  --------------------------------------------------------路径<-get_file帧=" -任务- v1 - 2. - tar.gz”起源=“https://s3.amazonaws.com/text - datasets/babi_tasks_1 - 20 - _v1 - 2. - tar.gz”)
加载Tensorflow 2.9.1版本
解压(路径,exdir =str_replace(路径,固定“gz”),“/”))路径<-str_replace(路径,固定“gz”),“/”)#默认QA1, 1000个样本# challenge = '%stasks_1-20_v1-2/ zh /qa1_singl卡塔尔世界杯欧洲预选赛赛程表e- supported -fact_%s.txt'# QA1, 10000个样本挑战' % stasks_1-20_v1-2 / en-10k qa1_sin卡塔尔世界杯欧洲预选赛赛程表gle-supporting-fact_ % s.txt '# QA2, 1000个样品#挑战<- "%stasks_1-20_v1-2/ zh /qa2_two- suppor卡塔尔世界杯欧洲预选赛赛程表ted -facts_%s.txt"# QA2, 10000个样本# challenge = '%stasks_1-20_v1-2/en-10k/qa2_two-卡塔尔世界杯欧洲预选赛赛程表 supported -facts_%s.txt'火车<-read_linesprintf(挑战,道路,“训练”))% > %parse_stories()% > %过滤器map_int(故事,长度(方式)< =max_length)测验<-read_linesprintf(挑战,道路,“测试”))% > %parse_stories()% > %过滤器map_int(故事,长度(方式)< =max_length)#提取词汇all_data<-bind_rows(火车、测试)词汇<-cunlist(all_data问题),all_data的答案,unlist(all_data故事)% > %独特的()% > %排序()#保留0通过pad_sequences屏蔽vocab_size<-长度(词汇)+1story_maxlen<-map_int(all_data的故事,长度(方式)% > %马克斯()query_maxlen<-map_int(all_data问题,长度(方式)% > %马克斯()#训练和测试集的向量化版本train_vec<-vectorize_stories(train, vocab, story_maxlen, query_maxlen)test_vec<-vectorize_stories(test, vocab, story_maxlen, query_maxlen)#定义模型  ------------------------------------------------------句子<-layer_input形状=c(story_maxlen),dtype =“int32”)encoded_sentence<-句子% > %layer_embeddinginput_dim =vocab_size,output_dim =embed_hidden_size)% > %layer_dropout率=0.3)问题<-layer_input形状=c(query_maxlen),dtype =“int32”)encoded_question<-问题% > %layer_embeddinginput_dim =vocab_size,output_dim =embed_hidden_size)% > %layer_dropout率=0.3)% > %layer_lstm单位=embed_hidden_size)% > %layer_repeat_vectorn =story_maxlen)合并后的<-列表(encoded_sentence encoded_question)% > %layer_add()% > %layer_lstm单位=embed_hidden_size)% > %layer_dropout率=0.3)仅仅<-合并后的% > %layer_dense单位=vocab_size,激活=“softmax”)模型<-keras_model输入=列表(句子,问题),输出=仅仅)模型% > %编译优化器=“亚当”损失=“categorical_crossentropy”指标=“准确性”)模型
模型:”模型 " ____________________________________________________________________________ 层(类型)形状参数#连接到输出  ============================================================================ input_2 (InputLayer)[(没有,4)]0 []embedding_1(嵌入)(没有4 50)1100(“input_2[0][0]”)input_1 (InputLayer)[(没有,68)]0 []dropout_1(辍学)(没有,4、50)0(“embedding_1[0][0]”)嵌入(嵌入)(没有,68年,50)1100(“input_1[0][0]”)lstm (lstm)(没有,50) 20200 [' dropout_1[0][0]”)辍学(辍学)(没有,68年,50)0(“嵌入[0][0]”)repeat_vector (RepeatVe(没有,68年,50)0(“lstm[0][0]”)男星)添加(添加)(没有,68年,50)0(“辍学[0][0]”、“repeat_vector[0][0]”)lstm_1 (lstm)(没有,50)20200(“添加[0][0]”)dropout_2(辍学)(没有,50)0(“lstm_1[0][0]”)密度(密度)(没有,22)1122 [' dropout_2 [0] [0 ]'] ============================================================================ 总参数:43722可训练的参数:43722 Non-trainable params: 0  ____________________________________________________________________________
#培训  ----------------------------------------------------------------模型% > %适合x =列表(train_vec故事,train_vec问题),y =train_vec答案,batch_size =batch_size,时代=时代,validation_split =0.05)评价<-模型% > %评估x =列表(test_vec故事,test_vec问题),y =test_vec答案,batch_size =batch_size)评价
损失精度0.03284298 0.99100000