This week, I learned about RNN, the differences between CNN and RNN, the structure of RNNs, and the application scenarios corresponding to different input-output relations. In addition, this week, I read a paper on the problem of multi-label classification in natural language processing, presenting the shortcomings of the existing method, ignoring the problem of correlation between labels, and finally demonstrating the improvement of this method through experiments.
本周学习了循环神经网络,了解了卷积神经网络和循环神经网络之间的差别,RNN的结构、不同输入输出关系对应的应用场景等。另外,本周阅读了一篇关于自然语言处理中多标签分类的问题,提出了现有的方法存在的不足,忽略了标签之间的关联性问题,最后通过实验证明了这个方法的改进效果。
定义
循环神经网络(Recurrent Neural Network, RNN)是一类以序列(sequence)数据为输入,在序列的演进方向进行递归(recursion)且所有节点(循环单元)按链式连接的递归神经网络(recursive neural network),其中双向循环神经网络(Bidirectional RNN, Bi-RNN)和长短期记忆网络(Long Short-Term Memory networks,LSTM)是常见的循环神经网络。
为什么需要RNN(循环神经网络)
在CNN网络中的训练样本的数据为IID数据(独立同分布数据),所解决的问题也是分类问题或者回归问题或者是特征表达问题,但更多的数据是不满足IID的,如语言翻译,自动文本生成。它们是一个序列问题,包括时间序列和空间序列。比如时间序列数据,这类数据是在不同时间点上收集到的数据,反映了某一事物、现象等随时间的变化状态或程度。一般的神经网络,在训练数据足够、算法模型优越的情况下,给定特定的x,就能得到期望y。其一般处理单个的输入,前一个输入和后一个输入完全无关,但实际应用中,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的, 这时就要用到RNN网络。
RNN结构
首先看一个简单的循环神经网络图,它由输入层、一个隐藏层和一个输出层组成:
由于时序上的层级结构,使得RNN在输入输出关系上具备了更大的灵活性,能够解决不同的问题:
1、单入多出:实现看图、说话、放音乐等功能
2、多入单出:通常用来处理序列分类问题。如输入一段文字判别它所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等等。
3、N to N:通常用来生成文章、诗歌、代码、问答、机器翻译等
4、N to M:通常用做Tag生成
LSTMs: 长短期记忆网络通常被称为“LSTMs”,是一种特殊的RNN网络,能够学习长距离依赖性,它们在各种各样的问题上工作得非常出色,现在得到了广泛的应用。LSTMs也有这种链状结构,但重复的模块有一些稍微不同的结构,不是有一个单一的神经网络层,而是有多个层,以非常特殊的方式进行交互。它们有输入门、忘记门和输出门。我们将很快推出LSTMs的详细文章。
GRUs: 另一个有效的RNN网络架构是门控循环单元即GRUs。他们是LSTMs的变体,但是在结构上更简单,也更容易训练。它们的成功主要是由于门控网络信号控制当前输入和先前记忆如何使用,从而更新当前的激活并生成当前状态。这些门有自己的权重集,在学习阶段自适应地更新。我们这里只有两个门,重置门和更新门。敬请关注GRUs更详细的文章。
论文题目:SGM: Sequence Generation Model for Multi-Label Classification
地址:https://arxiv.org/abs/1806.04822
多标签分类是自然语言处理中一项重要而具有挑战性的任务。它比单标签分类更复杂,因为标签往往是相互关联的。现有的方法往往忽略了标签之间的关联性。此外,文本的不同部分可以对预测不同的标签做出不同的贡献,而这是现有模型所没有考虑的。在本文中,将多标签分类任务看作是一个序列生成问题,并应用一个具有新颖解码器结构的序列生成模型来解决这个问题。广泛的实验结果表明,这个方法在很大程度上超过了以前的工作。对实验结果的进一步分析表明,所提出的方法不仅能捕捉到标签之间的相关性,而且在预测不同的标签时,还能自动选择信息量最大的词。
首先,我们定义一些符号了并且描述MLC任务。给定有L个labels的label空间L={l1,l2,…,lL},还有一个有m个单词的文本序列x,MLC的任务是把一个在label空间L中含有n个标签的子集合y指派给x。和传统的单标签分类不一样,单标签分类一次只给每个样本一个标签,而MLC任务中每个样本有多个标签。从序列生成的角度,MLC的任务就是寻找一个最优的标签序列y*,来最大化条件概率p(y|x),计算如下:
序列生成
整个序列生成模型由一个编码器和一个带有注意力机制的解码器组成,下图为概念模型,我们把每个样本的标签序列根据标签在训练集中的频率进行排序,高频的标签放在前面。另外,bos符号加入到了标签序列的开头,eos符号加入到了标签序列的末尾。(MS表示遮蔽的softmax层,GE表示全局嵌入):
令(w1,w2,…wm)为m个单词的序列,wi是第i个单词的one-hot表示。我们首先通过一个嵌入矩阵(embedding matrix)E∈Rk×|ν|把wi嵌入成一个稠密的嵌入向量xi,|v|是词汇表的大小,k是嵌入向量的维度。
我们使用一个bidirectional LSTM从两个方向上来读取文本序列x,并且计算每个单词的隐藏状态:
注意
当模型预测不同的标签的时候,并不是所有的单词贡献相同。通过关注不同比例的文本序列,聚合有信息量的单词的隐藏表示,注意力机制会产生一个上下文向量(context vector)。特别地,注意力机制会把权重αti在第t时刻指派给第i个单词:
Global Embedding
g(yt-1)是label的嵌入,这个label是在yt-1分布下的最高概率所对应标签得来的。可是,这个计算只是贪心的利用了yt-1的最大值。我们提出的模型序列化的产生标签,基于先前预测的标签来产生下一个标签。因此,可能我们在第t时刻得到了错误的预测,然后我们就会在预测下一个标签的时候得到了一个错误的后继标签,这也叫做exposure bias。从一定程度上,beam search算法缓解了这个问题。但是它不能从根本上解决这个问题,因为exposure bias可能会出现在所有的路径上。yt-1表示在t-1时刻的概率分布,很显然yt-1中的所有信息对我们在第t时刻预测标签是有帮助的。通过考虑所有包含在yt-1中的有效信号,exposure bias问题应该会得到缓解。
基于这个动机,我们提出了一个新的decoder结构,其中在t时刻中的g(yt-1)可以表示第t-1时刻的整体信息。受highway network中adaptive gate的想法的启发,这里我们引入我们的global embedding。令e表示在yt-1分布下具有最高概率的嵌入标签,e为时刻t上的带权平均嵌入。计算如下:
数据集
Reuters Corpus Volume I (RCV1-V2) :数据集包含800 000手工分类的新闻专线的故事(newswire stories),Reuters Ltd专门为学术目的制作的数据集。每个新闻专线的故事(newswire stories)可以指派多个话题,总共有103个话题。
Arxiv Academic Paper Dataset (AAPD) :我们为多标签分类建立了一个新的大数据集,我们收集了计算机科学领域内55 840篇学术论文的摘要和主题。一篇学术论文有多个主题,总共有54个主题。目标是根据摘要的内容来预测学术论文对应的主题。
两个数据集的统计结果如下:
分析与讨论
Global Embedding的探索在decoder上使用不同的值的结果如左边两个图,红色的线表示使用adaptive gate的结果,符号“+”表示值越高模型越好,符号“-”表示与之相反。误差分析如右边两个图,LLS代表the length of the label sequence,BR代表 Binary Relevance模型。
注意力可视化
AAPD数据集中的一个摘要例子,我们从中提取了三个有信息的句子。这个摘要被分配了两个标签。"CV "和 “CL”。它们分别表示计算机视觉和计算性 语言。
RCV1-V2数据集上生成的标签序列的几个例子。每个例子中的红色粗体标签 表示它们是高度相关的。
文章提出了一个具有新型解码器结构的序列生成模型来解决MLC任务,所提出的序列生成模型由一个编码器和一个具有注意力机制的解码器组成。解码器使用LSTM依次生成标签,并根据之前预测的标签预测下一个标签。因此,所提出的模型可以考虑标签之间的关联性。标签之间的相关性,通过LSTM结构来处理标签序列的依赖性。此外,当模型预测不同的标签时,注意力机制考虑了文本不同部分的贡献。另外,文章还提出了一种带有全局嵌入的新型解码器结构,以进一步提高模型的性能。通过纳入整体信息信号,进一步提高模型的性能。
本周学习了循环神经网络,了解了卷积神经网络和循环神经网络之间的差别,RNN的结构、不同输入输出关系对应的应用场景等,下周将继续学习循环神经网络,争取用代码实现。