本月累计签到次数:

今天获取 积分

建模

建模

613 浏览

漫谈RNN之序列建模(机器说图篇)

机械自动化类 集运物流 2016-12-09 13:31 发表了文章 来自相关话题

1. 机器说图概述

序列学习在自然语言处理领域已经取得了很多成功,如机器翻译(漫谈RNN之序列建模(机器翻译篇))、机器造句(漫谈RNN之序列建模(机器造句篇))等,今天我们看另外一个应用——机器看图说话(Neural Image Caption)。






首先需要明白,为什么序列建模可以用于图像描述。类比前面说过的机器翻译模型,其任务是将一种语言的句子S转化成另外一种语言的句子T,构建了一个编码RNN网络用于读取源句子S并得到其固定长度的特征表示,再将此特征表示传入解码RNN网络的隐含层进而可以生成新的句子T,训练网络的目标函数是使得条件概率P(T|S)达到最大。



回到图像描述的问题上,我们需要首先识别一幅图像中的所有物体及其内在关联性,然后用一句话(英语)来描述这些物体及其关联性。传统的图像描述的做法涉及的手动特征提取工作比较多,或者是添加了很多人为设定的语法规则,但是这种做法显然是不高效,而对于一个端对端的神经网络图像描述系统,它意味着我们不需要任何人为的附加干预,只要输入一幅图像,系统即可输出一句话,整个训练过程是端对端的。



如何得到一个端对端的神经网络图像描述系统呢?受机器翻译的启发,如果我们得到了每幅图像的固定长度的特征表示以后,再将此特征表示与图像描述的句子进行一一映射,这实际上就跟机器翻译的模型是一样的。因此,我们可以把图像描述总结为两步:

图像识别

序列建模






并且,我们可以建立类似的目标函数进行有监督训练,即给定一个输入图片I,要使得输出的描述句子S的概率最大:






这样,我们就构建了一个端对端的神经网络图像描述系统,接下来我会详细说明一下其具体的内部结构。



2.机器说图模型具体结构

前面提到,神经网络图像描述主要分为两大块,分别是图像识别和序列建模。接下来我们将具体讲解这两部分是如何用神经网络搭建起来联合学习的。


图像识别部分 由于深度卷积神经网络最近几年在图像识别领域取得了较大的成功(可参考文末的推荐文章),在大规模图像识别任务ImageNet上,很多优秀的深度卷积神经网络模型已经被训练出来了,例如2012年的AlexNet、2013年的Network in Network、2014年的VGG和GoogleNet、2015年的Resnet,它们都是用于图像分类的训练好的模型。一般在处理图像领域的问题时(如Prisma软件、你的名字同款滤镜),我们可以使用这些网络作为预训练的模型,因为它们在处理图像任务上具有良好的泛化能力,这样会比自己创新一个新的卷积网路模型更加高效,训练起来也节省时间。这里使用的是GoogleNet(论文:《Going Deeper with Convolutions》)作为图像识别的部分,即给定一幅图像I,经由GoogleNet产生一个固定长度的特征表示x。


序列建模部分 由于LSTM网络在时序建模问题上避免了梯度消失的问题,进而可以学习到长时间的时序记忆,因此这里使用LSTM作为序列建模的循环单元。并且,同机器翻译类似,我们在训练的时候,仍然是让LSTM输出一个单词的概率分布,然后将这个概率分布作为下一时刻LSTM网络的输入。假设输入图片是I,其对应的描述句子的单词为S=(S_0,S_1,...,S_N),那么整个序列建模的过程如下:







因此,整个神经网络图像描述系统的原理是:给定一幅图像I,将其传入到GoogleNet得到一个固定长度的特征分布,接着将其作为初始状态传入到LSTM网络中,得到一个特殊的代表描述开头标志单词S_0,然后将S_0进行word embedding传入到下一时刻的LSTM网络并且得到S_1的概率分布,再由S1得到S2,S2得到S3,...,直到代表描述结束标志单词S_N出现,即可结束循环。模型结构图如下所示(左边是GoogleNet,右边是基于LSTM的序列建模网络)。






在训练过程中,对于每幅图像,其误差可以表示为所有单词的误差的乘积,即对数之和:






运用后向传播算法即可实现端对端的训练网络,训练的参数包括GoogleNet的所有参数、word embedding的权重以及LSTM的权重。


在推理过程中,我们可以使用两种方法得到最佳描述序列。一种是类似于机器造句,先根据p_1的大小随机抽样得到第一个单词S_1,然后由S_1得到S_2,一直到序列结束,这种方法我们可以称为是Best-first Search,即每个时刻得到概率最大的单词,最终连成一句话;另外一种方法是使用Beam Search,受计算机资源的限制因此需要首先设定一个beam size,然后使用动态规划的算法不停地迭代得到t时刻最佳的K个序列,其优点是综合考虑了所有时刻的概率分布,并且可以降低噪声的影响。




3.序列建模总结

序列建模的应用性比较强,除了前面提到的几个应用之外,还有的典型应用如机器对话、机器作曲、知识问答、视频描述、文档摘要等。回顾机器翻译、机器造句、机器说图,我们可以发现它们有下列共同点:

训练数据通常是序列对,动态的如句子,静态的如图像

都是端对端的训练,即不需要额外的人工制定规则,输入序列A,即可输出序列B

RNN在其中应用十分广泛,尤其是LSTM

虽然领域不同,但是模型大多类似


到目前为止,我们只讲了最传统的序列建模的方式,即使用RNN网络结构得到序列的输出,而没有提到一些性能更好的优化策略,例如引入注意力模型、外部存储模块、更好的读写机制,甚至是强化学习来学得潜在的语法规则等等,这些在后面几期都会陆续讲解。




你可能会感兴趣的文章有:

《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》

《漫谈RNN之序列建模(机器翻译篇)》

《漫谈RNN之序列建模(机器造句篇)》

《TensorFlow(三)——卷积神经网络用于手写字识别》

《我所理解的深度学习(二)——卷积神经网络基础》

《我所理解的深度学习(三)——卷积神经网络应用①》

《我所理解的深度学习(四)——卷积神经网络应用②》

《Prisma修图软件的图片风格转换算法》
 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家 查看全部
1. 机器说图概述

序列学习在自然语言处理领域已经取得了很多成功,如机器翻译(漫谈RNN之序列建模(机器翻译篇))、机器造句(漫谈RNN之序列建模(机器造句篇))等,今天我们看另外一个应用——机器看图说话(Neural Image Caption)。

12.1_.jpg


首先需要明白,为什么序列建模可以用于图像描述。类比前面说过的机器翻译模型,其任务是将一种语言的句子S转化成另外一种语言的句子T,构建了一个编码RNN网络用于读取源句子S并得到其固定长度的特征表示,再将此特征表示传入解码RNN网络的隐含层进而可以生成新的句子T,训练网络的目标函数是使得条件概率P(T|S)达到最大。



回到图像描述的问题上,我们需要首先识别一幅图像中的所有物体及其内在关联性,然后用一句话(英语)来描述这些物体及其关联性。传统的图像描述的做法涉及的手动特征提取工作比较多,或者是添加了很多人为设定的语法规则,但是这种做法显然是不高效,而对于一个端对端的神经网络图像描述系统,它意味着我们不需要任何人为的附加干预,只要输入一幅图像,系统即可输出一句话,整个训练过程是端对端的。



如何得到一个端对端的神经网络图像描述系统呢?受机器翻译的启发,如果我们得到了每幅图像的固定长度的特征表示以后,再将此特征表示与图像描述的句子进行一一映射,这实际上就跟机器翻译的模型是一样的。因此,我们可以把图像描述总结为两步:

图像识别

序列建模


12.2_.jpg


并且,我们可以建立类似的目标函数进行有监督训练,即给定一个输入图片I,要使得输出的描述句子S的概率最大:

12.3_.JPG


这样,我们就构建了一个端对端的神经网络图像描述系统,接下来我会详细说明一下其具体的内部结构。



2.机器说图模型具体结构

前面提到,神经网络图像描述主要分为两大块,分别是图像识别和序列建模。接下来我们将具体讲解这两部分是如何用神经网络搭建起来联合学习的。


图像识别部分 由于深度卷积神经网络最近几年在图像识别领域取得了较大的成功(可参考文末的推荐文章),在大规模图像识别任务ImageNet上,很多优秀的深度卷积神经网络模型已经被训练出来了,例如2012年的AlexNet、2013年的Network in Network、2014年的VGG和GoogleNet、2015年的Resnet,它们都是用于图像分类的训练好的模型。一般在处理图像领域的问题时(如Prisma软件、你的名字同款滤镜),我们可以使用这些网络作为预训练的模型,因为它们在处理图像任务上具有良好的泛化能力,这样会比自己创新一个新的卷积网路模型更加高效,训练起来也节省时间。这里使用的是GoogleNet(论文:《Going Deeper with Convolutions》)作为图像识别的部分,即给定一幅图像I,经由GoogleNet产生一个固定长度的特征表示x。


序列建模部分 由于LSTM网络在时序建模问题上避免了梯度消失的问题,进而可以学习到长时间的时序记忆,因此这里使用LSTM作为序列建模的循环单元。并且,同机器翻译类似,我们在训练的时候,仍然是让LSTM输出一个单词的概率分布,然后将这个概率分布作为下一时刻LSTM网络的输入。假设输入图片是I,其对应的描述句子的单词为S=(S_0,S_1,...,S_N),那么整个序列建模的过程如下:

12.4_.JPG



因此,整个神经网络图像描述系统的原理是:给定一幅图像I,将其传入到GoogleNet得到一个固定长度的特征分布,接着将其作为初始状态传入到LSTM网络中,得到一个特殊的代表描述开头标志单词S_0,然后将S_0进行word embedding传入到下一时刻的LSTM网络并且得到S_1的概率分布,再由S1得到S2,S2得到S3,...,直到代表描述结束标志单词S_N出现,即可结束循环。模型结构图如下所示(左边是GoogleNet,右边是基于LSTM的序列建模网络)。

12.5_.JPG


在训练过程中,对于每幅图像,其误差可以表示为所有单词的误差的乘积,即对数之和:

12.6_.JPG


运用后向传播算法即可实现端对端的训练网络,训练的参数包括GoogleNet的所有参数、word embedding的权重以及LSTM的权重。


在推理过程中,我们可以使用两种方法得到最佳描述序列。一种是类似于机器造句,先根据p_1的大小随机抽样得到第一个单词S_1,然后由S_1得到S_2,一直到序列结束,这种方法我们可以称为是Best-first Search,即每个时刻得到概率最大的单词,最终连成一句话;另外一种方法是使用Beam Search,受计算机资源的限制因此需要首先设定一个beam size,然后使用动态规划的算法不停地迭代得到t时刻最佳的K个序列,其优点是综合考虑了所有时刻的概率分布,并且可以降低噪声的影响。




3.序列建模总结

序列建模的应用性比较强,除了前面提到的几个应用之外,还有的典型应用如机器对话、机器作曲、知识问答、视频描述、文档摘要等。回顾机器翻译、机器造句、机器说图,我们可以发现它们有下列共同点:

训练数据通常是序列对,动态的如句子,静态的如图像

都是端对端的训练,即不需要额外的人工制定规则,输入序列A,即可输出序列B

RNN在其中应用十分广泛,尤其是LSTM

虽然领域不同,但是模型大多类似


到目前为止,我们只讲了最传统的序列建模的方式,即使用RNN网络结构得到序列的输出,而没有提到一些性能更好的优化策略,例如引入注意力模型、外部存储模块、更好的读写机制,甚至是强化学习来学得潜在的语法规则等等,这些在后面几期都会陆续讲解。




你可能会感兴趣的文章有:

《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》

《漫谈RNN之序列建模(机器翻译篇)》

《漫谈RNN之序列建模(机器造句篇)》

《TensorFlow(三)——卷积神经网络用于手写字识别》

《我所理解的深度学习(二)——卷积神经网络基础》

《我所理解的深度学习(三)——卷积神经网络应用①》

《我所理解的深度学习(四)——卷积神经网络应用②》

《Prisma修图软件的图片风格转换算法》

 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家
534 浏览

漫谈RNN之序列建模(机器造句篇)

设备硬件类 集运物流 2016-12-09 13:20 发表了文章 来自相关话题

在《漫谈RNN之序列建模(机器翻译篇)》中,提到了如何运用序列建模进行机器翻译,机器翻译系统主要包含编码器和解码器,编码器负责将待翻译的句子进行特征表示,而解码器则负责将此特征用另外一种语言表示出来。神经机器翻译模型(Neural Translation Machine,以下简称NTM)的编解码系统如下图所示:







语言模型相比NTM要简单很多,原因是语言模型只涉及一种语言之间的关联,没有编码器、解码器之分。最常见的运用RNN搭建的语言模型如下图所示:







语言建模通常有两个作用,第一是衡量一句话是否合理,譬如说,我们可以用训练好的中文语言模型来评估『今天是星期五』这句话通顺的可能性有多大,或者说混乱度是多少(专业术语是perplexity);第二是用来预测语句序列,即机器造句,比如我们可以给定一个种子序列作为造句的开头部分,然后机器就可以根据该种子序列继续生成后面的句子。


传统的语言模型通常使用统计的方法来得到,常见的统计模型有N-gram或者马尔科夫链,其原理是先根据训练语料计算所有单词的转移概率,然后根据此转移概率计算一句话的perplexity,或者是给定一个种子序列,然后由转移概率随机抽样生成新的句子。






例如,我们要用bi-gram语言模型来评估『今天是星期五』这句话的是否通顺,我们可以计算整句话出现的概率,计算的流程如下:


句子以“今”开头的概率是多少

“今”后面紧邻“天”的概率是多少

“天”后面紧邻“是”的概率是多少

“是”后面紧邻“星”的概率是多少

“星”后面紧邻“期”的概率是多少

“期”后面紧邻“五”的概率是多少


然后把上面所有概率相乘起来,即可得到『今天是星期五』这句话出现的可能性有多大。


传统的语言建模过程是一个无参建模过程,因N-gram的计算过程是不含参数的,其优点是计算量比较小,无需迭代调参,统计词频即可。其缺点主要有两点:第一,计算的概率具有稀疏性,假设出现的单词数量为|V|,然而对于bi-gram而言,并不是|V|*|V|个概率都有被计算,因此如果“是星”在源训练集中没有出现,那么『今天是星期五』出现的概率等于0,这显然是不合理的;第二,这种统计模型不具备泛化能力,即如果“星期四”出现在数据库中,而“星期五”没有出现在数据库中,那么这个时候出现的概率为0,但是,如果这个模型具有泛化能力的话,显然“星期五”与“星期六”是同类的词语,因此出现的可能性应该是一样的。


运用神经网络进行语言建模就可以有效解决以上两个缺点,由于语言也是一种时序问题,因此我们一般采用RNN/LSTM进行建模,目的是使得模型具备长期记忆性,从而可以保证语言模型在判断或生成长句子时更加符合语法规则。


那么如何运用LSTM进行语言建模呢?在训练之前,我们需要得到数据集。由于语言建模是一个监督学习问题,因此我们需要得到(X,Y)这样的训练对。假设我们这里进行的是单词水平的语言建模,即以一个单词为单位,所以我们为了得到(X,Y)这样的训练对,比如训练样本是一句“How are you",我们可以把X设为['How','are'],把Y设为['are','you'],这样设定好之后,如果网络输入'How'这个单词,那我们的标准输出应该是'are',建立了一一对应的时序关系。


数据集构建好了之后,就开始构建模型了。首先,我们对每个单词做一个one-hot编码,由此编码再得到每个单词的特征向量表示,这个过程我们称为word embedding。


第二步,假设我们要构建一个三层LSTM网络,我们就可以把第一个单词作为RNN网络的输入x_t-1,经过计算得到最上面隐含层状态h_t-1,然后由h_t-1经过一个softmax层即可计算P(x_t|y_t-1)是多少。






第三步,将该概率值传到输入层作为第二时刻的输入x_t,然后经过三个循环隐含层即可计算得到h_t,同理,可以算出P(x_t+1|y_t)的值。


重复以上步骤,直到训练了整个mini-batch,接下来根据最大似然估计法则确定目标函数的表达式,训练过程中的目标是使得整句话出现的概率最大,因此目标函数可以写为:







然后就可以使用后向传播算法进行参数更新。


当模型训练好了以后,我们就可以使用这个模型来造句了。造句的方法就是抽样,但是我们必须先给定一个种子序列,例如"I am",然后将"I"和"am"分别输入到网络中,得到y_3的值,然后依概率进行抽样即可得到第三个单词...根据上图的计算流程,我们可以生成无限多个单词组成的句子。


除了单词水平的语言建模以外,常见的还有字母水平的语言建模,对于字母水平的语言建模,其好处就是可以生成OOV(out of vocabulary)的单词,不过字母水平的建模要比单词水平的更难一些,因其要求模型具有更长的时序记忆性。


值得注意的是,机器造句的实际效果不仅与训练语料库的大小有关,还与模型的好坏有关。如果使用RNN进行语言建模,那么其长期记忆性是非常差的,造出来的句子经常会不通顺。可以改善的方法有:使用深层LSTM模型、使用基于注意力的模型、使用外部memory的网络、使用深度强化学习等等,至于这些方法具体如何运用,后面几期会慢慢介绍。




你可能会感兴趣的文章有:


《如何评价一个语言模型(LM)》

《语言模型之N-gram》

《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》

《漫谈RNN之序列建模(机器翻译篇)》
 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家 查看全部
《漫谈RNN之序列建模(机器翻译篇)》中,提到了如何运用序列建模进行机器翻译,机器翻译系统主要包含编码器和解码器,编码器负责将待翻译的句子进行特征表示,而解码器则负责将此特征用另外一种语言表示出来。神经机器翻译模型(Neural Translation Machine,以下简称NTM)的编解码系统如下图所示:

11.1_.JPG



语言模型相比NTM要简单很多,原因是语言模型只涉及一种语言之间的关联,没有编码器、解码器之分。最常见的运用RNN搭建的语言模型如下图所示:

11.2_.JPG



语言建模通常有两个作用,第一是衡量一句话是否合理,譬如说,我们可以用训练好的中文语言模型来评估『今天是星期五』这句话通顺的可能性有多大,或者说混乱度是多少(专业术语是perplexity);第二是用来预测语句序列,即机器造句,比如我们可以给定一个种子序列作为造句的开头部分,然后机器就可以根据该种子序列继续生成后面的句子。


传统的语言模型通常使用统计的方法来得到,常见的统计模型有N-gram或者马尔科夫链,其原理是先根据训练语料计算所有单词的转移概率,然后根据此转移概率计算一句话的perplexity,或者是给定一个种子序列,然后由转移概率随机抽样生成新的句子。

11.3_.JPG


例如,我们要用bi-gram语言模型来评估『今天是星期五』这句话的是否通顺,我们可以计算整句话出现的概率,计算的流程如下:


句子以“今”开头的概率是多少

“今”后面紧邻“天”的概率是多少

“天”后面紧邻“是”的概率是多少

“是”后面紧邻“星”的概率是多少

“星”后面紧邻“期”的概率是多少

“期”后面紧邻“五”的概率是多少


然后把上面所有概率相乘起来,即可得到『今天是星期五』这句话出现的可能性有多大。


传统的语言建模过程是一个无参建模过程,因N-gram的计算过程是不含参数的,其优点是计算量比较小,无需迭代调参,统计词频即可。其缺点主要有两点:第一,计算的概率具有稀疏性,假设出现的单词数量为|V|,然而对于bi-gram而言,并不是|V|*|V|个概率都有被计算,因此如果“是星”在源训练集中没有出现,那么『今天是星期五』出现的概率等于0,这显然是不合理的;第二,这种统计模型不具备泛化能力,即如果“星期四”出现在数据库中,而“星期五”没有出现在数据库中,那么这个时候出现的概率为0,但是,如果这个模型具有泛化能力的话,显然“星期五”与“星期六”是同类的词语,因此出现的可能性应该是一样的。


运用神经网络进行语言建模就可以有效解决以上两个缺点,由于语言也是一种时序问题,因此我们一般采用RNN/LSTM进行建模,目的是使得模型具备长期记忆性,从而可以保证语言模型在判断或生成长句子时更加符合语法规则。


那么如何运用LSTM进行语言建模呢?在训练之前,我们需要得到数据集。由于语言建模是一个监督学习问题,因此我们需要得到(X,Y)这样的训练对。假设我们这里进行的是单词水平的语言建模,即以一个单词为单位,所以我们为了得到(X,Y)这样的训练对,比如训练样本是一句“How are you",我们可以把X设为['How','are'],把Y设为['are','you'],这样设定好之后,如果网络输入'How'这个单词,那我们的标准输出应该是'are',建立了一一对应的时序关系。


数据集构建好了之后,就开始构建模型了。首先,我们对每个单词做一个one-hot编码,由此编码再得到每个单词的特征向量表示,这个过程我们称为word embedding。


第二步,假设我们要构建一个三层LSTM网络,我们就可以把第一个单词作为RNN网络的输入x_t-1,经过计算得到最上面隐含层状态h_t-1,然后由h_t-1经过一个softmax层即可计算P(x_t|y_t-1)是多少。

11.4_.jpg


第三步,将该概率值传到输入层作为第二时刻的输入x_t,然后经过三个循环隐含层即可计算得到h_t,同理,可以算出P(x_t+1|y_t)的值。


重复以上步骤,直到训练了整个mini-batch,接下来根据最大似然估计法则确定目标函数的表达式,训练过程中的目标是使得整句话出现的概率最大,因此目标函数可以写为:

11.5_.JPG



然后就可以使用后向传播算法进行参数更新。


当模型训练好了以后,我们就可以使用这个模型来造句了。造句的方法就是抽样,但是我们必须先给定一个种子序列,例如"I am",然后将"I"和"am"分别输入到网络中,得到y_3的值,然后依概率进行抽样即可得到第三个单词...根据上图的计算流程,我们可以生成无限多个单词组成的句子。


除了单词水平的语言建模以外,常见的还有字母水平的语言建模,对于字母水平的语言建模,其好处就是可以生成OOV(out of vocabulary)的单词,不过字母水平的建模要比单词水平的更难一些,因其要求模型具有更长的时序记忆性。


值得注意的是,机器造句的实际效果不仅与训练语料库的大小有关,还与模型的好坏有关。如果使用RNN进行语言建模,那么其长期记忆性是非常差的,造出来的句子经常会不通顺。可以改善的方法有:使用深层LSTM模型、使用基于注意力的模型、使用外部memory的网络、使用深度强化学习等等,至于这些方法具体如何运用,后面几期会慢慢介绍。




你可能会感兴趣的文章有:


《如何评价一个语言模型(LM)》

《语言模型之N-gram》

《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》

《漫谈RNN之序列建模(机器翻译篇)》

 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家
675 浏览

漫谈RNN之序列建模(机器翻译篇)

机械自动化类 集运物流 2016-12-09 13:10 发表了文章 来自相关话题

本期讲解运用LSTM进行序列建模,并且介绍了机器翻译的原理,阅读本文可以参考以下几篇历史文章:


《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》




1.原理概述

序列学习其实是深度学习中的一个应用非常广泛的概念,例如语音识别、语言建模、机器翻译、机器作曲、机器写稿、自动对话、QA系统等都属于序列学习的领域,今天讲讲解如何运用序列建模的思想来构建一个端对端的机器翻译系统。


序列建模,顾名思义,处理的问题是有时序关联性的,因此这种情况下,普通的前馈式神经网络已经不适用这个问题了,取而代之的是具有循环记忆性的RNN网络,这里说的RNN是一种广泛的RNN概念,其内部记忆单元可以是原始的RNN或者是LSTM、GRU单元均可。由于RNN对于长时间建模问题表现没有LSTM好,因此本文中使用LSTM来建模。


通常来说,序列建模的输入数据长度与输出长度不一定相同。举个例子,就英汉机器翻译系统而言,英文中的“what's your name”是三个单词组成的序列,将它翻译成中文的话变成了“你叫什么名字”,它是六个汉字组成的序列,那么对于这种输入输出序列的长度是动态变化的情况,传统的RNN(或LSTM)建模显然是不行的,这个时候我们考虑的是把问题拆分为两个部分,即编码器和解码器,原因是,无论是汉语还是英语,两句话所对应的意义是一样的,那么当我们使用编码器对输入的英语序列进行特征编码,就相当于得到了这句话的意义,然后我们用汉语的解码器对这个意义进行解码并且用汉语的形式表达出来,这就得到了英译汉的结果。


具体来说,我们可以使用两个LSTM网络来分别作为编码和解码。编码的LSTM用来读取输入序列,每一时刻读取输入序列的一个单元,最终得到输入的特征编码分布;解码的LSTM根据特征编码分布从而得到解码输出。根据条件概率公式,我们可以得到下面的公式:






这里的x_1...x_T是输入序列,y_1...y_T'是输出序列,v是解码器的初始值x1...x_T,并且T和T'通常长度不一致。上式左边是我们需要求得的,而我们把它转换成右边的形式来计算,随后每一时刻解码器都会得到一个输出y_t,一直到输出<eos>即可停止解码。例如下图所示,这是一个由编码器输入ABC,再由解码器输出WXYZ的过程。









2.机器翻译实战

接下来我将讲解LSTM是如何具体在一个机器翻译系统中工作的,考虑如下一个英语-法语的翻译流程:






上图表示一个英-法翻译系统的结构,输入的是一句英语,经过机器翻译系统输出为一句法语。正如我们人脑翻译一句话一样,当我看到一句“what's your name”时,我的脑海中首先想的是它的具体含义,然后我才会根据这个含义,写出一句法语出来,这一思考流程正与上图中的编码和解码模块类似。


首先,我们大致浏览一下我们将要构建的基于LSTM的机器翻译系统,如下图所示,e是我们的一段待翻译英语句子,f是输出的翻译过后的法语句子。英语句子经过LSTM编码器得到特征表示,然后进入另一个LSTM解码器解码得到法语句子。这就是机器翻译系统的总体流程。






首先我们看下面的编码器部分,编码的过程如下:






1.英语句子中的每个单词首先进行one-hot向量编码(蓝色部分)。这个很简单,假设有10000个单词,并且每个单词标记一个索引,如0,1,2,...9999,假如Economic所对应的索引为1,那么Economic单词的one-hot编码后的向量为(0,1,0,0,...,0)。这个编码虽然简单,但是只是编码的第一步,原因是这个编码并没有存储单词之间的关联性;


2.每个单词进行二次编码(粉红色部分)。我们需要用一个向量来表示整句话,但是在得到这个向量之前,我们还需要对每个单词进行二次编码,这次编码的目的是要让其更有意义,不是简单的one-hot编码了,那么如何得到这种更有意义的编码呢?在上图的蓝色部分与红色部分连接一个权重W,这个W的维度应该是单词数量×特征大小,当然特征大小你可以自己定义,如100或200都可以。并且,这个W的值需要由网络不断更新从而自我学习,其更新的目的就是要使得该机器翻译系统性能越来越好;


3.经LSTM得到整句话的编码向量(红色循环层)。由第2步我们已经得到了每个单词的特征向量s,接下来就是把这些特征向量s按照时间先后顺序依次输入到LSTM隐含层,这里假设有个h_0是一个所有元素随机初始化为0的向量,于是,由s_1和h_0即可得到h_1,由h_1和s_2即可得到h_2,以此类推,直到由h_T-1和s_T得到了h_T,编码结束。那么这个h_T我们认为就是整个英语句子的特征向量表示。


得到了每句话的特征表示,我们不禁会想这个特征表示到底是什么样的?虽然是高维的特征,但是不同句子的特征表示是否有关联呢?有研究者在训练好了一个机器翻译系统之后,就将一些句子的特征向量保存了下来并做了主成分分析(PCA),将其降维到了2-D空间,如下图所示:






从上图可以看出,句子的特征向量确实可以反映句子之间的关联,例如,相似的句子在上图中靠的很近。



接下来看解码部分,根据输入句子的向量即可得到进行解码操作,具体流程如下:






1.将句子编码h_T作为输入传到解码LSTM中,对于解码LSTM而言,其隐含层状态z_i是由句子编码h_T、前一个输出单词u_i-1、前一隐含状态z_i-1共同决定的,即z_i=f(h_T,u_i-1,z_i-1),这里需要初始化一些量,例如t=0时刻的隐含层状态以及单词;


2.计算每个时刻的输出单词的概率分布。首先需要对z_i加一个前馈层,从而可以得到一个和字典单词数量一致的向量,然后使用softmax函数即可确定每个单词的概率。然后,依据单词概率进行抽样即可确定此刻的最终单词输出。


3.将上一时刻的单词输出以及上一时刻的隐含层状态,重复第2步计算,得到下一个输出的单词,直到<eos>出现为止,停止解码操作。



构建好了编码LSTM和解码LSTM以后,接下来就是如何训练这个网络了。假设我们的训练数据集是由很多(X,Y)构成的,X_i是英语句子,Y_i是对应的法语句子。我们可以由机器翻译网络得到P(Y_i|X_i)的值,那么借助EM算法的思想,我们要构建它的负对数似然的形式,即






这里的N是训练对的大小,然后按照常规的梯度下降算法即可训练这个机器翻译网络。




总结:


机器翻译时,将输入句子中的单词顺序颠倒一下可以提高机器翻译的性能,这可能是因为减小了源句与翻译后的句子的对应词语之间的距离;


本文是序列建模的一个最简单的例子,如果要提升机器翻译系统的性能,可以考虑假如注意力机制,注意力机制简而言之是可以让解码器更多地关注某个单词。


序列学习是一个非常广泛的概念,我们可以将此应用到机器写稿、句子语法分析、机器看图说话等领域。



近期文章预告:

《漫谈RNN之注意力机制》

《漫谈RNN之记忆网络》

《漫谈RNN之动态记忆网络》

《漫谈RNN之神经图灵机模型》

《漫谈RNN之无监督学习》
 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家 查看全部
本期讲解运用LSTM进行序列建模,并且介绍了机器翻译的原理,阅读本文可以参考以下几篇历史文章:


《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》





1.原理概述

序列学习其实是深度学习中的一个应用非常广泛的概念,例如语音识别、语言建模、机器翻译、机器作曲、机器写稿、自动对话、QA系统等都属于序列学习的领域,今天讲讲解如何运用序列建模的思想来构建一个端对端的机器翻译系统。


序列建模,顾名思义,处理的问题是有时序关联性的,因此这种情况下,普通的前馈式神经网络已经不适用这个问题了,取而代之的是具有循环记忆性的RNN网络,这里说的RNN是一种广泛的RNN概念,其内部记忆单元可以是原始的RNN或者是LSTM、GRU单元均可。由于RNN对于长时间建模问题表现没有LSTM好,因此本文中使用LSTM来建模。


通常来说,序列建模的输入数据长度与输出长度不一定相同。举个例子,就英汉机器翻译系统而言,英文中的“what's your name”是三个单词组成的序列,将它翻译成中文的话变成了“你叫什么名字”,它是六个汉字组成的序列,那么对于这种输入输出序列的长度是动态变化的情况,传统的RNN(或LSTM)建模显然是不行的,这个时候我们考虑的是把问题拆分为两个部分,即编码器和解码器,原因是,无论是汉语还是英语,两句话所对应的意义是一样的,那么当我们使用编码器对输入的英语序列进行特征编码,就相当于得到了这句话的意义,然后我们用汉语的解码器对这个意义进行解码并且用汉语的形式表达出来,这就得到了英译汉的结果。


具体来说,我们可以使用两个LSTM网络来分别作为编码和解码。编码的LSTM用来读取输入序列,每一时刻读取输入序列的一个单元,最终得到输入的特征编码分布;解码的LSTM根据特征编码分布从而得到解码输出。根据条件概率公式,我们可以得到下面的公式:

10.1_.JPG


这里的x_1...x_T是输入序列,y_1...y_T'是输出序列,v是解码器的初始值x1...x_T,并且T和T'通常长度不一致。上式左边是我们需要求得的,而我们把它转换成右边的形式来计算,随后每一时刻解码器都会得到一个输出y_t,一直到输出<eos>即可停止解码。例如下图所示,这是一个由编码器输入ABC,再由解码器输出WXYZ的过程。

10.2_.jpg





2.机器翻译实战

接下来我将讲解LSTM是如何具体在一个机器翻译系统中工作的,考虑如下一个英语-法语的翻译流程:

10.3_.jpg


上图表示一个英-法翻译系统的结构,输入的是一句英语,经过机器翻译系统输出为一句法语。正如我们人脑翻译一句话一样,当我看到一句“what's your name”时,我的脑海中首先想的是它的具体含义,然后我才会根据这个含义,写出一句法语出来,这一思考流程正与上图中的编码和解码模块类似。


首先,我们大致浏览一下我们将要构建的基于LSTM的机器翻译系统,如下图所示,e是我们的一段待翻译英语句子,f是输出的翻译过后的法语句子。英语句子经过LSTM编码器得到特征表示,然后进入另一个LSTM解码器解码得到法语句子。这就是机器翻译系统的总体流程。

10.4_.jpg


首先我们看下面的编码器部分,编码的过程如下:

10.5_.jpg


1.英语句子中的每个单词首先进行one-hot向量编码(蓝色部分)。这个很简单,假设有10000个单词,并且每个单词标记一个索引,如0,1,2,...9999,假如Economic所对应的索引为1,那么Economic单词的one-hot编码后的向量为(0,1,0,0,...,0)。这个编码虽然简单,但是只是编码的第一步,原因是这个编码并没有存储单词之间的关联性;


2.每个单词进行二次编码(粉红色部分)。我们需要用一个向量来表示整句话,但是在得到这个向量之前,我们还需要对每个单词进行二次编码,这次编码的目的是要让其更有意义,不是简单的one-hot编码了,那么如何得到这种更有意义的编码呢?在上图的蓝色部分与红色部分连接一个权重W,这个W的维度应该是单词数量×特征大小,当然特征大小你可以自己定义,如100或200都可以。并且,这个W的值需要由网络不断更新从而自我学习,其更新的目的就是要使得该机器翻译系统性能越来越好;


3.经LSTM得到整句话的编码向量(红色循环层)。由第2步我们已经得到了每个单词的特征向量s,接下来就是把这些特征向量s按照时间先后顺序依次输入到LSTM隐含层,这里假设有个h_0是一个所有元素随机初始化为0的向量,于是,由s_1和h_0即可得到h_1,由h_1和s_2即可得到h_2,以此类推,直到由h_T-1和s_T得到了h_T,编码结束。那么这个h_T我们认为就是整个英语句子的特征向量表示。


得到了每句话的特征表示,我们不禁会想这个特征表示到底是什么样的?虽然是高维的特征,但是不同句子的特征表示是否有关联呢?有研究者在训练好了一个机器翻译系统之后,就将一些句子的特征向量保存了下来并做了主成分分析(PCA),将其降维到了2-D空间,如下图所示:

10.6_.JPG


从上图可以看出,句子的特征向量确实可以反映句子之间的关联,例如,相似的句子在上图中靠的很近。



接下来看解码部分,根据输入句子的向量即可得到进行解码操作,具体流程如下:

10.7_.jpg


1.将句子编码h_T作为输入传到解码LSTM中,对于解码LSTM而言,其隐含层状态z_i是由句子编码h_T、前一个输出单词u_i-1、前一隐含状态z_i-1共同决定的,即z_i=f(h_T,u_i-1,z_i-1),这里需要初始化一些量,例如t=0时刻的隐含层状态以及单词;


2.计算每个时刻的输出单词的概率分布。首先需要对z_i加一个前馈层,从而可以得到一个和字典单词数量一致的向量,然后使用softmax函数即可确定每个单词的概率。然后,依据单词概率进行抽样即可确定此刻的最终单词输出。


3.将上一时刻的单词输出以及上一时刻的隐含层状态,重复第2步计算,得到下一个输出的单词,直到<eos>出现为止,停止解码操作。



构建好了编码LSTM和解码LSTM以后,接下来就是如何训练这个网络了。假设我们的训练数据集是由很多(X,Y)构成的,X_i是英语句子,Y_i是对应的法语句子。我们可以由机器翻译网络得到P(Y_i|X_i)的值,那么借助EM算法的思想,我们要构建它的负对数似然的形式,即

10.8_.JPG


这里的N是训练对的大小,然后按照常规的梯度下降算法即可训练这个机器翻译网络。




总结:


机器翻译时,将输入句子中的单词顺序颠倒一下可以提高机器翻译的性能,这可能是因为减小了源句与翻译后的句子的对应词语之间的距离;


本文是序列建模的一个最简单的例子,如果要提升机器翻译系统的性能,可以考虑假如注意力机制,注意力机制简而言之是可以让解码器更多地关注某个单词。


序列学习是一个非常广泛的概念,我们可以将此应用到机器写稿、句子语法分析、机器看图说话等领域。




近期文章预告:

《漫谈RNN之注意力机制》

《漫谈RNN之记忆网络》

《漫谈RNN之动态记忆网络》

《漫谈RNN之神经图灵机模型》

《漫谈RNN之无监督学习》

 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家
613 浏览

漫谈RNN之序列建模(机器说图篇)

机械自动化类 集运物流 2016-12-09 13:31 发表了文章 来自相关话题

1. 机器说图概述

序列学习在自然语言处理领域已经取得了很多成功,如机器翻译(漫谈RNN之序列建模(机器翻译篇))、机器造句(漫谈RNN之序列建模(机器造句篇))等,今天我们看另外一个应用——机器看图说话(Neural Image Caption)。






首先需要明白,为什么序列建模可以用于图像描述。类比前面说过的机器翻译模型,其任务是将一种语言的句子S转化成另外一种语言的句子T,构建了一个编码RNN网络用于读取源句子S并得到其固定长度的特征表示,再将此特征表示传入解码RNN网络的隐含层进而可以生成新的句子T,训练网络的目标函数是使得条件概率P(T|S)达到最大。



回到图像描述的问题上,我们需要首先识别一幅图像中的所有物体及其内在关联性,然后用一句话(英语)来描述这些物体及其关联性。传统的图像描述的做法涉及的手动特征提取工作比较多,或者是添加了很多人为设定的语法规则,但是这种做法显然是不高效,而对于一个端对端的神经网络图像描述系统,它意味着我们不需要任何人为的附加干预,只要输入一幅图像,系统即可输出一句话,整个训练过程是端对端的。



如何得到一个端对端的神经网络图像描述系统呢?受机器翻译的启发,如果我们得到了每幅图像的固定长度的特征表示以后,再将此特征表示与图像描述的句子进行一一映射,这实际上就跟机器翻译的模型是一样的。因此,我们可以把图像描述总结为两步:

图像识别

序列建模






并且,我们可以建立类似的目标函数进行有监督训练,即给定一个输入图片I,要使得输出的描述句子S的概率最大:






这样,我们就构建了一个端对端的神经网络图像描述系统,接下来我会详细说明一下其具体的内部结构。



2.机器说图模型具体结构

前面提到,神经网络图像描述主要分为两大块,分别是图像识别和序列建模。接下来我们将具体讲解这两部分是如何用神经网络搭建起来联合学习的。


图像识别部分 由于深度卷积神经网络最近几年在图像识别领域取得了较大的成功(可参考文末的推荐文章),在大规模图像识别任务ImageNet上,很多优秀的深度卷积神经网络模型已经被训练出来了,例如2012年的AlexNet、2013年的Network in Network、2014年的VGG和GoogleNet、2015年的Resnet,它们都是用于图像分类的训练好的模型。一般在处理图像领域的问题时(如Prisma软件、你的名字同款滤镜),我们可以使用这些网络作为预训练的模型,因为它们在处理图像任务上具有良好的泛化能力,这样会比自己创新一个新的卷积网路模型更加高效,训练起来也节省时间。这里使用的是GoogleNet(论文:《Going Deeper with Convolutions》)作为图像识别的部分,即给定一幅图像I,经由GoogleNet产生一个固定长度的特征表示x。


序列建模部分 由于LSTM网络在时序建模问题上避免了梯度消失的问题,进而可以学习到长时间的时序记忆,因此这里使用LSTM作为序列建模的循环单元。并且,同机器翻译类似,我们在训练的时候,仍然是让LSTM输出一个单词的概率分布,然后将这个概率分布作为下一时刻LSTM网络的输入。假设输入图片是I,其对应的描述句子的单词为S=(S_0,S_1,...,S_N),那么整个序列建模的过程如下:







因此,整个神经网络图像描述系统的原理是:给定一幅图像I,将其传入到GoogleNet得到一个固定长度的特征分布,接着将其作为初始状态传入到LSTM网络中,得到一个特殊的代表描述开头标志单词S_0,然后将S_0进行word embedding传入到下一时刻的LSTM网络并且得到S_1的概率分布,再由S1得到S2,S2得到S3,...,直到代表描述结束标志单词S_N出现,即可结束循环。模型结构图如下所示(左边是GoogleNet,右边是基于LSTM的序列建模网络)。






在训练过程中,对于每幅图像,其误差可以表示为所有单词的误差的乘积,即对数之和:






运用后向传播算法即可实现端对端的训练网络,训练的参数包括GoogleNet的所有参数、word embedding的权重以及LSTM的权重。


在推理过程中,我们可以使用两种方法得到最佳描述序列。一种是类似于机器造句,先根据p_1的大小随机抽样得到第一个单词S_1,然后由S_1得到S_2,一直到序列结束,这种方法我们可以称为是Best-first Search,即每个时刻得到概率最大的单词,最终连成一句话;另外一种方法是使用Beam Search,受计算机资源的限制因此需要首先设定一个beam size,然后使用动态规划的算法不停地迭代得到t时刻最佳的K个序列,其优点是综合考虑了所有时刻的概率分布,并且可以降低噪声的影响。




3.序列建模总结

序列建模的应用性比较强,除了前面提到的几个应用之外,还有的典型应用如机器对话、机器作曲、知识问答、视频描述、文档摘要等。回顾机器翻译、机器造句、机器说图,我们可以发现它们有下列共同点:

训练数据通常是序列对,动态的如句子,静态的如图像

都是端对端的训练,即不需要额外的人工制定规则,输入序列A,即可输出序列B

RNN在其中应用十分广泛,尤其是LSTM

虽然领域不同,但是模型大多类似


到目前为止,我们只讲了最传统的序列建模的方式,即使用RNN网络结构得到序列的输出,而没有提到一些性能更好的优化策略,例如引入注意力模型、外部存储模块、更好的读写机制,甚至是强化学习来学得潜在的语法规则等等,这些在后面几期都会陆续讲解。




你可能会感兴趣的文章有:

《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》

《漫谈RNN之序列建模(机器翻译篇)》

《漫谈RNN之序列建模(机器造句篇)》

《TensorFlow(三)——卷积神经网络用于手写字识别》

《我所理解的深度学习(二)——卷积神经网络基础》

《我所理解的深度学习(三)——卷积神经网络应用①》

《我所理解的深度学习(四)——卷积神经网络应用②》

《Prisma修图软件的图片风格转换算法》
 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家 查看全部
1. 机器说图概述

序列学习在自然语言处理领域已经取得了很多成功,如机器翻译(漫谈RNN之序列建模(机器翻译篇))、机器造句(漫谈RNN之序列建模(机器造句篇))等,今天我们看另外一个应用——机器看图说话(Neural Image Caption)。

12.1_.jpg


首先需要明白,为什么序列建模可以用于图像描述。类比前面说过的机器翻译模型,其任务是将一种语言的句子S转化成另外一种语言的句子T,构建了一个编码RNN网络用于读取源句子S并得到其固定长度的特征表示,再将此特征表示传入解码RNN网络的隐含层进而可以生成新的句子T,训练网络的目标函数是使得条件概率P(T|S)达到最大。



回到图像描述的问题上,我们需要首先识别一幅图像中的所有物体及其内在关联性,然后用一句话(英语)来描述这些物体及其关联性。传统的图像描述的做法涉及的手动特征提取工作比较多,或者是添加了很多人为设定的语法规则,但是这种做法显然是不高效,而对于一个端对端的神经网络图像描述系统,它意味着我们不需要任何人为的附加干预,只要输入一幅图像,系统即可输出一句话,整个训练过程是端对端的。



如何得到一个端对端的神经网络图像描述系统呢?受机器翻译的启发,如果我们得到了每幅图像的固定长度的特征表示以后,再将此特征表示与图像描述的句子进行一一映射,这实际上就跟机器翻译的模型是一样的。因此,我们可以把图像描述总结为两步:

图像识别

序列建模


12.2_.jpg


并且,我们可以建立类似的目标函数进行有监督训练,即给定一个输入图片I,要使得输出的描述句子S的概率最大:

12.3_.JPG


这样,我们就构建了一个端对端的神经网络图像描述系统,接下来我会详细说明一下其具体的内部结构。



2.机器说图模型具体结构

前面提到,神经网络图像描述主要分为两大块,分别是图像识别和序列建模。接下来我们将具体讲解这两部分是如何用神经网络搭建起来联合学习的。


图像识别部分 由于深度卷积神经网络最近几年在图像识别领域取得了较大的成功(可参考文末的推荐文章),在大规模图像识别任务ImageNet上,很多优秀的深度卷积神经网络模型已经被训练出来了,例如2012年的AlexNet、2013年的Network in Network、2014年的VGG和GoogleNet、2015年的Resnet,它们都是用于图像分类的训练好的模型。一般在处理图像领域的问题时(如Prisma软件、你的名字同款滤镜),我们可以使用这些网络作为预训练的模型,因为它们在处理图像任务上具有良好的泛化能力,这样会比自己创新一个新的卷积网路模型更加高效,训练起来也节省时间。这里使用的是GoogleNet(论文:《Going Deeper with Convolutions》)作为图像识别的部分,即给定一幅图像I,经由GoogleNet产生一个固定长度的特征表示x。


序列建模部分 由于LSTM网络在时序建模问题上避免了梯度消失的问题,进而可以学习到长时间的时序记忆,因此这里使用LSTM作为序列建模的循环单元。并且,同机器翻译类似,我们在训练的时候,仍然是让LSTM输出一个单词的概率分布,然后将这个概率分布作为下一时刻LSTM网络的输入。假设输入图片是I,其对应的描述句子的单词为S=(S_0,S_1,...,S_N),那么整个序列建模的过程如下:

12.4_.JPG



因此,整个神经网络图像描述系统的原理是:给定一幅图像I,将其传入到GoogleNet得到一个固定长度的特征分布,接着将其作为初始状态传入到LSTM网络中,得到一个特殊的代表描述开头标志单词S_0,然后将S_0进行word embedding传入到下一时刻的LSTM网络并且得到S_1的概率分布,再由S1得到S2,S2得到S3,...,直到代表描述结束标志单词S_N出现,即可结束循环。模型结构图如下所示(左边是GoogleNet,右边是基于LSTM的序列建模网络)。

12.5_.JPG


在训练过程中,对于每幅图像,其误差可以表示为所有单词的误差的乘积,即对数之和:

12.6_.JPG


运用后向传播算法即可实现端对端的训练网络,训练的参数包括GoogleNet的所有参数、word embedding的权重以及LSTM的权重。


在推理过程中,我们可以使用两种方法得到最佳描述序列。一种是类似于机器造句,先根据p_1的大小随机抽样得到第一个单词S_1,然后由S_1得到S_2,一直到序列结束,这种方法我们可以称为是Best-first Search,即每个时刻得到概率最大的单词,最终连成一句话;另外一种方法是使用Beam Search,受计算机资源的限制因此需要首先设定一个beam size,然后使用动态规划的算法不停地迭代得到t时刻最佳的K个序列,其优点是综合考虑了所有时刻的概率分布,并且可以降低噪声的影响。




3.序列建模总结

序列建模的应用性比较强,除了前面提到的几个应用之外,还有的典型应用如机器对话、机器作曲、知识问答、视频描述、文档摘要等。回顾机器翻译、机器造句、机器说图,我们可以发现它们有下列共同点:

训练数据通常是序列对,动态的如句子,静态的如图像

都是端对端的训练,即不需要额外的人工制定规则,输入序列A,即可输出序列B

RNN在其中应用十分广泛,尤其是LSTM

虽然领域不同,但是模型大多类似


到目前为止,我们只讲了最传统的序列建模的方式,即使用RNN网络结构得到序列的输出,而没有提到一些性能更好的优化策略,例如引入注意力模型、外部存储模块、更好的读写机制,甚至是强化学习来学得潜在的语法规则等等,这些在后面几期都会陆续讲解。




你可能会感兴趣的文章有:

《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》

《漫谈RNN之序列建模(机器翻译篇)》

《漫谈RNN之序列建模(机器造句篇)》

《TensorFlow(三)——卷积神经网络用于手写字识别》

《我所理解的深度学习(二)——卷积神经网络基础》

《我所理解的深度学习(三)——卷积神经网络应用①》

《我所理解的深度学习(四)——卷积神经网络应用②》

《Prisma修图软件的图片风格转换算法》

 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家
534 浏览

漫谈RNN之序列建模(机器造句篇)

设备硬件类 集运物流 2016-12-09 13:20 发表了文章 来自相关话题

在《漫谈RNN之序列建模(机器翻译篇)》中,提到了如何运用序列建模进行机器翻译,机器翻译系统主要包含编码器和解码器,编码器负责将待翻译的句子进行特征表示,而解码器则负责将此特征用另外一种语言表示出来。神经机器翻译模型(Neural Translation Machine,以下简称NTM)的编解码系统如下图所示:







语言模型相比NTM要简单很多,原因是语言模型只涉及一种语言之间的关联,没有编码器、解码器之分。最常见的运用RNN搭建的语言模型如下图所示:







语言建模通常有两个作用,第一是衡量一句话是否合理,譬如说,我们可以用训练好的中文语言模型来评估『今天是星期五』这句话通顺的可能性有多大,或者说混乱度是多少(专业术语是perplexity);第二是用来预测语句序列,即机器造句,比如我们可以给定一个种子序列作为造句的开头部分,然后机器就可以根据该种子序列继续生成后面的句子。


传统的语言模型通常使用统计的方法来得到,常见的统计模型有N-gram或者马尔科夫链,其原理是先根据训练语料计算所有单词的转移概率,然后根据此转移概率计算一句话的perplexity,或者是给定一个种子序列,然后由转移概率随机抽样生成新的句子。






例如,我们要用bi-gram语言模型来评估『今天是星期五』这句话的是否通顺,我们可以计算整句话出现的概率,计算的流程如下:


句子以“今”开头的概率是多少

“今”后面紧邻“天”的概率是多少

“天”后面紧邻“是”的概率是多少

“是”后面紧邻“星”的概率是多少

“星”后面紧邻“期”的概率是多少

“期”后面紧邻“五”的概率是多少


然后把上面所有概率相乘起来,即可得到『今天是星期五』这句话出现的可能性有多大。


传统的语言建模过程是一个无参建模过程,因N-gram的计算过程是不含参数的,其优点是计算量比较小,无需迭代调参,统计词频即可。其缺点主要有两点:第一,计算的概率具有稀疏性,假设出现的单词数量为|V|,然而对于bi-gram而言,并不是|V|*|V|个概率都有被计算,因此如果“是星”在源训练集中没有出现,那么『今天是星期五』出现的概率等于0,这显然是不合理的;第二,这种统计模型不具备泛化能力,即如果“星期四”出现在数据库中,而“星期五”没有出现在数据库中,那么这个时候出现的概率为0,但是,如果这个模型具有泛化能力的话,显然“星期五”与“星期六”是同类的词语,因此出现的可能性应该是一样的。


运用神经网络进行语言建模就可以有效解决以上两个缺点,由于语言也是一种时序问题,因此我们一般采用RNN/LSTM进行建模,目的是使得模型具备长期记忆性,从而可以保证语言模型在判断或生成长句子时更加符合语法规则。


那么如何运用LSTM进行语言建模呢?在训练之前,我们需要得到数据集。由于语言建模是一个监督学习问题,因此我们需要得到(X,Y)这样的训练对。假设我们这里进行的是单词水平的语言建模,即以一个单词为单位,所以我们为了得到(X,Y)这样的训练对,比如训练样本是一句“How are you",我们可以把X设为['How','are'],把Y设为['are','you'],这样设定好之后,如果网络输入'How'这个单词,那我们的标准输出应该是'are',建立了一一对应的时序关系。


数据集构建好了之后,就开始构建模型了。首先,我们对每个单词做一个one-hot编码,由此编码再得到每个单词的特征向量表示,这个过程我们称为word embedding。


第二步,假设我们要构建一个三层LSTM网络,我们就可以把第一个单词作为RNN网络的输入x_t-1,经过计算得到最上面隐含层状态h_t-1,然后由h_t-1经过一个softmax层即可计算P(x_t|y_t-1)是多少。






第三步,将该概率值传到输入层作为第二时刻的输入x_t,然后经过三个循环隐含层即可计算得到h_t,同理,可以算出P(x_t+1|y_t)的值。


重复以上步骤,直到训练了整个mini-batch,接下来根据最大似然估计法则确定目标函数的表达式,训练过程中的目标是使得整句话出现的概率最大,因此目标函数可以写为:







然后就可以使用后向传播算法进行参数更新。


当模型训练好了以后,我们就可以使用这个模型来造句了。造句的方法就是抽样,但是我们必须先给定一个种子序列,例如"I am",然后将"I"和"am"分别输入到网络中,得到y_3的值,然后依概率进行抽样即可得到第三个单词...根据上图的计算流程,我们可以生成无限多个单词组成的句子。


除了单词水平的语言建模以外,常见的还有字母水平的语言建模,对于字母水平的语言建模,其好处就是可以生成OOV(out of vocabulary)的单词,不过字母水平的建模要比单词水平的更难一些,因其要求模型具有更长的时序记忆性。


值得注意的是,机器造句的实际效果不仅与训练语料库的大小有关,还与模型的好坏有关。如果使用RNN进行语言建模,那么其长期记忆性是非常差的,造出来的句子经常会不通顺。可以改善的方法有:使用深层LSTM模型、使用基于注意力的模型、使用外部memory的网络、使用深度强化学习等等,至于这些方法具体如何运用,后面几期会慢慢介绍。




你可能会感兴趣的文章有:


《如何评价一个语言模型(LM)》

《语言模型之N-gram》

《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》

《漫谈RNN之序列建模(机器翻译篇)》
 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家 查看全部
《漫谈RNN之序列建模(机器翻译篇)》中,提到了如何运用序列建模进行机器翻译,机器翻译系统主要包含编码器和解码器,编码器负责将待翻译的句子进行特征表示,而解码器则负责将此特征用另外一种语言表示出来。神经机器翻译模型(Neural Translation Machine,以下简称NTM)的编解码系统如下图所示:

11.1_.JPG



语言模型相比NTM要简单很多,原因是语言模型只涉及一种语言之间的关联,没有编码器、解码器之分。最常见的运用RNN搭建的语言模型如下图所示:

11.2_.JPG



语言建模通常有两个作用,第一是衡量一句话是否合理,譬如说,我们可以用训练好的中文语言模型来评估『今天是星期五』这句话通顺的可能性有多大,或者说混乱度是多少(专业术语是perplexity);第二是用来预测语句序列,即机器造句,比如我们可以给定一个种子序列作为造句的开头部分,然后机器就可以根据该种子序列继续生成后面的句子。


传统的语言模型通常使用统计的方法来得到,常见的统计模型有N-gram或者马尔科夫链,其原理是先根据训练语料计算所有单词的转移概率,然后根据此转移概率计算一句话的perplexity,或者是给定一个种子序列,然后由转移概率随机抽样生成新的句子。

11.3_.JPG


例如,我们要用bi-gram语言模型来评估『今天是星期五』这句话的是否通顺,我们可以计算整句话出现的概率,计算的流程如下:


句子以“今”开头的概率是多少

“今”后面紧邻“天”的概率是多少

“天”后面紧邻“是”的概率是多少

“是”后面紧邻“星”的概率是多少

“星”后面紧邻“期”的概率是多少

“期”后面紧邻“五”的概率是多少


然后把上面所有概率相乘起来,即可得到『今天是星期五』这句话出现的可能性有多大。


传统的语言建模过程是一个无参建模过程,因N-gram的计算过程是不含参数的,其优点是计算量比较小,无需迭代调参,统计词频即可。其缺点主要有两点:第一,计算的概率具有稀疏性,假设出现的单词数量为|V|,然而对于bi-gram而言,并不是|V|*|V|个概率都有被计算,因此如果“是星”在源训练集中没有出现,那么『今天是星期五』出现的概率等于0,这显然是不合理的;第二,这种统计模型不具备泛化能力,即如果“星期四”出现在数据库中,而“星期五”没有出现在数据库中,那么这个时候出现的概率为0,但是,如果这个模型具有泛化能力的话,显然“星期五”与“星期六”是同类的词语,因此出现的可能性应该是一样的。


运用神经网络进行语言建模就可以有效解决以上两个缺点,由于语言也是一种时序问题,因此我们一般采用RNN/LSTM进行建模,目的是使得模型具备长期记忆性,从而可以保证语言模型在判断或生成长句子时更加符合语法规则。


那么如何运用LSTM进行语言建模呢?在训练之前,我们需要得到数据集。由于语言建模是一个监督学习问题,因此我们需要得到(X,Y)这样的训练对。假设我们这里进行的是单词水平的语言建模,即以一个单词为单位,所以我们为了得到(X,Y)这样的训练对,比如训练样本是一句“How are you",我们可以把X设为['How','are'],把Y设为['are','you'],这样设定好之后,如果网络输入'How'这个单词,那我们的标准输出应该是'are',建立了一一对应的时序关系。


数据集构建好了之后,就开始构建模型了。首先,我们对每个单词做一个one-hot编码,由此编码再得到每个单词的特征向量表示,这个过程我们称为word embedding。


第二步,假设我们要构建一个三层LSTM网络,我们就可以把第一个单词作为RNN网络的输入x_t-1,经过计算得到最上面隐含层状态h_t-1,然后由h_t-1经过一个softmax层即可计算P(x_t|y_t-1)是多少。

11.4_.jpg


第三步,将该概率值传到输入层作为第二时刻的输入x_t,然后经过三个循环隐含层即可计算得到h_t,同理,可以算出P(x_t+1|y_t)的值。


重复以上步骤,直到训练了整个mini-batch,接下来根据最大似然估计法则确定目标函数的表达式,训练过程中的目标是使得整句话出现的概率最大,因此目标函数可以写为:

11.5_.JPG



然后就可以使用后向传播算法进行参数更新。


当模型训练好了以后,我们就可以使用这个模型来造句了。造句的方法就是抽样,但是我们必须先给定一个种子序列,例如"I am",然后将"I"和"am"分别输入到网络中,得到y_3的值,然后依概率进行抽样即可得到第三个单词...根据上图的计算流程,我们可以生成无限多个单词组成的句子。


除了单词水平的语言建模以外,常见的还有字母水平的语言建模,对于字母水平的语言建模,其好处就是可以生成OOV(out of vocabulary)的单词,不过字母水平的建模要比单词水平的更难一些,因其要求模型具有更长的时序记忆性。


值得注意的是,机器造句的实际效果不仅与训练语料库的大小有关,还与模型的好坏有关。如果使用RNN进行语言建模,那么其长期记忆性是非常差的,造出来的句子经常会不通顺。可以改善的方法有:使用深层LSTM模型、使用基于注意力的模型、使用外部memory的网络、使用深度强化学习等等,至于这些方法具体如何运用,后面几期会慢慢介绍。




你可能会感兴趣的文章有:


《如何评价一个语言模型(LM)》

《语言模型之N-gram》

《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》

《漫谈RNN之序列建模(机器翻译篇)》

 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家
675 浏览

漫谈RNN之序列建模(机器翻译篇)

机械自动化类 集运物流 2016-12-09 13:10 发表了文章 来自相关话题

本期讲解运用LSTM进行序列建模,并且介绍了机器翻译的原理,阅读本文可以参考以下几篇历史文章:


《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》




1.原理概述

序列学习其实是深度学习中的一个应用非常广泛的概念,例如语音识别、语言建模、机器翻译、机器作曲、机器写稿、自动对话、QA系统等都属于序列学习的领域,今天讲讲解如何运用序列建模的思想来构建一个端对端的机器翻译系统。


序列建模,顾名思义,处理的问题是有时序关联性的,因此这种情况下,普通的前馈式神经网络已经不适用这个问题了,取而代之的是具有循环记忆性的RNN网络,这里说的RNN是一种广泛的RNN概念,其内部记忆单元可以是原始的RNN或者是LSTM、GRU单元均可。由于RNN对于长时间建模问题表现没有LSTM好,因此本文中使用LSTM来建模。


通常来说,序列建模的输入数据长度与输出长度不一定相同。举个例子,就英汉机器翻译系统而言,英文中的“what's your name”是三个单词组成的序列,将它翻译成中文的话变成了“你叫什么名字”,它是六个汉字组成的序列,那么对于这种输入输出序列的长度是动态变化的情况,传统的RNN(或LSTM)建模显然是不行的,这个时候我们考虑的是把问题拆分为两个部分,即编码器和解码器,原因是,无论是汉语还是英语,两句话所对应的意义是一样的,那么当我们使用编码器对输入的英语序列进行特征编码,就相当于得到了这句话的意义,然后我们用汉语的解码器对这个意义进行解码并且用汉语的形式表达出来,这就得到了英译汉的结果。


具体来说,我们可以使用两个LSTM网络来分别作为编码和解码。编码的LSTM用来读取输入序列,每一时刻读取输入序列的一个单元,最终得到输入的特征编码分布;解码的LSTM根据特征编码分布从而得到解码输出。根据条件概率公式,我们可以得到下面的公式:






这里的x_1...x_T是输入序列,y_1...y_T'是输出序列,v是解码器的初始值x1...x_T,并且T和T'通常长度不一致。上式左边是我们需要求得的,而我们把它转换成右边的形式来计算,随后每一时刻解码器都会得到一个输出y_t,一直到输出<eos>即可停止解码。例如下图所示,这是一个由编码器输入ABC,再由解码器输出WXYZ的过程。









2.机器翻译实战

接下来我将讲解LSTM是如何具体在一个机器翻译系统中工作的,考虑如下一个英语-法语的翻译流程:






上图表示一个英-法翻译系统的结构,输入的是一句英语,经过机器翻译系统输出为一句法语。正如我们人脑翻译一句话一样,当我看到一句“what's your name”时,我的脑海中首先想的是它的具体含义,然后我才会根据这个含义,写出一句法语出来,这一思考流程正与上图中的编码和解码模块类似。


首先,我们大致浏览一下我们将要构建的基于LSTM的机器翻译系统,如下图所示,e是我们的一段待翻译英语句子,f是输出的翻译过后的法语句子。英语句子经过LSTM编码器得到特征表示,然后进入另一个LSTM解码器解码得到法语句子。这就是机器翻译系统的总体流程。






首先我们看下面的编码器部分,编码的过程如下:






1.英语句子中的每个单词首先进行one-hot向量编码(蓝色部分)。这个很简单,假设有10000个单词,并且每个单词标记一个索引,如0,1,2,...9999,假如Economic所对应的索引为1,那么Economic单词的one-hot编码后的向量为(0,1,0,0,...,0)。这个编码虽然简单,但是只是编码的第一步,原因是这个编码并没有存储单词之间的关联性;


2.每个单词进行二次编码(粉红色部分)。我们需要用一个向量来表示整句话,但是在得到这个向量之前,我们还需要对每个单词进行二次编码,这次编码的目的是要让其更有意义,不是简单的one-hot编码了,那么如何得到这种更有意义的编码呢?在上图的蓝色部分与红色部分连接一个权重W,这个W的维度应该是单词数量×特征大小,当然特征大小你可以自己定义,如100或200都可以。并且,这个W的值需要由网络不断更新从而自我学习,其更新的目的就是要使得该机器翻译系统性能越来越好;


3.经LSTM得到整句话的编码向量(红色循环层)。由第2步我们已经得到了每个单词的特征向量s,接下来就是把这些特征向量s按照时间先后顺序依次输入到LSTM隐含层,这里假设有个h_0是一个所有元素随机初始化为0的向量,于是,由s_1和h_0即可得到h_1,由h_1和s_2即可得到h_2,以此类推,直到由h_T-1和s_T得到了h_T,编码结束。那么这个h_T我们认为就是整个英语句子的特征向量表示。


得到了每句话的特征表示,我们不禁会想这个特征表示到底是什么样的?虽然是高维的特征,但是不同句子的特征表示是否有关联呢?有研究者在训练好了一个机器翻译系统之后,就将一些句子的特征向量保存了下来并做了主成分分析(PCA),将其降维到了2-D空间,如下图所示:






从上图可以看出,句子的特征向量确实可以反映句子之间的关联,例如,相似的句子在上图中靠的很近。



接下来看解码部分,根据输入句子的向量即可得到进行解码操作,具体流程如下:






1.将句子编码h_T作为输入传到解码LSTM中,对于解码LSTM而言,其隐含层状态z_i是由句子编码h_T、前一个输出单词u_i-1、前一隐含状态z_i-1共同决定的,即z_i=f(h_T,u_i-1,z_i-1),这里需要初始化一些量,例如t=0时刻的隐含层状态以及单词;


2.计算每个时刻的输出单词的概率分布。首先需要对z_i加一个前馈层,从而可以得到一个和字典单词数量一致的向量,然后使用softmax函数即可确定每个单词的概率。然后,依据单词概率进行抽样即可确定此刻的最终单词输出。


3.将上一时刻的单词输出以及上一时刻的隐含层状态,重复第2步计算,得到下一个输出的单词,直到<eos>出现为止,停止解码操作。



构建好了编码LSTM和解码LSTM以后,接下来就是如何训练这个网络了。假设我们的训练数据集是由很多(X,Y)构成的,X_i是英语句子,Y_i是对应的法语句子。我们可以由机器翻译网络得到P(Y_i|X_i)的值,那么借助EM算法的思想,我们要构建它的负对数似然的形式,即






这里的N是训练对的大小,然后按照常规的梯度下降算法即可训练这个机器翻译网络。




总结:


机器翻译时,将输入句子中的单词顺序颠倒一下可以提高机器翻译的性能,这可能是因为减小了源句与翻译后的句子的对应词语之间的距离;


本文是序列建模的一个最简单的例子,如果要提升机器翻译系统的性能,可以考虑假如注意力机制,注意力机制简而言之是可以让解码器更多地关注某个单词。


序列学习是一个非常广泛的概念,我们可以将此应用到机器写稿、句子语法分析、机器看图说话等领域。



近期文章预告:

《漫谈RNN之注意力机制》

《漫谈RNN之记忆网络》

《漫谈RNN之动态记忆网络》

《漫谈RNN之神经图灵机模型》

《漫谈RNN之无监督学习》
 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家 查看全部
本期讲解运用LSTM进行序列建模,并且介绍了机器翻译的原理,阅读本文可以参考以下几篇历史文章:


《漫谈RNN之基本概念》

《漫谈RNN之训练方法》

《漫谈RNN之梯度消失及梯度爆炸》

《漫谈RNN之长短期记忆模型LSTM》

《漫谈RNN之长短期记忆模型LSTM(续)》





1.原理概述

序列学习其实是深度学习中的一个应用非常广泛的概念,例如语音识别、语言建模、机器翻译、机器作曲、机器写稿、自动对话、QA系统等都属于序列学习的领域,今天讲讲解如何运用序列建模的思想来构建一个端对端的机器翻译系统。


序列建模,顾名思义,处理的问题是有时序关联性的,因此这种情况下,普通的前馈式神经网络已经不适用这个问题了,取而代之的是具有循环记忆性的RNN网络,这里说的RNN是一种广泛的RNN概念,其内部记忆单元可以是原始的RNN或者是LSTM、GRU单元均可。由于RNN对于长时间建模问题表现没有LSTM好,因此本文中使用LSTM来建模。


通常来说,序列建模的输入数据长度与输出长度不一定相同。举个例子,就英汉机器翻译系统而言,英文中的“what's your name”是三个单词组成的序列,将它翻译成中文的话变成了“你叫什么名字”,它是六个汉字组成的序列,那么对于这种输入输出序列的长度是动态变化的情况,传统的RNN(或LSTM)建模显然是不行的,这个时候我们考虑的是把问题拆分为两个部分,即编码器和解码器,原因是,无论是汉语还是英语,两句话所对应的意义是一样的,那么当我们使用编码器对输入的英语序列进行特征编码,就相当于得到了这句话的意义,然后我们用汉语的解码器对这个意义进行解码并且用汉语的形式表达出来,这就得到了英译汉的结果。


具体来说,我们可以使用两个LSTM网络来分别作为编码和解码。编码的LSTM用来读取输入序列,每一时刻读取输入序列的一个单元,最终得到输入的特征编码分布;解码的LSTM根据特征编码分布从而得到解码输出。根据条件概率公式,我们可以得到下面的公式:

10.1_.JPG


这里的x_1...x_T是输入序列,y_1...y_T'是输出序列,v是解码器的初始值x1...x_T,并且T和T'通常长度不一致。上式左边是我们需要求得的,而我们把它转换成右边的形式来计算,随后每一时刻解码器都会得到一个输出y_t,一直到输出<eos>即可停止解码。例如下图所示,这是一个由编码器输入ABC,再由解码器输出WXYZ的过程。

10.2_.jpg





2.机器翻译实战

接下来我将讲解LSTM是如何具体在一个机器翻译系统中工作的,考虑如下一个英语-法语的翻译流程:

10.3_.jpg


上图表示一个英-法翻译系统的结构,输入的是一句英语,经过机器翻译系统输出为一句法语。正如我们人脑翻译一句话一样,当我看到一句“what's your name”时,我的脑海中首先想的是它的具体含义,然后我才会根据这个含义,写出一句法语出来,这一思考流程正与上图中的编码和解码模块类似。


首先,我们大致浏览一下我们将要构建的基于LSTM的机器翻译系统,如下图所示,e是我们的一段待翻译英语句子,f是输出的翻译过后的法语句子。英语句子经过LSTM编码器得到特征表示,然后进入另一个LSTM解码器解码得到法语句子。这就是机器翻译系统的总体流程。

10.4_.jpg


首先我们看下面的编码器部分,编码的过程如下:

10.5_.jpg


1.英语句子中的每个单词首先进行one-hot向量编码(蓝色部分)。这个很简单,假设有10000个单词,并且每个单词标记一个索引,如0,1,2,...9999,假如Economic所对应的索引为1,那么Economic单词的one-hot编码后的向量为(0,1,0,0,...,0)。这个编码虽然简单,但是只是编码的第一步,原因是这个编码并没有存储单词之间的关联性;


2.每个单词进行二次编码(粉红色部分)。我们需要用一个向量来表示整句话,但是在得到这个向量之前,我们还需要对每个单词进行二次编码,这次编码的目的是要让其更有意义,不是简单的one-hot编码了,那么如何得到这种更有意义的编码呢?在上图的蓝色部分与红色部分连接一个权重W,这个W的维度应该是单词数量×特征大小,当然特征大小你可以自己定义,如100或200都可以。并且,这个W的值需要由网络不断更新从而自我学习,其更新的目的就是要使得该机器翻译系统性能越来越好;


3.经LSTM得到整句话的编码向量(红色循环层)。由第2步我们已经得到了每个单词的特征向量s,接下来就是把这些特征向量s按照时间先后顺序依次输入到LSTM隐含层,这里假设有个h_0是一个所有元素随机初始化为0的向量,于是,由s_1和h_0即可得到h_1,由h_1和s_2即可得到h_2,以此类推,直到由h_T-1和s_T得到了h_T,编码结束。那么这个h_T我们认为就是整个英语句子的特征向量表示。


得到了每句话的特征表示,我们不禁会想这个特征表示到底是什么样的?虽然是高维的特征,但是不同句子的特征表示是否有关联呢?有研究者在训练好了一个机器翻译系统之后,就将一些句子的特征向量保存了下来并做了主成分分析(PCA),将其降维到了2-D空间,如下图所示:

10.6_.JPG


从上图可以看出,句子的特征向量确实可以反映句子之间的关联,例如,相似的句子在上图中靠的很近。



接下来看解码部分,根据输入句子的向量即可得到进行解码操作,具体流程如下:

10.7_.jpg


1.将句子编码h_T作为输入传到解码LSTM中,对于解码LSTM而言,其隐含层状态z_i是由句子编码h_T、前一个输出单词u_i-1、前一隐含状态z_i-1共同决定的,即z_i=f(h_T,u_i-1,z_i-1),这里需要初始化一些量,例如t=0时刻的隐含层状态以及单词;


2.计算每个时刻的输出单词的概率分布。首先需要对z_i加一个前馈层,从而可以得到一个和字典单词数量一致的向量,然后使用softmax函数即可确定每个单词的概率。然后,依据单词概率进行抽样即可确定此刻的最终单词输出。


3.将上一时刻的单词输出以及上一时刻的隐含层状态,重复第2步计算,得到下一个输出的单词,直到<eos>出现为止,停止解码操作。



构建好了编码LSTM和解码LSTM以后,接下来就是如何训练这个网络了。假设我们的训练数据集是由很多(X,Y)构成的,X_i是英语句子,Y_i是对应的法语句子。我们可以由机器翻译网络得到P(Y_i|X_i)的值,那么借助EM算法的思想,我们要构建它的负对数似然的形式,即

10.8_.JPG


这里的N是训练对的大小,然后按照常规的梯度下降算法即可训练这个机器翻译网络。




总结:


机器翻译时,将输入句子中的单词顺序颠倒一下可以提高机器翻译的性能,这可能是因为减小了源句与翻译后的句子的对应词语之间的距离;


本文是序列建模的一个最简单的例子,如果要提升机器翻译系统的性能,可以考虑假如注意力机制,注意力机制简而言之是可以让解码器更多地关注某个单词。


序列学习是一个非常广泛的概念,我们可以将此应用到机器写稿、句子语法分析、机器看图说话等领域。




近期文章预告:

《漫谈RNN之注意力机制》

《漫谈RNN之记忆网络》

《漫谈RNN之动态记忆网络》

《漫谈RNN之神经图灵机模型》

《漫谈RNN之无监督学习》

 
 
 
 
 
 
来源:张泽旺 深度学习每日摘要
智造家