Advertisement

基于深度学习的文本分类

阅读量:

学习内容

  • 学习word2vec
  • 学习textcnn、textrnn
  • 学习使用HAN网络结构完成文本分类

1 学习Wordvec

在之前的实验中,采用TF-IDF方法获取了文本特征;通过XGB分类模型实现了文本的分类任务,并获得了较高的准确度。然而,在这种编码方式下缺乏语义信息,在这种情况下还存在较高的稀疏性问题,并导致了冗余的计算开销。寻求一种既能提升语义表达能力同时又能在词向量维度上进行压缩的方法;因此引入了Word2Vec模型作为解决方案

word2vec模型的核心理念是通过分析与上下文相关联的词语来预测其出现的可能性。在处理每一条输入文本时,我们通常会选择一个固定大小的上下文窗口和一个中心词,并基于这个中心词去推断窗口内其他词语出现的概率分布。由此可见,在这种模式下训练出来的模型不仅能够捕捉到词语间的深层联系,还能够高效地从新增数据中学习到新的词汇表达形式,并支持一种便捷的在线学习机制(online learning)。

word2vec的核心思想在于基于单词与其周边词群之间的相互作用关系建立语义模型,在这种机制下有两种不同的学习算法被提出:Skip-gram模型则基于中间词预测其周边词的出现概率分布;而CBOW模型则基于周围词群预测单个词的出现概率分布。为了应对这两种假设计算复杂度较高的挑战问题,在现有解决方案主要包括以下两种方法,并结合多种优化策略(如并行计算、负采样等技术)以提升训练效率和模型性能

  • Hierarchical softmax
  • Negative sampling

1.1 skip-gram原理与网络结构

该模型主要包括Skip-Gram和CBOW两种主要架构。直观上来看,则认为Skip-Gram通过指定输入词去推断其周围的词语。相比之下,则基于周围词语信息推测输入词的出现。

在这里插入图片描述

说在开始
word2vec网络经过...处理后的输出结果并不是我们所期望的。
我们的目标是获得...
...即由所有词汇对应的词向量构成。
每个词汇都有其对应的...值。

在这里插入图片描述

词库中第4个词,对应权重矩阵第4行,[10,12,19]才是词向量

与自编码器思想有着异曲同工之妙的是Word2Vec的整个建模过程,
即首先基于训练数据构建了一个神经网络模型,
当我们拥有训练完成的模型时,
并不会直接使用该模型来处理新的任务,
它真正所需的是从训练数据中获得的一系列参数化配置,
例如,在隐层中存储着一系列权重矩阵——
事实上,在后续章节我们将了解到这些权重正是我们在尝试学习形成的“word vectors”。

假如我们有一个句子“The dog barked at the mailman”。

首先我们选取位于句子正中间的某个词汇作为我们的输入词;例如我们可以选择'dog'作为input word

当我们引入一个input单词后

该神经网络基于所给定的训练数据集将生成一个概率分布, 其数值代表了我们词典中每个词汇作为输入单词时被预测为输出单词的概率. 这一表述略显复杂, 我们可以尝试简化它. 让我们举个实例说明: 在设置参数skip_window=2且num_skips=2后得到了两批不同的训练样本. 假如我们先利用一组数据 (‘dog’, ‘barked’) 来训练神经网络, 那么该模型通过学习这一特定样本后, 将推导出词典中每个词汇当'dog'作为输入单词时, 其被推导为输出单词的可能性.

这表明模型的输出概率反映了我们词典中每个词与input word同时出现的可能性大小。例如,在给神经网络模型输入单词'Soviet'时,在最终模型的输出概率分布中,'Union'和'Russia'这种相关词汇的概率将远高于像'watermelon'和'kangaroo'这样不相关的词汇的概率。这是因为'Union'和'Russia'更有可能出现在与'Soviet'相关的上下文中。

我们将成对单词作为输入提供给神经网络进行训练以用于计算指定概率的过程。以下展示了若干训练样本供参考:我们选择窗口大小为2(window_size=2)即与输入词相邻的前后各两个词语被纳入考虑范围。图中使用蓝色标注显示input word的位置并框内展示包含在窗口内的相关词语。

问题来了

基于word2vec模型中的两种网络架构显然可以看出随着词汇库规模的增长隐含层参数数量随之增加这将导致巨大的计算开销然而这些庞大的计算负担却往往得不到有效的利用因此提出以下两个解决方案:

  • 容易找到那些作用显著的关键词, 同时尽量减少投入, 不需要投入过多的人力和物力 * * 尽量保留那些作用显著的关键点, 其余的部分可以适当舍弃 *

在完成训练的同时降低了计算量! 上面两种思路各自产生出两种优化方法,在文章的开头已经介绍过了。

  • Hierarchical softmax
  • Negative sampling

1.2 Hierarchical softmax

分层softmax基于霍夫曼树的生成方式。输入:具有权重(w1, w2, …, wn)的多个节点;输出:对应的霍夫曼树

  • 将(w₁, w₂, …, wₙ)视为由n棵单节点组成的森林
  • 在该森林中选取权值最小且数量最多的两棵根 tree 进行合并
  • 移除这两棵权值最小且被选中的根 nodes 所属的单 node tree,并将生成的新 parent node 加入现有 forest 中
  • 反复执行上述操作直至 forest 中只剩下一个 tree 的状态

让我们通过一个具体的例子详细阐述霍夫曼树的构建过程。给定六个节点a、b、c、d、e和f其对应的权值分别为16 4 8 6 20和3。首先选择两个权值最小的节点b和f进行合并生成一棵新的子树该子树的根节点权重为其父节点b和f权值之和即为7。经过这一步操作当前森林中剩余生成树的数量由原来的六棵减少为五棵它们各自的根节点权重依次为16 8 7 20以及新生成的子树根点权重为7。接着在剩下的生成树中继续选取当前最小的两个根节点进行合并以此类推最终完成整个霍夫曼树结构的构建

在这里插入图片描述

以霍夫曼树为架构的编码方案有哪些优势?在获得霍夫曼树之后,则会对各个叶子节点实施霍夫曼编码。具体而言,在这种架构下,具有较高权值的叶子节点倾向于靠近根部位置,并以此为基础对应较短长度的编码序列;相反地,在这种架构下,则会将那些具有较低权值的叶子节点安排至离根部较远的位置,并相应地赋予它们较长长度的编码序列。

1.3 Negative sampling

负采样(negative sampling)是一种旨在提高训练速度并提升词向量质量的方法。与传统方法不同,在这种方案中,每个训练样本只负责调整少部分词向量,并非所有词向量都会被更新。

当通过使用训练样本(input word: “fox”,output word: “quick”)来训练我们的神经网络模型时,在其中,“fox”和“quick”都经过了one-hot编码处理。假设我们的词典大小设定为10,000时,在输出层中预期对应于“quick”这个词的那个神经元结点会输出1。其余的(即非此词对应的)神经元结点应保持输出值为零。在这之中(即指那些未被目标词激活),我们将定义这些神经元结点对应的单词为负向量(negative words)。

当采用负采样策略时,在训练过程中我们会随机选取少量的negative word candidates(例如选取5个negative word candidates)来更新对应的权重参数。与此同时会对与之相对应的positive word进行权重调整(如前所述,在我们之前的例子中这个单词指的是'quick')

对于较小的数据样本来说,在挑选negative words的数量上应控制在5到20之间较为合适;而对于较大的数据样本,则可以选择较少的negative words来实现更好的分类效果。

2 TextCNN

TextCNN最初由Yoon kim于2014年在EMNLP会议上提出(2014 EMNLP) Convolutional Neural Networks for Sentence Classification

2.1 网络结构

在这里插入图片描述

简而言之,则是指将所有文本的embedding依次组合构成一个二维数组作为输入数据,在卷积神经网络中设定卷积核尺寸为m乘以n(其中m代表行数可自由选择而n固定为每个embedding的维度长度),完成卷积运算后会进行最大值池化处理,并最终接入全连接层进行分类或回归任务处理

具体的流程图

在这里插入图片描述

TextCNN详细过程:

复制代码
    - Embedding:第一层是图中最左边的7乘5的句子矩阵,每行是词向量,维度=5,这个可以类比为图像中的原始像素点。
  • 卷积操作:通过 kernel_sizes=(2,3,4) 的一维卷积层,在每个kernel_size 下生成两个输出通道。
  • 最大池化操作:在模型结构中,第三层采用的是1-max池化操作。该池化过程可确保不同长度句子经过池化处理后都能得到统一长度的表示形式。
  • 全连接层与Softmax激活函数:在模型结构中,最后一层是全连接层并搭配Softmax激活函数,在此基础之上完成各类别概率的计算与输出。

通道(Channels):

  • 图像中的各个通道可以采用(R, G, B)表示;
    • 在文本处理中,输入的不同通道通常采用不同的嵌入方式(如Word2Vec或GloVe)。此外,在实际应用中还常将静态词向量与经过微调优化的词向量分别作为各通道的表示方法。

一维卷积(conv-1d):

  • 图像属于二维数据;
    • 文本属于一维数据,在TextCNN中采用了基于word级别的1D卷积操作(虽然经过词向量映射后形成的是高维空间的数据结构,但在嵌入层面上进行2D卷积操作并无实际意义)。这种情况下的一维卷积设计所带来的问题是需要设计不同大小的kernel来捕捉 varied contextual granularities。

pooling层
提取每个特征图的最大响应值,并对其进行拼接融合。
关于Text-CNN每一层的计算样例

3 Text-RNN

3.1 RNN结构图

在这里插入图片描述

在其中每个圆圈相当于一个单元,在这些单元中执行的功能完全相同因而能够通过折叠的方式呈现为左半图所示的形式。对RNN进行简述时,则可概括为:一个单元不断重复使用以完成任务。

RNN是一种将序列数据转换为另一个序列数据模型,在此示例中我们采用输入序列为 x_{t-1}, x_t, x_{t+1} :'我是中国'这一特定情境下进行分析。通过这一设定我们可以观察到对应的输出t-2t-1分别为't=0时的状态和't=1时的状态对应的输出分别为'是'和'中国'两个状态的变化情况。基于此我们能够预测出在t=2时刻的输出t=3时的状态为出现的可能性较大即预测出下一个词很可能是'人'的概率较高

进而提出以下定义:其中X_t代表在时间t时的输入变量,O_t则用来标记在时间t时的状态输出,S_t则用于存储在时间t时的记忆状态

3.2 双向RNN

在这里插入图片描述

双层循环神经网络模型中,在每一个时间段内的节点不仅能够接收到来自前一层的信息,并且同时也能够接收来自后一层的信息,从而实现了对前后文内容的理解。

3.3 LSTM(长短时记忆网络)

相较于RNN而言,GRU具有较长的记忆深度和可控的存储能力。然而其主要缺陷在于网络架构较为复杂化,并包含多个门控机制,在提升效率方面仍存在挑战。随后于2014年提出了一种更为简洁实用的结构形式GRU(Gate Recurrent Unit),显著提升了效率。该模型通过将输入门与遗忘门进行整合,并将细胞状态St与记忆单元 Ct 进行整合,在性能上较之LSTM有所改进。为了解决梯度消失问题(如LSTM等其他门控型RNN模型)以及解决梯度爆炸问题(如梯度截断技术)的方法

在LSTM架构中作为第一个步骤,在神经网络模型设计中扮演着关键角色的机制决定了我们从细胞状态中舍弃哪些信息。这一过程则由被称为遗忘门的机制负责,在该机制的作用下,模型会综合考虑前一时间步的信息h_{t-1}以及当前输入x_t的影响,并计算出一个介于0到1之间的小数,并对细胞状态C_{t-1}中的每个元素进行评估。数值越接近1,则表示越倾向于保留该信息;数值接近0则表示倾向于舍弃。

在这里插入图片描述

输入门(input gate)
在随后的步骤中将控制新信息加入到cell状态中的数量。完成这一过程需要分为两个步骤:首先,在随后的步骤中,“input gate layer”这一层次通过sigmoid函数来决定哪些信息值得更新;另一个层次由tanh层生成候选向量\hat{C}_t作为潜在的新内容。最后,在随后的步骤中将这两部分整合后完成对cell状态的更新

在这里插入图片描述

为了确定最终输出的具体数值,我们需要考虑这一输出状态将取决于我们的细胞状态的同时也经过了一次过滤过程。随后利用一个sigmoid层来决定哪些部分将被允许通过到最终的输出中。然后将细胞状态输入tanh函数进行处理,计算出一个范围在[-1, 1]之间的数值,并将其与之前的sigmoid门计算结果相乘以获得最终的滤波后的数值作为最终的控制变量值

在这里插入图片描述

3.4 GRU

Gated Recurrent Unit(GRU)是长短期记忆网络(LSTM)的一个著名变体。如图所示, GRU仅包含两个关键组件: 重置门(reset gate) 和 更新门(update gate). 不过,在这一架构中, 细胞状态与隐含状态被整合在一起, 这使得整个设计相较于传统的 LSTM 架构更加简洁明了.

在这里插入图片描述

3.5TextRNN原理

在这里插入图片描述

TextCNN专长处理较短长度的信息,在文本分类任务中,在某种程度上类似于能够捕捉双侧较长跨度的内容。而TextRNN则专注于处理较长长度的信息,在文本分类任务中,则专门负责提取和分析较长跨度的信息特征。

在文本分类任务中应用CNN和RNN均能取得显著的效果;然而一个不足之处是模型的可解释性较差,在分析错误案例时尤其表现得不够理想;而注意力机制(Attention)能够有效地量化每个词对输出结果的贡献程度,并且已经成为现代_seq2seq_架构的重要组成部分;实际上,在某种程度上可以说文本分类问题等同于一种特殊的_seq2seq_架构的应用。

全部评论 (0)

还没有任何评论哟~