文章目录
1. 本周工作内容
通过本周的工作,我能够获得answer+passage组成文段的[CLS]
词向量,并认为该词向量中蕴含着本段文字的所有语义信息,计划通过[CLS]
与答案文本的命名实体识别来获得疑问词的分类,但在具体实现的过程中遇到了比较严重的问题,在与学姐充分交流之后转换了思路,决定使用uniLM模型进行问题生成任务。因此本周认真阅读并研究了uniLM模型。
2. 遇到的问题
2.1 模型方面
项目之前的实现思路是基于《Let Me Know What to Ask: Interrogative-Word-Aware Question Generation》一文,但该文章是针对英文文本提出的,实现在中文文本上有很大的问题。
最重要的就是英文中的疑问词相对明确,但是中文文本的混淆度更高,也就是越复杂,简而言之就是同样的意思有更多的说法。
原文中将疑问词分为八个类别,一开始我的思路是直接将其对应翻译成中文,即如下表所示:
英文 | 中文 |
---|---|
who | 谁 |
why | 为什么 |
when | 什么时候 |
what | 什么 |
how | 怎样 |
which | 哪一个 |
where | 哪里 |
others | 其他 |
但是具体实现的时候发现了问题,上表中的英文疑问词与中文疑问词并不是一一对应的,例如where
在中文中可以说成是哪里,也可说成什么地方,什么地点,有多种说法;疑问词从字面上看也互相包含,例如“为什么”,“什么”,“什么时候”。
原文中疑问词分类器的实现是通过识别数据集中的疑问词,对应自动做出标注,利用标注数据训练分类器。但在中文中因为疑问词说法繁多不一致,没有明显的标志无法实现自动标注,如果使用该思路需要人工进行数据集标注,成本很高,因此放弃了这个思路。
2.2 数据集方面
原本计划使用百度的Dureader数据集,因此该数据集对问题进行了标注,分为fact和opinion两个大类,每个大类下又各分三小类,共有六种类别的问题。计划将问题的类别输入模型,优化问题生成。
但是Dureader数据集是直接爬虫获得的,包含大量html代码,这一点通过简单的数据清洗还可以改善。
另一方面,Dureader数据集是从百度知道和百度搜索中选取的网友的问题和回答,通过检查数据集发现,很多问题并不是疑问词的形式,例如:“淘宝开店的流程步骤”,且答案文本偏向口语化,普遍篇章较长。
经过讨论分析,我认为该数据集更适合做文本理解任务,并不适合问题生成。因此改换为科大讯飞的CMRC数据集,该数据集更加规范符合我们的需要,并且格式与斯坦福SQuAD数据集相同。
但是我们仍然希望可以使用标签对生成的问题进行控制,因此决定将原本计划用于评估结果的问题分类应用于CMRC数据集。也就是先对CMRC数据集中的问题分类,运用分类后的数据进行问题生成。
3. uniLM论文阅读——Unified Language Model Pre-training for Natural Language Understanding and Generation
Abstract
uniLM模型是统一的预训练语言模型——自然语言理解和自然语言生成。使用三种类型的语言模型任务:单向、双向、序列到序列的预测;使用共享的transformer网络和特定的自我注意蒙版mask去控制预测条件在什么上下文中。
Introduction
uniLM模型主要有以下三个优点:
- 一个单独
transformer
共享参数和结构,减轻不同类型的LMs
分别训练和托管host多个LMs
的需要. - 共享参数使得文本表示形式更加通用,因为针对不同的语言建模目标(它们以不同的方式利用上下文)进行了联合优化,从而减轻了对任何单个LM任务的过度拟合.
- 使用
seq2seq
,成为NLG的自然选择.
Unified Language Model Pre-training
给定输入序列,uniLM对每个token获得上下文化的向量表示
预训练针对多个无监督语言建模目标(即单向LM,双向LM和序列到序列LM)优化了共享的Transformer网络。
不同的mask自注意–通过mask控制token关注多少上下文信息去计算向量表示。一旦对UNILM进行了预训练,我们就可以使用特定于任务的数据对下游任务进行微调(fine-tune).
Input Representation
[SOS]
:start-of-sequence,输入的开始
[EOS]
:end-of-sequence,[EOS]不仅标记了NLU任务中的句子边界,还用于模型学习何时终止NLG任务中的解码过程
- 对于每个输入的token,向量表示是通过相应的token embedding position embedding segment
- embedding相加sum得出的 针对不同的LM目标使用不同的段嵌入segment embedding
- The input representation follows that of BERT
Backbone Network:Multi-Layer Transformer
A:the output of a self-attention head
使用不同的mask矩阵来控制计算上下文表示的时候token能参加什么上下文
Pre-training Objectives
- 随机在输入中选择WordPiece tokens,用特殊token[mask]将transformer后的网络通过softmax预测被masked的token
- 最小化交叉熵
- 相似的训练流程对所有其他的语言模型 无论是单向还是双向都适用
Unidirectional LM :left-to-right and right-to-left
left-to-right LM:所有token的表示在编码时只考虑左边的token和自身
self-attention mask
Bidirectional LM
编码时考虑所有token
与单向文本相比,可以生成更好的文本上下文表示。
Sequence-to-Sequence LM
第一个segment能使用本segment中的所有token
第二个segment只能使用目标target左边的语境和他本身