入门 | 一文简述循环神经网络
本文简要介绍了什么是循环神经网络及其运行原理,并给出了一个 RNN 实现示例。
什么是循环神经网络(RNN)?它们如何运行?可以用在哪里呢?本文试图回答上述这些问题,还展示了一个 RNN 实现 demo,你可以根据自己的需要进行扩展。
循环神经网络架构
基础知识。Python、CNN 知识是必备的。了解 CNN 的相关知识,是为了与 RNN 进行对比:RNN 为什么以及在哪些地方比 CNN 更好。
我们首先从「循环」(Recurrent)这个词说起。为什么将其称为循环?循环的意思是:
经常或重复出现
将这类神经网络称为循环神经网络是因为它对一组序列输入重复进行同样的 *** 作。本文后续部分将讨论这种 *** 作的意义。
我们为什么需要 RNN?
也许你现在想的是,已经有像卷积网络这样表现非常出色的网络了,为什么还需要其他类型的网络呢?有一个需要用到 RNN 的特殊例子。为了解释 RNN,你首先需要了解序列的相关知识,我们先来讲一下序列。
序列是相互依赖的(有限或无限)数据流,比如时间序列数据、信息性的字符串、对话等。在对话中,一个句子可能有一个意思,但是整体的对话可能又是完全不同的意思。股市数据这样的时间序列数据也是,单个数据表示当前价格,但是全天的数据会有不一样的变化,促使我们作出买进或卖出的决定。
当输入数据具有依赖性且是序列模式时,CNN 的结果一般都不太好。CNN 的前一个输入和下一个输入之间没有任何关联。所以所有的输出都是独立的。CNN 接受输入,然后基于训练好的模型输出。如果你运行了 100 个不同的输入,它们中的任何一个输出都不会受之前输出的影响。但想一下如果是文本生成或文本翻译呢?所有生成的单词与之前生成的单词都是独立的(有些情况下与之后的单词也是独立的,这里暂不讨论)。所以你需要有一些基于之前输出的偏向。这就是需要 RNN 的地方。RNN 对之前发生在数据序列中的事是有一定记忆的。这有助于系统获取上下文。理论上讲,RNN 有无限的记忆,这意味着它们有无限回顾的能力。通过回顾可以了解所有之前的输入。但从实际 *** 作中看,它只能回顾最后几步。
本文仅为了与人类大体相关联,而不会做任何决定。本文只是基于之前关于该项目的知识做出了自己的判断(我甚至尚未理解人类大脑的 01%)。
何时使用 RNN?
RNN 可用于许多不同的地方。下面是 RNN 应用最多的领域。
1 语言建模和文本生成
给出一个词语序列,试着预测下一个词语的可能性。这在翻译任务中是很有用的,因为最有可能的句子将是可能性最高的单词组成的句子。
2 机器翻译
将文本内容从一种语言翻译成其他语言使用了一种或几种形式的 RNN。所有日常使用的实用系统都用了某种高级版本的 RNN。
3 语音识别
基于输入的声波预测语音片段,从而确定词语。
4 生成图像描述
RNN 一个非常广泛的应用是理解图像中发生了什么,从而做出合理的描述。这是 CNN 和 RNN 相结合的作用。CNN 做图像分割,RNN 用分割后的数据重建描述。这种应用虽然基本,但可能性是无穷的。
5 视频标记
可以通过一帧一帧地标记视频进行视频搜索。
深入挖掘
本文按照以下主题进行。每一部分都是基于之前的部分进行的,所以不要跳着读。
前馈网络循环网络循环神经元基于时间的反向传播(BPTT)RNN 实现
前馈网络入门
前馈网络通过在网络的每个节点上做出的一系列 *** 作传递信息。前馈网络每次通过每个层直接向后传递信息。这与其他循环神经网络不同。一般而言,前馈网络接受一个输入并据此产生输出,这也是大多数监督学习的步骤,输出结果可能是一个分类结果。它的行为与 CNN 类似。输出可以是以猫狗等作为标签的类别。
前馈网络是基于一系列预先标注过的数据训练的。训练阶段的目的是减少前馈网络猜类别时的误差。一旦训练完成,我们就可以用训练后的权重对新批次的数据进行分类。
一个典型的前馈网络架构
还有一件事要注意。在前馈网络中,无论在测试阶段展示给分类器的图像是什么,都不会改变权重,所以也不会影响第二个决策。这是前馈网络和循环网络之间一个非常大的不同。
与循环网络不同,前馈网络在测试时不会记得之前的输入数据。它们始终是取决于时间点的。它们只会在训练阶段记得历史输入数据。
循环网络
也就是说,循环网络不仅将当前的输入样例作为网络输入,还将它们之前感知到的一并作为输入。
我们试着建立了一个多层感知器。从简单的角度讲,它有一个输入层、一个具备特定激活函数的隐藏层,最终可以得到输出。
多层感知器架构示例
如果在上述示例中的层数增加了,输入层也接收输入。那么第一个隐藏层将激活传递到下一个隐藏层上,依此类推。最后到达输出层。每一个隐藏层都有自己的权重和偏置项。现在问题变成了我们可以输入到隐藏层吗?
每一层都有自己的权重(W)、偏置项(B)和激活函数(F)。这些层的行为不同,合并它们从技术层面上讲也极具挑战性。为了合并它们,我们将所有层的权重和偏置项替换成相同的值。如下图所示:
现在我们就可以将所有层合并在一起了。所有的隐藏层都可以结合在一个循环层中。所以看起来就像下图:
我们在每一步都会向隐藏层提供输入。现在一个循环神经元存储了所有之前步的输入,并将这些信息和当前步的输入合并。因此,它还捕获到一些当前数据步和之前步的相关性信息。t-1 步的决策影响到第 t 步做的决策。这很像人类在生活中做决策的方式。我们将当前数据和近期数据结合起来,帮助解决手头的特定问题。这个例子很简单,但从原则上讲这与人类的决策能力是一致的。这让我非常想知道我们作为人类是否真的很智能,或者说我们是否有非常高级的神经网络模型。我们做出的决策只是对生活中收集到的数据进行训练。那么一旦有了能够在合理时间段内存储和计算数据的先进模型和系统时,是否可以数字化大脑呢?所以当我们有了比大脑更好更快的模型(基于数百万人的数据训练出的)时,会发生什么?
另一篇文章(https://deeplearning4jorg/lstmhtml)的有趣观点:人总是被自己的行为所困扰。
我们用一个例子来阐述上面的解释,这个例子是预测一系列字母后的下一个字母。想象一个有 8 个字母的单词 namaskar。
namaskar(合十礼):印度表示尊重的传统问候或姿势,将手掌合起置于面前或胸前鞠躬。
如果我们在向网络输入 7 个字母后试着找出第 8 个字母,会发生什么呢?隐藏层会经历 8 次迭代。如果展开网络的话就是一个 8 层的网络,每一层对应一个字母。所以你可以想象一个普通的神经网络被重复了多次。展开的次数与它记得多久之前的数据是直接相关的。
循环神经网络的运作原理
循环神经元
这里我们将更深入地了解负责决策的实际神经元。以之前提到的 namaskar 为例,在给出前 7 个字母后,试着找出第 8 个字母。输入数据的完整词汇表是 {n,a,m,s,k,r}。在真实世界中单词或句子都会更复杂。为了简化问题,我们用的是下面这个简单的词汇表。
在上图中,隐藏层或 RNN 块在当前输入和之前的状态中应用了公式。在本例中,namaste 的字母 n 前面什么都没有。所以我们直接使用当前信息推断,并移动到下一个字母 a。在推断字母 a 的过程中,隐藏层应用了上述公式结合当前推断 a 的信息与前面推断 n 的信息。输入在网络中传递的每一个状态都是一个时间步或一步,所以时间步 t 的输入是 a,时间步 t-1 的输入就是 n。将公式同时应用于 n 和 a 后,就得到了一个新状态。
用于当前状态的公式如下所示:
h_t 是新状态,h_t-1 是前一个状态。x_t 是时间 t 时的输入。在对之前的时间步应用了相同的公式后,我们已经能感知到之前的输入了。我们将检查 7 个这样的输入,它们在每一步的权重和函数都是相同的。
现在试着以简单的方式定义 f()。我们使用 tanh 激活函数。通过矩阵 W_hh 定义权重,通过矩阵 W_xh 定义输入。公式如下所示:
上例只将最后一步作为记忆,因此只与最后一步的数据合并。为了提升网络的记忆能力,并在记忆中保留较长的序列,我们必须在方程中添加更多的状态,如 h_t-2、h_t-3 等。最后输出可以按测试阶段的计算方式进行计算:
其中,y_t 是输出。对输出与实际输出进行对比,然后计算出误差值。网络通过反向传播误差来更新权重,进行学习。本文后续部分会对反向传播进行讨论。
基于时间的反向传播算法(BPTT)
本节默认你已经了解了反向传播概念。如果需要对反向传播进行深入了解,请参阅链接:http://cs231ngithubio/optimization-2/。
现在我们了解了 RNN 是如何实际运作的,但是在实际工作中如何训练 RNN 呢?该如何决定每个连接的权重呢?如何初始化这些隐藏单元的权重呢?循环网络的目的是要准确地对序列输入进行分类。这要靠误差值的反向传播和梯度下降来实现。但是前馈网络中使用的标准反向传播无法在此应用。
与有向无环的前馈网络不同,RNN 是循环图,这也是问题所在。在前馈网络中可以计算出之前层的误差导数。但 RNN 的层级排列与前馈网络并不相同。
答案就在之前讨论过的内容中。我们需要展开网络。展开网络使其看起来像前馈网络就可以了。
展开 RNN
在每个时间步取出 RNN 的隐藏单元并复制。时间步中的每一次复制就像前馈网络中的一层。在时间步 t+1 中每个时间步 t 层与所有可能的层连接。因此我们对权重进行随机初始化,展开网络,然后在隐藏层中通过反向传播优化权重。通过向最低层传递参数完成初始化。这些参数作为反向传播的一部分也得到了优化。
展开网络的结果是,现在每一层的权重都不同,因此最终会得到不同程度的优化。无法保证基于权重计算出的误差是相等的。所以每一次运行结束时每一层的权重都不同。这是我们绝对不希望看到的。最简单的解决办法是以某种方式将所有层的误差合并到一起。可以对误差值取平均或者求和。通过这种方式,我们可以在所有时间步中使用一层来保持相同的权重。
RNN 实现
本文试着用 Keras 模型实现 RNN。我们试着根据给定的文本预测下一个序列。
代码地址:https://gistgithubcom/09aefc5231972618d2c13ccedb0e22ccgit
该模型是 Yash Katariya 建的。我对该模型做了一些细微的改动以适合本文的要求。
传统的文本分类一般都是使用词袋模型/Tf-idf作为特征+机器学习分类器来进行分类的。随着深度学习的发展,越来越多的神经网络模型被用来进行文本分类。本文将对这些神经网络模型做一个简单的介绍。
本文介绍了一种词向量模型,虽然算不得文本分类模型,但由于其可以说是fasttext的基础。因此也简单提一下。
作者认为cbow和skipgram及大部分词向量模型都没有考虑到单词的多态性,而简单的将一个单词的多种形态视为独立的单词。例如like的不同形式有likes,liking,liked,likes,这些单词的意思其实是相同的,但cbow/skipgram模型却认为这些单词是各自独立的,没有考虑到其形态多样性。
因此作者提出了一个可以有效利用单词字符级别信息的n-gram词向量模型,该模型是以skipgram模式实现的。例如单词 where,其n-gram表示为<wh, whe, her, ere, re>, where。其中<>分别表示前后缀。在原始的skipgram模型中,输入仅仅只是where的onehot向量,而在此模型中输入则变成了<wh, whe, her, ere, re>, where的onehot编码的加和,有效的利用了字符级别的信息,因此效果更加好。
而在loss方面,文中采用了负采样+binary LogisticRegression的策略。即对每一个目标单词都预测为正负中的一种。
在本文中作者提供了一个基于神经网络的文本分类模型,这个模型是基于cbow的,与cbow非常类似。
和CBOW一样,fastText模型也只有三层:输入层、隐含层、输出层(Hierarchical Softmax),输入都是多个经向量表示的单词,输出都是一个特定的target,隐含层都是对多个词向量的叠加平均。不同的是,CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征的embeding表示方式,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过;CBOW的输出是目标词汇,fastText的输出是文档对应的类标。输出层的实现同样使用了层次softmax,当然如果自己实现的话,对于类别数不是很多的任务,个人认为是可以直接使用softmax的。
最后,贴一个Keras的模型fasttext简化版。
基于词向量表示,本文提出利用卷积神经网络来进行文本分类。其算法如上图所示:
在本文中,作者尝试了多种不同的词向量模式:
在上一篇文章中CNN网络的输入一般是预训练好的词向量,而在本文中作者提出一种直接将embedding训练与分类任务结合在一起,且能有效提取/保留词序信息,也即有效训练出n-gram的模型方法,其实也可以理解为一种利用CNN来进行embedding的方法。
此外,另一个问题是输入序列长度变化问题(在上一篇文章textCNN中通过padding解决的?),在本文作者提出使用一个动态可变的pooling层来解决这个问题,使得卷积层输出的大小是相同的。关于可变pooling其实与图像识别中的 空间金字塔池化 (Spatial Pyramid Pooling) 是类似的。
这篇文章有点将fastText与TextCNN结合在一起的感觉,将n-gram embedding与分类任务结合在了一起进行训练,通过CNN来进行Embedding。
Text Categorization via Region Embedding》
在本篇文章中作者提出了一个tv-embedding(即two-view embedding),它也属于region embedding(也可以理解为ngram embedding)。这种方法与上面的bow-CNN表示相似,使用bow(bag of words)的方式来表示一个区域的词句,然后通过某个区域(region,左右邻域的单词或词句)来预测其前后的区域(单词或词句),即输入区域是view1,target区域是view2。tv-embedding是单独训练的,在使用的时候与CNN中的embedding组合在一起(形成多个channel?)。作者认为,word2vec方法预训练得到的embedding向量是普适性的,而通过特定任务的数据集的训练得到tv-embedding具有任务相关的一些信息,更有利于提升我们的模型效果。
吐槽一下,这篇文章没太看懂,也可能是英语太差,作者文章中没有那种一眼就能让人理解的网络图,像textCNN的图就非常一目了然,看图就知道是怎么做的了。
本文提出了一个使用监督学习加半监督预训练的基于LSTM的文本分类模型。文章作者与上面相同,所以用到的很多技术可以说与上面也是同出一辙。因此简单说下本文的一些思路。
作者认为已有的直接使用LSTM作为文本分类模型并直接将LSTM的最后一个输出作为后续全连接分类器的方法面临两个问题:(1)这种方式一般都是与word embedding整合在一起(即输入onehot经过一个embedding层再进入LSTM),但是embedding训练不稳定,不好训练;(2)直接使用LSTM最后一个输出来表示整个文档不准确,一般来说LSTM输入中后面的单词会在最后输出中占有较重的权重,但是这对于文章表示来说并不总是对的。因此作者对这两点进行了改进:
本文其实可以看作是作者将自己前面的tv-embedding半监督训练与RCNN的一个融合吧,大有一种一顿 *** 作猛如虎,一看人头0-5的感觉(因为作者的实验结果跟一般的CNN相比其实也抢不了多少)。
本文的作者也是前面两篇使用CNN来进行文本分类处理的文章的作者。因此在本文中,结合了前面两篇文章提出的一些方法,并使用了一个深层的卷积神经网络。具体的细节包括:
更多详细的关于DPCNN的细节可以查看 从DPCNN出发,撩一下深层word-level文本分类模型 。
本文提出了一种基于CNN+Attention的文本分类模型。作者认为已有的基于CNN的文本分类模型大都使用的是固定大小的卷积核,因此其学习到的表示也是固定的n-gram表示,这个n与CNN filter大小相关。但是在进行句子的语义表示时,不同句子发挥重要作用的ngram词语常常是不同的,也即是变化的。因此,模型能根据句子来自适应的选择每个句子最佳的n-gram对于提升模型的语义表示能力是非常关键的。本文便是由此思路提出了一种自适应的来选择不同n-gram表示的模型。
本文模型在主题结构上参照了CV中的DenseNet,借由DenseNet中的稠密连接来提取到丰富的n-gram特征表示。举例来说,在layer3的特征不仅能学习到f(x1, x2, x3),还能学习到f(x1(x2,x3))这种更多层次,更加丰富的特征。网络的结构主要包括三部分:DenseCNN主网络,Attention module和最后的全连接层分类网络。下面对这三部分进行简单的说明:
本文通过Dense connection + Attention来自动获取对于文本语义最重要的n-gram特征,结果很好。但是缺点是,这个网络比较适合较短的文本,文中对输入文本进行了padding补齐,对于不同数据集最大长度分别为50,100等,但这对于较长的文本明显是不足的。因此对于较长的文本或许HAN这种借用RNN来不限制输入长短的网络会更好。
本文提出了一种结合循环神经网络(RNN)和卷积神经网络来进行文本分类的方法,其结构如上图所示,该网络可以分为三部分:
虽然说是RNN与CNN的结合,但是其实只用到了CNN中的pooling,多少有一点噱头的意思。文中还提到了RCNN为什么比CNN效果好的原因,即为什么RCNN能比CNN更好的捕捉到上下文信息:CNN使用了固定大小window(也即kernel size)来提取上下文信息,其实就是一个n-gram。因此CNN的表现很大程度上受window大小的影响,太小了会丢失一些长距离信息,太大了又会导致稀疏性问题,而且会增加计算量。
在众多自然语言处理任务中,一个非常突出的问题就是训练数据不足,且标注难度大。因此文本提出了一种多任务共享的RNN模型框架,其使用多个不同任务数据集来训练同一个模型共享参数,已达到扩充数据集的作用。
文中作者提出了三个模型,如上图所示:
三个模型的训练方式相同:
本文提出了一个层次LSTM+Attention模型。作者认为,虽然一篇文章有多个句子组成但真正其关键作用的可能是其中的某几个,因此对各个句子施加了注意力机制,以使得对文章语义贡献较多的句子占有更多的权重。同样的,组成一个句子的单词有多个,但是发挥重要作用的可能就那么几个,因此使用注意力机制以使得重要单词发挥更大的作用,这些便是本文的核心思想。整个网络可分为三层,两个LSTM层分别用来进行word encode和sentence encode,最顶上为一个全连接分类层。若加上两层注意力层,则可认为网络为5层。下面简单聊聊这五层网络的结构:
总体来说,本文看起来还是比较有意思的,符合人阅读文章的习惯,我们写文章的时候也是有中心词和中心句的。但是由于这个层级结构是否会导致训练慢或者不好训练还不得而知。最后,文中还提出对文章按长短先进行排序,长度相似的进入一个batch,这将训练速度加快了3倍。
本文提出了一个基于图神经网络的文本分类方法。该方法的主要思想是将所有文章及其包含的词汇都放到一个图网络里面去,图网络中的节点分为两种类型:单词节点和文章节点。其中连接单词节点和文章节点的边的权重使用TF-IDF来表示,而单词与单词之间边的权重则是使用点互信息(PMI)来表示。点互信息与传统语言模型中的条件概率计算方式非常相似。只不过PMI采用的是滑窗方式而条件概率是直接在所有语料中进行统计,可以认为是将所有语料当做一个大窗口,这时就又与PMI相同了。
A表示图网络的邻接矩阵,表示如下:
GCN同样也是可以含有多层隐藏层的,其各个层的计算方式如下:
其中A'为归一化对称邻接矩阵, W0 ∈ R^(m×k) 为权重矩阵,ρ是激活函数,例如 ReLU ρ(x) = max(0,x) 如前所述,可以通过叠加多个GCN层来合并更高阶的邻域信息:
其中j表示层数。
损失函数定义为所有已标记文档的交叉熵误差:
文中提到Text GCN运行良好的原因有两个方面:
但是其也有一些缺:
总的来说,文章的idea还是挺有意思的,效果也还不错。初识GCN可能还是有一点难以理解,可以参考如下资料进行进一步学习:
基于图卷积网络的文本分类算法
如何理解 Graph Convolutional Network(GCN)?
神经网络是一种受到人类神经系统启发而设计的机器学习模型。它由多个称为神经元的单元组成,这些神经元通过连接权重相互连接。神经网络利用输入数据和这些连接权重来进行信息处理和模式识别。以下是神经网络的基本原理:
结构:神经网络由多个层级组成,包括输入层、隐藏层(可以有多个)和输出层。输入层接收外部输入数据,输出层产生最终的预测结果或输出。隐藏层位于输入层和输出层之间,其中每个隐藏层由多个神经元组成。
神经元:神经网络的基本单元是神经元。每个神经元接收来自上一层神经元的输入,并通过连接权重对这些输入进行加权求和。然后,应用一个激活函数来确定神经元的输出。激活函数可以是简单的阈值函数、Sigmoid函数、ReLU函数等,用于引入非线性特性。
前向传播:神经网络的前向传播是指从输入层到输出层的信息传递过程。输入数据通过网络中的连接和加权求和,逐层传递到输出层,最终生成预测结果。
反向传播:反向传播是神经网络用于训练和调整连接权重的过程。它基于损失函数来度量预测结果与真实标签之间的误差。通过计算误差梯度,反向传播将误差从输出层向后传播到隐藏层和输入层,然后根据梯度更新连接权重,以减小误差。
训练:神经网络的训练是通过不断迭代前向传播和反向传播来调整连接权重,以使网络的预测结果与真实标签更加接近。常用的训练算法包括梯度下降和其变体,以最小化损失函数。
通过逐渐调整连接权重,神经网络能够学习到输入数据中的模式和特征,从而实现识别、分类、预测等任务。它在各个领域中都有广泛的应用,如图像识别、自然语言处理、语音识别等。
词表示是自然语言处理的基础,一个好的词向量在很大程度上决定了后续任务的上限。本文是我最近学习该部分内容的笔记,主要参照的是 基于神经网络的词和文档语义向量表示方法研究 一文,穿插了一些个人理解。内容较多,错误难免,请拍砖~
分布表示(Distributional Representation)假说 :上下文相似的词,其语义也相似。根据建模方式的不同,主要分为三类:基于矩阵的分布表示、基于聚类的分布表示和基于神经网络的分布表示。
尽管不同的分布表示方法使用了不同的技术手段获取词表示,但由于这些方法均基于分布假说,它们的核心思想也都由两部分组成:
基于矩阵的分布表示通常又称为分布语义模型(distributional semantic models)。这类方法需要构建一个“词-上下文”矩阵,从矩阵中获取词的表示。在“词-上下文”矩阵中,每行对应一个词,每列表示一种不同的上下文,矩阵中的每个元素对应相关词和上下文的共现次数。在这种表示下,矩阵中的一行,就成为了对应词的表示,这种表示描述了该词的上下文的分布。由于分布假说认为上下文相似的词,其语义也相似,因此在这种表示下,两个词的语义相似度可以直接转化为两个向量的空间距离。这类方法具体可以分为三个步骤:
著名的 Global Vector模型(GloVe) 就是基于矩阵的分布表示
基于聚类的分布表示又称作分布聚类(distributional clustering),这类方法通过聚类手段构建词与其上下文之间的关系。其中最经典的方法是布朗聚类(Brown clustering)。布朗聚类是一种层级聚类方法,聚类结果为每个词的多层类别体系。因此可以根据两个词的公共类别判断这两个词的语义相似度。
基于神经网络的分布表示一般称为词向量、词嵌入(word embedding)或分布式表示(distributed representation)。神经网络词向量表示技术通过神经网络技术对上下文,以及上下文与目标词之间的关系进行建模。由于神经网络较为灵活,这类方法的最大优势在于可以表示复杂的上下文。在前面基于矩阵的分布表示方法中,最常用的上下文是词。如果使用包含词序信息的n-gram作为上下文,当n增加时,n-gram的总数会呈指数级增长,此时会遇到维数灾难问题。而神经网络在表示n-gram时,可以通过一些组合方式对n个词进行组合,参数个数仅以线性速度增长。有了这一优势,神经网络模型可以对更复杂的上下文进行建模,在词向量中包含更丰富的语义信息。
神经网络词向量模型与其它分布表示方法一样,均基于分布假说,核心依然是上下文的表示以及上下文与目标词之间的关系的建模。构建上下文与目标词之间的关系,最自然的一种思路就是使用语言模型。
语言模型可以对一段文本的概率进行估计,对信息检索、机器翻译、语音识别等任务有着重要的作用。形式化讲,统计语言模型的作用是为一个长度为 的字符串确定一个概率分布 ,表示其存在的可能性,其中 到 依次表示这段文本中的各个词。一般在实际求解过程中,通常采用下式计算其概率值:
在实践中,如果文本的长度较长,上述公式右部 的估算会非常困难。因此,研究者们提出使用一个简化模型:n元模型(n-gram model)。在n元模型中估算条件概率时,距离大于等于n的上文词会被忽略,也就是对上述条件概率做了以下近似:
在 元模型中,传统的方法一般采用频率计数的比例来估算 元条件概率:
其中, 表示文本序列 在语料中出现的次数。
为了更好地保留词序信息,构建更有效的语言模型,我们希望在 元模型中选用更大的 。但是,当 较大时,长度为 序列出现的次数就会非常少,在按照上述公式估计 元条件概率时,就会遇到数据稀疏问题,导致估算结果不准确。因此,一般在百万词级别的语料中,三元模型是比较常用的选择,同时也需要配合相应的平滑算法,进一步降低数据稀疏带来的影响。
为了更好地解决 元模型估算概率时遇到的数据稀疏问题,神经网络语言模型应运而生。
神经网络语言模型(Neural Network Language Model ,NNLM)在学习语言模型的同时,也能得到词向量。
NNLM 同样也是对n 元语言模型进行建模,估算 的值。但与传统方法不同的是,NNLM 不通过计数的方法对 元条件概率进行估计,而是直接通过一个神经网络结构,对其进行建模求解。下图展示了NNLM 的基本结构。
具体而言,对语料中一段长度为 的序列 , 元语言模型需要最大化以下概率:
其中, 为需要通过语言模型预测的词(目标词)。对于整个模型而言,输入为条件部分的整个词序列: ,输出为目标词的分布。而神经网络的目标就是要让输出中, (目标词)的概率最大。
神经网络语言模型采用普通的三层前馈神经网络结构,其中第一层为输入层。Bengio提出使用各词的词向量作为输入以解决数据稀疏问题,因此输入层为词 的词向量的顺序拼接:
当输入层完成对上文的表示 之后,模型将其送入剩下两层神经网络,依次得到隐藏层 和输出层 :
其中 , 。 表示词汇表的大小, 表示词向量的维度, 是隐层的维度。矩阵 表示从输入层到输出层的直连边权重矩阵。如果使用该直连边,可以减少一半的迭代次数;但如果没有直连边,可以生成性能更好的语言模型。因此在后续工作中,很少有使用输入层到输出层直连边的工作。
输出层一共有 个元素,,依次对应下一个词为词表中某个词的可能性。这里使用softmax函数,将其转化为对应的概率。
将 展开,得到:
被称为能量函数。
2007 年,Mnih和Hinton在神经网络语言模型(NNLM)的基础上提出了log双线性语言模型(Log-Bilinear Language Model,LBL)。LBL模型的能量函数为:
LBL模型的能量函数与NNLM的能量函数主要有两个区别。一、LBL 模型中,没有非线性的激活函数tanh,而由于NNLM 是非线性的神经网络结构,激活函数必不可少;二、LBL 模型中,只有一份词向量e,也就是说,无论一个词是作为上下文,还是作为目标词,使用的是同一份词向量。其中第二点(只有一份词向量),只在原版的LBL模型中存在,后续的改进工作均不包含这一特点。
循环神经网络语言模型(Recurrent Neural Network based Language Model,RNNLM)则直接对 进行建模(注意不是 )
RNNLM里面最厉害的就属 ELMo 了。该模型利用多层双向LSTM的加权和来表示词向量,其中权重可根据具体任务动态调节。
与基于语言模型的词向量生成方法不同,C&W以直接生成词向量为目标。
C&W模型没有去求解 ,而是直接对n元短语打分。对于语料中出现过的 元短语,模型会对其打高分;而对于语料中没有出现的随机短语,模型会对其打低分。通过这种方式,C&W 模型可以更直接地学习得到符合分布假说的词向量。
具体而言,对于整个语料,C&W模型需要最小化:
其中, 为从语料中选出的一个 元短语 , 为序列中的中间词,也是目标词,即 ; 表示 的上下文; 为字典中的某一个词。正样本 来自语料,而负样本 则是将正样本序列中的中间词替换成其它词。
即:
C&W模型与NNLM相比,主要的不同点在于C&W模型将目标词放到了输入层,同时输出层也从语言模型的 个节点变为一个节点,这个节点的数值表示对这组n元短语的打分。这个区别使得C&W模型成为神经网络词向量模型中最为特殊的一个,其它模型的目标词均在输出层,只有C&W模型的目标词在输入层。
CBOW模型的结构如上图,该模型一方面根据C&W模型的经验,使用一段文本的中间词作为目标词;另一方面,又以NNLM作为蓝本,并在其基础上做了两个简化。一、CBOW没有隐藏层,去掉隐藏层之后,模型从神经网络结构直接转化为log线性结构,与Logistic回归一致。log线性结构比三层神经网络结构少了一个矩阵运算,大幅度地提升了模型的训练速度。二、CBOW去除了上下文各词的词序信息,使用上下文各词词向量的平均值,代替神经网络语言模型使用的上文各词词向量的拼接。形式化地,CBOW模型对于一段训练样本 ,输入为:
由于没有隐藏层,CBOW模型的输入层直接就是上下文的表示。CBOW 模型根据上下文的表示,直接对目标词进行预测:
对于整个语料而言,与神经网络语言模型类似,CBOW的优化目标为最大化:
Skip-gram模型的结构如上图,与CBOW模型一样,Skip-gram模型中也没有隐藏层。和CBOW模型不同的是,Skip-gram模型每次从目标词 的上下文 中选择一个词,将其词向量作为模型的输入 ,也就是上下文的表示。Skip-gram模型同样通过上下文预测目标词,对于整个语料的优化目标为最大化:
其中,
人工神经网络模型主要考虑网络连接的拓扑结构、神经元的特征、学习规则等。目前,已有近40种神经网络模型,其中有反传网络、感知器、自组织映射、Hopfield网络、波耳兹曼机、适应谐振理论等。根据连接的拓扑结构,神经网络模型可以分为:
(1)前向网络 网络中各个神经元接受前一级的输入,并输出到下一级,网络中没有反馈,可以用一个有向无环路图表示。这种网络实现信号从输入空间到输出空间的变换,它的信息处理能力来自于简单非线性函数的多次复合。网络结构简单,易于实现。反传网络是一种典型的前向网络。
(2)反馈网络 网络内神经元间有反馈,可以用一个无向的完备图表示。这种神经网络的信息处理是状态的变换,可以用动力学系统理论处理。系统的稳定性与联想记忆功能有密切关系。Hopfield网络、波耳兹曼机均属于这种类型。
学习是神经网络研究的一个重要内容,它的适应性是通过学习实现的。根据环境的变化,对权值进行调整,改善系统的行为。由Hebb提出的Hebb学习规则为神经网络的学习算法奠定了基础。Hebb规则认为学习过程最终发生在神经元之间的突触部位,突触的联系强度随着突触前后神经元的活动而变化。在此基础上,人们提出了各种学习规则和算法,以适应不同网络模型的需要。有效的学习算法,使得神经网络能够通过连接权值的调整,构造客观世界的内在表示,形成具有特色的信息处理方法,信息存储和处理体现在网络的连接中。
根据学习环境不同,神经网络的学习方式可分为监督学习和非监督学习。在监督学习中,将训练样本的数据加到网络输入端,同时将相应的期望输出与网络输出相比较,得到误差信号,以此控制权值连接强度的调整,经多次训练后收敛到一个确定的权值。当样本情况发生变化时,经学习可以修改权值以适应新的环境。使用监督学习的神经网络模型有反传网络、感知器等。非监督学习时,事先不给定标准样本,直接将网络置于环境之中,学习阶段与工作阶段成为一体。此时,学习规律的变化服从连接权值的演变方程。非监督学习最简单的例子是Hebb学习规则。竞争学习规则是一个更复杂的非监督学习的例子,它是根据已建立的聚类进行权值调整。自组织映射、适应谐振理论网络等都是与竞争学习有关的典型模型。
研究神经网络的非线性动力学性质,主要采用动力学系统理论、非线性规划理论和统计理论,来分析神经网络的演化过程和吸引子的性质,探索神经网络的协同行为和集体计算功能,了解神经信息处理机制。为了探讨神经网络在整体性和模糊性方面处理信息的可能,混沌理论的概念和方法将会发挥作用。混沌是一个相当难以精确定义的数学概念。一般而言,“混沌”是指由确定性方程描述的动力学系统中表现出的非确定性行为,或称之为确定的随机性。“确定性”是因为它由内在的原因而不是外来的噪声或干扰所产生,而“随机性”是指其不规则的、不能预测的行为,只可能用统计的方法描述。混沌动力学系统的主要特征是其状态对初始条件的灵敏依赖性,混沌反映其内在的随机性。混沌理论是指描述具有混沌行为的非线性动力学系统的基本理论、概念、方法,它把动力学系统的复杂行为理解为其自身与其在同外界进行物质、能量和信息交换过程中内在的有结构的行为,而不是外来的和偶然的行为,混沌状态是一种定态。混沌动力学系统的定态包括:静止、平稳量、周期性、准同期性和混沌解。混沌轨线是整体上稳定与局部不稳定相结合的结果,称之为奇异吸引子。
内容来自哈工大车万翔老师团队的作品《自然语言处理:基于预训练模型的方法》。
马尔可夫假设降低了句子概率为0的可能性,但是当n比较大或者测试句子含有 未登录词(Out-Of-Vacabulary,OOV) 时,仍然会出现“零概率”问题。
由于数据的稀疏性,训练数据很难覆盖测试数据中所有可能出现的N-gram,但这并不意味着这些N-gram出现的概率为0。为了避免该问题,使用 平滑(Smoothing) 计算调整概率估计的结果
折扣法(Discounting) 平滑的基本思想时“损有余而补不足”,即从频繁出现的N-gram中匀出一部分概率并分配给低频次(含零频次)的N-gram,从而使得整体概率分布趋于均匀。
加1平滑(Add-one Discounting) 是一种典型折扣法,又称 拉普拉斯平滑(Laplace Discounting) 。其假设所有N-gram的频次都比实际出现的频次多一次。
例:unigram模型,平滑后概率公式为
注意,实际使用中,尤其训练数据较小时,加1平滑将对低频次或零频次时间给出过高的概率估计。于是扩展为 加 平滑 ,即假设所有事件的频次比实际出现的频次多 次,其中 。于是bigram语言模型的条件概率为:
至于超参数 的取值,需要根据开发集数据上的困惑度对不同 取值下的语言模型进行评价,最终确定最优的 用于测试集。
N元模型的问题:马尔可夫假设使得N元语言模型无法对长度超过N的长距离词语依赖关系进行建模,如果N扩大又会带来严重的数据稀疏问题,同时还会急剧增加模型的参数量。后续会讲到神经网络语言模型可以解决上述问题。
NLP:计算机或系统真正理解人类语言并以与人类相同的方式处理它的能力。
难度:理解话中的潜在意图;理解句子中的歧义。
歧义包括:单词、句子、语义中歧义。
在文本数据上执行的一些基本 *** 作
正则表达式:对字符串 *** 作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
1 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”)
2 可以通过正则表达式,从字符串中获取我们想要的特定部分。
可以读取一个文本文件并根据需要将其转化为一列单词或句子。
方式:
1、将一个单词替换为另一个单词;
2、删除或添加某些特定类型的单词;
可以通过urllib包获取。
停止词:索引擎会忽略的常用词。例如:the
是SciKit-Learn库的一个工具,可以接收任何大量的文本,将每个独特的单词作为特征返回,并计算每个单词在文本中出现的 次数。
TF:术语频率。特定单词的计数与文档中单词总数的比率。
IDF:反向文档频率。文档总数与包含特定单词的文档数量的对数比率。
TF-IDF权重:二者的乘积。
作用: 衡量一个词对于一段文本的重要性
例如,文本可以被分为正面和负面。通调取TExtBlob包可以获取许多这样的架构。
神经网络的基本结构
基本原理:人工神经元或感知器的基本元素的集合。
采用多个二元输入x1, x2, x3,如果总和大于激活电位,则产生单个二进制输出,神经元会执行称为"发射"的指令,发射的神经元沿着信号传递到与其他树突相连的神经元,如果超过了激活电位,其他神经元也会发射。
神经网络的类型
前馈神经网络:神经网络家族的基本单元
循环神经网络:处理 NLP 中普遍存在的动态输入序列的一个最佳的技术方案。但是很快被经典的LSTM取代
卷积神经网络:应用于文本的卷积神经网络只在两个维度上工作,其中滤波器(卷积核)只需要沿着时间维度移动。卷积也可以用来 加速 LSTM。
递归神经网络:将句子视为树而不是序列
词嵌入:利用所有个体单词 相邻 的单词,使用给定文本中的信息并将其传递给模型。这使得嵌入以密集向量的形式存在,在连续向量空间中表示个体单词的投影。 即将「不可计算」「非结构化」的词转化为「可计算」「结构化」的向量。
这一步解决的是”将现实问题转化为数学问题“ ,是人工智能非常关键的一步。
嵌入:单词在新学习的向量空间中的 坐标
词嵌入是无监督学习领域最重要的应用之一
2 神经语言模型
Bengio提出的前馈神经网络语言模型(FNNLM)引入了前馈神经网络,是为词嵌入模型奠定了基础。
该模型中仍然用于词嵌入模型的部分有:
1、 嵌入层:
作用:记录训练数据集中所有单词的表示。
初始化:由一组随机权重初始化
组成:词汇表的大小,词嵌入向量输出的大小、模型输入序列的长度
结果输出:二维向量,包含给定单词序列中所有单词的最终嵌入
2、隐藏层:
位置:位于初始层到最终层之间,可以一个或多个
作用:通过将神经网络中的 非线性函数 应用于先前n个词的词嵌入,来产生 输入文本数据的表示 。
3、Softmax层:
位置:神经网络体系结构的最后一层
作用:返回输入词汇表中存在的所用单词的 概率分布
该模型有助于实现当前词汇表中不存在的单词的泛化。
Word2vec 是 Word Embedding 的方法之一, Word Embedding 的模型本身并不重要,重要的是生成出来的结果——词向量。因为在后续的任务中会直接用到这个词向量。
包含两种模型:CBOW(连续词袋)和skip-gram
区别:执行预测的方式。
CBOW:利用上下文或周围的单词来预测中心词
skip-gram:使用中心词来预测上下文
优点:与单热编码相比,word2vec有利于减我码空间大小,并将单词的表示压缩到所需的向量长度。
word2vec创建单词表示的方式基于单词的上下文。
过程:使用序列中的当前单词来预测周围的单词
周围单词的分类 得分 基于 语法关系 和它们与中心词一起出现的 次数
CBOW模型
CBOW是一种基于窗口的语言模型。(窗口:句子中的一个固定长度的片段,窗口中间的词为中心词,其他词问中心词的上下文)
原理:通过三层神经网络接受上下文的特征向量,预测中心词是什么
结构:输入层、隐藏层、输出层
该模型的6个步骤:
全文链接: Convolutional Neural Networks for Sentence Classification——学术范
2012年在深度学习和卷积神经网络成为图像任务明星之后, 2014年TextCNN诞生于世,成为了CNN在NLP文本分类任务上的经典之作。 TextCNN提出的目的在于,希望将CNN在图像领域中所取得的成就复制于自然语言处理NLP任务中。
TextCNN是一种采用卷积神经网络(CNN)提取文本n-gram特征,最大池化,全连接然后进行分类的一种新型模型。它在当时对文本分类SVM老大的位置提出了挑战,虽然当时TextCNN模型效果没有完全超过SVM,但CNN的热潮使得TextCNN极受追捧,成为NLP文本分类任务的经典模型。
上论文~
首先论文在摘要部分指出本文报告了一系列关于卷积神经网络(CNN)的实验,这些实验是在预先训练的单词向量的基础上进行的,用于句子级别的分类任务。
近年来,深度学习模型在计算机视觉和语音识别方面取得了显著的成果。在自然语言处理中,深度学习方法的大部分工作都涉及到通过神经语言模型学习单词向量表示,并对学习到的单词向量进行合成进行分类。单词向量,其中单词从一个稀疏的1- V编码(这里的V是词汇量)通过一个隐藏层投影到一个低维向量空间,本质上是一个特征提取器,在其维中编码单词的语义特征。在这种密集表示中,语义上相近的词在低维向量空间中的欧几里得距离或余弦距离也是相近的。卷积神经网络(CNN)利用卷积滤波器应用于局部特征。
数据集和实验设置
使用的所有数据集:校正线性单元,过滤窗口(h)为3,4,5,每个有100个特征图,dropout率(p)为05,l2约束(s)为3,小批量大小为50。这些值是通过在SST-2开发集上的网格搜索选择的。
用从无监督神经语言模型中获得的词向量初始化是在没有大型监督训练集的情况下提高性能的一种流行方法。文中使用公开可用的word2vec向量,这些向量是从谷歌新闻中训练的1000亿个单词。向量的维数为300,并使用连续的词袋结构进行训练。在预先训练的词集中不存在的词将被随机初始化。
论文用模型的几个变体进行了实验
•CNN-rand:基线模型,其中所有单词都随机初始化,然后在训练期间修改。
•CNN-static:一个带有fromword2vec预训练向量的模型。所有单词(包括随机初始化的未知单词)都保持静态,只学习模型的其他参数。
•CNN-non-static:同上,但预训练向量对每个任务进行了微调。
•CNN-multichannel:一个具有两个词向量集的模型。每个向量集被视为一个“通道”,每个过滤器被应用于两个通道,但梯度只通过一个通道反向传播。因此,该模型能够在保持其他向量不变的情况下对一组向量进行微调。两个通道都用word2vec初始化。
表2列出了模型与其他方法的对比结果,基线模型包含所有随机初始化的单词(CNN-rand),但它自己的表现并不好。
即使是一个简单的静态向量模型(CNN-static)也表现得非常好,与更复杂的深度学习模型相比,使用复杂的池化方案(Kalchbrenner et al, 2014)或要求预先计算解析树(Socheret al, 2013),其结果具有竞争力。这些结果表明,预先训练的向量是良好的,“通用的”特征提取器,可以跨数据集使用。对每个任务的预训练向量进行微调,还可以得到进一步的改进(CNN-non-static)。
多通道与单通道模型
我们最初希望多通道体系结构能够防止过拟合(通过确保学习到的向量不会离原始值太远),从而比单通道模型工作得更好,特别是在较小的数据集上。然而,结果是喜忧参半的,进一步规范微调过程的工作是有必要的。例如,在非静态部分,我们可以使用一个单独的通道,但使用允许在训练期间修改的额外维度,而不是使用一个额外的通道。
静态与非静态表示
与单通道非静态模型的情况一样,多通道模型能够对非静态通道进行微调,使其更适合当前的任务。例如,good和bad在word2vec中最相似,大概是因为它们(几乎)在语法上是等价的。但是对于SST-2数据集上经过微调的非静态信道中的向量来说,情况就不一样了(表3)。同样,good在表达情感方面可以说更接近于nice,而不是great,这确实反映在学习到的向量上。对于(随机初始化的)不属于预先训练的向量集合的标记,微调可以让它们学习更有意义的表示:网络学习到感叹号与热情的表达式有关,逗号是连接符(表3)。
结论
在目前的工作中,论文描述了一系列建立在word2vec之上的卷积神经网络实验。尽管很少对超参数进行调整,但带有一层卷积的简单CNN表现得非常好。研究结果进一步证明,无监督词向量的预训练是NLP深度学习的重要组成部分。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)