1.问答系统

SQuAD数据集 给定一段文字作为context,给定一个问题question,从context中寻找一段连续的文字(text
span)作为问题的答案。

网址:https://rajpurkar.github.io/SQuAD-explorer/
代码:https://github.com/galsang/BiDAF-pytorch

2. 数据格式

pytorch 中文 pytorch 中文问答系统_python


pytorch 中文 pytorch 中文问答系统_pytorch 中文_02


3. 整体流程架构

pytorch 中文 pytorch 中文问答系统_语言模型_03

文本摘要

所谓摘要,就是对给定的单个或者多个文档进行梗概,即在保证能够反映原文档的重要内容的情况下,尽可能地保持简明扼要。质量良好的文摘能够在信息检索过程中发挥重要的作用,比如利用文摘代替原文档参与索引,可以有效缩短检索的时间,同时也能减少检索结果中的冗余信息,提高用户体验。

1. 分类

按照摘要面向的文档类型,可以将其分为单文档摘要和多文档摘要。根据需要产生摘要的文档长度,可以将摘要分为长文摘要、短文摘要。按照摘要的生成方法,可以将它分为抽取式摘要和生成式摘要。抽取式摘要是通过抽取拼接源文档中的关键句子来生成摘要的,生成式摘要则是系统根据文档表达的重要内容,自行组织语言,对源文档进行概括。后者是比较常见的划分方式,因为抽取式摘要和生成式摘要在生成过程中有较大的区别。本文后续对摘要生成方法的分类,也是根据这种方式进行划分。
2. 模型思路

Seq2Seq模型
Copy Mechanism
Coverage Loss

代码:https://github.com/atulkum/pointer_summarizer

pytorch 中文 pytorch 中文问答系统_pytorch 中文_04


大规模预训练语言模型

1. ELMo所谓ELMo是一些网络层的组合。对于每个单词(token)tktk,对于L层的双向lstm语言模型,一共有2L+1个表征(representations)。

一个预训练两层双向LSTM语言模型,由一个前向和一个后向语言模型构成,目标函数就是取这两个方向语言模型的最大似然。

pytorch 中文 pytorch 中文问答系统_pytorch 中文_05


在预训练好这个语言模型之后,ELMo就是根据下面的公式来用作词表示,其实就是把这个双向语言模型的每一中间层进行一个求和。最简单的也可以使用最高层的表示来作为ELMo。

pytorch 中文 pytorch 中文问答系统_pytorch 中文_06


然后在进行有监督的NLP任务时,可以将ELMo直接当做特征拼接到具体任务模型的词向量输入或者是模型的最高层表示上。总结一下,不像传统的词向量,每一个词只对应一个词向量,ELMo利用预训练好的双向语言模型,然后根据具体输入从该语言模型中可以得到上下文依赖的当前词表示(对于不同上下文的同一个词的表示是不一样的),再当成特征加入到具体的NLP有监督模型里。

2. AllenNLP

一个很好的构建NLP模型的package,基于PyTorch
AllenNLP是艾伦人工智能研究院开发的开源NLP平台。它的设计初衷是为了NLP研究和开发(尤其是语义和语言理解任务)的快速迭代提供支持。它提供了灵活的API,对NLP很实用的抽象,以及模块化的实验框架,从而加速NLP的研究进展。
AllenAI在2018 EMNLP上的一个tutorial

https://github.com/allenai/writing-code-for-nlp-research-emnlp2018/blob/master/writing_code_for_nlp_research.pdf

3. BERT

本质上是通过在海量的语料的基础上运行自监督学习方法为单词学习一个好的特征表示,所谓自监督学习是指在没有人工标注的数据上运行的监督学习。在以后特定的NLP任务中,我们可以直接使用BERT的特征表示作为该任务的词嵌入特征。所以BERT提供的是一个供其它任务迁移学习的模型,该模型可以根据任务微调或者固定之后作为特征提取器。

(1). 网络架构

BERT的网络架构使用的是《Attention is all you need》中提出的多层Transformer结构,其最大的特点是抛弃了传统的RNN和CNN,通过Attention机制将任意位置的两个单词的距离转换成1,有效的解决了NLP中棘手的长期依赖问题。Transformer的结构在NLP领域中已经得到了广泛应用,并且作者已经发布在TensorFlow的tensor2tensor库中。

pytorch 中文 pytorch 中文问答系统_学习_07


(2). 输入表示

BERT的输入的编码向量(长度是512)是3个嵌入特征的单位和,这三个词嵌入特征是:

  • WordPiece 嵌入:WordPiece是指将单词划分成一组有限的公共子词单元,能在单词的有效性和字符的灵活性之间取得一个折中的平衡。例如图的示例中‘playing’被拆分成了‘play’和‘ing’;
  • 位置嵌入(Position Embedding):位置嵌入是指将单词的位置信息编码成特征向量,位置嵌入是向模型中引入单词位置关系的至关重要的一环。位置嵌入的具体内容参考我之前的分析;
  • 分割嵌入(Segment Embedding):用于区分两个句子,例如B是否是A的下文(对话场景,问答场景等)。对于句子对,第一个句子的特征值是0,第二个句子的特征值是1。
    最后,说明一下图中的两个特殊符号[CLS]和[SEP],其中[CLS]表示该特征用于分类模型,对非分类模型,该符合可以省去。[SEP]表示分句符号,用于断开输入语料中的两个句子。