独家 | 一文读懂序列建模(deeplearning.ai)

640?wx_fmt=png

作者:Pulkit Sharma,2019年1月21日

翻译:陈之炎

校对:丁楠雅

本文约11000字,建议阅读10+分钟。

本文为你详细介绍序列模型,并分析其在不同的真实场景中的应用。


简介


如何预测一个序列中接下来要发生什么事情是一个非常吸引人的课题,这是我对数据科学如此着迷的原因之一!有趣的是——人类的头脑确实擅长于此,但是机器却不是这样的。如果一本书中有一个神秘的情节,人类的大脑就会开始预测出结果,然而,如何教会机器来做类似的事情呢?


多亏了深度学习,我们今天能做的事情比几年前要多的多。处理序列数据的能力,如音乐歌词、句子翻译、理解评论或构建聊天机器人-所有这些都要归功于序列建模


这便是我们在本文中需要学习的内容,由于这是deeplearning.ai专业系列课程的一部分,我希望读者能够了解到某些概念。如果你还没有读过前几篇文章,或者还需要快速复习一下,可以访问以下链接:


  • 深度学习和神经网络入门指南(deeplearning.ai第1课)

    https://www.analyticsvidhya.com/blog/2018/10/introduction-neuric-networks-deep-learning/

  • 改进神经网络–超参数调整、正则化和其他(deeplearning.ai第2课)

    https://www.analyticsvidhya.com/blog/2018/11/neuric-networks-hyperparameter-tuning-regularization-deeplearning/

  • 从零开始学习卷积神经网络的综合教程(deeplearning.ai第4课)

    https://www.analyticsvidhya.com/blog/2018/11/neuric-networks-hyperparameter-tuning-regularization-deeplearning/


在本节课程中,我们将看到如何将序列模型应用到不同的真实场景中去,如情感分类、图像字幕等。


640?wx_fmt=png


课程目录


  • 课程结构

  • 课程内容:序列模型


序列模型课程内容如下: 


一、模块1:循环神经网络(RNNs)

二、模块2:自然语言处理(NLP)和单词嵌入

    2.1 单词嵌入简介

    2.2 学习单词嵌入:Word2vec & GloVe

    2.3 单词嵌入的应用程序

三、模块3:序列模型与注意力(Attention)机制


课程结构


到目前为止,我们已经在这个系列课程中涵盖了相当多的内容,以下是对所学概念的简要概括:


  • 深度学习和神经网络基础。

  • 浅层和深层神经网络的工作原理。

  • 如何通过超参数调整、正则化和优化来提高深度神经网络的性能。

  • 如何通过scratch实现卷积神经网络。


现在我们把重点转向序列建模,本课程分为三个模块(官方课程名称为:Andrew Ng教授的深度学习专业课程第5课):


  • 模块1中,我们将学习循环神经网络及其工作原理,此外,还将在本模块中介绍GRU和LSTM。

  • 模块2中,重点学习自然语言处理和单词嵌入。我们将学到如何将Word2vec和Glove框架应用于学习单词嵌入

  • 最后,模块3将介绍注意力(Attention)模型的概念。我们将学到如何将大而复杂的句子从一种语言翻译成另一种语言。


准备好了吗?那我们便从模块1开始第5课序列模型的学习吧!


一、模块1:循环神经网络


第5课第一模块的目标是:


  • 了解什么是循环神经网络(RNN)

  • 学习包括LSTM、GRUS和双向RNN在内的多种算法


如果这些缩写听起来令人生畏,不要担心——我们会很快把它们解决掉。


1. 首先,为什么是序列模型?


为回答这个问题,将向你展示一些在真实场景中应用到的序列模型示例。


  • 语音识别:


这是一个很常见的应用(每个有智能手机的人都会知道这一点),在这里,输入是一个音频剪辑板,模型生成文本转录。在这里,音频被认为是一个序列,随着时间的推移,输出为一系列单词。

 

640?wx_fmt=jpeg


  • 情感分类:


序列模型的另一个流行应用是情感分类。我们将一个文本句子作为输入,模型必须预测出句子的情感(积极、消极、愤怒、兴奋等),输出可以为分级或标星。


640?wx_fmt=jpeg


  • DNA序列分析:


给定一个DNA序列作为输入,期望模型能够预测出哪一部分DNA属于哪一种蛋白质。


640?wx_fmt=jpeg


  • 机器翻译:


用一种语言输入一个句子,比如法语,希望模型能把它转换成另一种语言,比如英语。在这里,输入和输出都是序列:

 640?wx_fmt=jpeg


  • 视频活动识别:


这实际上是利用序列模型对即将到来的事件(和当前的趋势)进行预测,该模型用来预测给定视频中正在进行的活动,在这里,输入是一个帧序列。

 

640?wx_fmt=jpeg


  • 名称实体识别:


这当然是我最喜欢的序列模型示例。如下图所示,我们用一句话作为输入,并希望模型能识别出该句子中的人名:


640?wx_fmt=jpeg


现在,在做进一步深入探讨之前,需要讨论几个重要的符号,你会在整个文章中看到这些符号。

 

2. 将在本文中使用到的符号


我们用“x”来表示一个句子,为方便理解,以下面的示例句子为例:


640?wx_fmt=png

X:哈利和赫敏发明了一种新的咒语。

 

现在,我们用x<t>来表示句子中的每个词:

 

  • x<1> = 哈利

  • x<2>=赫敏,等等


上述句子的输出将是:


Y=1 0 1 0 0 0 0


在这里,1表示这个单词代表一个人的名字(0表示它是其他)。下面是我们经常用到的一些常用符号:


  • T=  输入句长度

  • T=  输出句长度

  • x(i) = ith 训练样本

  • x(i)<t> = ith训练样本的tth训练

  • Tx(i)  = ith输入句长度


此时,我们或许会问——如何在一个序列中表示一个单独的单词呢?嗯,这里,我们要依靠词汇表或字典,即我们在句子中使用到的单词列表,词汇表结构如下所示:

 

640?wx_fmt=jpeg


词汇表的大小因不同的应用而异,通常从训练集中挑选出现频度最高的单词来制作词汇表。


现在,假设我们想表示单词“Harry”这个词,它在词汇表中的位置是4075th 位,我们对这个词汇进行一次编码,以表示“Harry”:


640?wx_fmt=jpeg


通常,x<t>是一个独热编码向量,我们将1放在第4075t位置,所有其余的单词将表示为0。


如果单词不出现在词汇表中,会创建一个未知的<unk>标记,并将其添加到词汇表中。就这么简单!


3. 循环神经网络(RNN)模型


当X,Y之中有一个是序列,或者X和Y都是序列时,我们使用循环神经网络来学习从X到Y的映射。但是,为什么不能用一个标准的神经网络来解决这些序列问题呢?


问得太好了!下面,让我用一个例子来做出解释。假设我们需要构建下述神经网络:

 

这里主要有两个问题:


  1. 输入和输出没有固定的长度,也就是说,一些输入语句可以是10个单词,而其他的可以是<>10(大于或小于)。最终输出也是如此

  2. 如果使用一个标准的神经网络,我们将无法在不同的文本位置上共享所学的特征。


为此,需要建立一种表示,用它来解析不同长度的句子,并减少模型中的参数数量。这就是我们要用到循环神经网络的地方,这便是典型RNN:

 

RNN获取第一个单词(x<1>),并将其馈送到预测输出(y‘<1>)的神经网络层。重复此过程,直到最后一步x<tx>生成最后的输出y‘<Ty>,这是输入字数和输出字数相等的网络。


RNN按从左到右的顺序扫描数据。注意,RNN在每个时间步长中使用的参数是共享的,在每个输入层和隐藏层(Wax)之间、每个时间步长(Waa)之间以及隐藏层和输出层(Wya)之间共享参数。


因此,如果需要对x<3>进行预测,我们也会得到关于x<1>和x<2>的信息。RNN的一个潜在缺点是:它只从先前的时间步长获取信息,而不是从后续的时间步长获取信息。这个问题可以用双向RNN来解决,我们会在稍后进行讨论。现在,我们来看看RNN模型中的前向传播的步骤:


a<0> 是一个全零向量,我们计算与标准神经网络相类似的激活函数:


  • a<0>  = 0

  • a<1>  = g(Waa * a<0> + Wax * x<1> + ba)

  • y<1> = g’(Wya * a<1> + by)


同样,我们可以计算每个时间步长的输出。这些公式的一般形式可以写成:


640?wx_fmt=jpeg


可以用更为简洁的方法列出这些方程:


640?wx_fmt=jpeg


水平叠加Waa Wya 以获得Waa<t-1>x<t>垂直叠加。目前只有一个矩阵,而不是带着两个参数的矩阵。简言之,这便是循环神经网络的前向传播原理。


3.1 时间轴上的反向传播


接下来,你可能会看到这种情况-反向传播步骤与前向传播的方向正好相反。我们有一个损失函数,为了得到准确的预测,需要将它最小化。损失函数由以下公式给出:


640?wx_fmt=jpeg


我们计算每个时间步长里的损失,最后对所有这些损失求和,以计算序列的最终损失:


640?wx_fmt=jpeg


在前向传播中,我们从左向右移动,即增加时间t的步长。在反向传播中,我们从右向左移动,即在时间轴上向后移动(因此称为时间反向传播)。


到目前为止,我们看到的是输入和输出序列长度相等的应用场景。但是如果输入和输出序列长度不等的情况又如何呢?我们将在下一节中看到这些不同的应用场景。

 

3.2 不同种类的RNN


可以用多种不同类型的RNN来处理序列长度不同的示例。这些问题可分为以下几类:


  • 多对多


前面看到的名称实体识别示例属于这个类别。假设我们有一系列的单词,对于每个单词,我们必须预测它是否是一个人名。针对此类问题的RNN架构如下:


640?wx_fmt=jpeg


对于每个输入字,我们预测它对应的输出字。


  • 多对一


来看看情绪分类问题:我们将一个句子传递给模型,它将返回与该句子对应的情感或评级。这是一个多对一的问题,输入序列可以有不同的长度,而输出只有一个。针对此类问题的RNN架构如下所示:


640?wx_fmt=jpeg


这里,我们在句子结束时会得到一个输出。


  • 一对多


以音乐生成为例,我们希望用音乐作为输入来预测歌词。在这种情况下,输入只是一个单词(或一个整数),输出的长度可变。这类问题的RNN体系结构如下所示:


640?wx_fmt=jpeg


还有一种RNN在工业上广泛使用,即机器翻译,将一种语言的输入句翻译成另一种语言。这是一个多对多的问题,输入序列的长度可能等于也可能不等于输出序列的长度。


在这种情况下,我们有编码器和解码器。编码器读取输入语句,解码器将其转换为输出语句:


640?wx_fmt=jpeg


3.3 语言模型和序列生成


假设需要建立一个语音识别系统,我们听到一句话:“苹果和梨沙拉很好吃”。该模型将预测什么——“苹果配梨沙拉很美味”还是“苹果和梨沙拉是美味”?


我希望是第二句话!语音识别系统通过预测每个句子的概率来选择句子。


但是又如何来构建语言模型呢?


假设有一个输入语句:


640?wx_fmt=png

猫平均每天睡15小时

 

构建语言模型的步骤如下:


  • 第1步:标记输入,即创建字典

  • 第2步:将这些单词映射到一个编码向量,可以添加的<eos>标记来表示句子的结束。

  • 第3步:构建RNN模型


我们取第一个输入词并对其进行预测,输出会告诉我们字典中任意单词的概率是多少。第二个输出会告诉我们给定第一个输入字的预测词的概率:


640?wx_fmt=jpeg


RNN模型中的每一步都会查看前面的一组单词,以预测下一个单词。训练RNN模型会遇到各种各样的挑战,这将在下一节进行讨论。


3.4 RNN的梯度消失


循环神经网络的最大问题之一是它会陷入梯度消失。怎么回事?我们来考虑这两个句子:

 

640?wx_fmt=jpeg

那只猫吃了一堆食物,已经吃饱了。

猫已经吃了一堆食物之后,都已经吃饱了。


以上两个句子中哪一句语法正确?是第一句。(如果你错过了请再读一遍!)


基本RNN不擅长捕获长期依赖项,这是因为在反向传播过程中,来自输出Y的梯度将很难传播回来,从而影响先期层的权重。因此,在基本RNN中,输出受到更接近该单词的那个输入的影响。


为避免这种情况的发生,我们可以通过设置一个预先定义的阈值来对它们进行剪辑。

 

3.5 门控循环单元(GRU)


GRU是RNN的一种改进形式。它们在捕获更长范围的依赖关系方面非常有效,并且有助于解决梯度消失问题。在时间步长t中计算激活的公式为:

 

640?wx_fmt=jpeg


RNN的隐藏单元如下图所示:


640?wx_fmt=jpeg


一个单元的输入是来自前一个单元的激活和该时间步长的输入字。在计算该步长的激活和输出的时候,我们在这个RNN中添加一个存储单元,以便记住当前单词以外的单词。来看看GRU的方程:


c<t> = a<t>


其中c是一个存储单元。


在每个时间步长内,将c<的值用以下公式得到的值迭代:


640?wx_fmt=jpeg


这便是更新c<t>值的候选值。我们还定义了一个更新门,利用这个门的值来决定是否更新存储单元,更新门的方程为:


640?wx_fmt=jpeg


请注意,因为使用sigmoid来计算更新值,所以,更新门的输出总是在0和1之间。我们使用先前的存储单元值和更新门输出来更新存储单元。c<t>的更新方程如下:


640?wx_fmt=jpeg


当门值为0时,c<t> = c<t-1>,即不更新c<t>;;当门值为1时,c<t> = c<t>,对值进行更新。举一个例子来理解这一概念:


640?wx_fmt=jpeg


当遇到cat这个词时,门(gate)值为1;对于序列中的所有其他单词,门(gate)值为0,因此cat的信息将被携带到单词“was”。我们期望模型能预测到单词were的地方应该是was。


GRUS就是通过这种方式来助力于记忆长期依赖关系,下面是这个可视化工具,会有助于你理解GRU工作原理: 


640?wx_fmt=jpeg


每个单元均有三个输入:a<t-1>, c<t-1> x<t>,以及三个输出:a<t>, c<t>  y(hat)<t>。 


3.6 长期短期记忆(LSTM)


当前,LSTM在深度学习中非常流行。由于它们的复杂性,现在可能没有很多工业应用程序,但请相信我,它们很快就会出现。花点时间学习这个概念是值得的——将来它会派上用场。


为了更好地理解LSTM,让我们一起回顾一下在GRU那个小节中看到的所有方程:


640?wx_fmt=jpeg


在计算c<t>的相关性时,只是添加了一个门(gate),而这个门(gate)告诉我们c<t-1>c<t>的更新值之间是如何相关的,对于GRUs来说, a<t> = c<t>


LSTM是增强版的GRU,它的应用更为普遍。LSTM的方程式为:


640?wx_fmt=jpeg


这和GRU的类似,对吧?我们只是使用a<t-1>取代了c<t-1>。更新门的公式也可以写为:


640?wx_fmt=jpeg


在LSTM中,还有一个遗忘门和一个输出门。这些门的方程与更新门的方程相类似:


640?wx_fmt=jpeg


最后,将c<t>的值更新为:


640?wx_fmt=jpeg


下一层的激活将是:


640?wx_fmt=jpeg


你会使用哪种算法——GRU还是 LSTM?


每种算法都有各自的优点。你会发现:它们的准确度取决于你试图解决的问题的类型。GRU的优势在于它有一个更简捷的架构,因此我们可以用它来构建一些大的模型,然而, LSTM则更为强大和有效,因为它有3个门。


3.7 双向RNN


到目前为止,我们看到的RNN架构只关注序列中先前的信息。如果我们的模型能够同时考虑到序列的先前信息和后续信息,同时在特定的时间步长中进行预测,那会有多棒啊?


是的,这完全有可能做到!欢迎来到双向RNN的世界。但是在介绍双向RNN以及它们的工作原理之前,还是让我们先看看为什么需要它。


来看看一个命名实体识别问题,我们想知道序列中的一个单词是否代表一个人名。看看下面这个例子:

 

640?wx_fmt=png

他说:“泰迪熊在打折!“


如果我们把这个句子输入一个简单的RNN,模型会预测“Teddy”是一个人的名字。它没有考虑到这个词后面会发生什么。通过双向RNN,可以解决这个问题。


现在假设我们有一个4个单词的输入序列,双向RNN看起来像:


640?wx_fmt=jpeg


利用以下公式,计算RNN单元的输出:


640?wx_fmt=jpeg


同样,可以有双向GRU和双向LSTM。使用双向RNN的缺点是,在进行预测之前,必须先查看整个数据序列。但是,标准的B-RNN算法对于构建和设计大多数NLP应用程序时,效率是非常高的。

 

3.8 深度RNN


还记得深度神经网络的样子吗?


640?wx_fmt=jpeg


它有一个输入层,一些隐藏层和一个输出层。深度RNN也类似,它采用相似的网络架构并在时间轴上展开:


640?wx_fmt=jpeg


这里,激活函数的表示法如下:

 

假设需要计算a[2]<3> :


640?wx_fmt=jpeg


这是为深度RNN准备的。深呼吸,这些内容是不是不难消化?下面,即将进入模块2内容的学习了!

 

二、模块2:自然语言处理 &单词嵌入


学习第二个模块的目的是:


  • 运用深度学习技术学习自然语言处理

  • 了解如何使用单词向量表达和嵌入

  • 通过了解NLP的多种应用,如情感分析、命名实体识别和机器翻译,来充实我们的学习。

 

2.1 第1部分-单词嵌入简介


  • 文字表示法


在此,我们利用词汇表来表示多个单词:


640?wx_fmt=jpeg


创建一个独热向量(one-hot vector)来表示一个单词:

 

现在,假设我们希望模型能实现将不同的单词进行归纳,利用以下句子对模型进行训练:


640?wx_fmt=jpeg

640?wx_fmt=png

给我来杯苹果汁

 

将“给我来杯苹果汁”这句话作为训练序列,将“果汁”这个单词设为目标。希望模型生成如下的解决方案:

 

640?wx_fmt=png

给我来杯橘子__

 

为什么我们先前的词汇方法在这里行不通了?因为它缺乏归纳的灵活性,我们尝试计算一下表示Apple和Orange两个单词向量之间的相似性。毋庸讳言,结果为零,因为任何两个独热向量(one-hot vectors)的乘积总是零。

如果用一组特征来表示每个单词,而不是用一个独热向量(one-hot vectors)来表示,又该怎么办?查看下表:


640?wx_fmt=jpeg


可以利用这种方法找到类似的单词。很管用,对吧?


比方说,如果每个单词有300个特性。例如,单词“Man”将用一个名称为e5391.的300维向量来表示。


还可以将这些表达方式进行可视化,将300维向量转换为二维向量,然后绘制出来。有多种算法可以用来实现这个任务,但是我最喜欢的算法是很容易上手的t-SNE。


640?wx_fmt=jpeg


  • 采用单词嵌入


单词嵌入确实有助于处理单词表达和归纳。


如果需要完成一个命名实体识别任务,并且训练集中只有有限的几条记录。在这种情况下,可以采用在线提供的预训练过的单词嵌入,也可以创建自己的单词嵌入。这些嵌入将具备该词汇表中所有单词的特征。


以下两个步骤,可以实现用单词嵌入替换独热向量(one-hot vectors):


  • 从大型文本语料库中学习单词嵌入(或下载预训练的单词嵌入)

  • 将这些嵌入内容迁移到具有较小训练集的新任务中


接下来,我们将研究单词嵌入的属性。


  • 单词嵌入的属性


假设你有一个问题——“如果男人对应女人,那么国王对应什么呢?”大多数热衷于解谜的人以前都会看到过类似这种问题!


这个问题的答案可能是女王。但是模型将如何决定呢?这实际上是理解单词嵌入最广泛使用的示例之一。我们为男人、女人、国王和王后准备了嵌入。男人的嵌入向量与女人的嵌入向量相似,国王的嵌入向量与女王的嵌入向量相似。

可以使用以下公式:


eman – ewoman = eking – ?


给出一个300维的向量用来解决这个问题,其值等于Queen的嵌入值。我们也可以使用相似度函数来确定两个单词嵌入之间的相似度。相似函数由以下公式给出:


640?wx_fmt=jpeg


这是一个余弦相似性,也可以使用欧氏距离公式:


640?wx_fmt=jpeg


在核心推荐系统中,还可以找到其他几种不同类型的相似性度量。

 

  • 嵌入矩阵


实际上,当实现一个单词嵌入算法时,我们最终会学习一个嵌入矩阵。如果有一个10,000个单词的词汇表,并且每个单词都有300个特征,则嵌入矩阵,表示为E,如下所示:


640?wx_fmt=jpeg


为了找到位于第6257位的“桔子”一词的嵌入,我们将上面的嵌入矩阵与桔子的单热向量相乘:


640?wx_fmt=jpeg


E为(300,10k),O为(10k,1),因此,嵌入向量e的为(300,1)。

 

2.2 第2部分-学习单词嵌入:word2vec& GloVe


  • 学习单词嵌入


假设我们用神经网络构建语言模型,模型的输入是“给我来杯橘子….”,需要模型预测下一个单词。


首先使用预先训练的词嵌入矩阵来学习序列中每个单词的嵌入,然后将这些嵌入传递给一个神经网络,该神经网络会有一个Softmax分类器来预测下一个单词。


640?wx_fmt=jpeg


架构便是这样,在这个例子中,我们有6个输入单词,每个单词用一个300维向量表示,因此该序列的输入为6*300=1800维,该模型的参数如下:


  • 嵌入矩阵(E)

  • w[1],b[1]

  • w[2],b[2]


可以通过减少输入单词的数量,来降低输入维度。如果希望模型只使用前面的4个单词进行预测,此时,输入的维度将是1200维。输入也可以称为上下文,并且可以有各种选择上下文的方法。有以下几种可选的方法:


  • 选取最后4个单词

  • 选取左起4个单词,右起4个单词

  • 最后1个单词

  • 可以选取最近的一个单词


这就是我们通过输入上下文和预测目标词来解决语言建模问题的方法。在下一节中,我们将研究Word2vec如何应用于学习单词嵌入。


  • Word2VEC


这是学习单词嵌入的一种简单而有效的方法。假设训练集中有一句话:


640?wx_fmt=png

给我的谷类食品配一杯果汁

 

跳过语法(skip-gram)模型,来选取一些上下文和目标词。用这种方式,创建了一个有监督的学习问题,其中有一个输入和相应的输出。对于上下文,我们不仅仅只有最后4个单词或最后1个单词,而是随机选择一个单词作为上下文单词,然后在某个窗口中随机选择另一个单词(比如:从左到右的5个单词),并将其设置为目标单词。上下文-目标对可能是:


上下文

目标

桔子

果汁

桔子

桔子

我的

 

这里只选取了部分上下文-目标对,同样还可以有更多的上下文-目标对。下面是该模型的细节:


Vocab size=10000K


现在,需要学习从上下文(C)到目标(T)的映射。我们做如下映射:


640?wx_fmt=jpeg


这里,ec = E.Oc


Softmax计算出给定上下文词(C)时,目标单词(T)作为输出的概率。


640?wx_fmt=jpeg


最后,计算出损失为:


640?wx_fmt=jpeg


使用SoftMax函数会给算法带来一些问题,其中之一就是计算成本。每次计算概率时:


640?wx_fmt=jpeg


必须对词汇表中的全部10,000个单词进行求和。如果使用一个更大的词汇表,比如100,000个单词甚至更多,计算会变得非常缓慢。可以通过以下几个方法解决这个问题:


使用分层的SoftMax分类器。所以,与其一次把一个单词分为10000个类别,不如先把它分为前5000个类别或后5000个类别,依此类推。这样就不必每次都计算10000个单词的和了。分层SoftMax分类器的流程如下:

 

640?wx_fmt=jpeg


你脑海中可能会出现这样一个问题:如何选择上下文C?一种方法是随机抽取上下文单词样本。随机抽样的问题是,像“是”(is)这样的常用词会出现得更为频繁,而像“桔子”、“苹果”这样的词甚至可能一次也不会出现。因此,我们试图选择这样一种方法:令不太频繁的词具有更大的权重,而较频繁的词具有更小的权重。


在下一节中,我们将介绍一种有助于降低计算成本和一种更优的学习单词嵌入的技术。


  • 负抽


在跳过语法(skip-gram)模型中,正如前面所述,我们将上下文单词映射到目标单词,这样就可以学习单词嵌入。该模型的一个缺点是,SoftMax的计算成本很高。来看一下我们前面所举的例子:


640?wx_fmt=jpeg

给我的谷类食品配一杯果汁


负抽样将要做的是,它创建了一个新的有监督的学习问题,在这个问题中,给定一对单词“桔子”(orange)和“果汁”(juice),我们来预测它是否是上下文目标对?在上面的例子中,新的监督学习问题将如下所示:


上下文(C)

单词(t)

目标(Y)

桔子

果汁

1

桔子

国王

0

桔子

0

桔子

这个

0

 

由于“桔子”(orange)和“果汁”(juice)是上下文目标对,所以我们将目标值设置为1,而“桔子”(orange)和“国王”(king)不是上述例子中的上下文目标对,因此目标值为0。0这个值表示它是负样本。现在利用逻辑回归来计算这两个对是否是上下文目标对的概率。概率由以下公式给出:


640?wx_fmt=jpeg


我们可以用K对单词来训练这个模型。对于较小的数据集,K的范围在5-20之间,而对于较大的数据集,我们选择较小的K(2-5)。所以,可以建立一个神经网络,输入是“桔子”(orange) (桔子的独热向量):


640?wx_fmt=jpeg


我们将得到一个有10000种可能的分类问题,每个分类问题对应于词汇表中不同的单词。因此,这个网络将得出对应上下文词“桔子”(orange)的所有可能的目标词。这里,我们得到的是10000个二进制分类问题,而不是一个硕大的10000路SoftMax,这是一个速度非常慢的问题。


上下文词从序列中选取,一旦被选定之后,再从序列中随机选择另一个单词作为正样本,然后从词汇表中选择其他几个随机单词作为负样本。这样,便可以使用简单的二进制分类问题来学习单词嵌入。接下来我们将看到更为简单的学习单词嵌入算法。

 

  • GloVe单词向量


相同的例子:

 

640?wx_fmt=jpeg

给我的谷类食品配一杯果汁


如前所述,我们从文本语料库中提取两个彼此接近的词,来对单词对(上下文和目标)进行抽样。利用GloVe(Global Vectors全局向量)表示单词会更为明晰。假设:


Xij =单词I 出现在上下文j 中的次数


其中,i类似于目标(t),而j类似于上下文(c)。GloVe使以下各项最小化:


640?wx_fmt=jpeg


这里,f(xij)为权重项,它为使用频度大的单词(如is,of,a,这样的单词…)分配较小的权重,为使用频度小的单词分配较大的权重,当(Xj)=0时,f(Xj)=0。通过对上述方程进行最小化,最终得到了一个很好的嵌入词。目前为止,我们已经学到了许多学习单词嵌入的算法。接下来将来学习单词嵌入(word embeddings)的应用程序。

 

2.3 第3部分-采用单词嵌入的应用程序


  • 情感分类


经过以上内容的学习,你一定已经很清楚什么是情感分类了,所以我会加快以下内容的进度。查看下表,其中包含一些文本及其对应的情感:


X(文本)

Y(情感)

甜点很棒。

***

服务比较慢。

**

很适合吃快餐,但没什么特别的。

***

完全没有品味

*

情感分类的应用多种多样、量也比较大。但在大多数情况下,训练没有带标签。这就是单词嵌入的救赎,让我们来看看如何利用单词嵌入构建情感分类模型。


640?wx_fmt=jpeg

输入是:“甜点很棒”

 

这里,E是预先训练好的嵌入矩阵,比如说有1000亿字。我们用嵌入矩阵对每个单词的一个独热编码向量进行多重处理,得到单词的表达形式。接下来,对所有这些嵌入进行总结,并应用Softmax分类器来确定评级。


因为是取所有单词的平均值,所以即使获得的是一个负数,但它也是代表肯定的单词,模型可能会给它比较高的评级。这似乎有点不对劲,所以,我们应采用RNN来进行情感分类,而不是简单地利用单词嵌入来获得输出。


640?wx_fmt=jpeg


这是一个多对一的问题,我们有一个输入序列(多个单词)和一个输出。到目前为止,你已具备解决此问题的能力。

 

三、模块3:序列模型与注意力机制(Attention Mechanism


欢迎来到本课程的最后一个模块!以下是我们将在本单元中主要实现的两个目标:


  • 理解注意力机制

  • 理解模型将注意力集中在输入序列的何处


3.1 基本模型


我尽量保持本节内容与行业的相关性,在此会给出的一些模型,这些模型对机器翻译、语音识别等应用程序将非常有用。来看一下这个例子——我们的任务是建立一个序列到序列模型,在这个模型中需要输入一个法语句子并将其翻译成英语。问题如下:


640?wx_fmt=jpeg


这里x<1>,x<2>是输入,y<1>,y<2>是输出。为了建立一个模型,我们创建一个编码器,用它接受输入序列。编码器架构可以为RNN、LSTM或GRU。在编码器之后,再构建一个以编码输出为输入的译码器网络,并对其进行训练以生成译文。


640?wx_fmt=jpeg


这个网络也普遍应用于图像字幕。作为输入,我们获取图像的特征(使用卷积神经网络生成)。

 

3.2 选择可能性最大的句子


机器翻译系统的译码器模型与语言模型非常类似。但两者之间有一个关键区别:在语言模型中,是从全零向量开始,而在机器翻译中,则有一个编码器网络:


640?wx_fmt=jpeg


机器翻译模型的编码器部分是一个条件语言模型,在该模型中,需要计算出给定输入的输出概率:


640?wx_fmt=jpeg


对于下述输入语句:


640?wx_fmt=jpeg


可以有多种翻译,比如:


640?wx_fmt=jpeg


我们利用下面的公式,从以上句子中找出最好的译文。


640?wx_fmt=jpeg


好消息是,有一种算法可以帮助我们选择最有可能的翻译。


3.3 定向搜索


这是生成最优译文的常用算法之一。该算法可以通过以下3个步骤来理解:


第1步:选择第一个翻译单词并计算其概率:

 

640?wx_fmt=png


可以设置beam宽度(B)来表示,在这里:B=3,我们不仅仅选择一个单词,可以选出前三个词,这三个单词均可能是第一个单词的译文。然后将这三个单词存储在计算机的内存中。


第2步: 对于步骤1中的每个选定单词,用算法计算出第二个单词的概率:


640?wx_fmt=jpeg


如果beam宽度(B)为3,词汇表中有10000个单词,则可能的组合总数为3*10000=30000。对这3万种组合进行估算,选出了前3种组合。


第3步:重复这个过程直到句子结束。


通过每次添加一个单词,定向搜索决定了任何给定句子最可能的译文。可以对定向搜索做的一些改进,以提高效率。


3.4 定向搜索的改进


定向搜索概率最大化:


640?wx_fmt=jpeg


这个概率是通过把不同单词的概率相乘计算得到的。由于概率是非常小的数字(介于0和1之间),如果我们将这些小数字多次相乘,最终的输出就会非常小,这会在计算中产生问题。为此,可以使用以下公式来计算概率:


640?wx_fmt=jpeg


我们不是最大化乘积,而是最大化乘积的对数。但是,即使用这个目标函数,如果译文中有更多的单词,乘积的结果也会为负值,对此,可以将函数归一化:


640?wx_fmt=jpeg


对于所有使用定向搜索选择的句子,计算出归一化的对数概率,然后选择计算结果最大的句子。还有一个细节值得分享,如何来决定beam宽度(B)?


beam宽度(B)越大,结果会更优,但算法速度会变慢;另一方面,选择较小的beam宽度(B),将使算法运行更快,但结果却不准确。beam宽度(B)的选择没有硬性规定,可以根据应用情况而变化。可以通过尝试不同的值,然后选择能生成最佳结果的值。

 

3.5 定向搜索误差分析


定向搜索是一种近似算法,它根据beam宽度(B)输出概率最大的译文。但是,并非每次都生成正确的译文。如果没有得到正确的译文,必须分析它的原因:是由于定向搜索还是RNN模型引起的问题。如果是定向搜索造成的这个问题,可以加大beam宽度(B),从而得出更好的结果。那么,如何决定我们应该集中改进波束定向搜索还是集中改进RNN模型呢?


假设实际的译文是:


640?wx_fmt=jpeg

简9月访问非洲(y*)


从算法中得到的译文是:

 

640?wx_fmt=jpeg

简去年9月访问了非洲(Y(Hat))


RNN将计算P(y* | x)和 P(y(hat) | x)


第一种情况:P(Y*X)>P(Y(Hat)X)


这意味着定向搜索选择了y(HAT),虽然y*的概率更高。因此,定向搜索结果是错误的,我们可以考虑增加beam宽度(B)。


第二种情况: P(y* | x) <= P(y(hat) | x)


这意味着y*的译文优于y(HAT),但RNN的预测正好相反。这时,问题出在RNN,应对RNN模型进行改进。


因此,对于每一个翻译,应决定问题是出在RNN是还是出在定向搜索。最后,我们分析了定向搜索和RNN模型的误差比例,并在此基础上对定向搜索或RNN模型进行了更新。这样便就可以优化译文。


3.6 注意力模型(Attention Model)


到目前为止,我们已经了解到了机器翻译的编码器-解码器架构,其中一个RNN读取输入,另一个RNN输出一个句子。但是当我们输入很长的句子时,模型便很难记住整个句子。


注意力模型是从长句中抽取小样本并翻译,然后再抽取另一个样本进行翻译,等等。


在生成输出时,我们使用alpha参数来决定对特定输入字应该给予多少注意度。


<1,2> = 为生成第一个词,应给予第二个输入词多少关注?


让我们用一个例子来理解这一点:


640?wx_fmt=jpeg


为了生成第一个输出y<1>,应赋予每个单词多少注意力权重,这就是计算注意力的方法:


640?wx_fmt=jpeg


如果有Tx输入词和Ty 输出词,那么总注意力参数将是Tx * Ty。


你可能已经注意到了——注意力模型是深度学习中最强大的想法之一。


后记


序列模型真不错,对吧?它们有大量的实际应用——我们只需要知道在特定情况下使用的正确技术。希望你能在本指南中学习到这些技巧。


单词嵌入是表示单词的一种很好的方法,我们看到了如何构建和使用这些单词嵌入,与此同时,学习了单词嵌入的不同应用,最后我们还介绍了注意力模型,这是构建序列模型的最强大的想法之一。


如果你对本文有任何疑问或反馈,请随时在下面的评论部分分享。期待你的回复!


你也可以在Analytics Vidhya的Android应用程序上阅读本文。

 

原文标题:

Must-Read Tutorial to Learn Sequence Modeling (deeplearning.ai Course #5)

原文链接:

https://www.analyticsvidhya.com/blog/2019/01/sequence-models-deeplearning/


编辑:黄继彦


译者简介

640?wx_fmt=png

陈之炎,北京交通大学通信与控制工程专业毕业,获得工学硕士学位,历任长城计算机软件与系统公司工程师,大唐微电子公司工程师,现任北京吾译超群科技有限公司技术支持。目前从事智能化翻译教学系统的运营和维护,在人工智能深度学习和自然语言处理(NLP)方面积累有一定的经验。业余时间喜爱翻译创作,翻译作品主要有:IEC-ISO 7816、伊拉克石油工程项目、新财税主义宣言等等,其中中译英作品“新财税主义宣言”在GLOBAL TIMES正式发表。能够利用业余时间加入到THU 数据派平台的翻译志愿者小组,希望能和大家一起交流分享,共同进步

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。


点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:datapi),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。


640?wx_fmt=png

640?wx_fmt=jpeg

点击“阅读原文”拥抱组织

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值