深度学习学习笔记(五)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

此篇博客是对于神经网络中的卷积网络学习的相应笔记。


提示:以下是本篇文章正文内容。

一、序列模型(Sequence Models)

1.1 序列模型

序列模型的应用:
1.语音识别
2.音乐生成问题
3.情感分类问题
4.DNA序列分析
5.机器翻译
6.视频行为识别:给定一系列视频帧,要求识别其中的行为
7.命名实体识别:可能会给定一个句子要你识别出句中的人名

1.2 循环神经网络(Recurrent Neural Network)

我们在这里以命名实体识别为例。
我们如何去建立一个神经网络来学习从X到Y的映射?
很容易想到使用标准神经网络,但是这个方法并不好,首先,在命名实体识别问题中,输入和输出数据在不同的样本中有着不同的长度。其次,标准的神经网络无法从文本的不同位置学到特证。具体来说,如果神经网络已经学习到了在位置1出现的Harry可能是人名的一部分,那么如果Harry出现在其他位置,标准神经网络难以进行识别。

于是,我们想到了循环神经网络(RNN)
具体结构如下:
在这里插入图片描述
循环神经网络在预测当前的X时会用到前面的信息即图中的a1。
比如,如果当前循环神经网络要预测x2,那么他会用到a2,而a2则会用到x2和a1。
但是同样,循环神经网络也有一定的缺陷,比如他只用到了这个序列之前的信息来做预测,有时候只知道序列之前的信息是完全不够的,还需要知道句中后部分的信息,由此则引出了我们后面会介绍的双向循环神经网络(BRNN)

1.3 RNN的前向传播与反向传播

1.3.1 前向传播

对于RNN,我们的前向传播过程公式如下:
在这里插入图片描述
为了简便表示,我们会将Waa和Wax矩阵压缩到一个矩阵中:

在这里插入图片描述
具体的前向传播的示意图如下:
在这里插入图片描述

1.3.2 反向传播

在这里插入图片描述
我们定义单个元素的损失函数如下(交叉熵损失函数):
在这里插入图片描述
然后定义整个序列的损失函数:
在这里插入图片描述
反向传播的相应公式如下:
在这里插入图片描述
推到方式
在这里插入图片描述
(前面的每个h都会对后面的h有着影响)
所以可以发现当i=1时,则对应的会出现wnn的k次方,也就会导致梯度消失或者梯度爆炸
或者可参考:
RNN梯度消失分析

1.4 不同类型的循环神经网络

上述,我们讨论的循环神经网络的输入和输出数量相同。但在某些应用中,输入与输出的数量并不一定相等,由此也有产生了不同类型的RNN的结构。
具体如下
在这里插入图片描述
在上图中,对于一对一结构,当去掉a0时,他就是一种标准的神经网络结构。对于音乐生成或者序列生成,采用的多为一对多的结构。对于情感分类等则是采用多对一的结构。当然类似的机器翻译和命名实体识别则是采用多对多的结构。

1.5 语言模型和序列生成

什么是语言模型?
语言模型所做的就是,它会告诉你某个特定的句子它出现的概率是多少。

如何建立语言模型?
首先需要一个训练集,包含一个很大的英文文本语料库(corpus)或者其它的语言。
然后考虑类似于之前的方式将给定训练样本中一个句子中的每个单词转化为one-hot向量。同时你也需要定义句子的结尾,一般的做法就是增加一个额外的标记,记作EOS。

具体的训练如下:
在这里插入图片描述
RNN模型通过softmax来计算对应的每个位置的词可能是什么,预测会受到前面词语预测结果的影响。
因此单个损失函数即为softmax损失函数:
在这里插入图片描述
总体的损失函数为:
在这里插入图片描述

举例如下:现在有一个新句子,它是y1,y2,y3为了简单起见,它只包含3个词(如上图所示),现在要计算出整个句子中各个单词的概率,方法就是第一个softmax层会告诉你y1的概率(上图编号1所示),这也是第一个输出,然后第二个softmax层会告诉你在考虑y1的情况下y2的概率(上图编号2所示),然后第三个softmax层告诉你在考虑y1和y2的情况下y3的概率(上图编号3所示),把这三个概率相乘,最后得到这个含3个词的整个句子的概率。

1.6 对新序列采样

在你训练了某个序列模型后,要想了解这个模型学到了什么,一种非正式的方法是进行一次新序列采样。

即向模型输入x1=0,a0=0然后根据softmax层的分布进行随机采样,然后继续下一步,知道得到最后的终止标识。
在这里插入图片描述
根据应用的不同,你可以选择建立基于字符的RNN结构或者基于词汇的RNN结构。
基于字符的RNN结构即你的训练数据将会是单独的字符,而不是单独的词汇。它有优点也有相应的缺点,优点就是它不会出现未知的标识,缺点是他难以捕捉长范围的关系,且计算成本比较高昂。

1.7 循环神经网络的梯度消失(Vanishing gradients)

当一个样本中的句子有着长期的依赖即最前面的单词对句子后面的单词有影响时,我们上述的基本RNN模型不擅长捕捉这种长期依赖。
这主要是因为当网络较深时,会使得反向传播很难传播回去,去影响靠前层的权重,这会出现所谓的梯度消失或者梯度爆炸的问题,对于RNN网络也是一样。

补充:对于梯度爆炸我们可以考虑对其进行一个梯度修剪操作,即观察你的梯度向量,如果它大于某个阈值,则缩放梯度向量,以保证它不会太大。

1.7.1 GRU单元(Gated Recurrent Unit)

GRU单元为了保持较好的长期依赖,会有一个新的变量c,代表记忆细胞,在GRU单元中ct=at。
在每个时间步中,我们会有一个候选值来记下ct。然后我们考虑使用一个对应的更新门来判断是否要用候选值来更新ct。
公式如下所示
在这里插入图片描述
上述是简单的GRU单元,在实际应用中,我们会在加上一个相关门,用以表示下一个c的候选值与前一个c的值的相关性。
此时计算公式变为如下所示
在这里插入图片描述
具体的GRU结构如下
在这里插入图片描述其中符号略有变动
ht-1=ct-1
zt=gt(更新门)

补充
因为sigmoid的值,所以对应的更新门很容易取到0值,或者说非常非常接近0,在这种情况下,ct也就会保持原值,这也就是说,哪怕经过很多很多时间步,都很难发生梯度消失的问题,由此也就缓解了梯度消失。
可参考LSTM如何解决梯度消失和梯度爆炸

1.7.2 长短期记忆(LSTM)

在上节中,我们介绍了对应的GRU单元,对于GRU,我们有at=ct,同时还引入了两个门结构,即更新门和相关门。

而LSTM则是一个相较于GRU更为强大和通用的版本。
对于LSTM而言,它的主要更新公式为如下所示
在这里插入图片描述即它在GRU的基础上,增加了一个输出门与遗忘门。同时它的a值不等于c值,也就是说,我们将a值与c值分开使用。
而遗忘门的引入也就代表了我们给了记忆细胞对于维持旧值,或者加上新值选择的权利。
具体的LSTM结构如下
在这里插入图片描述

补充 偷窥孔连接(peephole connection)
该方法就是门值不仅取决于at-1和xt,同时它也受到ct-1的值的影响。
对应的方向传播计算公式
在这里插入图片描述
对应的dbf,dbu,dbc,dbo需要各自对上述的值进行求和(dTf等)
在这里插入图片描述

对于GRU和LSTM,相对而言LSTM更加强大和灵活,但是同样的,GRU模型更加简单,由于它只有两个门结构所以计算量也相对较少,因此它很容易就能够扩大模型的规模。

相关文献
Hochreiter&Schmidhuber 1997.Long short-term memory

1.8 双向循环神经网络(BRNN,Bidirectional RNN)

基于之前的问题,即句子后半部分的信息可能会对前面词语的选择产生影响,所以我们这里提出了BRNN结构。
BRNN模型的特点就是能够让你不仅可以获取之前的信息,还可以获取未来的信息。

具体结构如下
在这里插入图片描述即它由一部分的前向连接结构和反向连接结构。通过将前向连接和反向连接的激活值计算完,然后再计算预测结果。这样,对于预测结果的输入不仅包含了过去的信息,还有将来的信息。

双向RNN模型的缺点在于需要完整的数据序列才能进行相应的预测,如果是在实时语音识别的场景下,那还需要增加更多复杂的结构。

1.9 深层循环神经网路(Deep RNNs)

为了要学习非常复杂的函数,通常我们会把RNN的多个层堆叠在一起从而构建一个更深的模型。
Deep RNN的结构如下
在这里插入图片描述上述结构中,堆叠了三层循环RNN结构。对于每层里各个结构的参数都是相同的。

补充 一般而言,Deep RNN堆叠的循环结构不会太多,但是在循环结构上添加神经网络是较为常见的。同时循环RNN结构的单元也可以是GRU单元或者LSTM单元。

习题

要使信号反向传播而不消失,我们需要 c高度依赖于c<t−1>。

二、自然语言处理与词嵌入(Natural Language Processing and Word Embeddings)

2.1 词汇表征

词嵌入(word embeddings),这是语言表示的一种方式,可以让算法自动的理解一些类似的词,比如男人对女人,比如国王对王后等。

在这前,我们一直采用的使用词汇表来表示词,即用one-hot向量来表示词,这种表示方法的一大缺点就是它把每个词孤立起来,这样使得算法对相关词的泛化能力不强。

举例如下
当你看到“I want a glass of orange ___”,那么下一个词会是什么?很可能是juice。即使你的学习算法已经学到了“I want a glass of orange juice”这样一个很可能的句子,但如果看到“I want a glass of apple ___”,因为算法不知道apple和orange的关系很接近,就像man和woman,king和queen一样。

于是我们采用特征化的表示来表示每个词,我们学习这些词的特征。
如下
在这里插入图片描述
通过这种方式得到的表示方法有着很好的泛化效果。
我们可以通过可视化算法t-SNE算法来观察这种词嵌入的表示方法
在这里插入图片描述
词嵌入已经是NLP领域最重要的概念之一了,在自然语言处理领域。

2.2 使用词嵌入

如何用词嵌入做迁移学习

第一步,先从大量的文本集中学习词嵌入。一个非常大的文本集,或者可以下载网上预训练好的词嵌入模型,网上你可以找到不少,词嵌入模型并且都有许可。

第二步,你可以用这些词嵌入模型把它迁移到你的新的只有少量标注训练集的任务中,比如说用这个300维的词嵌入来表示你的单词。这样做的一个好处就是你可以用更低维度的特征向量代替原来的10000维的one-hot向量,现在你可以用一个300维更加紧凑的向量。尽管one-hot向量很快计算,而学到的用于词嵌入的300维的向量会更加紧凑。

第三步,当你在你新的任务上训练模型时,在你的命名实体识别任务上,只有少量的标记数据集上,你可以自己选择要不要继续微调,用新的数据调整词嵌入。实际中,只有这个第二步中有很大的数据集你才会这样做,如果你标记的数据集不是很大,通常我不会在微调词嵌入上费力气。

当你的任务的训练集相对较小时,词嵌入的作用最明显,所以它广泛用于NLP领域。

最后,我们可以发现词嵌入和人脸编码之间有着奇妙的关系。
对于人脸识别,我们通过训练一个Siamese网络结构来学习不同人脸的一个128维表示,然后通过这个编码结果来判断两个图片是否是同一个人脸。
而与词嵌入不同的是,在人脸识别中,我们训练一个网络对于任意一张图片都会计算出一个相应的编码结果,但是对于词嵌入,则是有着一个固定的词汇表,即我们只需学习一个固定的编码即可,对于一些没有出现过得单词,我们就记为未知单词。

这里的术语编码(encoding)和嵌入(embedding)可以互换。

2.3 词嵌入的特性

词嵌入还有一个特性就是他还能帮助你实现类比推理,通过类比推理能够让你更加深入的了解词嵌入做了什么,以及词嵌入能够做什么。

假如我提出一个问题,man如果对应woman,那么king应该对应什么?你们应该都能猜到king应该对应queen。能否有一种算法来自动推导出这种关系,下面就是实现的方法。

即通过词嵌入的表达方式来寻找对应的关系
在这里插入图片描述
由此我们只需找到单词w来最大化ew与eking-eman+ewoman的相似度即可,这里我们可以使用余弦来表示相似度。
(两个向量之间角度的余弦是衡量它们有多相似的指标,角度越小,两个向量越相似。)
在这里插入图片描述
在这里插入图片描述
或者我们也可以用两个向量的距离,不过由于我们是最大化,所以需要在前面取负号。

2.4 嵌入矩阵(Embedding Matrix)

当你应用算法来学习词嵌入时,实际上是学习一个嵌入矩阵。

假如我们的词汇表中有10000个单词,我们需要做的就是学习一个嵌入矩阵E,它将是一个300x10000的矩阵,我们通过E*onehot来得到对应的单词的词嵌入表示。
在这里插入图片描述
一般而言,在实践中,我们不会使用矩阵相乘的方式来计算得到对应的词嵌入表示,而是使用单独的函数来查找矩阵E的某列。

2.5 学习词嵌入

实践证明,建立一个语言模型是学习词嵌入的好方法
在这里插入图片描述
我们需要的就是生成一个参数矩阵E,通过E*onehot来得到嵌入向量,我们将这些嵌入向量输入到神经网络中,经过神经网络以后再通过softmax层,让softmax层在10000个可能中预测结尾的这个单词。

实际上更常见的是有一个固定的历史窗口,举个例子,你总是想预测给定四个单词(上图编号1所示)后的下一个单词,注意这里的4是算法的超参数。这就是如何适应很长或者很短的句子,方法就是总是只看前4个单词。

用一个固定的历史窗口就意味着你可以处理任意长度的句子,因为输入的维度总是固定的。
我们可以用反向传播来进行梯度下降来最大化训练集似然,通过序列中给定的4个单词去重复地预测出语料库中下一个单词什么。

事实上通过这个算法能很好地学习词嵌入,原因是,如果你还记得我们的orange jucie,apple juice的例子,在这个算法的激励下,apple和orange会学到很相似的嵌入。

一般我们对于需要预测的词称为目标词,而上下文的选择,我们一般选取目标词之前的几个词作为上下文,当然也可以有其他的选择方式,比如左右各四个等,或者只提供目标词的前一个词,或者是附近一个单词(效果比较好,skip-Gram模型)。

2.6 Word2Vec

在Skip-Gram模型中,我们要做的是抽取上下文和目标
上下文不一定总是目标单词之前离得最近的四个单词,或最近的个单词。我们要的做的是随机选一个词作为上下文词。
然后我们要做的是随机在一定词距内选另一个词,比如在上下文词前后5个词内或者前后10个词内,我们就在这个范围内选择目标词。
于是我们将构造一个监督学习问题,它给定上下文词,要求你预测在这个词正负10个词距或者正负5个词距内随机选择的某个目标词。

具体的训练模型
我们将上下文词通过嵌入矩阵E乘以向量OC得到对应的嵌入向量。
然后利用softmax单元来得到预测不同目标词的概率
在这里插入图片描述然后通过交叉熵损失函数来进行参数更新。

这个算法也会遇到一些问题
在softmax模型中,每次计算概率都需要对于词汇表中的所有词做求和计算,也就是说softmax分母的求和计算非常困难。

相关的解决方案有以下几种
1.分级softmax (hierarchical softmax)
分级softmax就是说,它并不是一次确定到底是属于哪一类,而是判断是否在前5000个中,然后接着判断是否在前2500个中等等,按照一个分类树来进行判断。
在这里插入图片描述
(计算成本为词汇表大小的对数成正比)
一般而言,分级的softmax分类器会被构造成常用词在顶部,不常用词在树的更深处以加速对应的计算。

2.负采样 (Negative Sampling)

补充
CBOW是从原始语句推测目标字词;而Skip-Gram正好相反,是从目标字词推测出原始语句。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。
在这里插入图片描述

参考文献
Tomas Mikolov,Kai Chen,Greg Corrado 和 Jeff Dean。
(Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.)

2.7 负采样(Negative Sampling)

在上一节中,我们了解到Skip-Gram模型如何构造一个监督学习任务,通过将上下文映射到目标词上来学的一个实用的词嵌入。
但是它的缺点在于softmax的分母计算很慢。

在这一节中,我们将会学习负采样,一个更加有效的学习算法。
在这个算法中要做的是构造一个新的监督学习问题,那么问题就是给定一对单词,比如orange和juice,我们要去预测这是否是一对上下文词-目标词

具体细节如下

我们通过采样来得到一个上下文词和一个目标词(先抽取一个上下文词,在一定词距内比如说正负10个词距内选一个目标词),然后对于相同的上下文词再在字典中随机选k个词,生成k个负样本。
在这里插入图片描述
即使当我们从字典中随机选到的值正好出现在了词距内,也没有关系。

对于负样本参数k的取值,一般认为当小数据集时,选择5-20,当数据集较大时,就选小一些2-5。

在这个算法中,我们使用sigmoid函数,所以整个模型相当于有10000个逻辑回归分类问题。每次迭代都训练更新其中的5个分类器。
在这种情况下,每次迭代的成本比softmax分类的成本低。

其中一个非常重要的问题就是如何选取负样本,即在选取了上下文词之后,如何在字典中采样生成负样本。
根据论文作者,他们发现使用一下的方式来采样最好。
在这里插入图片描述
其中fwi 为wordi的词频。通过3/4次方的计算,使其处于完全独立的分布和训练集的观测分布两个极端之间

参考文献
Mikolov T, Sutskever I, Chen K, et al. Distributed Representations of Words and Phrases and their Compositionality[J]. 2013, 26:3111-3119.

2.8 GloVe词向量

上述算法是挑选语料库中位置相近的两个词,列举出词对,即上下文和目标词,而GloVe算法做的就是使其关系明确化。
假定Xij是单词i在单词j上下文中出现的次数,那么Xij=Xji
对于GloVe算法,我们定义上下文和目标词为任意两个位置相近的单词。

对应的优化目标如下
在这里插入图片描述
在上述的式子中,对于单词i和j的联系程度,我们用Xij来表示而θiTej即和之前的θttec类似。ej表示上下文词的嵌入向量,而θi是关于词i的参数,用以输出对于在该上下词下,词i为目标词的概率。

当XiJ=0时,那么log0 就是未定义的,所以我们在前面加上一个加权项,使得当xij=0时,fx=0
即上述求和我们只对上下文和目标词关系里至少出现一次的词对求和。同时fx的另一个作用就是对于某些出现频繁的词进行一定的平衡。即给出现更频繁的词更大但不至于过分的权重,也不给常用词过小的权重。

同时在这个算法中,e和θ时完全对称的,所以其中一种训练算法是一致的初始化θ和e,在每个词都处理完之后取平均值。

在上述算法中,它不能保证嵌入向量的独立组成部分是能够理解的。
举例说明如下
在这里插入图片描述
具体而言,第一个特征可能是个Gender、Roya、Age、Food Cost和Size的组合,它也许是名词或是一个行为动词和其他所有特征的组合,所以很难看出独立组成部分

参考文献
Pennington J, Socher R, Manning C. Glove: Global Vectors for Word Representation[C]// Conference on Empirical Methods in Natural Language Processing. 2014:1532-1543.

2.9 情感分类(Sentiment Classification)

情感分类任务就是看一段文本,然后分辨这个人是否喜欢他们在讨论的这个东西。
情感分类一个最大的挑战就是可能标记的训练集没有那么多,但是有了词嵌入,即使只有中等大小的标记的训练集,也能够构建一个效果不错的情感分类器。

在这里插入图片描述
上图是一个简单的情感分类器模型,即将每个单词的嵌入向量相加或者求平均,然后经过softmax函数来得到最后的输出。

这样的方式会导致没有考虑词序问题,尤其是这样一个负面的评价,“Completely lacking in good taste, good service, and good ambiance.”,但是good这个词出现了很多次,有3个good,如果你用的算法跟这个一样,忽略词序,仅仅把所有单词的词嵌入加起来或者平均下来,你最后的特征向量会有很多good的表示,你的分类器很可能认为这是一个好的评论,尽管事实上这是一个差评,只有一星的评价。

由此我们想到了使用RNN模型
在这里插入图片描述

2.10 词嵌入除偏(Debiasing Word Embeddings)

因此根据训练模型所使用的文本,词嵌入能够反映出性别、种族、年龄、性取向等其他方面的偏见,所以我们需要尽量修改学习算法来尽可能减少或是理想化消除这些非预期类型的偏见。

如何消除类似的偏见呢?
主要有以下三个步骤
1.对于性别歧视这种情况来说,我们能做的是ehe-eshe,因为它们的性别不同,然后将emale-efemale,然后将这些值取平均(上图编号2所示),将这些差简单地求平均。(更复杂的方式是svu奇异值分解)
2.中和步骤,所以对于那些定义不确切的词可以将其处理一下,避免偏见。
所以对于像doctor和babysitter这种单词我们就可以将它们在这个轴(上图编号1所示)上进行处理,来减少或是消除他们的性别歧视趋势的成分,也就是说减少他们在这个水平方向上的距离(上图编号2方框内所示的投影),所以这就是第二个中和步。

在这里插入图片描述

3.均衡步,意思是说你可能会有这样的词对,grandmother和grandfather,或者是girl和boy,对于这些词嵌入,你只希望性别是其区别。
主要做的就是将grandmother和grandfather移至与中间轴线等距的一对点上(2所示)
现在性别歧视的影响也就是这两个词与babysitter的距离就完全相同了
在这里插入图片描述
补充
均衡算法
如何对两个单词除偏,比如:"actress“(“女演员”)和“actor”(“演员”)。 均衡算法适用于您可能希望仅通过性别属性不同的单词对。
在这里插入图片描述
均衡背后的关键思想是确保一对特定的单词与其余维度距离相等
具体详情见下述论文
参考文献
olukbasi T, Chang K W, Zou J, et al. Man is to Computer Programmer as Woman is to Homemaker? Debiasing Word Embeddings[J]. 2016.

习题
1.T-SNE 是一种非线性的降维方法
2.你已经在文本数据集m 1上训练了词嵌入,现在准备将它用于一个语言任务中,对于这个任务,你有一个单独标记的数据集m 2 请记住,使用词嵌入是一种迁移学习的形式,在这种情况下,你认为词嵌入会有帮助吗?
当m1>>m2

三、序列模型和注意力机制(Sequence models & Attention mechanism)

在这一节中,我们将会学习到seq2seq模型,可以应用于机器翻译和语音识别,同时还有集束搜索(Beam search)和注意力模型(Attention model)。

3.1 基础模型

首先,对于一个翻译问题,比如我们想要将法语翻译为英语,那么我们可以使用RNN来接受所有的词向量,然后生成对应的编码向量来代表这个输入序列,然后通过一个解码网络(可以是RNN)来将其进行翻译。(类似于语言生成)
在这里插入图片描述

同样,我们还可以将做图像描述,也是类似的,我们将图片通过卷积神经网络(例如AlexNet),然后将其得到的图像的特征向量输入到对应的上述类似的模型中,让其生成一个输出序列。

在这里插入图片描述

参考文献
机器翻译
1.Sequence to sequence learning with neural networks
2.Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation

图像描述
1.Deep captioning with multimodal recurrent neural networks
2.Show and tell Neural image caption generator
3.Deep visual semantic alignments for generating image descriptions

3.2 选择最可能的句子

在机器翻译模型中Seq2Seq与之前的语言模型有很多相似的地方,但是他们之间也有许多区别。

首先,对于机器翻译问题,我们希望在给定句子的情况下来得到它所对应的最好的翻译。于是我们不会像之前原因模型一样,输入第一个向量0然后产生一个句子,而是用encoder网络来对输入句子输出一系列的向量,通过这个向量然后再利用decoder来进行翻译操作,decoder网络结构类似于语言模型。
总而言之,Seq2seq模型是一个条件语言模型。

在这里插入图片描述

另一个问题在于,如何得到一个好的翻译。
当你输入句子后,Seq2Seq模型会给出对应的单词的概率,不同于语言生成,我们需要从这个概率分布中选择一个句子,然后使得它的在给定原句的情况下概率最大。

这里不能采用贪心搜索(每一次都挑选一个最大概率的词),这是因为该问题并不具备贪心结构,即局部最优构成了全局最优。
而如果是穷举搜索,那么问题的解空间非常大,所以我们需要一个近似的搜索方式来得到。近似的意思就是它会尽力地,尽管不一定总会成功,但它将挑选出句子y使得条件概率最大化,尽管它不能保证找到的y值一定可以使概率最大化,但这已经足够了。

3.3 集束搜索(Beam Search)

对于每个输入,贪心算法只会挑出最可能的那一个单词,然后继续,而集束搜索则会考虑多个选择,集束搜索算法会有一个参数B,叫做集束宽(beam width),表示在每次选择中,保留几个相应的结果。

在每一步中,我们都要找到最有可能的单词对的概率。
在这里插入图片描述
对于不同的集束宽,我们可以使用与集束宽一样大小的网络副本而不需要使用三个不同的网络来进行解码。

假如集束宽度为1,那么就意味着当前为贪婪搜索,一般而言当集束宽度大于1时,通常,集束搜索都会得到较好的结果。

3.4 改进集束搜索

对于束搜索算法,它要做的就是最大化条件概率,而概率都是小与1的也就是说,当要翻译成多个单词时,会导致数值下溢。(数值太小,电脑的浮点数不能精确的存储)
由此我们可以取log值,将连乘改为加法。这两者求最大化是相同的。
在这里插入图片描述
同样对于较长的句子,log形式的目标函数也会导致该值越来越负,于是我们可以进行归一化处理,通过如下操作可以较好的解决这个问题。即除上句子单词数量的α次方。

具体的束搜索算法过程如下
通过运行束搜索得到对应束宽度数量的概率最大的句子,然后对其进行计算,求得其中概率最高的一个作为输出。

如何选择束宽B,一般B越大,找到的子句越好,但是计算的代价也越大。同时当束宽到一定大小时,再增大,效果不大。比如当束宽从1000增大到3000那么此时效果不会有特别明显的改善。

3.5 集束搜索的误差分析

我们在这一节中学习通过误差分析来判断我们的机器翻译模型到底是RNN出现了错误还是集束搜索出现了错误。
我们考虑如下例子
在这里插入图片描述
假如我们通过运行模型,得到了上述的结果。
由此我们需要去判断到底是RNN模型发生了错误还是集束搜索发生了错误。
我们需要去计算两个翻译所对应的概率,并做如下分析
在这里插入图片描述
假如y*<y ,那么很有可能是你的RNN模型出现了错误,因为你计算得到的概率与实际不相符。(正则化,增加更多的训练数据,修改网络结构)
如果相反,那么很有可能是你的集束搜索出现了错误,意味着集束搜索得到的不是概率最高的句子。(可以增加搜索束宽)

通过对于开发集中的错误样本做如上误差分析,就可以发现哪一个是产生更多错误的原因。

3.6 Bleu得分(Bleu Score)

机器翻译的一大难题是如何评估翻译的质量。在这一节,我们提出Bleu得分来解决该问题。

BLEU得分做的就是,给定一个机器生成的翻译,它能够自动地计算一个分数来衡量机器翻译的好坏。
也就是说,当机器得到的翻译与任何一个人工翻译的结果足够的接近,那么它就会得到一个非常高的BLEU分数。

BLEU的基本思想是对于n元词组,我们考虑它在参考的人工翻译中出现的次数(每句中最多出现的次数),然后除以机器翻译得到的总的n元词组的个数。
然后用以下公式计算
在这里插入图片描述

同时为了不让机器翻译过短,我们还引入了一个BP项,用以惩罚那些特别短的翻译结果
在这里插入图片描述
BLEU可以应用在多个领域中,比如机器翻译系统,图像描述系统,文本生成等等。

参考文献
1.BLEU:a Method for Automatic Evaluation of Machine Translation

3.7 注意力模型直观理解(Attention Model)

在之前的部分内容中,我们使用的模型结构都是基于以下这个编码解码的结构来完成机器翻译。在这一节中,我们会引入注意力模型,来使算法完成的更好。

我们考虑如下的例子
给定一个很长的句子,我们需要将其进行翻译。按照之前的编码解码结构,我们需要输入整个句子,然后让编码器完成对整个句子的编码,在通过解码网络完成翻译工作。
但是,人工翻译对于长句子往往不会全部读完再进行翻译,更多的是看一部分,翻译一部分。

同样,我们可以观察在编码解码的结构中,随着句子长度的增加,对应的Bleu分数的变化

在这里插入图片描述
可以很明显的看到,编码解码的结构对于短句子效果比较好,但是对于长句子则效果不太好,这也表示了神经网络记忆一个长句子的能力不强。

于是我们需要引入注意力这个机制。
我们需要一个参数——注意力权重,用以表示计算某个词时,对于其他信息的关注度。
比如用来表示a<1,1>当你生成第一个词时你应该放多少注意力在这个第一块信息处。a<1,2>表示当你生成第一个词时你应该放多少注意力在这个第二个信息块出。
a<2,1>表示当你生成第二个词时你应该放多少注意力在这个第二个信息块出。
通过注意力权重来得到生成相应翻译的上下文C。
在这里插入图片描述

总而言之
注意力权重,即a<t,t>告诉你,当你尝试生成第t个英文词,它应该花多少注意力在第t个法语词上面。当生成一个特定的英文词时,这允许它在每个时间步去看周围词距内的法语词要花多少注意力。

3.8 注意力模型

在这一节中,我们将上述的直观内容变成具体的步骤。
我们用a表示前向传播和后向传播得到的值,然后通过对应的注意力权重计算得到上下文C,加上对应的RNN的隐藏参数S来得到对应的输出(前一个单词的输出也会用到)。
在这里插入图片描述
在这里插入图片描述

对于注意力权重,我们用以上的计算方式计算。
即通过前一个隐藏层的参数st-1和 当前的激活参数at通过一个小型的神经网络得到e<t,t’>
然后经过softmax来保证所有的注意力权重之和为1。得到对应的注意力权重a<t,t’>

上述算法的缺点在于他要花费三次方的时间,即算法的复杂度为O(n^3)
如果你有tx个输入单词和ty个输出单词,那么注意力参数将有Tx*Ty个。

注意力机制也被应用到了许多其他的领域之中,比如图片加标题。

拓展阅读
1.Neural machine translation by jointly learning to align and translate
2.图片标题描述 Show, attend and tell Neural image caption generation with visual attention

3.9 语音识别(Speech recognition)

Seq2Seq模型在语音识别准确性有着很大的提升。
语音识别问题 即输入一段音频然后输出其中的文本内容。

我们可以使用之前的注意力模型来建立一个语音识别系统

在这里插入图片描述
另一种方法 CTC 损失函数(CTC cost)

该算法的思想如下
在语音识别中,通常输入要比输出多很多,
而CTC损失函数允许RNN生成ttt这样的输出,这是一个特殊字符,表示空白符,而CTC损失函数的一个基本规则是将空白符之间的重复字符折叠起来。这种特殊的空白符与空格符不同。

扩展文献
1.Connectionist temporal classification:labelling unsegmented sequence data with recurrent neural networks

3.10 触发字检测

随着语音识别的发展,越来越多的设备可以通过你的声音来唤醒,这有时被叫做触发字检测系统。

有关触发字检测系统的文献还处于发展阶段。
在这里,我们将介绍一个简单的算法。

我们通过对于一段音频进行计算,通过它的声谱图特征得到对应的特征向量。
于是在对应的触发字之前,我们在训练集中将标签设为0,在这个点之后把目标标签设置为1.类似的可以得到一个训练集,但是该训练集很不平衡。
于是我们可以在输出变为0之前多次输出1,或者在固定的一段时间内输出多个1,由此提高对应的训练集中0和1的比例。

おすすめ

転載: blog.csdn.net/weixin_43869415/article/details/120634023
おすすめ