今天终于开始技术博客的第一章,从阅读理解的非预训练model开始,第一篇SAN for SQUAD 2.0windows
SAN for SQUAD 2.0 主要包含两个组件:a span detector and a binary classifier for judging whether the question is unanswerable,and both components are jointly optimized.
也就是一个跨度检测器和一个线性分类器,其中线性分类器用来判断当前问题是否有答案(毕竟这是SQUAD2.0相比于 1.1的最大改变之处,也为阅读理解提供了难度),跨度检测器用来检测答案的span。整个模型能够看做,总体包含五(四)层。网络
如下是模型的总体架构图
模型分为两部分:左边的上半部分也就是刚才所写的跨度检测器(a span detector),也就是SAN Answer Module,右边的上半部分也就是线性分类器(a binary classifier),并且模型包括两种不一样的layers。
几个关键点:架构
a lexicon encoding layer, contextual encoding layer and memory generation layer
下面详细介绍整个模型的各个层级函数
事先将question划分位Q={q_0,q_1,q_2,..,q_m-1} ,passage/paragraph划分为P={p_0,p_1,p_2,...,p_m-1},answer 计算为 A={abegin , aend},A也就是P中的一个字串,当问题没法回答时,A指向段落的最后一个标记。学习
Eq=Rd*m编码
使用两层的BiLSTM做为上下文信息编码层spa
最后经过两层的BiLSTM的输出获得最终的Hq∈ R4d×mfor questions and Hp∈ R4d×nfor passages.code
本层的主要做用的是将前面获得的Hq、 Hp进行融合从而产生一个 working memory,在此层中使用attenion机制来计算qustion and passage之间的类似度:
先获得question-aware passage representation:
Up= concat(Hp, HqC)
而后对passage进行self-attention:
本层的数学公示建议去看论文。😂
最后也是经过一层BiLSTM造成了最后的M = BiLSTM([Up];ˆUp]).component
这一层对于有答案的文章来讲其实也就是最后一层,该层输出最后答案的span。
本文中使用的是multi-turn answer module 来进行 span detector
输入初始状态s0(s0是Q每一个token的加权之和),最后经过一个线性函数来找begin and end point of answer spans at each reasoning step t ∈ {0, 1, . . . , T − 1}blog
针对SQUAD 2.0中的不可回答问题,特有的一个机制。
论文中仅仅采用了一层的神经网络来做为线性分类器。公式以下:
Pu= sigmoid([s0; m0]W4)
Pu也就是最后判断问题是否可回答的几率值。
y=1时表示问题不可回答,y=0时表示问题可回答
从实验结果来看,SAN在2.0上的确取得了当今非预训练模型几乎最好的成绩,至于实验细节,论文写的仍是很详细的。
实验细节
分词: spaCy word embedding: GloVe 300-D character encoding: 利用CNN训练, embedding size设为20. windows设为1,3,5 hidden size设为{50, 100, 150} word embedding和character embedding拼接, 最终的lexicon embedding就是600维. LSTM hidden size: 128 注意力层的projection size: 256 dropout: 0.2 batch size: 32 optimizer: Adamax learning rate: 0.002
但本身在对于代码的复现中并无在2.0上取得像论文同样的实验效果,(可能哪儿参数不对?欢迎你们给我留言讨论😁)
就整篇文章看完,我的以为 SAN的模型其实十分简单,并且整个的训练时间也不长.实力点赞!!
SAN与其余模型主要的区别在于,它的预测输出结果,并非最后直接输出,而是每一个时间步骤迭代的结果,最后取平均获得最后输出,这点的确很特别。。。
下期预告:QANET