项目进度
本周五我们小组开会讨论各自部分的进展,并进行交流与总结。对各自面对的问题共同进行探讨,商量解决办法。同时,我们对接下来的一周制定详细计划,稳步执行。
统一版本
在自然语言处理方面,市面上流行python语言,于是我们统一使用较新版本的Python,例如python3.7,python3.8 。在pytorch, cuda 版本上我们也尽量做到统一,以方便后续的代码执行。
项目执行
疑问词分类
为了更加精准地生成问题,我们在QG前加一个疑问词分类器——Interrogative-Word-Aware Question Generation (IWAQG),再将预测到的疑问词输入到QG的编码器中。下图即是问题生成的模型结构。
.
Interrogative-Word Classifier 步骤为:Bert输入包含答案的文章,得到[CLS]token,再concat答案的实体类别,进行疑问词类型预测。
数据集我们目前采用 CMRC2018 中文数据集
链接为:https://worksheets.codalab.org/worksheets /0x92a80d2fab4b4f79a2b4064f7ddca9ce
举个栗子:
我们根据所拥有的数据集进行训练数据降采样
.
分出疑问词类别:what, which, where, when, who, why, how, others
问题生成
我们采用基于序列到序列生成方法(Seq2Seq,Sequence-to-sequence),这种结构的特点在于输入序列和输出序列的长度可变。输入序列是文本,输出序列是生成的问题。
.
基于序列到序列的问题生成框架主要包括两部分:编码器(Encoder)与解码器(Decoder),通过编码器对句子语义进行编码,然后将编码后的语义信息输入解码器生成相应的问句。Encoder 阶段将输入序列进行编码,通过一个双向的 LSTM将 source 进行编码。基础 Seq2Seq 模型使用的是 RNN,Decoder 阶段为了获得用于初始化解码器隐藏状态的语句编码器的输出。
基本的编码器解码器框架,解码器都是从编码器的最后输出开始的,只有一个向量来传递信息,且向量的长度固定。如果编码器编码的内容过于长,会丢失很多重要的信息。所以引入了 attention 机制,解码过程中不同时刻输入解码器的上下文状态不同。
对于文档序列 S,其由单词序列[w1,w2 ,w3 , …,wn] 构成。将其转换为词向量[x1 ,x2,x3,… , xn,]。 再 通 过 编 码 器 将 整 个 句 子 转 换 为 一 个 向 量 序 列[ b1,b2 ,b3 , … ,bn ] 。我们的最终目标是要能够帮助 decoder 在生成词语时,有一个不同词语的权重的参考。在训练时,对于 decoder 我们是有训练目标的,此时将 decoder 中的信息定义为一个 Query。而 encoder 中包含了所有可能出现的词语,我们将其作为一个字典,该字典的 key 为所有 encoder 的序列信息。n 个单词相当于当前字典中有 n 条记录,而字典的 value 通常也是所有encoder 的序列信息。
首先我们就是要 计算注意力权重。用我们的学习目标 Query 来参与这个过程,因此对 Query 的每个向量,通过一个函数,计算预测词时,需要学习注意力权重,由于包含n 个单词,因此应当是一个 n 维的向量,为了后续计算方便,需要将该向量进行 softmax 归一化,让向量的每一维元素都是一个概率值。attention 机制比较核心的地方就是如何对 Query 和 key 计算注意力权重。
总结
项目已经进行了四周,我们在各自的分工配合下逐步走上正轨。学习许多自然语言处理方面的知识和技术,在不断摸索中取得胜利。这次的合作也让我们明白团队合作的重要性,锻炼了我们沟通交流的能力。