今天终于开始技术博客的第一章,从阅读理解的非预训练model开始,第一篇SAN for SQUAD 2.0
阅读理解系列之Stochastic Answer Network (SAN)
一、摘要
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
特定下游任务层:包括 SAN ANswer Module 和 a binary classfier
整个模型是共同学习的
下面详细介绍整个模型的各个层级
1.lexicon encoding 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指向段落的最后一个标记。
第一步,将Q and P映射到欧氏空间(所有model的第一步都大差不差),这里采用的是300-dim的glove word emdedding、16-dim part-of-speech(POS) tagging embeddings, 8-dim named-entity embeddings and 4-dim hard-rule features
最后就是通过两层的position-wise Feed- Forward Networks (FFN)将questrion and passager映射到同一纬度。最后分别将Q和P转换为矩阵:Eq=R d*m
Eq=Rd*m
2.Contextual Encoding Layer(上下文编码层)
使用两层的BiLSTM作为上下文信息编码层
为了避免过拟合将600-dimensional CoVe vectors和lexicon embeddings进行concat 作为contextual encoding layer的最后输入,
然后将600-dimensional CoVe vectors与第一层的输出进行concat作为第二层的输入。
最后通过两层的BiLSTM的输出得到最终的Hq∈ R4d×mfor questions and Hp∈ R4d×nfor passages.
3.Memory Generation Layer
本层的主要作用的是将前面得到的Hq、 Hp进行融合从而产生一个 working memory,在此层中使用attenion机制来计算qustion and passage之间的相似度:
先得到question-aware passage representation:
Up= concat(Hp, HqC)
然后对passage进行self-attention:
本层的数学公示建议去看论文。😂
最后也是通过一层BiLSTM形成了最后的M = BiLSTM([Up];ˆUp]).
4.Span detector
这一层对于有答案的文章来说其实也就是最后一层,该层输出最后答案的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}
需要注意的是最后的预测span是每个时间步骤t的平均和;
论文中采用了随机的dropout机制
5.Unanswerable classifier
针对SQUAD 2.0中的不可回答问题,特有的一个机制。
论文中仅仅采用了一层的神经网络来作为线性分类器。公式如下:
Pu= sigmoid([s0; m0]W4)
Pu也就是最后判断问题是否可回答的概率值。
6.Objective
目标函数包括两部分:
Ljoint= Lspan+ λLclassifier
span loss function:
线性分类器的目标函数:
y=1时表示问题不可回答,y=0时表示问题可回答
三、实验
从实验结果来看,SAN在2.0上的确取得了当今非预训练模型几乎最好的成绩,至于实验细节,论文写的还是很详细的。
实验细节
分词: spaCywordembedding:GloVe300-Dcharacterencoding:
利用CNN训练, embedding size设为20.windows设为1,3,5hidden size设为{50,100,150}
word embedding和character embedding拼接,
最终的lexicon embedding就是600维.
LSTM hiddensize:128
注意力层的projectionsize:256 。dropout:0.2 batchsize:32 optimizer:Adamax learningrate:0.002
但自己在对于代码的复现中并没有在2.0上取得像论文一样的实验效果,(可能哪儿参数不对?欢迎大家给我留言讨论😁)
四、个人感悟
就整篇文章看完,个人觉得 SAN的模型其实十分简单,而且整个的训练时间也不长.实力点赞!!
SAN与其他模型主要的区别在于,它的预测输出结果,并不是最后直接输出,而是每个时间步骤迭代的结果,最后取平均得到最后输出,这点的确很特别。。。
下期预告:QANET
网友评论