深度学习
写在前面
由课程书目总结,仅供参考。如有错误请指正。
大纲
入门:
Ch2 感知机
Ch3 神经网络
Ch4 神经网络的学习
Ch5 误差反向传播法
Ch6 与学习相关的技巧
Ch7 卷积神经网络
Ch8 深度学习
进阶:
Ch1 神经网络的复习
Ch2 自然语言和单词的分布式表示
Ch3 word2Vec
Ch4 word2vec的高速化
Ch5 RNN
Ch6 Gated RNN
Ch7 基于RNN生成文本
Ch8 Attention
Ch2 感知机
-
感知机是具有输入和输出的算法。给定一个输入后,将输出一个既定的值。感知机的信号只有0和1两种值。
-
一般情况下,0对应“不传递信号”,1对应“传递信号”。
一个接收两个输入信号的感知机的例子:
表达式:
- 感知机的多个输入信号都有各自固有的权重,权重越大,对应该权重的信号的重要性就越高。
- 使用感知机可以表示与门、与非门、或门的逻辑电路。即表达式为上图,只是设置的权重w和与之θ不同,从而实现与门或与非门等。
- 权重(w1和w2)是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数。
改进表达式(偏置):
感知机的局限性:(单层)
单层感知机无法表示异或门,它只能表示由一条直线分割的空间。
线性/非线性空间:
由曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间。
多层感知机:
叠加了多层的感知机称为多层感知机。
单层感知机只能表示线性空间,而多层感知机可以表示非线性空间。
通过两层结构的感知机,得以实现异或门。通过叠加层(加深层),感知机能进行更加灵活的表示。
多层感知机(在理论上)可以表示计算机。
本章小结
- 感知机是具有输入和输出的算法。给定一个输入后,将输出一个既定的值。
- 感知机将权重和偏置设定为参数。
- 使用感知机可以表示与门和或门等逻辑电路。
- 异或门无法通过单层感知机来表示。
- 使用2层感知机可以表示异或门。
- 单层感知机只能表示线性空间,而多层感知机可以表示非线性空间。
- 多层感知机(在理论上)可以表示计算机。
Ch3 神经网络
神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数。(下一章学习)
一、神经网络的结构
其中,中间层也称为隐藏层。
明确表示出偏置:
改变形式,引入激活函数:
二、激活函数
h(x)函数会将输入信号的总和转换为输出信号,这种函数一般称为激活函数。
激活函数的作用在于决定如何来激活输入信号的总和。
改写,分阶段处理:
Ch2中的感知机使用的激活函数称为阶跃函数。该激活函数以阈值为界,一旦输入超过阈值,就切换输出。当使用其他激活函数时,就可以进入神经网络的世界了。
sigmoid:
与阶跃函数进行比较:
-
阶跃函数图形:
-
sigmoid函数图形:
-
不同点:
- 平滑性:sigmoid 函数是一条平滑的曲线,输出随着输入发生连续性的变化;阶跃函数以0为界,输出发生急剧性的变化
- 返回值:sigmoid可以返回连续的实数值信号;阶跃函数只能返回0或1。
-
相同点:
- 两者具有相似的形状
- 不管输入信号的大小,输出信号的值都在0到1之间
- 两者均为非线性函数
为什么神经网络必须使用非线性函数?
- 如果使用线性函数作为激活函数,那么不管如何加深层数,是存在与之等效的“无隐藏层的神经网络”,无法发挥神经网络叠加层所带来的优势。
ReLU函数:(最近使用的激活函数)
ReLU函数在输入大于0时,直接输出该值;在输入小于等于0时,输出0。
ReLU函数图形:
三、多维数组
矩阵乘积(点积)
numpy中使用np.dot()函数计算点积。np.dot(A, B)
在矩阵的乘积运算中,对应维度的元素个数要保持一致。
神经网络:
神经网络的运算可以作为矩阵运算打包进行。
使用 np.dot(多维数组的点积),可以一次性计算出Y的结果。(其实就是矩阵的运算,输入矩阵X与权重矩阵W相乘)
恒等函数:(又一激活函数)
- 会将输入按原样输出,对于输入的信息,不加以任何改动地直接输出。定义该函数是为了和之前的流程保持统一。
- 可能会用于隐藏层到输出层的激活。
输出层激活函数的选择:
- 输出层所用的激活函数,要根据求解问题的性质决定。
- 一般地,回归问题【根据某个输入预测一个(连续的)数值的问题】可以使用恒等函数,二元分类问题可以使用sigmoid函数,多元分类问题【数据属于哪一个类别的问题】可以使用softmax函数。
softmax:
- k表示:假设输出层共有n个神经元,计算第k个神经元的输出yk。
- 其中,分子是输入信号ak的指数函数,分母是所有输入信号的指数函数的和。
本函数特性:
- 输出是0.0到1.0之间的实数,且输出值的总和是1(向量各分量之和)。
- 则可以把softmax函数的输出解释为“概率”。(因为第2个元素的概率最高,所以答案是第2个类别)
- 注意:即便使用了 softmax 函数,各个元素之间的大小关系也不会改变。所以,输出层的 softmax 函数一般会被省略。
求解机器学习问题的步骤可以分为“学习” 和“推理”两个阶段。推理阶段一般会省略输出层的softmax函数。在输出层使用softmax函数是因为它和神经网络的学习有关系。
输出层的神经元数量:
对于分类问题,输出层的神经元数量一般设定为类别的数量。
四、手写数字识别(实操)
此处,将输入进行了预处理(正规化)——将图像的各个像素值除以255,使得数据的值在0.0~1.0的范围内。
批处理:
一次处理一张图片:
输入一个由784个元素(原本是一个28 × 28的二维数组)构成的一维数组后,输出一个有10个元素的一维数组。
一次处理100张图片:
每一行表示一张图片。
这种打包式的输入数据称为批(batch)。通过以批为单位进行推理处理,能够实现高速的运算。
本章小结
- 神经网络中的激活函数使用平滑变化的sigmoid函数或ReLU函数。
- 通过巧妙地使用NumPy多维数组,可以高效地实现神经网络。
- 机器学习的问题大体上可以分为回归问题和分类问题。
- 关于输出层的激活函数,回归问题中一般用恒等函数,分类问题中一般用softmax函数。
- 分类问题中,输出层的神经元的数量设置为要分类的类别数。
- 输入数据的集合称为批。通过以批为单位进行推理处理,能够实现高速的运算。
Ch4 神经网络的学习
- 学习是指从训练数据中自动获取最优权重参数的过程。
- 指标:损失函数
- 学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。
- 使用机器学习,仍需要人工选择特征量,即对于识别狗和识别数字5所需要的特征量不同,使用这些特征量将图像数据转换为向量,然后对转换后的向量使用机器学习中的SVM、KNN等分类器进行学习。
- 而深度学习有时也称为端到端机器学习。端到端即从原始数据(输入)中获得目标结果(输出)。不存在人为介入。
一、数据划分
一般将数据分为训练数据和测试数据两部分来进行学习和实验等。
划分的目的:为了正确评价模型的泛化能力。
泛化能力:是指处理未被观察过的数据(不包含在训练数据中的数据)的能力。
过拟合:只对某个数据集过度拟合的状态称为过拟合。
二、损失函数
损失函数可以使用任意函数,但一般用均方误差和交叉熵误差等。
损失函数是表示神经网络性能的“恶劣程度”的指标,即当前的神经网络对训练(监督)数据在多大程度上不拟合,在多大程度上不一致。
均方误差:
yk是表示神经网络的输出,tk表示训练数据,k表示数据的维数。
one-hot:将正确解标签表示为1,其他标签表示为0的表示方法称为 one-hot 表示。
交叉熵误差:
log 表示以e为底数的自然对数(log e)。yk是神经网络的输出,tk是正确解标签。
该式实际上只计算对应正确解标签的输出的自然对数。(注意取了负数,因为0-1之间的log为负)
根据自然对数的图像性质,当正确解标签对应的输出概率越大时,得到的交叉熵误差约小,越接近零。
实际计算时,会加一个微小的值计算log:作为保护性对策,添加一个微小值可以防止负无限大的发生
mini-batch:
实际计算时,我们需要针对所有的训练数据进行损失函数值的计算。但大量数据会导致计算时间过长,我们选择从训练数据中选出(随机选择)一批数据(称为 mini-batch, 小批量),然后对每个mini-batch 进行学习。
均值版交叉熵误差:
设定损失函数的目的:
- 为什么不直接使用识别精度作为指标而选择引入新的参数(损失函数的值)?
- 我们为了找到最优参数,需要计算参数的导数/梯度,然后以这个导数为指引,逐步更新参数的值。如果以识别精度为指标,则参数的导数在绝大多数地方都会变为0(识别精度对微小的参数变化基本上没有什么反应,即便有反应,它的值也是不连续地、突然地变化),导致参数无法更新。
- 这也是为什么在神经网络中不使用阶跃函数作为激活函数的原因。阶跃函数的导数在绝大多数地方均为0。而sigmoid 函数的导数在任何地方都不为0,且是连续变化的。
三、寻找最优参数
梯度:
由全部变量的偏导数汇总而成的向量称为梯度。
梯度指示的方向是各点处的函数值减小最多的方向。
梯度下降法:(寻找最小值)
通过不断地沿梯度方向前进,逐渐减小函数值的过程就是梯度法。
虽然梯度的方向并不一定指向最小值,但沿着它的方向能够最大限度地减小函数的值。
数学表达式:
η表示学习率,学习率决定在一次学习中,应该学习多少,以及在多大程度上更新参数。
设置合适的学习率:学习率过大的话,会发散成一个很大的值;反过来,学习率过小的话,基本上没怎么更新就结束了。
超参数:
是一种与神经网络的参数(权重和偏置)性质不同的参数,超参数由人工设定,经验值。
神经网络的梯度:
指损失函数关于权重参数的梯度。(因为要求使得损失函数最小的权重参数的值,所以将损失函数对权重参数求导)
对于x,是x的各个分量分别向负梯度方向更新。从而使得损失函数值减小。
四、神经网络的学习/训练步骤
-
mini-batch
从训练数据中随机选出一部分数据,这部分数据称为mini-batch。目标是减小mini-batch的损失函数的值。
-
计算梯度
为了减小 mini-batch的损失函数的值,需要求出各个权重参数的梯度。梯度表示损失函数的值减小最多的方向。
-
更新参数
将权重参数沿梯度方向进行微小更新。
-
重复
重复步骤123
现在,我们使用的是数值微分的方法计算梯度(导数),后面,我们会介绍一个高速计算梯度的方法,称为误差反向传播法。
因为我们的mini-batch是随机选择一部分数据为对象使用梯度法更新权重参数,所以也称为随机梯度下降法(SGD)。
五、基于测试数据的评价
神经网络的学习中,必须确认是否能够正确识别训练数据以外的其他数据,即确认是否会发生过拟合。
即将数据分为训练数据和测试数据,测试数据评价学习到的模型的泛化能力。
本章小结
- 机器学习中使用的数据集分为训练数据和测试数据。
- 神经网络用训练数据进行学习,并用测试数据评价学习到的模型的泛化能力。
- 神经网络的学习以损失函数为指标,更新权重参数,以使损失函数的值减小。
- 利用某个给定的微小值的差分求导数的过程,称为数值微分。
- 利用数值微分,可以计算权重参数的梯度。
- 数值微分虽然费时间,但是实现起来很简单。下一章中要实现的稍微复杂一些的误差反向传播法可以高速地计算梯度。
Ch5 误差反向传播法
即能够高效计算权重参数的梯度的方法。
一、计算图
通过计算图理解误差反向传播。
求解一个问题,根据计算图从左向右计算是正方向的传播,如果从右向左计算的话,这种传播称为反向传播,这在接下来的求导中起到很重要的作用。
优点:
- 计算图可以集中精力于局部计算。无论全局的计算有多么复杂,各个步骤所要做的就是对象节点的局部计算,从而简化问题。
- 利用计算图可以将中间的计算结果全部保存起来。
- 可以通过正向传播和反向传播高效计算导数。
传递局部导数的原理:链式法则
反向传播计算:局部导数是指正向传播中y = f(x)的导数,把这个局部导数乘以上游传过来的值,然后传递给前面的节点。
二、反向传播
加法节点:
这里以z = x + y为对象,求解得到的偏导数:
加法节点的反向传播只乘以1,所以输入的值会原封不动地流向下一个节点。
乘法节点:
这里我们考虑z = xy。
乘法的反向传播会将上游的值乘以正向传播时的输入信号的“翻转值” 后传递给下游。
另外,加法的反向传播只是将上游的值传给下游,并不需要正向传播的输入信号。但是,乘法的反向传播需要正向传播时的输
入信号值。因此,实现乘法节点的反向传播时,要保存正向传播的输入信号。
例题 :
三、激活函数层的推导
ReLU:
如果正向传播时的输入x大于0,则反向传播会将上游的值原封不动地传给下游。反过来,如果正向传播时的x小于等于0,则反向传播中传给下游的信号将停在此处。
sigmoid:
除了加法、乘法节点外,出现了新的节点。依次推导。
-
-
反向传播时,会将上游的值乘以−y2(正向传播的输出的平方乘以−1后的值)后,再传给下游。
-
加法节点原封不动传给下游。
-
-
上游的值乘以正向传播时的输出(这个例子中是exp(−x))后,再传给下游。
-
乘法节点翻转传给下游。
整理得:
四、推广到矩阵运算
实现为Affine层。(仿射变换)
注意矩阵的形状。因为在做矩阵乘法的运算时,需要保证正确的形状才能够正确运算。
神经网络的推理通常不使用Softmax层。我们只关心得分的最大值。
softmax-loss:
神经网络的反向传播会把这个差分表示的误差传递给前面的层,这是神经网络学习中的重要性质。
而得到这个漂亮的差分结果不是偶然。
使用交叉熵误差作为softmax函数的损失函数后,反向传播得到(y1 − t1, y2 − t2, y3 − t3)这样 “漂亮”的结果。实际上,这样“漂亮” 的结果并不是偶然的,而是为了得到这样的结果,特意设计了交叉熵误差函数。回归问题中输出层使用“恒等函数”,损失函数使用 “平方和误差”,也是出于同样的理由(3.5节)。也就是说,使用“平方和误差”作为“恒等函数”的损失函数,反向传播才能得到(y1 − t1, y2 − t2, y3 − t3)这样“漂亮”的结果。
数值微分的作用:
经常会比较数值微分的结果和误差反向传播法的结果,以确认误差反向传播法的实现是否正确。称为梯度确认。
数值微分和误差反向传播法的计算结果之间的误差为0是很少见的。这是因为计算机的计算精度有限。受到数值精度的限制,刚才的误差一般不会为0。
本章小结
- 通过使用计算图,可以直观地把握计算过程。
- 计算图的节点是由局部计算构成的。局部计算构成全局计算。
- 计算图的正向传播进行一般的计算。通过计算图的反向传播,可以计算各个节点的导数。
- 通过将神经网络的组成元素实现为层,可以高效地计算梯度(反向传播法)。
- 通过比较数值微分和误差反向传播法的结果,可以确认误差反向传播法的实现是否正确(梯度确认)。
Ch6 与学习相关的技巧
本章的技巧可以提高神经网络的识别精度。
一、寻找最优参数的方法
在前几章中,为了找到最优参数,我们使用参数的梯度,沿梯度方向更新参数,并重复这个步骤多次,从而逐渐靠近最优参数,这个过程称为随机梯度下降法(SGD)。
SGD缺点:
- 如果函数的形状非均向,比如呈延伸状,搜索的路径就会非常低效。
- SGD低效的根本原因是,梯度的方向并没有指向最小值的方向。
Momentum:
式1表示了物体在梯度方向上受力,在这个力的作用下,物体的速度增加这一物理法则。
(α设定为0.9之类的值)
和SGD相比,我们发现“之”字形的“程度”减轻了。
这是因为虽然x轴方向上受到的力非常小,但是一直在同一方向上受力,所以朝同一个方向会有一定的加速。反过来,虽然y轴方向上受到的力很大,但是因为交互地受到正方向和反方向的力,它们会互相抵消,所以y轴方向上的速度不稳定。
因此,和SGD时的情形相比,可以更快地朝x轴方向靠近,减弱“之”字形的变动程度。
AdaGrad:
学习率衰减:随着学习的进行,使学习率逐渐减小。
AdaGrad扩展了这一想法,它会为参数的每个元素适当地调整学习率,与此同时进行学习。
h保存了以前的所有梯度值的平方和(圈点表示对应矩阵元素的乘法)
这意味着,参数的元素中变动较大(被大幅更新)的元素的学习率将变小。
y轴方向上的更新程度被减弱,“之” 字形的变动程度有所衰减。
Adam:
将Momentum和AdaGrad融合起来。
到底选择哪种参数更新的方法?
这4种方法各有各的特点,都有各自擅长解决的问题和不擅长解决的问题。
很显然,超参数(学习率等)的设定值不同,结果也会发生变化。
二、权重初始值的设定
可以将权重初始值设为0/相同的值吗?
不能。因为在误差反向传播法中,所有的权重值都会进行相同的更新。回想加法、乘法节点(翻转得到的仍是同样的值)的反向传播。
试验:
使用标准差为1的高斯分布作为权重初始值
- 结论:偏向0和1的数据分布会造成反向传播中梯度的值不断变小,最后消失。(随着多层隐藏层不断的传播)这个问题称为梯度消失。(导数的值逐渐接近0)
使用标准差为0.01的高斯分布作为权重初始值
- 结论:激活值的分布有所偏向,会出现“表现力受限”的问题。
Xavier初始值:
Xavier初始值是以激活函数是线性函数为前提而推导出来的。
因为sigmoid函数和tanh函数左右对称,且中央附近可以视作线性函数,所以适合使用 Xavier 初始值。
He初始值:
(ReLU专用的权重初始值)
与Xavier初始值相比,(直观上)可以解释为,因为ReLU的负值区域的值为0,为了使它更有广度,所以需要2倍的系数。
结论:
当激活函数使用ReLU时,权重初始值使用He初始值,当激活函数为 sigmoid 或 tanh 等S型曲线函数时,初始值使用Xavier 初始值。这是目前的最佳实践。
三、批正规化(Batch Normalization)
为了使各层拥有适当的广度,“强制性”地调整激活值的分布会怎样呢?批正规化基于该想法诞生。
优点:
- 可以使学习快速进行(可以增大学习率)。
- 不那么依赖初始值(对于初始值不用那么神经质)。
- 抑制过拟合(降低Dropout等的必要性)。
做法:要向神经网络中插入对数据分布进行正规化的层
以进行学习时的mini-batch 为单位,按 mini-batch进行正规化,使数据分布的均值为0、方差为1。
四、过拟合
指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。
原因:
- 模型拥有大量参数、表现力强。
- 训练数据少。
抑制过拟合的方法:
权值衰减:该方法通过在学习的过程中对大的权重进行惩罚,来抑制过拟合。即通过减小权重参数的值来抑制过拟合的发生。
例如为损失函数加上权重的L2范数的权值衰减方法。
Dropout:
如果网络的模型变得很复杂,只用权值衰减就难以应对了。我们使用Dropout。
Dropout是一种在学习的过程中随机删除神经元的方法。训练时,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递。
集成学习与Dropout有密切的关系。这是因为可以将Dropout理解为,通过在学习过程中随机删除神经元,从而每一次都让不同的模型进行学习。可以理解成, Dropout将集成学习的效果(模拟地)通过一个网络实现了。
五、超参数的验证
不能使用测试数据评估超参数的性能:
因为如果使用测试数据调整超参数,超参数的值会对测试数据发生过拟合。
用于调整超参数的数据,一般称为验证数据。
超参数的最优化步骤:
逐渐缩小超参数的“好值”的存在范围。
- 设定超参数的范围。
- 从设定的超参数范围中随机采样。
- 使用步骤1中采样到的超参数的值进行学习,通过验证数据评估识别精度(但是要将epoch设置得很小)。
- 重复步骤1和步骤2(100次等),根据它们的识别精度的结果,缩小超参数的范围。
本章小结
- 参数的更新方法,除了 SGD 之外,还有 Momentum、AdaGrad、 Adam等方法。
- 权重初始值的赋值方法对进行正确的学习非常重要。
- 作为权重初始值,Xavier初始值、He初始值等比较有效。
- 通过使用Batch Normalization,可以加速学习,并且对初始值变得健壮。
- 抑制过拟合的正则化技术有权值衰减、Dropout等。
- 逐渐缩小“好值”存在的范围是搜索超参数的一个有效方法。
Ch7 卷积神经网络
CNN被用于图像识别、语音识别等各种场合。
一、CNN网络结构
增加卷积层和池化层。
之前介绍的神经网络中,相邻层的所有神经元之间都有连接,这称为全连接。我们用 Affine层实现了全连接层。
之前的“Affine - ReLU”连接(一个隐藏层)被替换成了“Convolution - ReLU -(Pooling)”连接。
二、卷积层
全连接层存在的问题:数据的形状被“忽视”了。
卷积运算:
将各个位置上滤波器(kernel)的元素和输入的对应元素相乘,然后再求和(有时将这个计算称为乘积累加运算)。然后,将这个结果保存到输出的对应位置。
在全连接的神经网络中,除了权重参数,还存在偏置。CNN中,滤波器的参数就对应之前的权重。也有偏置。
填充:
- 在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比如0等),这称为填充。
- 使用填充主要是为了调整输出的大小。
- 如果每次进行卷积运算都会缩小空间,那么在某个时刻输出大小就有可能变为1,导致无法再应用卷积运算。
- 使用填充则卷积运算就可以在保持空间大小不变的情况下将数据传给下一层。
步幅:
应用滤波器的位置间隔称为步幅。
增大步幅后,输出大小会变小。增大步幅后,输出大小会变小。
公式:
输入大小为(H,W),滤波器大小为(FH, FW),输出大小为(OH,OW),填充为P,步幅为S。
当值无法除尽时,有时会向最接近的整数四舍五入,不进行报错而继续运行。
三、三维数据的卷积运算
三维:高、长、通道方向
通道方向上有多个特征图时,会按通道进行输入数据和滤波器的卷积运算,并将结果相加,从而得到输出。
- 输入数据和滤波器的通道数要设为相同的值。
- 每个通道的滤波器大小要全部相同。
滤波器参数书写顺序:通道、高、长(channel, height, width)即(C, FH, FW)
一个滤波器,输出数据的通道数为1。
如果要在通道方向上也拥有多个卷积运算的输出,就需要用到多个滤波器(权重)。
作为4维数据,滤波器的权重数据要按(output_channel, input_channel, height, width) 的顺序书写
卷积运算同样存在偏置。
批处理:
为此,需要将在各层间传递的数据保存为4维数据。具体地讲,就是按 (batch_num, channel, height, width)的顺序保存数据。
四、池化层
池化是缩小高、长方向上的空间的运算。
例如,“Max池化”是获取最大值的运算。还有,Average池化则是计算目标区域的平均值。
池化层特征:
- 没有要学习的参数
- 通道数不发生变化:计算是按通道独立进行的
- 对微小的位置变化具有鲁棒性(健壮):输入数据发生微小偏差时,池化仍会返回相同的结果。
NumPy中存在使用for语句后处理变慢的缺点。我们使用便利的函数,im2col会把输入数据展开以适合滤波器(权重)。
五、CNN的可视化
第一层权重的可视化:它在观察边缘(颜色变化的分界线)和斑块(局部的块状区域)等,即卷积层的滤波器会提取边缘或斑块等原始信息。
那么多层卷积层和池化层呢?
- 第1层的神经元对边缘或斑块有响应,第3层对纹理有响应,第5层对物体部件有响应,最后的全连接层对物体的类别(狗或车)有响应
- 随着层次加深,神经元从简单的形状向“高级”信息变化。
代表性CNN:
LeNet:
和“现在的CNN”相比,LeNet有几个不同点:
- 激活函数:LeNet 中使用 sigmoid 函数,而现在的CNN中主要使用ReLU 函数
- 缩小:原始的LeNet中使用子采样缩小中间数据的大小,而现在的CNN中Max池化是主流。
AlexNet:
- 激活函数使用ReLU。
- 使用进行局部正规化的LRN(Local Response Normalization)层。
- 使用Dropout
本章小结
- CNN在此前的全连接层的网络中新增了卷积层和池化层。
- 使用 im2col函数可以简单、高效地实现卷积层和池化层。
- 通过CNN的可视化,可知随着层次变深,提取的信息愈加高级。
- LeNet 和 AlexNet 是CNN的代表性网络。
- 在深度学习的发展中,大数据和GPU做出了很大的贡献。
Ch8 深度学习
深度学习是加深了层的深度神经网络。
集成学习、学习率衰减、Data Augmentation(数据扩充)等都有助于提高识别精度。
Data Augmentation 基于算法“人为地”扩充输入图像(训练图像)。具体来说,对于输入图像,通过施加旋转、垂直或水平方向上的移动等微小变化,增加图像的数量。还可以通过其他各种方法扩充图像,比如裁剪图像的 “crop 处理”、将图像左右翻转的“fl ip 处理”A 等。
这在数据集的图像数量有限时尤其有效。
加深层的好处:
- 可以减少网络的参数数量:与没有加深层的网络相比,加深了层的网络可以用更少的参数达到同等水平(或者更强)的表现力
- 使学习更加高效:与没有加深层的网络相比,通过加深层,可以减少学习数据,从而高效地进行学习
VGG:
VGG是由卷积层和池化层构成的基础的CNN。它的特点在于将有权重的层(卷积层或者全连接层)叠加至16 层(或者 19 层),具备了深度。
GoogLeNet:
特征是,网络不仅在纵向上有深度,在横向上也有深度(广度)。
ResNet:
为了解决过度加深层而导致学习不能顺利进行的问题,导入了“快捷结构”,反向传播时信号可以无衰减地传递。
深度学习高速化:
- 基于GPU的高速化
- 分布式学习
- 运算精度的位数缩减
应用案例:
- 物体检测:物体检测是从图像中确定物体的位置,并进行分类的问题。
- 图像分割:图像分割是指在像素水平上对图像进行分类。
- 图像标题的生成
本章小结
- 对于大多数的问题,都可以期待通过加深网络来提高性能。
- 在最近的图像识别大赛ILSVRC中,基于深度学习的方法独占鳌头,使用的网络也在深化。
- VGG、GoogLeNet、ResNet等是几个著名的网络。
- 基于GPU、分布式学习、位数精度的缩减,可以实现深度学习的高速化。
- 深度学习(神经网络)不仅可以用于物体识别,还可以用于物体检测、图像分割。
- 深度学习的应用包括图像标题的生成、图像的生成、强化学习等。最近,深度学习在自动驾驶上的应用也备受期待。
进阶:自然语言处理
Ch1 神经网络的复习
本章小结
- 神经网络具有输入层、隐藏层和输出层
- 通过全连接层进行线性变换,通过激活函数进行非线性变换
- 全连接层和 mini-batch 处理都可以写成矩阵计算
- 使用误差反向传播法可以高效地求解神经网络的损失的梯度
- 使用计算图能够将神经网络中发生的处理可视化,这有助于理解正向传播和反向传播
- 在神经网络的实现中,通过将组件模块化为层,可以简化实现
- 数据的位精度和 GPU 并行计算对神经网络的高速化非常重要
Ch2 自然语言和单词的分布式表示
一、什么是自然语言处理
自然语言处理:处理自然语言的科学。它是一种能够让计算机理解人类语言的技术。
编程语言是硬语言。英语等是软语言。
语言由单词组成。首先应该让计算机理解单词的含义。
二、单词含义
方法:
1.基于同义词词典:
在同义词词典中,具有相同含义的单词(同义词)或含义类似的单词(近义词)被归类到同一个组中。
另外,同义词词典有时会定义单词之间的粒度更细的关系,比如“上位 - 下位”关系、“整体 - 部分”关系。
在自然语言处理领域,最著名的同义词词典是 WordNet。
问题:
- 难以顺应时代变化
- 人力成本高
- 无法表示单词的微妙差异
2.基于计数:
使用语料库。语料库就是大量的文本数据。
语料库中包含了大量的关于自然语言的实践知识,即文章的写作方法、单词的选择方法和单词含义等。
基于计数的方法的目标就是从这些富有实践知识的语料库中,自动且高效地提取本质。
分布式表示:
单词的分布式表示将单词表示为固定长度的向量。这种向量的特征在于它是用密集向量表示的。
分布式假设:某个单词的含义由它周围的单词形成。
如何构建分布式表示呢?
使用基于计数的方法,计算每个单词的上下文(根据窗口大小确定)所包含的单词的频数。
例如:
汇总了所有单词的共现单词的表格,呈矩阵状,称为共现矩阵。
测量向量间的相似度:
向量内积、欧氏距离、余弦相似度。
余弦相似度直观地表示了“两个向量在多大程度上指向同一方向”(取值范围是 −1 到 1)。
排序:
基于余弦相似度的结果,按降序显示它们的值。
整体思想:
给一个词,通过语料库构建共现矩阵,得到该词的分布式表示,计算与其他词的余弦相似度,输出降序排名,即与该词相似度较高的其他词。
基于计数的方法的改进:
the car和drive car哪两个单词的相似度高?改进后我们使用点互信息这一指标。
PMI 的值越高,表明相关性越强。
我们考虑了单词单独出现的次数。
用以下式子解决两个单词共现次数为0导致的负∞的问题。
问题:
随着语料库的词汇量增加,各个单词向量的维数也会增加。
解决:
降维。
降维方法,我们使用奇异值分解(SVD)。
SVD 将任意矩阵分解为 3 个矩阵的乘积。
将奇异值视为“对应的基轴”的重要性,基于此减少非重要元素。
通过SVD,将原先的稀疏矩阵(向量)转换为密集矩阵U。
如果要对这个密集向量降维,比如把它降维到二维向量,取出前两个元素即可。(我们对共现矩阵进行SVD)
使用大的语料库进行试验。
使用语料库,计算上下文中的单词数量,将它们转化 PPMI 矩阵,再基于 SVD 降维获得好的单词向量。
本章小结
- 使用 WordNet 等同义词词典,可以获取近义词或测量单词间的相似度等
- 使用同义词词典的方法存在创建词库需要大量人力、新词难更新等问题
- 目前,使用语料库对单词进行向量化是主流方法
- 近年来的单词向量化方法大多基于“单词含义由其周围的单词构成” 这一分布式假设
- 在基于计数的方法中,对语料库中的每个单词周围的单词的出现频数进行计数并汇总(= 共现矩阵)
- 通过将共现矩阵转化为 PPMI 矩阵并降维,可以将大的稀疏向量转变为小的密集向量
- 在单词的向量空间中,含义上接近的单词距离上理应也更近
Ch3 word2Vec
接上章。
3.基于推理:
基于计数的方法问题:
现实世界中,语料库处理的单词数量非常大。使用该方法会生成超级大的共现矩阵,并且需要对其进行SVD处理,不现实。
而基于推理的方法使用神经网络,通常在 mini-batch 数据上进行学习。这意味着神经网络一次只需要看一部分学习数据(mini-batch),并反复更新权重。
推理:(即预测)
当给出周围的单词(上下文)时,预测“?”处会出现什么单词,这就是推理。
与基于计数的方法一样,基于推理的方法同样基于分布式假设。
单词处理:
要用神经网络处理单词,需要先将单词转化为固定长度的向量。从而神经网络的输入层的神经元个数就可以固定下来。
- one-hot:
在 one-hot 表示中,只有一个元素是 1,其他元素都是 0。
此处在生成全连接层时,选择不使用偏置。即只有矩阵的乘积。
所以,上述代码中的 c 和 W 的矩阵乘积相当于“提取”权重的对应行向量。不是那么有效率,后续改进。(引入embedding层)
一、简单的word2vec
将神经网络嵌入如图所示的模型中。
word2vec常见的有两种神经网络:CBOW模型和 skip-gram模型。
CBOW模型的推理:
CBOW 模型是根据上下文预测目标词的神经网络(“目标词”是指中间的单词,它周围的单词是“上下文”)。
此处取输入的上下文个数为2,即有两个输入层。得到的中间层是两个矩阵乘积结果的均值。
输出层对应语料库的各个单词,输出为得分。将其应用于softmax激活函数即可得到概率。
输入层到中间层的权重矩阵Win即为单词的分布式表示。即借助神经网络的学习能力,通过反复学习训练,不断更新各个单词的分布式表示,以正确地从上下文预测出应当出现的单词。
需要注意的是,中间层的神经元数量比输入层少。因为,中间层需要将预测单词所需的信息压缩保存,从而产生密集的向量表示。
该模型的一个特点:多个输入层共享权重(即Win是同一个)。
CBOW模型的学习:
实际上,是一个进行多类别分类的神经网络。我们采用softmax激活函数和交叉熵误差。
输入侧和输出侧的权重都可以被视为单词的分布式表示:
- 输入侧的权重 Win 的每一行对应于各个单词的分布式表示
- 输出侧的权重在列方向上保存了各个单词的分布式表示
就 word2vec(特别是 skip-gram 模型)而言,最受欢迎的是“只使用输入侧的权重”的方案。
我们对这个简单的CBOW模型进行了实现,简单,是因为我们的语料库只有一句话。当语料库增大时,此种使用one-hot进行表示的方法在处理效率上存在很大问题。
skip-gram模型:
skip-gram 模型反转了 CBOW 模型处理的上下文和目标词的模型,它从中间的单词(目标词)预测周围的多个单词(上下文)。
该模型输入层只有一个,输出层的数量则与上下文的单词个数相等。对于输出层,需要分别求出各个输出层的损失(通过Softmax with Loss 层等),然后将它们加起来作为最后的损失。
两个模型如何选择?
- 从单词的分布式表示的准确度来看,在大多数情况下,skip-grm模型的结果更好。
- 就学习速度而言, CBOW模型比 skip-gram 模型要快。因为skip-gram模型需要根据上下文数量计算相应个数的损失,计算成本变大。
- 可以说 skip-gram 模型要解决的是更难的问题。
二、基于计数与基于推理
区别:
- 学习机制:基于计数的方法通过对整个语料库的统计数据进行一次学习来获得单词的分布式表示,而基于推理的方法则反复观察语料库的一部分数据进行学习
- 当要更新词汇表时:基于计数的方法需要从头开始计算,而基于推理的方法允许参数的增量学习。具体来说,可以将之前学习到的权重作为下一次学习的初始值,在不损失之前学习到的经验的情况下,高效地更新单词的分布式表示。
- 对于得到的单词的分布式表示:基于计数的方法主要是编码单词的相似性,而 word2vec(特别是 skip-gram 模型)除了单词的相似性以外,还能理解更复杂的单词之间的模式。
- 准确度:基于推理的方法和基于计数的方法难分上下
事实,两者有一定的关联性。
本章小结
- 基于推理的方法以预测为目标,同时获得了作为副产物的单词的分布式表示
- word2vec 是基于推理的方法,由简单的 2 层神经网络构成
- word2vec 有 skip-gram 模型和 CBOW 模型
- CBOW 模型从多个单词(上下文)预测 1 个单词(目标词)
- skip-gram 模型反过来从 1 个单词(目标词)预测多个单词(上下文)
- 由于 word2vec 可以进行权重的增量学习,所以能够高效地更新或添加单词的分布式表示
Ch4 word2vec的高速化
CBOW目前的实现存在几个问题,其中最大的问题是,随着语料库中处理的词汇量的增加,计算量也随之增加。
本章主要做两点改进:引入新层Embedding 层,引入名为负采样的新损失函数。
具体来讲,当语料库为100万的单词时,会出现以下两个计算瓶颈:
- 输入层的 one-hot 表示和权重矩阵 Win 的乘积
- 中间层和权重矩阵 Wout 的乘积以及 Softmax 层的计算
Embedding层:
解决计算瓶颈一。
来源于词嵌入一词,是从权重参数中抽取“单词 ID 对应行(向量)”的层。
只需要通过数组索引即可很容易地取出一行或多行。
负采样:
解决计算瓶颈二。
使用 Negative Sampling 替代 Softmax。
负采样,关键思想是用二分类拟合多分类。
二分类问题回答的是yes或者no。我们可以让神经网络来回答“当上下文是 you 和 goodbye 时,目标词是 say 吗?的问题,将其转化为二分类问题。
- 我们仍要学习负例:对于正例(say),使 Sigmoid 层的输出接近 1;对于负例(say 以外的单词),使 Sigmoid 层的输出接近 0。
- 我们只是用少量负例,这就是负采样方法的含义。
- 负采样方法既可以求将正例作为目标词时的损失,同时也可以采样(选出)若干个负例,对这些负例求损失。然后,将这些数据(正例和采样出来的负例)的损失加起来,将其结果作为最终的损失。
如何采样?
- 基于语料库的统计数据进行采样的方法比随机抽样要好。即让语料库中经常出现的单词容易被抽到。
- 首先需要求出语料库中各个单词的出现次数,并将其表示为“概率分布”。
- 取5-10个。
改进的CBOW:
改进之处在于使用 Embedding 层和 Negative Sampling Loss 层。此外,我们将上下文部分扩展为可以处理任意的窗口大小。
word2vec类推问题:
使用 word2vec 获得的单词的分布式表示,可以通过向量的加减法求解类推问题。不仅限于单词的含义,它也捕获了语法中的模式。
本章小结
- Embedding 层保存单词的分布式表示,在正向传播时,提取单词 ID对应的向量
- 因为 word2vec 的计算量会随着词汇量的增加而成比例地增加,所以最好使用近似计算来加速
- 负采样技术采样若干负例,使用这一方法可以将多分类问题转化为二分类问题进行处理
- 基于 word2vec 获得的单词的分布式表示内嵌了单词含义,在相似的上下文中使用的单词在单词向量空间上处于相近的位置
- word2vec 的单词的分布式表示的一个特性是可以基于向量的加减法运算来求解类推问题
- word2vec 的迁移学习能力非常重要,它的单词的分布式表示可以应用于各种各样的自然语言处理任务
Ch5 RNN
到目前为止,我们看到的神经网络都是前馈型神经网络,指网络的传播方向是单向的。
这种网络存在的问题:不能很好地处理时序数据
一、语言模型
语言模型:给出了单词序列发生的概率。具体来说,就是使用概率来评估一个单词序列发生的可能性,即在多大程度上是自然的单词序列。
语言模型的任务是根据已经出现的单词预测下一个将要出现的单词。
如果强行将CBOW模型用作语言模型,将上下文窗口设定为非对称式,只考虑目标单词左侧的单词。那么窗口大小设置为多少时才能正确预测出目标单词呢?
虽然可以通过增大 CBOW 模型的上下文大小来预测,但是 CBOW 模型还存在忽视了上下文中单词顺序的问题。
因此,RNN登场。
RNN 具有一个机制,那就是无论上下文有多长,都能将上下文信息记住。因此,使用 RNN 可以处理任意长度的时序数据。
二、RNN
RNN 的特征就在于拥有一个环路(或回路)。这个环路可以使数据不断循环。通过数据的循环,RNN 一边记住过去的数据,一边更新到最新的数据。
循环展开:
各个时刻的 RNN 层接收传给该层的输入和前一个RNN 层的输出,然后据此计算当前时刻的输出。
结构:
RNN 有两个权重,分别是将输入 x转化为输出 h 的权重 Wx 和将前一个 RNN 层的输出转化为当前时刻的输出的权重 Wh。
- BPTT基于时间的反向传播
- 截断的BPTT:Truncated BPTT 中,网络连接被截断,但严格地讲,只是网络的反向传播的连接被截断,正向传播的连接依然被维持
对于长的时序数据,通常的做法是将网络连接截成适当的长度。
批处理:
例如,对长度为1000的时序数据,以时间长度10为单位进行截断。
如何将批大小设为 2 进行学习呢?第 1 笔样本数据从头开始按顺序输入,第 2 笔数据从第 500 个数据开始按顺序输入。
三、语言模型的评价
常用困惑度评价语言模型的预测性能。
困惑度表示“概率的倒数”。
困惑度越小越好。
可以被直观地解释为分叉度,是指下一个可以选择的选项的数量。
例如,当输入单词you时,模型输出下一个出现的单词的概率分布。好的预测模型的分叉度是 1.25,这意味着下一个要出现的单词的候选个数可以控制在 1 个左右。而在差的模型中,下一个单词的候选个数有 5 个。
输入数据为多个的情况:
本章小结
- RNN 具有环路,因此可以在内部记忆隐藏状态
- 通过展开 RNN 的循环,可以将其解释为多个 RNN 层连接起来的神经网络,可以通过常规的误差反向传播法进行学习(= BPTT)
- 在学习长时序数据时,要生成长度适中的数据块,进行以块为单位的 BPTT 学习(= Truncated BPTT)
- Truncated BPTT 只截断反向传播的连接
- 在 Truncated BPTT 中,为了维持正向传播的连接,需要按顺序输入数据
- 语言模型将单词序列解释为概率
- 理论上,使用 RNN 层的条件语言模型可以记忆所有已出现单词的信息
Ch6 Gated RNN
上一章的 RNN 存在环路,可以记忆过去的信息,其结构非常简单,易于实现。不过,遗憾的是,这个 RNN 的效果并不好。
LSTM 和 GRU 中增加了一种名为“门”的结构。
上一章的RNN不擅长学习时序数据的长期依赖关系。会产生梯度消失和梯度爆炸的问题。
一、梯度消失和梯度爆炸
原因:
这里考虑长度为 T 的时序数据,关注从第 T 个正确解标签传递出的梯度如何变化。分析可知反向传播的梯度流经 tanh、“+”和 MatMul(矩阵乘积)运算。
- 首先考虑“+”,它的反向传播将上游传来的梯度原样传给下游,因此梯度的值不变。
- 考虑tanh。通过观察y = tanh(x) 的导数图像可以看出,它的值小于1.0,并且随着 x 远离 0,它的值在变小。意味着,当反向传播的梯度经过tanh 节点时,它的值会越来越小。
- 考虑矩阵乘积。进行实验发现,梯度的大小或者呈指数级增加(梯度爆炸),或者呈指数级减小(梯度消失)。因为矩阵 Wh 被反复乘了 T 次。如果 Wh 是标量,则问题将很简单:当 Wh 大于 1 时,梯度呈指数级增加;当 Wh小于 1 时,梯度呈指数级减小。如果Wh是矩阵,那么根据矩阵的奇异值可以预测梯度大小的变化。必要条件:如果奇异值的最大值大于1,则可以预测梯度很有可能会呈指数级增加;而如果奇异值的最大值小于1,则可以判断梯度会呈指数级减小。
梯度爆炸的对策:
梯度裁剪。
梯度消失的对策:
需要从根本上改变 RNN 层的结构。即Gated RNN。
在众多Gated RNN中,其中具有代表性的有LSTM 和 GRU。本文重点LSTM。
二、LSTM
LSTM的接口与RNN比较:
LSTM新增c,c 称为记忆单元(或者简称为“单元”),相当于 LSTM 专用的记忆部门。记忆单元的特点是,仅在 LSTM 层内部接收和传递数据,不向其他层输出。
但是,重点是隐藏状态 ht 要使用更新后的 ct 来计算。
门:作用是控制数据的流动。
LSTM中的门,有专门的权重参数用于控制门的开合程度,这些权重参数通过学习被更新。
输出门:
我们考虑对 tanh(ct) 施加门。
由于这个门管理下一个隐藏状态 ht 的输出,所以称为输出门。
输出门的开合程度(流出比例)根据输入 xt 和上一个状态 ht−1 求出。
遗忘门:
使用门明确告诉记忆单元需要“忘记什么”。
向新的记忆单元添加必要信息:
基于 tanh 节点计算出的结果被加到上一时刻的记忆单元 ct−1 上。
用 g 表示向记忆单元添加的新信息。不是门。
输入门:
用g给节点添加信息,但是需要对要添加的信息进行取舍。输入门会添加加权后的新信息。
然后,将 i 和 g 的对应元素的乘积添加到记忆单元中。
这种LSTM结构不会引起梯度消失问题,原因?
这里的 LSTM 的反向传播进行的不是矩阵乘积计算,而是对应元素的乘积计算,而且每次都会基于不同的门值进行对应元素的乘积计算。这就是它不会发生梯度消失(或梯度爆炸)的原因。
三、进一步改进RNNLM
LSTM层的多层化:
- 可以通过叠加多个层,提高语言模型的精度
- 叠加方式:第一个 LSTM 层的隐藏状态是第二个 LSTM 层的输入。
- 叠加的层数是超参数
基于Dropout抑制过拟合:
- 通过加深层,可以创建表现力更强的模型,但是这样的模型往往会发生过拟合。RNN 比常规的前馈神经网络更容易发生过拟合。
- 抑制过拟合的方法:一是增加训练数据;二是降低模型的复杂度。三是对模型复杂度给予惩罚的正则化,dropout可以看作是一种正则化。
- dropout:我们在垂直方向上插入 Dropout 层。这样,无论沿时间方向(水平方向)前进多少,信息都不会丢失。
- 常规Dropout不适合用在时间方向上,改进,变分 Dropout 能用在时间方向上
权重共享:
- 在Embedding 层和 Affine 层之间权重共享,可以大大减少学习的参数数量。
本章小结
- 在简单 RNN 的学习中,存在梯度消失和梯度爆炸问题
- 梯度裁剪对解决梯度爆炸有效,LSTM、GRU 等 Gated RNN 对解决梯度消失有效
- LSTM 中有 3 个门:输入门、遗忘门和输出门
- 门有专门的权重,并使用 sigmoid 函数输出 0.0 ~ 1.0 的实数
- LSTM 的多层化、Dropout 和权重共享等技巧可以有效改进语言模型
- RNN 的正则化很重要,人们提出了各种基于 Dropout 的方法
Ch7 基于RNN生成文本
本章将使用语言模型进行文本生成,就是使用在语料库上训练好的语言模型生成新的文本。(简单地)体验基于 AI 的文本创作。
同时,介绍一种结构名为 seq2seq 的新神经网络。
一、使用语言模型生成文本
语言模型根据已经出现的单词输出下一个出现的单词的概率分布。我们“概率性地”进行选择。每次生成的文本有所不同。
步骤:
- 语言模型根据已经出现的单词输出下一个出现的单词的概率分布。
- “概率性地”进行选择一个单词。
- 将生成的单词输入语言模型,获得单词的概率分布,然后再根据这个概率分布采样下一个出现的单词。
二、seq2seq模型
存在许多需要将一种时序数据转换为另一种时序数据的任务。例如机器翻译、语音识别等。
seq2seq 模型也称为 Encoder-Decoder 模型。顾名思义,这个模型有两个模块—— Encoder(编码器)和 Decoder(解码器)。编码器对输入数据进行编码,解码器对被编码的数据进行解码。
seq2seq 是组合了两个 RNN 的神经网络。
举例说明什么是把一种时序数据转换为另一种时序数据。
编码器和解码器协作,将一个时序数据转换为另一个时序数据。
- 在编码器与解码器之间,LSTM 的隐藏状态 h 是一个固定长度的向量。
- 编码就是将任意长度的文本转换为一个固定长度的向量
如图,seq2seq 由两个 LSTM 层构成,即编码器的 LSTM 和解码器的LSTM。LSTM层的隐藏状态是编码器和解码器的“桥梁”。
对于可变长度的时序数据:
在进行 mini-batch 处理时,可以使用填充的方法。即用无效(无意义)数据填入原始数据,从而使数据长度对齐。
实现:
- Encoder 类由 Embedding 层和 LSTM 层组成。Embedding层将字符(字符 ID)转化为字符向量,然后将字符向量输入 LSTM 层。
- LSTM 层向右(时间方向)输出隐藏状态和记忆单元,向上输出隐藏状态。
- 在编码器处理完最后一个字符后,输出 LSTM 层的隐藏状态 h。然后,这个隐藏状态 h 被传递给解码器。
- Decoder 类接收Encoder 类输出的 h,输出目标字符串。
- 在解码器中,在学习时和在生成时处理 Softmax 层的方式是不一样的。
- 在学习时,因为已经知道正确解,所以可以整体地输入时序方向上的数据。相对地,在推理时,则只能输入第 1 个通知开始的分隔符(本次为“_”)。然后,基于输出采样 1 个字符,并将这个采样出来的字符作为下一个输入,如此重复该过程。
三、seq2seq的改进
反转输入数据(Reverse):(镜面反转)
直观上,反转数据后梯度的传播可以更平滑。
因为通过反转,输入语句的开始部分和对应的转换后的单词之间的距离变近,所以梯度的传播变得更容易,学习效率也更高。
偷窥(Peeky):
解码器的唯一信息来源是h,但是,当前的 seq2seq 只有最开始时刻的 LSTM 层利用了 h。
所以,我们可以将这个集中了重要信息的编码器的输出 h 分配给解码器的其他层。
例如,将编码器的输出 h 分配给所有时刻的 Affine 层和LSTM 层。
下一章利用 Attention 技术对seq2seq进行大幅度的改进。
本章小结
- 基于 RNN 的语言模型可以生成新的文本
- 在进行文本生成时,重复“输入一个单词(字符),基于模型的输出(概率分布)进行采样”这一过程
- 通过组合两个 RNN,可以将一个时序数据转换为另一个时序数据(seq2seq)
- 在 seq2seq 中,编码器对输入语句进行编码,解码器接收并解码这个编码信息,获得目标输出语句
- 反转输入语句(Reverse)和将编码信息分配给解码器的多个层(Peeky)可以有效提高 seq2seq 的精度
- seq2seq 可以用在机器翻译、聊天机器人和自动图像描述等各种各样的应用中
Ch8 Attention
一、Attention的结构
基于 Attention 机制,seq2seq 可以像我们人类一样,将“注意力”集中在必要的信息上。
seq2seq存在的问题:
- 固定长度的向量:无论输入语句多长,编码器都将其塞入固定长度的向量中。编码器的输出的长度应该根据输入文本的长度相应地改变。
改进:
编码器:
使用各个时刻(各个单词)的隐藏状态向量,可以获得和输入的单词数相同数量的向量。编码器输出的 hs 矩阵就可以视为各个单词对应的向量集合。
解码器:
上一章的解码器只用了编码器的 LSTM 层的最后的隐藏状态。
我们的目标是仅关注必要的信息,并根据该信息进行时序转换。这个机制称为 Attention。
新增一个进行“某种计算”的层。这个“某种计算”接收(解码器)各个时刻的 LSTM 层的隐藏状态和编码器的 hs。同时,与之前一样,编码器的最后的隐藏状态向量传递给解码器最初的 LSTM 层。
某种计算,用于从 hs中选出与各个时刻解码器输出的单词有对应关系的单词向量。如何选择?
先对各个单词计算表示重要度的权重,然后,计算这个表示各个单词重要度的权重和单词向量 hs 的加权和,可以获得目标向量,我们称为上下文向量。
各个单词的权重 a 的求解方法:
将h分别与hs的行向量做内积,计算相似度,并利用softmax进行正规化。相似度越高,表示重要度越大。
由此,Attention的核心即,关注编码器传递的信息 hs 中的重要元素,基于它算出上下文向量,再传递给上一层。
二、关于Attention的其他话题
1.双向 LSTM
对于翻译问题,我们既可以从左向右读取文本,也可以从右向左读取文本。为此,可以让 LSTM 从两个方向进行处理,这就是名为双向 LSTM 的技术。
双向 LSTM 在之前的 LSTM 层上添加了一个反方向处理的 LSTM 层,然后,拼接各个时刻的两个 LSTM 层的隐藏状态,将其作为最后的隐藏状态向量。这样一来,这些向量就编码了更均衡的信息。
2.加深层
例如,将编码器和解码器使用 3 层 LSTM 层。
在加深层时使用到的另一个重要技巧是残差连接,就是指“跨层连接”。此时,在残差连接的连接处,有两个输出被相加。因为加法在反向传播时“按原样”传播梯度,所以残差连接中的梯度可以不受任何影响地传播到前一个层。这样一来,即便加深了层,梯度也能正常传播,而不会发生梯度消失(或者梯度爆炸),学习可以顺利进行。
对于深度方向上的梯度消失,这里介绍的残差连接很有效。
本章小结
- 在翻译、语音识别等将一个时序数据转换为另一个时序数据的任务中,时序数据之间常常存在对应关系
- Attention 从数据中学习两个时序数据之间的对应关系
- Attention 使用向量内积(方法之一)计算向量之间的相似度,并输出这个相似度的加权和向量
- 因为 Attention 中使用的运算是可微分的,所以可以基于误差反向传播法进行学习
- 通过将 Attention 计算出的权重(概率)可视化,可以观察输入与输出之间的对应关系
- 在基于外部存储装置扩展神经网络的研究示例中,Attention 被用来读写内存