APP下载

打造NLP文本分类深度学习方法库

2017-09-29编译徐子淇李煜

机器人产业 2017年5期
关键词:解码器编码器标签

□编译/徐子淇、李煜

打造NLP文本分类深度学习方法库

□编译/徐子淇、李煜

这个库的目的是探索用深度学习进行NLP文本分类的方法。它具有文本分类的各种基准模型。它还支持多标签分类,其中多标签与句子或文档相关联。

虽然这些模型大都看似简单,可能不会让你游刃有余地进行这项文本分类任务。但是其中还是有一些非常经典的模型,可以说是非常适合作为基准模型的。

每个模型在模型类型下都有一个测试函数。

我们探讨了用两个seq2seq模型(带有注意的seq2seq模型,以及transformer:attention is all you need)进行文本分类。同时,这两个模型也可以用于生成序列和其他任务。如果你的任务是多标签分类,那么你就可以将问题转化为序列生成。

我们实现了一个记忆网络:循环实体网络(recurrent entity network),追踪世界的状态。它用键值对块(blocks of key-value pairs)作为记忆,并行运行,从而获得新的状态。它可以用于使用上下文(或历史)来回答建模问题。例如,你可以让模型读取一些句子(作为文本),并提出一个问题(作为查询),然后请求模型预测答案;如果你像查询一样向其提供一些素材资源,那么它就可以进行分类任务。Network)

模型

1. fastText

2. TextCNN

3. TextRNN

4. RCNN

5. 分层注意网络(Hierarchical Attention Network)

6. 具有注意的seq2seq模型(seq2seq with attention)

7. Transformer("Attend Is All You Need")

8. 动态记忆网络(Dynamic Memory

9. 实体网络:追踪世界的状态

其他模型

1. BiLstm Text Relation

2. Two CNN Text Relation

3. BiLstm Text Relation Two RNN

性能

(多标签预测任务,要求预测能够达到前5名,300万训练数据,满分:0.5)

注意:“HierAtteNetwork”是指Hierarchical Attention Network

用途

1. 模型在xxx_model.py中

2. 运行python xxx_train.py来训练模型

3. 运行python xxx_predict.py进行推理(测试)

每个模型在模型下都有一个测试方法。你可以先运行测试方法检查模型是否能正常工作。

环境

python 2.7+tensorflow 1.1

(tensorflow 1.2也是可以应用的;大多数模型也应该在其他tensorflow版本中正常应用,因为我们在某些版本中只是添了非常少的特征变化;如果你使用的是python 3.5,只要更改print / try catch函数,它也会运行得很好。)

注:一些util函数是在data_util.py中的;典型输入如:“x1 x2 x3 x4 x5 label 323434”,其中“x1,x2”是单词,“323434”是标签;它具有一个将预训练的单词加载和分配嵌入到模型的函数,其中单词嵌入在word2vec或fastText中进行预先训练。

模型细节

1.快速文本(fast Text)

《用于高效文本分类的技巧》(Bag of Tricks for Efficient Text Classification)论文的实现。

① 使用bi-gram 或者tri-gram。

② 使用NCE损失,加速我们的softmax计算(不使用原始论文中的层次softmax)结果:性能与原始论文中的一样好,速度也非常快。

查看:p5_fastTextB_model.py

2.文本卷积神经网络(Text CNN)

《用于句子分类的卷积神经网络》(Convolutional Neural Networks for Sentence Classification)论文的实现。

结构:降维---> conv ---> 最大池化--->完全连接层--------> softmax。

查看:p7_Text CNN_model.py

为了能够使用TextCNN获得非常好的结果,你还需要仔细阅读此论文“用于句子分类的卷积神经网络灵敏度分析(和从业者指南)”【A Sensitivity Analysis of (and Practitioners' Guide to) Convolutional Neural Networks for Sentence Classification】,它可以帮助你了解一些影响性能的相关见解。当然,你还需要根据具体任务来更改某些设置。

3.文本循环神经网络(Text RNN)

结构:降维--->双向lstm ---> concat输出--->平均 -----> softmax。

查看:p8_Text RNN_model.py

4.双向长短期记忆网络文本关系(BiLstm Text Relation)

结构与Text RNN相同。但输入是被特别设计的。例如:输入“这台电脑多少钱?笔记本电脑的股票价格(how much is the computer? EOS price of laptop)”。“EOS”是一个特殊的标记,将问题1和问题2分开。

查看:p9_BiLstm Text Relation_model.py

5.两个卷积神经网络文本关系(two CNN Text Relation)

结构:首先用两个不同的卷积来提取两个句子的特征,然后连接两个函数,使用线性变换层将映射输出到目标标签上,然后使用softmax。

查看:p9_two CNN Text Relation_model.py

6.双长短期记忆文本关系双循环神经网络(BiLstm Text Relation Two RNN)

结构:一个句子的一个双向lstm(得到输出1),另一个句子的另一个双向lstm(得到输出2),最终softmax(输出1 M输出2)。

查看:p9_BiLstm Text Relation Two RNN_model.py

有关更多详细信息,你可以访问:《Deep Learning for Chatbots》的第2部分—在Tensorflow中实现一个基于检索的模型(Implementing a Retrieval-Based Model in Tensorflow)。

7.循环卷积神经网络(RCNN)

用于文本分类的循环卷积神经网络。

《用于文本分类的循环卷积神经网络》(Recurrent Convolutional Neural Network for Text Classification)论文的实现。

结构:① 循环结构(卷积层);② 最大池化;③ 完全连接层+ softmax。

它用左侧文本和右侧文本学习句子或文档中的每个单词的表示:

表示当前单词= [left_side_context_vector,current_word_embedding,right_side_context_vecotor]。

对于左侧文本,它使用一个循环结构,前一个单词的非线性转换与左侧上一个文本相结合;右侧文本与其类似。

查看:p71_TextRCNN_model.py

8. 分层注意网络(Hierarchical Attention Network)

《用于文档分类的分层注意网络》(Hierarchical Attention Networks for Document Classification )论文的实现。

结构:

① 降维;

② 词编码器:词级双向GRU,以获得丰富的词汇表征;

③ 词注意:词级注意在句子中获取重要信息;

④ 句子编码器:句子级双向GRU,以获得丰富的句子表征;

⑤ 句子注意:句级注意以获得句子中的重点句子;

⑥ FC + Softmax。

数据输入:

一般来说,这个模型的输入应该是几个句子,而不是一个句子。形式是:[None,sentence_lenght]。其中None意味着batch_size。

在训练数据中,对于每个样本来说,有四个部分,每个部分具有相同的长度,将四个部分形成一个单一的句子。该模型将句子分为四部分,形成一个形状为:[None,num_sentence,sentence_length]的张量。其中num_sentence是句子的个数(在设置中,其值等于4)。

查看:p1_HierarchicalAttention_model.py

9. 具有注意的Seq2seq模型

具有注意的Seq2seq模型的实现是通过《共同学习排列和翻译的神经机器翻译》来实现的。

结构:

① 降维;

② bi-GRU也从源语句(向前和向后)获取丰富的表示;

③ 具有注意的解码器。

数据输入:

使用三种输入方法中的两种:

① 编码器输入,这是一个句子;

② 解码器输入,是固定长度的标签列表;

③ 目标标签,它也是一个标签列表。

例如,标签是:“L1 L2 L3 L4”,则解码器输入为:[_ GO,L1,L2,L2,L3,_PAD];目标标签为:[L1,L2,L3,L3,_END,_PAD]。长度固定为6,任何超出标签将被截断,如果标签不足,将其填充完整。

注意机制:

① 传输编码器输入列表和解码器的隐藏状态;

② 计算每个编码器输入隐藏状态的相似度,以获得每个编码器输入的可能性分布;

③ 基于可能性分布的编码器输入的加权和。

通过RNN Cell使用这个权重和解码器输入以获得新的隐藏状态。

Vanilla E编码解码工作原理:

在解码器中,源语句将使用RNN作为固定大小向量(“思想向量”)进行编码:

当训练时,使用另一个RNN尝试通过使用这个“思想向量”作为初始化状态获取一个单词,并从每个时间戳的解码器输入中获取输入。解码器从特殊指令“_GO”开始。在执行一步之后,新的隐藏状态将与新输入一起获得,可以继续此过程,直到达到特殊指令“_END”。我们可以通过计算对数和目标标签的交叉熵损失来计算损失。logits是通过隐藏状态的映射层(对于解码器步骤的输出,在GRU中,我们可以仅使用来自解码器的隐藏状态作为输出)。

当测试时,没有标签,所以我们应该提供从以前的时间戳获得的输出,并继续进程直到我们到达“_END”指令。

注意事项:

在这里使用两种词汇,一个是由编码器使用的单词; 另一个是用于解码器的标签。

对于词汇表,插入三个特殊指令:“_GO”,“_ END”,“_ PAD”; “_UNK”不被使用,因为所有标签都是预先定义的。

10. Transformer(“Attention Is All You Need”)

状态:完成主要部分,能够在任务中产生序列的相反顺序。你可以通过在模型中运行测试函数来检查它。然而,我还没有在实际任务中获得有用的结果。我们在模型中也使用并行的style.layer规范化、残余连接和掩码。

对于每个构建块,下面的每个文件中都包含测试函数,并且已经成功测试了每个小块的性能。

带注意的序列到序列是解决序列生成问题的典型模型,如翻译、对话系统。大多数情况下,它使用RNN完成这些任务。直到最近,人们也应用卷积神经网络进行序列顺序问题。但是,Transformer,它仅仅依靠注意机制执行这些任务,便能快速地实现新的最先进的结果。

它还有两个主要部分:编码器和解码器。

编码器:

共6层,每个层都有两个子层。第一层是多向自我注意机制;第二层是位置的全连接前馈网络。对于每个子层使用LayerNorm(x+ Sublayer(x)),维度= 512。

解码器:

① 解码器由N = 6个相同层的堆叠组成;

② 除了每个编码器层中的两个子层之外,解码器插入第三子层,其在编码器堆栈的输出上执行多向注意;

③ 与编码器类似,我们采用围绕每个子层的残余连接,然后进行层归一化。我们还修改解码器堆栈中的自我注意子层,以防止位置参与到后续位置。这种掩蔽与输出嵌入偏移一个位置的事实相结合的操作确保了位置i的预测只能取决于位于小于i的位置的已知输出。

模型中的突出特点:

① 多向自我注意:使用自我注意,线性变换多次获取关键值的映射,然后开始注意机制;

② 一些提高性能的技巧(剩余连接、位置编码、前馈、标签平滑、掩码以忽略我们想忽略的事情)。

有关模型的详细信息,请查看:a2_transformer.py

11.循环实体网络(Recurrent Entity Network)

输入:

① 故事:它是多句话,作为上下文;

② 问题:一个句子,这是一个问题;

③ 回答:一个单一的标签。

型号结构:

① 输入编码:使用一个词来编码故事(上下文)和查询(问题);通过使用位置掩码将位置考虑在内。

通过使用双向rnn编码故事和查询,性能从0.392提高到0.398,增长了1.5%。

② 动态记忆:

a. 通过使用键的“相似性”,输入故事的值来计算门控;

b. 通过转换每个键、值和输入来获取候选隐藏状态;

c. 组合门和候选隐藏状态来更新当前的隐藏状态。

③ 输出(使用注意机制):

a. 通过计算查询和隐藏状态的“相似性”来获得可能性分布;

b. 使用可能性分布获得隐藏状态的加权和;

c. 查询和隐藏状态的非线性变换获得预测标签。

这个模型的关键点:

① 使用彼此独立的键和值块,可以并行运行;

② 上下文和问题一起建模。使用记忆来追踪世界的状态,并使用隐性状态和问题(查询)的非线性变换进行预测;

③ 简单的型号也可以实现非常好的性能,可以简单的编码作为词的使用包。

有关模型的详细信息,请查看:a3_entity_network.py

在这个模型下,它包含一个测试函数,它要求这个模型计算故事(上下文)和查询(问题)的数字,但故事的权重小于查询。

12.动态记忆网络

模块:Outlook

① 输入模块:将原始文本编码为向量表示。

② 问题模块:将问题编码为向量表示。

③ 独特的记忆模块:通过输入,通过注意机制选择哪些部分输入,将问题和以前的记忆考虑在内====>它将产生“记忆”向量。

④ 答案模块:从最终的记忆向量生成答案。

详情:

① 输入模块:

一个句子:使用gru获取隐藏状态b.list的句子,使用gru获取每个句子的隐藏状态。例如 [隐藏状态1,隐藏状态2,隐藏状态...隐藏状态n]。

② 问题模块:使用gru获取隐藏状态。

③ 记忆模块:使用注意机制和循环网络来更新其记忆。

a.需要多集===>传递推理。

e.g. ask where is the football? it will attend to sentence of "john put down the football"),then in second pass, it need to attend location of john.

b.注意机制:

two-layer feed forward nueral network.input is candidate fact c,previous memory m and question q. feature get by take: elementwise,matmul and absolute distance of q with c,and q with m.

c.记 忆 更 新 机 制:h = f(c,h_previous,g)。 最后一个隐藏状态是应答模块的输入。

④ 答案模块:

要做的事情:

① 文本分类的字符级卷积网络;

② 文本分类的卷积神经网络:浅词级与深字符级;

③ 文本分类的深度卷积网络;

④ 半监督文本分类的对抗训练方法。

猜你喜欢

解码器编码器标签
科学解码器(一)
科学解码器(二)
科学解码器(三)
线圣AudioQuest 发布第三代Dragonfly Cobalt蓝蜻蜓解码器
无惧标签 Alfa Romeo Giulia 200HP
基于FPGA的同步机轴角编码器
不害怕撕掉标签的人,都活出了真正的漂亮
基于PRBS检测的8B/IOB编码器设计
标签化伤害了谁
JESD204B接口协议中的8B10B编码器设计