1 基本概念
1.1 深度学习和机器学习的区别
深度学习和传统机器学习方法区别.主要体现在“深层”和“学习高层特征”:传统机器学习以浅层模型为主,比如逻辑回归、支持向量机等;深度学习模型深度则有几十甚至上百层.比如LeNet-5有7层(输入-卷积-池化-卷积-池化-卷积-全连接-输出层),Alexnet有8层(5个卷积层、3个全连接层),GoogleNet 有 22 层. ResNet 有 152 层网络,因为非线性网络层次深.模型拟合能力非常好;高层特征的表示在传统机器学习上以人工设计特征为主,需要复杂的特征工程和领域知识.比如做特征抽取、特征变换、特征组合、特征选择等;深度学习能通过复杂的深层网络学习出高层特征表示,大大减少了特征工程工作,且只需要很少的领域知识。这两点优势让深度学习在越来越多的领域有突破性的进展。
2 激活函数
2.1 常见的激活函数及其导数
常用的激活函数主要有三种形式,Sigmoid函数,Tanh函数和ReLU函数。
- Sigmoid函数及其导数
- Tanh函数及其导数
- ReLU函数及其导数
2.2 Sigmoid和Tanh激活函数会导致梯度消失
Sigmoid激活函数的曲线如下所示,它将输入z映射到区间$(0, 1)$,当z很大时,$f(z)$趋近于1;当z很小时,$f(z$)趋近于0。其导数 $f^{\prime}(z)=f(z)(1-f(z))$ 在z很大或很小时都会趋近于0,造成梯度消失的现象。
Tanh激活函数的曲线如下所示。当z很大时,$f(z)$趋近于1;当z很小时,$f(z)$趋近于−1。其导数 $f^{\prime}(z)=1-(f(z))^{2}$ 在z很大或很小时都会趋近于0,同样会出现“梯度消失”。实际上,Tanh激活函数相当于Sigmoid的平移:$\tanh (x)=2 \operatorname{sigmoid}(2 x)-1$。
2.3 ReLU系列的激活函数相对于Sigmoid和Tanh激活函数的优点,局限性和改进
优点
- 从计算的角度上,Sigmoid和Tanh激活函数均需要计算指数,复杂度高,而ReLU只需要一个阈值即可得到激活值。
- ReLU的非饱和性可以有效地解决梯度消失的问题,提供相对宽的激活边界。
- ReLU的单侧抑制提供了网络的稀疏表达能力。
局限性
- ReLU的局限性在于其训练过程中会导致神经元死亡的问题。这是由于函数$f(z)=\max (0, z)$ 导致负梯度在经过该ReLU单元时被置为0,且在之后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生响应。在实际训练中,如果学习率(Learning Rate)设置较大,会导致超过一定比例的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。
改进一:为解决这一问题,人们设计了ReLU的变种Leaky ReLU(LReLU),其形式表示为
ReLU和LReLU的函数曲线对比如下图所示。LReLU与ReLU的区别在于,当$z<0$时其值不为0,而是一个斜率为a的线性函数,一般a为一个很小的正常数, 这样既实现了单侧抑制,又保留了部分负梯度信息以致不完全丢失。但另一方面,a值的选择增加了问题难度,需要较强的人工先验或多次重复训练以确定合适的参数值。
改进二:基于此,参数化的PReLU(Parametric ReLU)应运而生。它与LReLU的主要 区别是将负轴部分斜率a作为网络中一个可学习的参数,进行反向传播训练,与其 他含参数网络层联合优化。
3 神经网络训练技巧
在大规模神经网络的训练过程中,我们常常会面临“过拟合”的问题,即当参数数目过于庞大而相应的训练数据短缺时,模型在训练集上损失值很小,但在测试集上损失较大,泛化能力很差。解决“过拟合”的方法有很多,包括数据集增强(Data Augmentation)、参数范数惩罚/正则化(Regularization)、模型集成(ModelEnsemble)等;其中Dropout是模型集成方法中最高效与常用的技巧。同时,深度神经网络的训练中涉及诸多手调参数,如学习率、权重衰减系数、Dropout比例等,这些参数的选择会显著影响模型最终的训练效果。批量归一化(Batch Normalization,BN)方法有效规避了这些复杂参数对网络训练产生的影响,在加速训练收敛的同时也提升了网络的泛化能力。
3.1 神经网络训练时是否可以将全部参数初始化为0
考虑全连接的深度神经网络,同一层中的任意神经元都是同构的,它们拥有相同的输入和输出,如果再将参数全部初始化为同样的值,那么无论前向传播还是反向传播的取值都是完全相同的。学习过程将永远无法打破这种对称性,最终同一网络层中的各个参数仍然是相同的。
因此,我们需要随机地初始化神经网络参数的值,以打破这种对称性。简单来说,我们可以初始化参数为取值范围的均匀分布。偏置可以被简单地设为0,并不会导致参数对称的问题。
3.2 Dropout的工作原理和实现,抑制过拟合
Dropout是指在深度网络的训练中,以一定的概率随机地“临时丢弃”一部分神经元节点。具体来讲,Dropout作用于每份小批量训练数据,由于其随机丢弃部分神经元的机制,相当于每次迭代都在训练不同结构的神经网络。类比于Bagging方法,Dropout可被认为是一种实用的大规模深度神经网络的模型集成算法。这是由于传统意义上的Bagging涉及多个模型的同时训练与测试评估,当网络与参数规模庞大时,这种集成方式需要消耗大量的运算时间与空间。Dropout在小批量级别上的操作,提供了一种轻量级的Bagging集成近似,能够实现指数级数量神经网络的训练与评测。
Dropout的具体实现中,要求某个神经元节点激活值以一定的概率p被“丢弃”,即该神经元暂时停止工作。因此,对于包含N个神经元节点的网络,在Dropout的作用下可看作为 $2^N$ 个模型的集成。这 $2^N$ 个模型可认为是原始网络的子网络,它们共享部分权值,并且具有相同的网络层数,而模型整体的参数数目不变,这就大大简化了运算。对于任意神经元,每次训练中都与一组随机挑选的不同的神经元集合共同进行优化,这个过程会减弱全体神经元之间的联合适应性,减少过拟合的风险,增强泛化能力。
在神经网络中应用Dropout包括训练和预测两个阶段。在训练阶段中,每个神经元节点需要增加一个概率系数,一般使用Bernoulli函数,以概率系数p随机生成一个取值为0或1的向量,代表每个神经元是否需要被丢弃。如果取值为0,则该神经元将不会计算梯度或参与后面的误差传播。
测试阶段是前向传播的过程。在前向传播的计算时,每个神经元的参数要预先乘以概率系数p,以恢复在训练中该神经元只有p的概率被用于整个神经网络的前向传播计算。
3.3 批量归一化(BN)
神经网络训练过程的本质是学习数据分布,如果训练数据与测试数据的分布不同将大大降低网络的泛化能力,因此我们需要在训练开始前对所有输入数据进行归一化处理。
然而随着网络训练的进行,每个隐层的参数变化使得后一层的输入发生变化,从而每一批训练数据的分布也随之改变,致使网络在每次迭代中都需要拟合不同的数据分布,增大训练的复杂度以及过拟合的风险。
批量归一化方法是针对每一批数据,在网络的每一层输入之前增加归一化处 理(均值为0,标准差为1),将所有批数据强制在统一的数据分布下,即对该层 的任意一个神经元(假设为第k维)$X^{(k)}$采用如下公式
批量归一化可以看作在每一层输入和上一层输出之间加入了一个新的计算层,对数据的分布进行额外的约束,从而增强模型的泛化能力。但是批量归一化同时也降低了模型的拟合能力,归一化之后的输入分布被强制为0均值和1标准差。以Sigmoid激活函数为例,批量归一化之后数据整体处于函数的非饱和区域,只包含线性变换,破坏了之前学习到的特征分布。
4 卷积神经网络
4.1 全连接网络存在的问题
(1)参数太多:如果输入图像大小为100×100×3(即图像高度为100,宽度为100,3个颜色通道:RGB)。在全连接前馈网络中,第一个隐藏层的每个神 经元到输入层都有100×100×3=30,000个相互独立的连接,每个连接都对应一个权重参数。随着隐藏层神经元数量的增多,参数的规模也会急剧增加。这会导致整个神经网络的训练效率会非常低,也很容易出现过拟合。
(2)局部不变性特征:自然图像中的物体都具有局部不变性特征,比如在尺度缩放、平移、旋转等操作不影响其语义信息。而全连接前馈网络很难提取这些局部不变特征,一般需要进行数据增强来提高性能。
4.2 卷积神经网络
卷积神经网络(Convolutional Neural Networks,CNN)也是一种前馈神经网 络,其特点是每层的神经元节点只响应前一层局部区域范围内的神经元(区别:全连接网络中每个神经元节点响应前一层的全部节点)。一个深度卷积神经网络模型通常由若干卷积层叠加若干全连接层组成,中间也包含各种非线性操作以及池化操作。卷积神经网络同样可以使用反向传播算法进行训练,相较于其他网络模型,卷积操作的参数共享特性使得需要优化的参数数目大大缩减,提高了模型的训练 效率以及可扩展性。由于卷积运算主要用于处理类网格结构的数据,因此对于时间序列以及图像数据的分析与识别具有显著优势。
4.3 卷积操作的本质特性包括稀疏交互和参数共享
- 稀疏交互
在传统神经网络中,网络层之间输入与输出的连接关系可以由一个权值参数矩阵来表示,其中每个单独的参数值都表示了前后层某两个神经元节点之间的交互。对于全连接网络,任意一对输入与输出神经元之间都产生交互,形成稠密的连接结构,如下图所示,神经元$s_i$与输入的所有神经元$x_j$均有连接。
而在卷积神经网络中,卷积核尺度远小于输入的维度,这样每个输出神经元仅与前一层特定局部区域内的神经元存在连接权重(即产生交互),我们称这种特性为稀疏交互,此时优化过程的时间复杂度将会大大降低,过拟合的情况也得到了较好的改善。
稀疏交互的物理意义是,通常图像、文本、语音等现实世界中的数据都具有局部的特征结构,我们可以先学习局部的特征,再将局部的特征组合起来形成更复杂和抽象的特征。以人脸识别为例,最底层的神经元可以检测出各个角度的边缘特征(见图9.17(a));位于中间层的神经元可以将边缘组合起来得到眼睛、鼻子、嘴巴等复杂特征(见图9.17(b));最后,位于上层的神经元可以根据各个器官的组合检测出人脸的特征(见图9.17(c))。
- 参数共享
参数共享是指在同一个模型的不同模块中使用相同的参数,它是卷积运算的固有属性。全连接网络中,计算每层的输出时,权值参数矩阵中的每个元素只作用于某个输入元素一次;而在卷积神经网络中,卷积核中的每一个元素将作用于每一次局部输入的特定位置上。根据参数共享的思想,我们只需要学习一组参数集合,而不需要针对每个位置的每个参数都进行优化,从而大大降低了模型的存储需求。
参数共享的物理意义是使得卷积层具有平移等变性。假如图像中有一只猫,那么无论它出现在图像中的任何位置,我们都应该将它识别为猫,也就是说神经网络的输出对于平移变换来说应当是等变的。
4.5 池化操作
常用的池化操作主要针对非重叠区域,包括均值池化(meanpooling)、最大池化(maxpooling)等。其中均值池化通过对邻域内特征数值求平均来实现,能够抑制由于邻域大小受限造成估计值方差增大的现象,特点是对背景的保留效果更好。最大池化则通过取邻域内特征的最大值来实现,能够抑制网络参数误差造成估计均值偏移的现象,特点是更好地提取纹理信息。池化操作的本质是降采样。例如,我们可以利用最大池化将4×4的矩阵降采样为2×2的矩阵,如图9.18所示。图中的池化操作窗口大小为2×2,步长为2。每次在2×2大小的窗口上进行计算,均值池化是求窗口中元素的均值,最大池化则求窗口中元素的最大值;然后将窗口向右或向下平移两格,继续操作。
池化操作除了能显著降低参数量外,还能够保持对平移、伸缩、旋转操作的不变性。平移不变性是指输出结果对输入的小量平移基本保持不变。例如,输入为(1,5,3),最大池化将会取5,如果将输入右移一位得到(0,1,5),输出的结果仍将为5。对伸缩的不变性(一般称为尺度不变性)可以这样理解,如果原先神经元在最大池化操作之后输出5,那么在经过伸缩(尺度变换)之后,最大池化操作在该神经元上很大概率的输出仍然是5。因为神经元感受的是邻域输入的最大值,而并非某一个确定的值。旋转不变性可以参照图9.19。图中的神经网络由3个学得的过滤器和一个最大池化层组成。这3个过滤器分别学习到不同旋转方向的“5”。当输入中出现“5”时,无论进行何种方向的旋转,都会有一个对应的过滤器与之匹配并在对应的神经元中引起大的激活。最终,无论哪个神经元获得了激活,在经过最大池化操作之后输出都会具有大的激活。
4.6 卷积神经网络如何用于文本分类任务
卷积神经网络的核心思想是捕捉局部特征,起初在图像领域取得了巨大的成功,后来在文本领域也得到了广泛的应用。对于文本来说,局部特征就是由若干单词组成的滑动窗口,类似于N-gram。卷积神经网络的优势在于能够自动地对Ngram特征进行组合和筛选,获得不同抽象层次的语义信息。由于在每次卷积中采用了共享权重的机制,因此它的训练速度相对较快,在实际的文本分类任务中取得了非常不错的效果。
5 深度残差网络
5.1 ResNet的提出背景和核心理论
ResNet的提出背景是解决或缓解深层的神经网络训练中的梯度消失问题。假设有一个L层的深度神经网络,如果我们在上面加入一层,直观来讲得到的L+1层深度神经网络的效果应该至少不会比L层的差。因为我们简单地设最后一层为前一层的拷贝(用一个恒等映射即可实现),并且其他层维持原来的参数即可。然而在进行反向传播时,我们很难找到这种形式的解。实际上,通过实验发现,层数更深的神经网络反而会具有更大的训练误差。
ResNet通过调整网络结构来解决上述问题。首先考虑两层神经网络的简单叠加(见图9.23(a)),这时输入x经过两个网络层的变换得到H(x),激活函数采用ReLU。反向传播时,梯度将涉及两层参数的交叉相乘,可能会在离输入近的网络层中产生梯度消失的现象。
ResNet把网络结构调整为,既然离输入近的神经网络层较难训练,那么我们可以将它短接到更靠近输出的层,如图9.23(b)所示。输入x经过两个神经网络的变换得到 $F(x)$,同时也短接到两层之后,最后这个包含两层的神经网络模块输出 $H(x)=F(x)+x$。这样一来,$F(x)$ 被设计为只需要拟合输入x与目标输出的残差,残差网络的名称也因此而来。如果某一层的输出已经较好的拟合了期望结果,那么多加入一层不会使得模型变得更差,因为该层的输出将直接被短接到两层之后,相当于直接学习了一个恒等映射,而跳过的两层只需要拟合上层输出和目标之间的残差即可。
ResNet可以有效改善深层的神经网络学习问题,使得训练更深的网络成为可能,传统神经网络的可能随着模 型结构的加深训练误差反而上升;而ResNet的随着模型结构的加深,训练误差逐渐降低,并且优于相同层数的传统的神经网络。
6 循环神经网络
循环神经网络(Recurrent Neural Network,RNN)是用来建模序列化数据的一种主流深度学习模型。我们知道,传统的前馈神经网络一般的输入都是一个定长的向量,无法处理变长的序列信息,即使通过一些方法把序列处理成定长的向量,模型也很难捕捉序列中的长距离依赖关系。RNN则通过将神经元串行起来处理序列化的数据。由于每个神经元能用它的内部变量保存之前输入的序列信息,因此整个序列被浓缩成抽象的表示,并可以据此进行分类或生成新的序列。
6.1 处理文本数据时,循环神经网络与前馈神经网络相比有什么特点
传统文本处理任务的方法中一般将TF-IDF向量作为特征输入。显而易见,这样的表示实际上丢失了输入的文本序列中每个单词的顺序。在神经网络的建模过程中,一般的前馈神经网络,如卷积神经网络,通常接受一个定长的向量作为输入。卷积神经网络对文本数据建模时,输入变长的字符串或者单词串,然后通过滑动窗口加池化的方式将原先的输入转换成一个固定长度的向量表示,这样做可以捕捉到原文本中的一些局部特征,但是两个单词之间的长距离依赖关系还是很难被学习到。
循环神经网络却能很好地处理文本数据变长并且有序的输入序列。它模拟了人阅读一篇文章的顺序,从前到后阅读文章中的每一个单词,将前面阅读到的有用信息编码到状态变量中去,从而拥有了一定的记忆能力,可以更好地理解之后的文本。下图展示了一个典型的循环神经网络结构。
一个长度为T的序列用循环神经网络建模,展开之后可以看作是一 个T层的前馈神经网络。其中,第t层的隐含状态ht编码了序列中前t个输入的信息,可以通过当前的输入$x_t$和上一层神经网络的状态$h_{t−1}$计算得到;最后一层的状态$h_T$编码了整个序列的信息,因此可以作为整篇文档的压缩表示,以此为基础的结构可以应用于多种具体任务。例如,在$h_T$后面直接接一个Softmax层,输出文本所属类别的预测概率 y,就可以实现文本分类。
通过最小化损失误差(即输出的y与真实类别之间的距离),我们可以不断训练网络,使得得到的循环神经网络可以准确地预测文本所属的类别,达到分类目的。相比于卷积神经网络等前馈神经网络,循环神经网络由于具备对序列顺序信息的刻画能力,往往能得到更准确的结果。
6.2 循环神经网络的梯度消失问题
循环神经网络模型的求解可以采用BPTT(BackPropagationThroughTime,基于时间的反向传播)算法实现,BPTT实际上是反向传播算法的简单变种。如果将循环神经网络按时间展开成T层的前馈神经网络来理解,就和普通的反向传播算法没有什么区别了。循环神经网络的设计初衷之一就是能够捕获长距离输入之间的依赖。从结构上来看,循环神经网络也理应能够做到这一点。然而实践发现,使用BPTT算法学习的循环神经网络并不能成功捕捉到长距离的依赖关系,这一现象主要源于深度神经网络中的梯度消失。传统的循环神经网络梯度可以表示成连乘的形式。
由于预测的误差是沿着神经网络的每一层反向传播的,因此当雅克比矩阵的最大特征值大于1时,随着离输出越来越远,每层的梯度大小会呈指数增长,导致梯度爆炸;反之,若雅克比矩阵的最大特征值小于1,梯度的大小会呈指数缩小,产生梯度消失。对于普通的前馈网络来说,梯度消失意味着无法通过加深网络层次来改善神经网络的预测效果,因为无论如何加深网络,只有靠近输出的若干层才真正起到学习的作用。这使得循环神经网络模型很难学习到输入序列中的长距离依赖关系。
梯度爆炸的问题可以通过梯度裁剪来缓解,即当梯度的范式大于某个给定值时,对梯度进行等比收缩。而梯度消失问题相对比较棘手,需要对模型本身进行改进。深度残差网络是对前馈神经网络的改进,通过残差学习的方式缓解了梯度消失的现象,从而使得我们能够学习到更深层的网络表示;而对于循环神经网络来说,长短时记忆模型[LSTM]及其变种门控循环单元(Gated recurrent unit,GRU)等模型通过加入门控机制,很大程度上弥补了梯度消失所带来的损失。
6.3 长短期记忆网络 LSTM
长短期记忆网络(Long Short Term Memory,LSTM)是循环神经网络的最知 名和成功的扩展。由于循环神经网络有梯度消失和梯度爆炸的问题,学习能力有限,在实际任务中的效果往往达不到预期效果。LSTM可以对有价值的信息进行长期记忆,从而减小循环神经网络的学习难度。
与传统的循环神经网络相比,LSTM仍然是基于当前输入和上一时刻的内部状态来计算当前输出,只不过对内部的结构进行了更加精心的设计,加入了输入门$i_t$、遗忘门$f_t$以及输出门$o_t$三个门和一个内部记忆单元$c_t$。输入门控制当前计算的新状态以多大程度更新到记忆单元中;遗忘门控制前一步记忆单元中的信息有多大程度被遗忘掉;输出门控制当前的输出有多大程度上取决于当前的记忆单元。
在一个训练好的网络中,当输入的序列中没有重要信息时,LSTM的遗忘门的值接近于1,输入门的值接近于0,此时过去的记忆会被保存,从而实现了长期记忆功能;当输入的序列中出现了重要的信息时,LSTM应当把其存入记忆中,此时其输入门的值会接近于1;当输入的序列中出现了重要信息,且该信息意味着之前的记忆不再重要时,输入门的值接近1,而遗忘门的值接近于0,这样旧的记忆被遗忘,新的重要信息被记忆。经过这样的设计,整个网络更容易学习到序列之间 的长期依赖。
6.4 LSTM里各模块的激活函数
关于激活函数的选取,在LSTM中,遗忘门、输入门和输出门使用Sigmoid函数作为激活函数;在生成候选记忆时,使用双曲正切函数Tanh作为激活函数。值得注意的是,这两个激活函数都是饱和的,也就是说在输入达到一定值的情况 下,输出就不会发生明显变化了。如果是用非饱和的激活函数,例如ReLU,那么 将难以实现门控的效果。 Sigmoid函数的输出在0~1之间,符合门控的物理定义。 且当输入较大或较小时,其输出会非常接近1或0,从而保证该门开或关。在生成候选记忆时,使用Tanh函数,是因为其输出在−1~1之间,这与大多数场景下特征 分布是0中心的吻合。此外,Tanh函数在输入为0附近相比Sigmoid函数有更大的梯 度,通常使模型收敛更快。
6.5 GRU
门控循环单元网络((GatedRecurrentUnit,GRU)也是通过引入门机制来控制信息更新的方式,在LSTM网络中,输入门和遗忘门是互补关系,用两个门比较冗余。GRU将输入门与和遗忘门合并成一个门:更新门。也就是说我们使用了同一个门控就同时可以进行遗忘和选择记忆(LSTM则要使用多个门控)。与LSTM相比,GRU内部少了一个”门控“,参数比LSTM少,但是却也能够达到与LSTM相当的功能。考虑到硬件的计算能力和时间成本,因而很多时候我们也就会选择更加”实用“的GRU啦。
7 Seq2Seq模型
Seq2Seq模型的核心思想是,通过深度神经网络将一个作为输入的序列映射为一个作为输出的序列,这一过程由编码输入与解码输出两个环节构成。在经典的实现中,编码器和解码器各由一个循环神经网络构成,既可以选择传统循环神经网络结构,也可以使用长短期记忆模型、门控循环单元等。在Seq2Seq模型中,两个循环神经网络是共同训练的。
假想一个复习和考试的场景。如图10.3所示,我们将学到的历史信息经过了一系列加工整理,形成了所谓的知识体系,这便是编码过程。然后在考试的时候,将高度抽象的知识应用到系列问题中进行求解,这便是解码过程。譬如对于学霸,他们的网络很强大,可以对很长的信息进行抽象理解,加工内化成编码向量,再在考试的时候从容应答一系列问题。而对于大多数普通人,很难记忆长距离、长时间的信息。在考前只好临时抱佛脚,编码很短期的序列信号,考试时也是听天由命,能答多少写多少,解码出很短时效的信息。
对应于机器翻译过程,如图10.4所示。输入的序列是一个源语言的句子,有三个单词A、B、C,编码器依次读入A、B、C和结尾符
在文本摘要任务中,输入的序列是长句子或段落,输出的序列是摘要短句。在图像描述文本生成任务中,输入是图像经过视觉网络的特征,输出的序列是图像的描述短句。进行语音识别时,输入的序列是音频信号,输出的序列是识别出的文本。不同场景中,编码器和解码器有不同的设计,但对应Seq2Seq的底层结构是一样的。
7.1 Seq2Seq模型解码方法
eq2Seq模型最核心的部分是其解码部分,大量的改进也是在解码环节衍生的。Seq2Seq模型最基础的解码方法是贪心法,即选取一种度量标准后,每次都在当前状态下选择最佳的一个结果,直到结束。贪心法的计算代价低,适合作为基准结果与其他方法相比较。很显然,贪心法获得的是一个局部最优解,由于实际问题的复杂性,该方法往往并不能取得最好的效果
集束搜索是常见的改进算法,它是一种启发式算法。该方法会保存beamsize(后面简写为b)个当前的较佳选择,然后解码时每一步根据保存的选择进行下一步扩展和排序,接着选择前b个进行保存,循环迭代,直到结束时选择最佳的一个作为解码的结果。
由图可见,当前已经有解码得到的第一个词的两个候选:I和My。然后,将I 和My输入到解码器,得到一系列候选的序列,诸如I decided、My decision、I thought等。最后,从后续序列中选择最优的两个,作为前两个词的两个候选序列。很显然,如果b取1,那么会退化为前述的贪心法。随着b的增大,其搜索的空间增大,最终效果会有所提升,但需要的计算量也相应增大。在实际的应用(如机器翻译、文本摘要)中,b往往会选择一个适中的范围,以8~12为佳。
解码时使用堆叠的RNN、增加Dropout机制、与编码器之间建立残差连接等,均是常见的改进措施,另外,解码环节中一个重要的改进是注意力机制,注意力机制的引入,使得在解码时每一步可以有针对性地关注与当前有关的编码结果,从而减小编码器输出表示的学习难度,也更容易学到长期的依赖关系。此外,解码时还可以采用记忆网络等,从外界获取知识。
7.2 Seq2Seq模型引入注意力机制解决了什么问题
在实际任务(例如机器翻译)中,使用Seq2Seq模型,通常会先使用一个循环神经网络作为编码器,将输入序列(源语言句子的词向量序列)编码成为一个向量表示;然后再使用一个循环神经网络模型作为解码器,从编码器得到的向量表示里解码得到输出序列(目标语言句子的词序列)。
在实际使用中,会发现随着输入序列的增长,模型的性能发生了显著下降。这是因为编码时输入序列的全部信息压缩到了一个向量表示中。随着序列增长,句子越前面的词的信息丢失就越严重。试想翻译一个有100个词的句子,需要将整个句子全部词的语义信息编码在一个向量中。而在解码时,目标语言的第一个词大概率是和源语言的第一个词相对应的,这就意味着第一步的解码就需要考虑100步之前的信息。建模时的一个小技巧是将源语言句子逆序输入,或者重复输入两遍来训练模型,以得到一定的性能提升。使用长短期记忆模型能够在一定程度上缓解这个问题,但在实践中对于过长的序列仍然难以有很好的表现。同时,Seq2Seq模型的输出序列中,常常会损失部分输入序列的信息,这是因为在解码时,当前词及对应的源语言词的上下文信息和位置信息在编解码过程中丢失了。
Seq2Seq模型中引入注意力机制就是为了解决上述的问题。在注意力机制中,仍然可以用普通的循环神经网络对输入序列进行编码,得到隐状态h1,h2…hT。但是在解码时,每一个输出词都依赖于前一个隐状态以及输入序列每一个对应的隐状态及对应的注意力权重。在生成一个输出词时,会考虑每一个输入词和当前输出词的对齐关系,对齐越好的词,会有越大的权重,对生成当前输出词的影响也就越大。
8 注意力
注意力是一种人类不可或缺的复杂认知功能,指人可以在关注一些信息的同时忽略另一些信息的选择能力。在日常生活中,我们通过视觉、听觉、触觉等方式接收大量的感觉输入。但是人脑可以在这些外界的信息轰炸中还能有条不紊地工作,是因为人脑可以有意或无意地从这些大量输入信息中选择小部分的有用信息来重点处理,并忽略其他信息。这种能力就叫做注意力。注意力可以体现在外部的刺激(听觉、视觉、味觉等),也可以体现在内部的意识(思考、回忆等)。
一个和注意力有关的例子是鸡尾酒会效应。当一个人在吵闹的鸡尾酒会上和朋友聊天时,尽管周围噪音干扰很多,他还是可以听到朋友的谈话内容,而忽略其他人的声音(聚焦式注意力)。同时,如果未注意到的背景声中有重要的词(比如他的名字),他会马上注意到(显著性注意力)。
聚焦式注意力一般会随着环境、情景或任务的不同而选择不同的信息。比如当要从人群中寻找某个人时,我们会将专注于每个人的脸部;而当要统计人群的人数时,我们只需要专注于每个人的轮廓。
参考文献:
诸葛越, 葫芦娃. 百面机器学习