导图社区 深度学习理论知识
部分内容被折叠,总计包含1216个模块。基于斎藤康毅的两本书《深度学习入门:基于Python的理论与实现》和《深度学习进阶:自然语言处理 作者:[日] 斋藤康毅 译者:陆宇杰》。这是我读过最适合深度学习入门的书,在学习李牧的《动手学深度学习》前强烈推荐!里面的内容不需要任何基础,都是从零开始讲,高中生也能看懂。
编辑于2024-02-04 00:57:48部分内容被折叠,总计包含1216个模块。基于斎藤康毅的两本书《深度学习入门:基于Python的理论与实现》和《深度学习进阶:自然语言处理 作者:[日] 斋藤康毅 译者:陆宇杰》。这是我读过最适合深度学习入门的书,在学习李牧的《动手学深度学习》前强烈推荐!里面的内容不需要任何基础,都是从零开始讲,高中生也能看懂。
人类历史上的重大战役,总结了汉匈战争、 大唐雄师扬威西域、悠悠两宋、大梦初醒,知耻后勇、 第一次世界大战等。
详细介绍了传统计算机视觉的方法,包含数字图像处理基础知识、图像复原、 图像压缩、图像分割等,常用于对图像的预处理。希望对你有所帮助!
社区模板帮助中心,点此进入>>
部分内容被折叠,总计包含1216个模块。基于斎藤康毅的两本书《深度学习入门:基于Python的理论与实现》和《深度学习进阶:自然语言处理 作者:[日] 斋藤康毅 译者:陆宇杰》。这是我读过最适合深度学习入门的书,在学习李牧的《动手学深度学习》前强烈推荐!里面的内容不需要任何基础,都是从零开始讲,高中生也能看懂。
人类历史上的重大战役,总结了汉匈战争、 大唐雄师扬威西域、悠悠两宋、大梦初醒,知耻后勇、 第一次世界大战等。
详细介绍了传统计算机视觉的方法,包含数字图像处理基础知识、图像复原、 图像压缩、图像分割等,常用于对图像的预处理。希望对你有所帮助!
深度学习理论知识
绪论
基础概念
深度学习问题是一个机器学习问题,指从有限样例中,通过算法总结出一般性的规律,并可以应用到新的未知数据上。
和传统的机器学习不同,深度学习采用的模型一般比较复杂
样本的原始输入到输出目标之间的数据流经过多个线性或非线性的组件。每个组件都会对信息进行加工,并进而影响后续的组件。
当我们最后得到输出结果时,我们并不清楚其中每个组件的贡献是多少。这个问题叫做贡献度 分配问题。
贡献度分配问题也经常翻译为信用分配问题或功劳分配问题。
贡献度分配问题是一个很关键的问题,这关系到如何学习每个组件中的参数。
目前可以比较好解决贡献度分配问题的模型是人工神经网络(ANN)
神经网络和深度学习并不等价。深度学习可以采用神经网络模型,也可以采用其它模型(比如深度信念网络是一种概率图模型)。
人工智能
AI基本概念
智能的概念
自然智能
定义
指人类和一些动物所具有的之力和行为能力
人类的自然智能
只人类在认识客观世界中,由思维过程和脑力活动所表现的综合能力
智能的不同观点和层次结构
观点
思维理论
智能来源于思维活动
知识阈值理论
智能取决于可运用的知识
进化理论
智能可由逐步进化来实现
层次结构
智能包含的特征能力
感知能力
记忆和思维能力
学习和自适应能力
行为能力
人工智能的概念
解释
用人工的方法在机器上实现智能
研究如何构造智能机器或系统,模拟延伸扩展人工智能
图灵测试
AI研究的基本内容
人工智能的学科位置
自然科学和社会科学的交叉
核心:思维与智能
基础学科:数学、思维科学、计算机
与脑学科和认知科学的交叉研究
智能模拟的方法和技术研究
机器感知
视觉
听觉
机器思维
机器学习
机器行为
领域分类
感知:即模拟人的感知能力,对外部刺激信息(视觉和语音等)进行感知和加工。主要研究领域包括语音信息处理和计算机视觉等。
学习:即模拟人的学习能力,主要研究如何从样例或与环境交互中进行学习。主要研究领域包括监督学习、无监督学习和强化学习等。
认知:即模拟人的认知能力,主要研究领域包括知识表示、自然语言理解、推理、规划、决策等。
历史
AI研究的不同学派
符号主义
符号主义(symbolism),又称逻辑主义、心理学派或计算机学派。通过分析人类智能的功能,然后通过计算机来实现这些功能。
基本假设
信息可以用符号来表示
符号可以通过显式的规则(比如逻辑运算)来操作
人类的认知过程可以看作是符号操作过程。在人工智能的推理期和知识期,符号主义的方法比较盛行,并取得了大量的成果。
连接主义
连接主义(connectionism),又称仿生学派或生理学派,是认知科学领域中的一类信息处理的方法和理论。
在认知科学领域,人类的认知过程可以看做是一种信息处理过程。连接主义认为人类的认知过程是由大量简单神经元构成的神经网络中的信息处理过程,而不是符号运算。
因此,联结主义模型的主要结构是由大量的简单的信息处理单元组成的互联网络,具有非线性、分布式、并行化、局部性计算以及适应性等特性。
行为主义
行为主义认为人工智能源于控制论。
除了深度学习以外,目前机器学习领域中还有另外一项振奋人心的技术,强化学习。
让一个智能体(Agent)不断的采取不同的行动(Action), 改变自己的状态(State),和环境(Enviroment)进行交互,从而获得不同的奖励(Reward),我们只需要设计出合适的奖励(Reward)规则,智能体就能在不断的试错中习得合适的策略。
神经网络
大脑神经网络
人工神经网络
神经网络的发展历史
模型提出
1943~1969 年,是神经网络发展的第一个高潮期。在此期间,科学家们提出了许多神经元模型和学习规则。
在1943年,心理学家Warren McCulloch和数学家Walter Pitts最早描述了一种理想化的人工神经网络,并构建了一种基于简单逻辑运算的计算机制。他们提出的神经网络模型称为MP模型。
冰河期
1969年~1983年,为神经网络发展的第一个低 谷期。在此期间,神经网络的研究处于长年停滞及低潮状态。
1969年,Marvin Minsky出版《感知机》一书,指出了神经网络的两个关键缺陷:第一个是感知机无法处理异或回路问题;第二个是当时的计算机无法支持处理大型神经网络所需要计算能力。
1974 年,哈佛大学的 Paul Webos 发明反向传播算法(Backpropagation,BP),但当时未受到应有的重视。
反向传播算法引起的复兴
1983年~1995年。反向传播算法重新激发了人们对神经网络的兴趣。
加州理工学院的物理学家John Hopfield提出了一种用于联想记忆和优化计算的神经网络,称为Hopfield网络。Hopfield网络在旅行商问题上获得当时最好结果,并引起了轰动。
David Rumelhart和James McClelland对于连接主义在计算机模拟神经活动中的应用提供了全面的论述,并重新发明了反向传播算法。
流行度降低
1995年~2006年。支持向量机和其他更简单的方法(例如线性分类器)在机器学习领域的流行度逐渐超过了神经网络。
深度学习的崛起
2006年~现在。多层前馈神经网络可以先通过逐层预训练,再用反向传播算法进行精调的方式进 行有效学习。
机器学习
数据预处理
经过数据的预处理,如去除噪声等。比如在文本分类中,去除停用词等
特征提取
从原始数据中提取一些有效的特征。比如在图像分类中,提取边缘、尺度不变特征变换(Scale Invariant Feature Transform,SIFT)特征等
特征转换
对特征进行一定的加工,比如降维和升维。降维包括特征抽取(Feature Extraction)和特征选择(Feature Selection)两种途径。常用的特征转换方法有主成分分析(Principal components analysis,PCA)、线性判别分析(Linear Discriminant Analysis)等
预测
机器学习的核心部分,通过一个函数进行预测
表示学习
为了提高机器学习系统的准确率,将输入信息转换为有效的特征
如果有一种算法可以自动地学习出有效的特征,并提高最终机器学习模型的性能,那么这种学习就是可以叫做表示学习(Representation Learning)。
表示方法
局部表示
一种表示颜色的方式是以不同名字来命名不同的颜色
维度高且不能扩展,不同颜色之间的相似度都为0
分布式表示
RGB值来表示颜色
要学习到一种好的高层语义表示(一般为分布式表示),通常需要从底层特征开始,经过多步非线性转换才能得到。
深度学习
步骤
贡献度分配问题
和“浅层学习”不同,深度学习需要解决的关键问题是贡献度分配问题
以下围棋为例,每当下完一盘棋,最后的结果要么赢要么输。我们会思考哪几步棋导致了最后的胜利,而又是哪几步棋导致了最后的败局。如何判断每一步棋的贡献就是贡献度分配问题,这也是一个非常困难的问题。
某种意义上讲,深度学习也可以看作是一种强化学习(Reinforcement Learning,RL),每个内部组件并不能直接得到监督信息,需要通过整个模型的最终监督信息(奖励)得到,并且有一定的延时性。
神经网络模型可以使用误差反向传播算法,从而可以比较好地解决贡献度分配问题。
端到端学习
传统学习方式
在一些复杂任务中,传统机器学习方法需要将一个任务的输入和输出之间人为地切割成很多子模块(或多个阶段),每个子模块分开学习。
比如一个自然语言理解任务,一般需要分词、词性标注、句法分析、语义分析、语义推理等步骤。
这种学习方式有两个问题
一是每一个模块都需要单独优化,并且其优化目标和任务总体目标并不能保证一致。
二是错误传播,即前一步的错误会对后续的模型造成很大的影响。这样就增加了机器学习方法在实际应用的难度。
新型学习方式
端到端学习(End-to-End Learning),也称端到端训练,是指在学习过程中不进行分模块或分阶段进行训练,直接优化任务的总体目标。
一般不需要明确地给出不同模块或阶段的功能,中间过程不需要人为干预。
大部分采用神经网络模型的深度学习也可以看作是一种端到端的学习。
常用的深度学习框架
Theano:蒙特利尔大学的Python工具包,用来高效地定义、优化和执行 Theano 项目目前已停止维护。 多维数组数据对应数学表达式。Theano 可以透明的使用 GPUs 和高效的符号 微分。
Caffe:全称为 Convolutional Architecture for Fast Feature Embedding,是一个卷积网络模型的计算框架,所要实现的网络结构可以在配置文件中指定,不需要编码。Caffe是用C++和Python实现,主要用于计算机视觉。
TensorFlow:Google公司开发的Python工具包,可以在任意具备CPU或者GPU的设备上运行。TensorFlow的计算过程使用数据流图来表示。TensorFlow的名字来源于其计算过程中的操作对象为多维数组,即张量(tensor)。
Chainer:一个最早采用动态计算图的神经网络框架,其核心开发团队为来自日本的一家机器学习创业公司Preferred Networks。和Tensorflow、Theano、Caffe等框架使用的静态计算图相比,动态计算图可以在运行时动态地构建计算图,因此非常很适合进行一些复杂的决策或推理任务
PyTorch5:由Facebook、NVIDIA、Twitter等公司开发维护的深度学习框架,其前身为Lua语言的Torch6。PyTorch也是基于动态计算图的框架,在需要动态改变神经网络结构的任务中有着明显的优势。
本书的组织结构
感知机
感知机是具有输入和输出的算法。给定一个输入后,将输出一个既定的值。
感知机将权重和偏置设定为参数
使用感知机可以表示与门和或门等逻辑电路。
异或门无法通过单层感知机来表示。
使用2层感知机可以表示异或门
单层感知机只能表示线性空间,而多层感知机可以表示非线性空间。
2层感知机(在理论上)就可以表示计算机。
神经网络
感知机和神经网络
“朴素感知机”是指单层网络,指使用阶跃函数这个激活函数的模型。
“多层感知机”是指神经网络,即使用sigmoid函数或ReLU函数等平滑的激活函数的多层网络。
运算:神经网络的内积
Y = np.dot(X, W)
通过使用矩阵运算,可以高效地实现神经网络。
Affine层
神经网络的正向传播中进行的矩阵的乘积运算在几何学领域被称为“仿射变换”
仿射变换包括一次线性变换和一次平移,分别对应神经网络的加权和运算与加偏置运算。
Y = sigmoid(Y)
输出层
激活函数:回归问题用恒等函数,分类问题用softmax函数
恒等函数
输入信号会原封不动地被输出
softmax函数
假设输出层共有n个神经元,计算第k个神经元的输出yk。
特点:输出层的输出值总和为1
注意:溢出问题
数量
分类问题
一般设定为类别的数量
手写数字识别
输入层有28*28=784个神经元,输出层有10个神经元。还有两个隐藏层,神经元数量可以为任意值
批处理
一次输入多组数据
神经网络的学习
损失函数
引入概念
寻找最优参数(权重和偏置)时,要寻找使损失函数的值尽可能小的参数,所以要计算参数的导数(确切地讲是梯度)
为什么不直接以识别精度作为指标
参数的导数在绝大多数地方都会变为0
作为激活函数的阶跃函数也有同样的情况
类型
均方误差
交叉熵误差
mini-batch
抽一部分测试数据出来
梯度
由全部变量的偏导数汇总而成的向量称为梯度
梯度指示的方向是各点处的函数值减小最多的方向
超参数
人工设定
学习率n
minibatch的大小
更新次数iters_num
训练获得
权重w和偏置theta
神经网络
损失函数关于权重参数的梯度
epoch
循环次数/minibatch的大小
随机梯度下降法(SGD)
对随机选择的数据进行梯度下降
误差反向传播法
数值微分虽然简单,也容易实现,但缺点是计算上比较费时间。有一种能够高效计算权重参数的梯度的方法:误差反向传播法
计算图
通过使用计算图,可以直观地把握计算过程
计算图的正向传播进行一般的计算。通过计算图的反向传播,可以计算各个节点的导数
第l层的误差项可以通过第l+ 1层的误差项计算 得到,这就是误差的反向传播。
公式
计算
黄色的量是反向传播时得到的值
绿色的量是已知量
通过将神经网络的组成元素实现为层,可以高效地计算梯度
通过比较数值微分和误差反向传播法得到的结果,可以确认误差反向传播法的实现是否正确(梯度确认)
参考视频
https://www.bilibili.com/video/BV1LM411J7cW/?spm_id_from=333.788&vd_source=048c7bdfe54313b8b3ee1483d9d07e38
卷积神经网络
一切都应该尽可能地简单,但不能过于简单。 [艾伯特·爱因斯坦]
整体结构
对比
基于全连接层(Affine层)的网络
基于CNN的网络
链接顺序
Convolution[卷积层]-ReLU-(Pooling[池化层])
靠近输出的层使用了之前的Affine[仿射变换] - ReLU组合
最后输出层使用了之前的Affine - Softmax组合
卷积层
卷积概念
全连接层存在的问题
数据的形状被“忽视”了,图像通常是高、长、通道方向上的3维形状,但在输入时需要将3维数据拉平为1维数据
图像是3维形状,这个形状中应该含有重要的空间信息。
空间上邻近的像素为相似的值
RBG的各个通道之间分别有密切的关联性
相距较远的像素之间没有什么关联
而卷积层可以保持形状不变
定义
卷积层的输入输出数据称为特征图
卷积层的输入数据称为输入特征图
输出数据称为输出特征图
卷积运算
卷积运算相当于图像处理中的滤波器运算
卷积的主要功能是在一个图像(或某种特征)上滑动一个卷积核(即滤波器),通过卷积操作得到一组新的特征。
二维
给定一个图像 X ∈ R(M×N),和滤波器 W ∈ R (m×n),一般m << M, n << N,其卷积为
三维
互相关
在计算卷积的过程中,往往需要进行卷积核翻转
翻转就是从两个维度(从上到下、从左到右)颠倒次序,即旋转180度。
具体实现上,以互相关操作来代替卷积,从而会减少一些不必要的操作或开销。
互相关(Cross-Correlation)是一个衡量两个序列相关性的函数,通常是用滑动窗口的点积计算来实现。
给定一个图像X ∈ R(M×N)和卷积核W ∈ R (m×n),它们的互相关为
互相关和卷积的区别仅仅是在于卷积核否进行翻转。互相关也可以称为不翻转卷积。
在神经网络中使用卷积是为了进行特征抽取,卷积核是否进行翻转和其特征抽取的能力无关。特别是当卷积核是可学习的参数时,卷积和互相关是等价的。
卷积的变种
零填充
为了保持空间大小不变,需要对输入数据填充
步幅
应用滤波器的位置间隔称为步幅
常用的卷积
窄卷积(Narrow Convolution):步长s = 1,两端不补零p = 0,卷积后输出长度为n − m + 1。
宽卷积(Wide Convolution):步长s = 1,两端补零p = m − 1,卷积后输出长度n + m − 1。
等宽卷积(Equal-Width Convolution):步长s = 1,两端补零p = (m −1)/2,卷积后输出长度n。
卷积的数学性质
3维数据的卷积运算
输入数据和滤波器的通道数要设为相同的值
多个卷积运算
关于卷积运算的滤波器,也必须考虑滤波器的数量。因此,作为4维数据,滤波器的权重数据要按(output_channel, input_channel, height, width)的顺序书写。比如,通道数为3、大小为5 × 5的滤波器有20个时,可以写成(20, 3, 5, 5)。
批处理
我们希望卷积运算也同样对应批处理。为此,需要将在各层间传递的数据保存为4维数据。具体地讲,就是按(batch_num, channel, height, width)的顺序保存数据。
卷积层的性质
局部连接:在卷积层(假设是第l 层)中的每一个神经元都只和下一层(第l − 1层)中某个局部窗口内的神经元相连,构成一个局部连接网络。卷积层和下一层之间的连接数大大减少,由原来的n(l) × n(l - 1)个连接变为n(l) × m个连接。m为滤波器大小。
权重共享:作为参数的滤波器w(l)对于第l层的所有的神经元都是相同的。
由于局部连接和权重共享,卷积层的参数只有一个m维的权重w(l) 和1维的偏置b(l),共m + 1个参数。
第l 层的神经元个数不是任意选择的,而是满足n(l) = n(l−1) − m + 1。
池化层
也叫汇聚层,子采样层
池化是特征选择,降低特征数量,并从而减少参数数量,降低特征维度,缩小高、长方向上的空间。
常用的汇聚函数
最大汇聚(Maximum):一般是取一个区域内所有神经元的最大值。
平均汇聚(Mean):一般是取区域内所有神经元的平均值。
典型的汇聚层是将每个特征映射划分为2×2大小的不重叠区域,然后使用最大汇聚的方式进行下采样。
汇聚层也可以看做是一个特殊的卷积层
早期的一些卷积网络(比如LeNet-5)中,有时也会在汇聚层使用非线性激活函数
其中Y(′d) 为汇聚层的输出,f(·)为非线性激活函数,w(d) 和b(d) 为可学习的标量权重和偏置。
池化层的特征
没有要学习的参数
通道数不发生变化
对微小的位置变化具有鲁棒性(健壮性)
参数学习
误差项的计算
CNN的可视化
第1层权重的可视化
学习前的滤波器是随机进行初始化的,所以在黑白的浓淡上没有规律可循,但学习后的滤波器变成了有规律的图像。我们发现,通过学习,滤波器被更新成了有规律的滤波器,比如从白到黑渐变的滤波器、含有块状区域(称为blob)的滤波器等。对水平方向上和垂直方向上的边缘有响应的滤波器
由此可知,卷积层的滤波器会提取边缘或斑块等原始信息。而刚才实现的CNN会将这些原始信息传递给后面的层。
基于分层结构的信息提取
CNN的卷积层中提取的信息。第1层的神经元对边缘或斑块有响应,第3层对纹理有响应,第5层对物体部件有响应,最后的全连接层对物体的类别(狗或车)有响应
如果堆叠了多层卷积层,则随着层次加深,提取的信息也愈加复杂、抽象,这是深度学习中很有意思的一个地方。随着层次加深,神经元从简单的形状向“高级”信息变化。换句话说,就像我们理解东西的“含义”一样,响应的对象在逐渐变化。
典型的卷积神经网络
LeNet-5
LeNet在1998年被提出,是进行手写数字识别的网络。它有连续的卷积层和池化层,最后经全连接层输出结果。
不计输入层,LeNet-5共有7层
输入层:输入图像大小为32 × 32 = 1024。
卷积层:使用6个5 × 5的滤波器,得到6组大小为28 × 28 = 784的特征映射。因此,C1层的神经元数量为6 × 784 = 4704,可训练参数数量为6 × 25 + 6 = 156,连接数为156 × 784 = 122304(包括偏置在内,下同)。
汇聚层:采样窗口为2×2,使用平均汇聚,并使用一个非线性函数。神经元个数为 6 × 14 × 14 = 1176,可训练参数数量为6 × (1 + 1) = 12,连接数为6 × 196 × (4 + 1) = 5, 880。
卷积层。LeNet-5中用一个连接表来定义输入和输出特征映射之间的依赖关系,如图所示,共使用60个5 × 5的滤波器,得到16组大小为10 × 10的特征映射。神经元数量为16 × 100 = 1, 600,可训练参数数量为(60 × 25) + 16 = 1, 516,连接数为100 × 1, 516 = 151, 600。
汇聚层,采样窗口为2 × 2,得到16个5 × 5大小的特征映射,可训练参数数量为16 × 2 = 32,连接数为16 × 25 × (4 + 1) = 2000。
个卷积层,使用120 × 16 = 1, 920个5 × 5的滤波器,得到120组大小为1 × 1的特征映射。C5层的神经元数量为120,可训练参数数量为1, 920 × 25 + 120 = 48120,连接数为120 × (16 × 25 + 1) = 48120。
全连接层,有84个神经元,可训练参数数量为84×(120+1) =10164。连接数和可训练参数个数相同,为10164。
输出层:输出层由10个欧氏径向基函数
连接表
卷积层的输入和输出特征映射之间的全连接关系不是必须的,可以采用非共享卷积
定义一个连接表(Link Table)T 来描述输入和输出特征映射之间的连接关系。
如果第p个输出特征映射依赖于第d个输入特征映射,则Tp,d = 1,否则为0。
AlexNet
2012年被提出,使用了很多现代深度卷积网络的一些技术方法
使用 GPU 进行并行训练
激活函数使用ReLU
使用Dropout,防止过拟合
使用数据增强来提高模型准确率
使用进行局部正规化的LRN(Local Response Normalization)层
Inception 网络
Inception模块:一个卷积层包含多个不同大小的卷积操作
Inception网络是由有多个inception模块和少量的汇聚层堆叠而成。
V1版本
Inception 网络最早的 v1 版本就是非常著名的 GoogLeNet [Szegedy et al.,2015],并赢得了2014年ImageNet图像分类竞赛的冠军。
残差网络ResNet
通过给非线性的卷积层增加直连边的方式来提高信息的传播效率。
非线性单元
可以为一层或多层的卷积层
让这个非线性单元f(x, θ)去逼近一个目标函数为h(x)
一个由神经网络构成的非线性单元有足够的能力来近似逼近原始目标函数或残差函数,但实际中后者更容易学习
结论:让非线性单元f(x, θ)去近似残差函数h(x)−x,并用f(x, θ) + x去逼近h(x)。
残差网络就是将很多个残差单元串联起来构成的一个非常深的网络。
其他卷积方式
转置卷积
空洞卷积(膨胀卷积)
深度学习
加深网络
向更深的网络出发
这个网络参考了下一节要介绍的VGG
基于3×3的小型滤波器的卷积层
激活函数是ReLU
全连接层的后面使用Dropout层
基于Adam的最优化
使用He初始值作为权重初始值
识别精度为99.38%
进一步提高识别精度
集成学习
学习率衰减
Data Augmentation(数据扩充)
通过施加旋转、垂直或水平方向的移动、裁剪、翻转、增加亮度等微小变化,增加图像的数量
加深层的动机
提高识别性能
从以ILSVRC为代表的大规模图像识别的比赛结果中可以看出加深层的重要性。这种比赛的结果显示,最近前几名的方法多是基于深度学习的,并且有逐渐加深网络的层的趋势。也就是说,可以看到层越深,识别性能也越高。
减少网络的参数数量
叠加小型滤波器来加深网络的好处是可以减少参数的数量,扩大感受野(receptive field,给神经元施加变化的某个局部空间区域)。并且,通过叠加层,将 ReLU等激活函数夹在卷积层的中间,进一步提高了网络的表现力。这是因为向网络添加了基于激活函数的“非线性”表现力,通过非线性函数的叠加,可以表现更加复杂的东西。
使学习更加高效
与没有加深层的网络相比,通过加深层,可以减少学习数据,从而高效地进行学习。
深度学习网络结构
ILSVRC比赛
ImageNet,它包含了各种各样的图像,并且每张图像都被关联了标签(类别名)。每年都会举办使用这个巨大数据集的ILSVRC图像识别大赛。
2012年举办的大规模图像识别大赛ILSVRC。在那年的比赛中,基于深度学习的方法(通称AlexNet)以压倒性的优势胜出,彻底颠覆了以往的图像识别方法。在之后的比赛中,深度学习一直活跃在舞台中央。
特别是2015年的ResNet(一个超过150层的深度网络)将错误识别率降低到了3.5%。据说这个结果甚至超过了普通人的识别能力。
VGG
VGG是由卷积层和池化层构成的基础的CNN。不过它的特点在于将有权重的层(卷积层或者全连接层)叠加至16层(或者19层),具备了深度(根据层的深度,有时也称为“VGG16”或“VGG19”)。
GoogLeNet
网络不仅在纵向上有深度,在横向上也有广度,被称为Inception结构
ResNet
具有比以前的网络更深的结构
我们已经知道加深层对于提升性能很重要。但是,在深度学习中,过度加深层的话,很多情况下学习将不能顺利进行,导致最终性能不佳。ResNet中,为了解决这类问题,导入了“快捷结构”(也称为“捷径”或“小路”)。导入这个快捷结构后,就可以随着层的加深而不断提高性能了(当然,层的加深也是有限度的)。
实践中经常会灵活应用使用ImageNet这个巨大的数据集学习到的权重数据,这称为迁移学习,将学习完的权重(的一部分)复制到其他神经网络,进行再学习(fine tuning)。比如,准备一个和 VGG相同结构的网络,把学习完的权重作为初始值,以新数据集为对象,进行再学习。迁移学习在手头数据集较少时非常有效。
深度学习的高速化
需要努力解决的问题
AlexNet的forward处理中各层的时间比:左边是使用GPU的情况,右边是使用CPU的情况。图中的“conv”对应卷积层,“pool”对应池化层,“fc”对应全连接层,“norm”对应正规化层
卷积层的处理时间加起来占GPU整体的95%,占CPU整体的89%
基于GPU的高速化
GPU主要由NVIDIA和AMD两家公司提供。虽然两家的GPU都可以用于通用的数值计算,但与深度学习比较“亲近”的是NVIDIA的GPU。实际上,大多数深度学习框架只受益于NVIDIA的GPU。这是因为深度学习的框架中使用了NVIDIA提供的CUDA这个面向GPU计算的综合开发环境。
分布式学习
在多个GPU或者多台机器上进行分布式计算
Google的TensorFlow、微软的CNTK在开发过程中高度重视分布式学习
横轴是GPU的个数 纵轴是与单个GPU相比时的高速化率
运算精度的位数缩减
关于数值精度(用几位数据表示数值),我们已经知道深度学习并不那么需要数值精度的位数。这是神经网络的一个重要性质。这个性质是基于神经网络的健壮性而产生的。
今后半精度浮点数将被作为标准使用,有望实现超过上一代 GPU约 2倍的高速化
深度学习的应用案例
物体检测
从图像中确定物体的种类和物体的位置
在使用CNN进行物体检测的方法中,有一个叫作R-CNN的方法
图像分割
在像素水平上对图像进行分类
FCN通过一次forward处理,对所有像素分类
FCN的字面意思是“全部由卷积层构成的网络”。相对于一般的CNN包含全连接层,FCN将全连接层替换成发挥相同作用的卷积层。
图像标题的生成
一个基于深度学习生成图像标题的代表性方法是被称为NIC
NIC由深层的CNN和处理自然语言的RNN(Recurrent Neural Network)构成
深度学习的未来
图像风格变换
图像的生成
自动驾驶
强化学习
自然语言和单词的分布式表示
Marty: “This is heavy(棘手).” Dr. Brown: “In the future, things are so heavy(重)?” —电影《回到未来》
什么是自然语言处理
我们的语言是由文字构成的,而语言的含义是由单词构成的。换句话说,单词是含义的最小单位。
让计算机理解单词含义的三种方法
基于同义词词典的方法
基于计数的方法
基于推理的方法(word2vec)
基于同义词词典的方法
考虑通过人工方式来定义单词含义
目前被广泛使用的是同义词词典
根据各单词的含义,基于上位-下位关系的图
WordNet
最著名的同义词词典
作用
获得单词的近义词
计算单词之间的相似度
通过NLTK模块使用
存在的问题
新词不断出现,难以顺应时代变化
人力成本高
无法表示单词的微妙差异
基于计数的方法
语料库
语料库就是大量的文本数据
自然语言处理领域中使用的语料库有时会给文本数据添加额外的信息。比如,可以给文本数据的各个单词标记词性。这里,假定我们使用的语料库没有添加标签。
基于 Python的语料库的预处理
著名的语料库
Wikipedia 和 Google News
预处理
大写 -> 小写
text.lower()
处理标点
text.replace('.', ' .')
re.split('(\W+)', text)
\W:匹配非单词字符(非字母、数字或下划线)
+:表示匹配前面的模式「\W」重复一次或多次
创建单词 ID 和对应表
将单词列表转化为单词 ID 列表
corpus = [word_to_id[w] for w in words]
单词的分布式表示
在单词领域构建紧凑合理的向量表示
分布式假设
某个单词的含义由它周围的单词形成
上下文是指某个居中单词的周围词汇
上下文的大小称为窗口大小
窗口大小为 1,上下文包含左右各 1 个单词
共现矩阵
向量最简单的方法是对它的周围出现了多少次什么单词进行计数
text = 'You say goodbye and I say hello.'
将窗口大小设为 1
向量间的相似度
余弦相似度
相似单词的排序
取出查询词的单词向量
分别求得查询词的单词向量和其他所有单词向量的余弦相似度
基于余弦相似度的结果,按降序显示它们的值
基于计数的方法的改进
点互信息
在共现矩阵中,像 the 这种常用词,会被认为与 car 这种名词有很强的相关性
PMI
,P(x) 表示 x 发生的概率,P(y) 表示 y 发生的概率,P(x, y) 表示 x和 y 同时发生的概率。
基于共现矩阵的PMI
不足
当两个单词的共现次数为 0 时,log(2)(0) = −∞
正的点互信息
根据共现矩阵得出PPMI矩阵
降维
我们要观察数据的分布,并发现重要的“轴”
奇异值分解(SVD)
SVD 将任意矩阵分解为 3 个矩阵的乘积
其中 U 和 V 是列向量彼此正交的正交矩阵,S 是除了对角线元素以外其余元素均为 0 的对角矩阵
可以通过去除矩阵 U 中的多余的列向量来近似原始矩阵
U, S, V = np.linalg.svd(W)
如果矩阵大小是 N*N,SVD 的计算的复杂度将达到 O(N^3)。所以往往会使用Truncated SVD等更快的方法。Truncated SVD 通过截去奇异值较小的部分,从而实现高速化。
from sklearn.utils.extmath import randomized_svd U, S, V = randomized_svd(W, n_components=wordvec_size, n_iter=5, random_state=None)
PTB数据集
PTB 语料库经常被用作评价提案方法的基准
PTB 语料库做的预处理
括将稀有单词替换成特殊字符 <unk>
将具体的数字替换成“N”
我做的预处理
将所有句子连接起来,并将其视为一个大的时序数据。此时,在每个句子的结尾处插入一个特殊字符 <eos>
超参数赋值
window_size = 2
wordvec_size = 100
基于 PTB数据集的评价
对于查询词 you,可以看到 i、we 等人称代词排在前面,这些都是在语法上具有相同用法的词。
查询词 year 有month、quarter 等近义词。
查询词 car 有 auto、vehicle 等近义词。
将 toyota 作为查询词时,出现了 nissan、honda 和 lexus 等汽车制造商名或者品牌名。
总结
使用语料库,计算上下文中的单词数量,将它们转化 PPMI 矩阵,再基于 SVD 降维获得好的单词向量
word2vec
“没有判断依据,就不要去推理。” ——阿瑟·柯南·道尔 《波希米亚丑闻》
词嵌入
Word2Vec是一种用于生成"词嵌入"的算法
除了Word2Vec之外,还有其他生成词嵌入的方法,例如 GloVe(Global Vectors for Word Representation)、FastText 等。这些方法可能使用不同的策略和算法,但它们的目标都是在向量空间中有效地捕捉词汇的语义信息。
基于推理的方法和神经网络
基于计数的方法的问题
在现实世界中,语料库处理的单词数量非常大。比如,据说英文的词汇量超过 100 万个。如果词汇量超过 100 万个,那么使用基于计数的方法就需要生成一个 100 万 × 100 万的庞大矩阵,但对如此庞大的矩阵执行 SVD 显然是不现实的。
基于推理的方法使用神经网络
在 mini-batch 数据上学习。也就是使用部分数据学习,反复更新权重。
神经网络的学习可以使用多台机器、多个 GPU 并行执行,从而加速整个学习过程。
基于推理的方法的概要
目标
当给出周围的单词(上下文)时,预测中间会出现什么单词,就像完形填空一样
推理方法
输入上下文,模型输出各个单词的出现概率
作为模型学习的产物,我们会得到单词的分布式表示
神经网络中单词的处理方法
把单词转换成向量
神经网络无法直接处理 you 或 say 这样的单词,要用神经网络处理单词,需要先将单词转化为固定长度的向量
转换方式
one-hot向量
只有一个元素是 1,其他元素都是 0
神经网络
输入层
全连接层
初始权重是随机的
简单的 word2vec
CBOW模型的推理
结构
特点
有两个输入层
从输入层到中间层的变换由相同的全连接层(权重为W(in))完成
从中间层到输出层神经元的变换由另一个全连接层(权重为 W(out))完成
中间层的神经元是各个输入层经全连接层变换后得到的值的“平均
输出层的神经元是各个单词的得分,它的值越 大,说明对应单词的出现概率就越高。
CBOW模型的学习
使用 Softmax 函数将得分转化为概率
求这些概率和监督标签之间的交叉熵误差
将其作为损失进行学习
word2vec的权重和分布式表示
W(in)权重就是我们要的单词的分布式表示
学习数据的准备
上下文和目标词
转化为one-hot表示
CBOW模型的实现
补充说明
CBOW模型和概率
在 wt−1 和 wt+1 发生后,wt 发生的概率
CBOW 模型的损失函数L(负对数似然)
skip-gram模型
word2vec 有两个模型
CBOW
skip-gram
skip-gram 是反转了 CBOW 模型处理的上下文和目标词的模型。
skip-gram网络结构图
skip-gram模型和概率
skip-gram 模型的输入层只有一个,输出层的数量则与上下文的单词个数相等。首先要分别求出各个输出层的损失然后将它们加起来作为最后的损失。
根据中间单词(目标词)wt 预测上下文 wt−1 和 wt+1 的情况
skip-gram 模型的损失函数可以表示为
损失函数对比
skip-gram 模型的预测次数和上下文单词数量一样多,所以它的损失函数需要求各个上下文单词对应的损失的总和。而CBOW模型只需要求目标词的损失。
从单词的分布式表示的准确度来看,在大多数情况下,skip-grm 模型的结果更好。
基于计数与基于推理
需要向词汇表添加新词并更新单词的分布式表示的场景
基于计数的方法需要从头开始计算
基于推理的方法允许参数的增量学习
单词的分布式表示的性质
基于计数的方法主要是编码单词的相似性
基于推理的方法可以理解复杂的单词之间的模式
kingman + woman = queen
单词的分布式表示的准确度
基于推理的方法和基于计数的方法难分上下
word2vec的高速化
不要企图无所不知,否则你将一无所知。 ——德谟克利特(古希腊哲学家)
改进
学习
其他
word2vec的应用
使用 word2vec 获得的单词的分布式表示可以用来查找近似单词
迁移学习
在某个领域学到的知识可以被应用于其他领域
在解决自然语言处理任务时,一般不会使用 word2vec 从零开始学习单词的分布式表示,而是先在大规模语料库(Wikipedia、Google News 等文本数据)上学习,然后将学习好的分布式表示应用于某个单独的任务。
在文本分类、文本聚类、词性标注和情感分析等自然语言处理任务中,第一步的单词向量化工作就可以使用学习好的单词的分布式表示。
在几乎所有类型的自然语言处理任务中,单词的分布式表示都有很好的效果!
使用单词的分布式表示,也可以将文档(单词序列)转化为固定长度的向量。
如果可以将自然语言转化为向量,就可以使用很多机器学习方法
单词向量的评价方法
人工创建的单词相似度评价集来评估
cat 和 animal 的相似度是 8,cat 和 car 的相似度是 2……类似这样,用 0 ~ 10 的分数人工地对单词之间的相似度打分。
比较人给出的分数和 word2vec 给出的余弦相似度,考察它们之间的相关性
结论
模型不同,精度不同(根据语料库选择最佳的模型)
语料库越大,结果越好(始终需要大数据)
单词向量的维数必须适中(太大会导致精度变差)
RNN
只记得我在一个昏暗潮湿的地方喵喵地哭泣着。 ——夏目漱石《我是猫》
概率和语言模型
单纯的前馈网络无法充分学习时序数据的性质。于是,RNN(Recurrent Neural Network,循环神经网络)便应运而生。
概率视角下的word2vec
CBOW 模型本来的目的“从上下文预测目标词”是否可以用来做些什么呢? P(wt|wt−2, wt−1) 是否可以在一些实际场景中发挥作用呢?
我们之前考虑的窗口都是左右对称的,之后我们只考虑左侧窗口
语言模型
使用概率来评估一个单词序列发生的可能性,即在多大程度上是自然的单词序列的概率
概率表示
其中P(A,B) = P(A|B)*P(B) = P(B|A)*P(A)
将CBOW模型用作语言模型
马尔科夫链
当某个事件的概率仅取决于其前面的 N 个事件时,称为“N 阶马尔可夫链”。
将上下文限定为左侧的 2 个单词就是2阶马尔科夫链
不足
如果窗口过短会导致不能结合上下文
如果窗口过长会导致忽视上下文中单词顺序
CBOW 是 Continuous Bag-Of-Words 的简称。Bag-Of-Words 是“一袋子单词”的意思,这意味着袋子中单词的顺序被忽视了。
RNN 具有一个机制,那就是无论上下文有多长,都能将上下文信息记住。因此,使用 RNN 可以处理任意长度的时序数据。
word2vec 是以获取单词的分布式表示为目的的方法,一般不会用于语言模型。
RNN
循环的神经网络
RNN层的结构
时刻 t 的输入是 xt,这暗示着时序数据 (x0, x1, ··· , xt, ···) 会被输入到层中。然后,以与输入对应的形式,输出 (h0, h1, ··· , ht, ···)
输出有两个分叉,这意味着同一个东西被复制了。输出中的一个分叉将成为其自身的输入。
展开循环
我们用“时刻”这个词表示时序数据的索引(也就是说时刻 t 的输入数据为 xt)。既使用“第 t 个单词”“第 t 个 RNN 层”这样的表述,也使用“时刻 t 的单词”或者“时刻 t 的 RNN 层”这样的表述。
各个时刻的 RNN 层接收两个值,分别是传给该层的输入和前一个RNN 层的输出
RNN 有两个权重,分别是将输入 x转化为输出 h 的权重 Wx 和将前一个 RNN 层的输出转化为当前时刻的输出的权重 Wh。此外,还有偏置 b。
从另一个角度看,RNN 具有状态h,通过上述公式不断更新状态。所以h可以被成为隐藏状态或隐藏状态向量
两种示意图画法是等价的
Backpropagation Through Time
基于时间的反向传播
要基于 BPTT 求梯度,必须在内存中保存各个时刻的 RNN 层的中间数据。因此,随着时序数据变长,计算机的内存使用量(不仅仅是计算量)也会增加。
Truncated BPTT
为了解决上面的问题,在处理长时序数据时,通常的做法是将网络连接截成适当的长度。
将时间轴方向上过长的网络在合适的位置进行截断,从而创建多个小型网络,然后对截出来的小型网络执行误差反向传播法,这个方法称为 Truncated BPTT(截断的 BPTT)。
在 Truncated BPTT 中,网络的反向传播的连接被截断,正向传播的连接依然被维持。
处理顺序
首先要做的是,将第 1 个块的输入数据 (x0, ... , x9) 输入 RNN 层。
先进行正向传播,再进行反向传播,这样可以得到所需的梯度。
接着,将下一个块的输入数据 (x10, x11, ··· , x19) 输入 RNN 层。这个正向传播的计算需要前一个块最后的隐藏状态 h9,这样可以维持正向传播的连接。
Truncated BPTT的mini-batch学习
在输入数据的开始位置,需要在各个批次中进行“偏移”。
注意
要按顺序输入数据
要平移各批次(各样本)输入数据的开始位置
RNN的实现
考虑到基于 Truncated BPTT 的学习,目标神经网络接收长度为 T 的时序数据(T 为任意值),可以将这T个状态视为一个层
将一次处理 T 步的层称为“Time RNN 层”
将进行 Time RNN 层中的单步处理的层称为“RNN 层”
像 Time RNN 这样,将整体处理时序数据的层以单词“Time”开头命名,这是本书中规定的命名规范。之后,我们还会实现 Time Affine 层、Time Embedding 层等
RNN层的实现
正向传播
反向传播
Time RNN层的实现
正向传播
Time RNN层将隐藏状态h保存在成员变量中,以在块之间继承隐藏状态
通过参数stateful来记录隐藏状态h是否调用。在反向传播中,当 stateful 为 False 时,第一个 RNN 层的隐藏状态是零矩阵。
反向传播
我们将流向上一时刻的隐藏状态的梯度存放在成员变量 dh 中。这是因为在第 7 章探讨 seq2seq(sequence-to-sequence,序列到序列)时会用到它
处理时序数据的层的实现
RNNLM的全貌图
将基于 RNN 的语言模型称为 RNNLM
结构
第 1 层是 Embedding 层,该层将单词 ID 转化为单词的分布式表示(单词向量)。这个单词向量被输入到 RNN 层。
RNN 层向下一层(上方)输出隐藏状态,同时也向下一时刻的 RNN 层(右侧)输出隐藏状态。
RNN 层向上方输出的隐藏状态经过 Affine 层,传给 Softmax 层。
样例
you say goodbye and i say hello
第 1 个单词,单词 ID 为 0 的 you 被输入。此时,查看 Softmax层输出的概率分布,可知 say 的概率最高,这表明正确预测出了 you 后面出现的单词为 say。
第 2 个单词 say。此时,Softmax 层的输出在 goodbye处和 hello 处概率较高。因为RNN层将“you say”这一过去的信息保存为了简短的隐藏状态向量。RNN 层的工作是将这个信息传送到上方的 Affine 层和下一时刻的 RNN 层。
Time层的实现
目标神经网络结构
Time Affine
Time Affine 层并不是单纯地使用 T 个Affine 层,而是使用矩阵运算实现了高效的整体处理。
Time Softmax
在 Softmax 中一并实现损失误差 Cross Entropy Error 层计算交叉熵误差
T 个Softmax with Loss 层各自算出损失,然后将它们加在一起取平均,将得到的值作为最终的损失。
RNNLM的学习和评价
RNNLM的实现
语言模型的评价
输入数据为1个
困惑度(perplexity)常被用作评价语言模型的预测性能的指标。困惑度=1/概率
输入数据为多个
这里,假设数据量为 N 个。tn 是 one-hot 向量形式的正确解标签,tnk 表示第 n 个数据的第 k 个值,ynk 表示概率分布(神经网络中的 Softmax 的输出)。顺便说一下,L 是神经网络的损失
概率越大越好,困惑度越小越好
困惑度表示下一个可以选择的选项的数量。如果困惑度是1.25,意味着下一个单词的候选个数是1个左右。
RNNLM的学习
RNNLM的Trainer类
把上述操作封装成了类
扩展到图结构
递归神经网络
有三个隐藏层h1、h2 和h3,其中h1 由两个输入x1 和 x2 计算得到,h2 由另外两个输入层 x3 和x4 计算得到,h3 由两个隐藏层h1 和h2 计算得到。
图网络
Gated RNN
卸下包袱,轻装上阵。 ——尼采
当我们说 RNN 时,更多的是指 LSTM 层,而不是上一章的 RNN当需要明确指上一章的 RNN 时,我们会说“简单RNN”或“Elman”。
简单RNN的问题
在学习的过程中,RNN 层通过向过去传递“有意义的梯度”,学习时间方向上的依赖关系。但学习的梯度很难控制,这会导致梯度消失或梯度爆炸
原因
激活函数
tanh
从图中可以看出,它的值小于1.0,并且随着 x 远离 0,它的值在变小。这意味着,当反向传播的梯度经过tanh 节点时,它的值会越来越小。因此,如果经过 tanh 函数 T 次,则梯度也会减小 T 次。
ReLU
梯度不会退化
MatMul(矩阵乘积)节点
梯度爆炸
如图可知梯度的大小随时间步长呈指数级增加,如果发生梯度爆炸,最终就会导致溢出,出现 NaN(Not a Number,非数值)之类的值。如此一来,神经网络的学习将无法正确运行。
梯度消失
如图可知梯度的大小随时间步长呈指数级减少,如果发生梯度消失,梯度将迅速变小。一旦梯度变小,权重梯度不能被更新,模型就会无法学习长期的依赖关系。
变化原因
矩阵 Wh 被反复乘了 T 次。如果 Wh 是标量,则问题将很简单:当 Wh 大于 1 时,梯度呈指数级增加;当 Wh小于 1 时,梯度呈指数级减小。
如果 Wh 是矩阵。此时,矩阵的奇异值将成为指标。简单而言,矩阵的奇异值表示数据的离散程度。根据这个奇异值(更准确地说是多个奇异值中的最大值)是否大于 1,可以预测梯度大小的变化。
梯度爆炸的对策
解决梯度爆炸有既定的方法,称为梯度裁剪
这里假设可以将神经网络用到的所有参数的梯度整合成一个变量,并用符号g 表示。然后将阈值设置为 threshold。此时,如果梯度的 L2 范数g大于或等于阈值,就按上述方法修正梯度。
梯度消失和LSTM
在 RNN 的学习中,梯度消失也是一个大问题。为了解决这个问题,需要从根本上改变 RNN 层的结构,这里本章的主题 Gated RNN 就要登场了。人们已经提出了诸多 Gated RNN 框架(网络结构),其中具有代表性的有LSTM 和 GRU。
LSTM的接口
LSTM是Long Short-Term Memory(长短期记忆)的缩写,意思是可以长(Long)时间维持短期记忆(Short-Term Memory)。
先将tanh(h(t−1)*Wh + xt*Wx + b) 这个计算表示为一个长方形节点 tanh(ht−1 和 xt 是行向量)
我们来比较一下 LSTM 与 RNN 的接口(输入和输出)
LSTM 与 RNN 的接口的不同之处在于,LSTM 还有路径 c。这个 c 称为记忆单元(或者简称为“单元”),相当于 LSTM 专用的记忆部门。
记忆单元的特点是,仅在 LSTM 层内部接收和传递数据。也就是说,从接收LSTM的输出的一侧来看,LSTM的输出仅有隐藏状态向量h。记忆单元 c 对外部不可见,我们甚至不用考虑它的存在。
LSTM层的结构
ct 存储了时刻 t 时 LSTM 的记忆,可以认为其中保存了从过去到时刻 t 的所有必要信息。然后基于这个携带者记忆的ct,输出隐藏状态 ht。
计算
当前的记忆单元 ct 是基于3个输入 c(t−1) h(t−1) 和 xt,经过“某种计算”(后述)算出来的。
隐藏状态 ht 要使用更新后的 ct 来计算,公式是ht = tanh(ct)
Gate
门的开合程度也是自动从数据中学习到的,开合程度由 0.0 ~1.0 的实数表示(1.0 为全开)
输出门
隐藏状态 ht 对记忆单元 ct 仅仅应用了 tanh 函数,我们考虑对 tanh(ct) 施加门。由于这个门管理下一个隐藏状态 ht 的输出,所以称为输出门。
输出门的计算如下。其中sigmoid 函数用σ()表示
ht 可由 o 和 tanh(ct) 的乘积计算出来,计算方式是元素乘积,就是对应元素的乘积,也被成为阿达玛乘积
遗忘门
现在,我们在记忆单元 c(t−1) 上添加一个忘记不必要记忆的门,这里称为遗忘门
遗忘门的计算如下
ct 由这个 f 和上一个记忆单元 ct−1 的对应元素的乘积求得
新的记忆单元
现在我们还想向这个记忆单元添加一些应当记住的新信息,为此我们添加新的 tanh 节点
基于 tanh 节点计算出的结果被加到上一时刻的记忆单元 ct−1 上。
这个 tanh 节点的作用不是门,而是将新的信息添加到记忆单元中。因此,它不用 sigmoid函数作为激活函数,而是使用 tanh 函数。
输入门
我们给图 6-17 的 g 添加门,这里将这个新添加的门称为输入门
输入门判断新增信息 g 的各个元素的价值有多大。输入门不会不经考虑就添加新信息,而是会对要添加的信息进行取舍。换句话说,输入门会添加加权后的新信息。
输入门的计算如下
LSTM的梯度的流动
记忆单元的反向传播仅流过“+”和“×”节点。“+”节点将上游传来的梯度原样流出,所以梯度没有变化(退化)。而“×”节点的计算并不是矩阵乘积,而是对应元素的乘积(阿达玛积),也不会导致梯度变化
LSTM的实现
对于x*Wx + h*Wh + b这样的仿射变化,可以整合为通过 1 个式子进行
矩阵库计算“大矩阵”时通常会更快,而且通过将权重整合到一起管理,源代码也会更简洁。
使用LSTM的语言模型
这里实现的语言模型和上一章几乎是一样的,唯一的区别是,上一章使用Time RNN 层的地方这次使用 Time LSTM 层
进一步改进RNNLM
LSTM层的多层化
加深 LSTM 层(叠加多个 LSTM层)的方法往往很有效。
多少层合适
因为层数是超参数,所以需要根据要解决的问题的复杂程度、能给到的训练数据的规模来确定。
在PTB数据集上学习语言模型的情况下, 当LSTM 的层数为 2 ~ 4 时,可以获得比较好的结果
谷歌翻译中使用的 GNMT 模型叠加了 8 层 LSTM 的网络。
基于Dropout抑制过拟合
通过加深层,可以创建表现力更强的模型,但是这样的模型往往会发生过拟合(overfitting)。更糟糕的是,RNN 比常规的前馈神经网络更容易发生过拟合,因此 RNN 的过拟合对策非常重要。
对策
增加训练数据
降低模型的复杂度
正则化
Dropout
Dropout
Dropout 随机选择一部分神经元,然后忽略它们,停止向前传递信号
Dropout 层插入位置
常规的 Dropout
错误结构
如果在时序方向上插入 Dropout,那么当模型学习时,随着时间的推移,信息会渐渐丢失。
正确结构
垂直方向上插入Dropout 层
变分 Dropout
通过同一层的 Dropout 共用 mask,mask 被“固定”。如此一来,信息的损失方式也被“固定”,所以可以避免常规 Dropout 发生的指数级信息损失。
权重共享
weight tying 可以直译为“权重绑定”。
绑定(共享)Embedding 层和 Affine 层的权重的技巧在于权重共享。通过在这两个层之间共享权重,可以大大减少学习的参数数量。除此之外,它还能提高精度。
更好的RNNLM的实现
前沿研究
基于RNN生成文本
不存在什么完美的文章,就好像没有完美的绝望。 ——村上春树《且听风吟》
使用语言模型生成文本
如何生成下一个新单词
选择概率最高的单词,结果唯一确定
概率高的单词容易被选到,概率低的单词难以被选到
文本生成的实现
更好的文本生成
使用更好的语言模型
seq2seq模型
Seq2Seq(Sequence to Sequence,序列到序列模型)
将时序数据转换为其他时序数据的模型
seq2seq的原理
这个模型有两个模块——Encoder(编码器)和 Decoder(解码器)。编码器对输入数据进行编码,解码器对被编码的数据进行解码。
seq2seq 由两个 LSTM 层构成,即编码器的 LSTM 和解码器的LSTM。
LSTM 的隐藏状态 h 是一个固定长度的向量。它和上一节的模型的差异就是 LSTM 层会接收向量 h。这个唯一的、微小的改变使得普通的语言模型进化为可以驾驭翻译的解码器。
时序数据转换的简单尝试
试图让seq2seq做加法计算
可变长度的时序数据
填充
用无效(无意义)数据填入原始数据,从 而使数据长度对齐。
使用填充时需要向 seq2seq 添加一些填充专用的处理
在解码器中输入填充时,不应计算其损失(这可以通过向 Softmax with Loss 层添加 mask 功能来解决)
在编码器中输入填充时,LSTM层应按原样输出上一时刻的输入
加法数据集
seq2seq的实现
seq2seq的改进
反转输入数据
在许多情况下,使用这个技巧后,学习进展得更快,最终的精度也有提高。
直观的认为,反转数据后梯度的传播可以更平滑,传递更有效
偷窥
使用头盔的编码器被称为Peeky Decoder,使用了Peeky Decoder 的 seq2seq 称 为 Peeky seq2seq。
编码器将输入语句转换为固定长度的向量 h,这个 h 集中了解码器所需的全部信息。它是解码器唯一的信息源。
可以将这个集中了重要信息的编码器的输出 h 分配给解码器的其他层
有两个向量同时被输入到了 LSTM 层和 Affine 层,这实际上表示两个向量的拼接(concatenate)。
seq2seq的应用
机器翻译:将“一种语言的文本”转换为“另一种语言的文本”
自动摘要:将“一个长文本”转换为“短摘要”
问答系统:将“问题”转换为“答案”
邮件自动回复:将“接收到的邮件文本”转换为“回复文本”
聊天机器人
算法学习
自动图像描述
Attention
注意力是全部。 ——Vaswani 们的论文标题
Attention 毫无疑问是近年来深度学习领域最重要的技术之一。本章的目标是在代码层面理解 Attention的结构,然后将其应用于实际问题,体验它的奇妙效果。
Attention的结构
seq2seq存在的问题
seq2seq 中使用编码器对时序数据进行编码,然后将编码信息传递给解码器。此时,编码器的输出是固定长度的向量。
固定长度的向量意味着,无论输入语句的长度如何(无论多长),都会被转换为长度相同的向量。
编码器的改进
编码器的输出的长度应该根据输入文本的长度相应地改变
因为编码器是从左向右处理的,所以严格来说,刚才的“猫”向量中含有“吾輩”“は”“猫”这3个单词的信息。考虑整体的平衡性,最好均衡地含有单词“猫”周围的信息。在这种情况下,从两个方向处理时序数据的双向RNN(或者双向LSTM)比较有效。
解码器的改进
之前我们将编码器的 LSTM 层的“最后”的隐藏状态放入了解码器的 LSTM 层的“最初”的隐藏状态
上一章的解码器只用了编码器的 LSTM 层的最后的隐藏状态。如果使用 hs,则只提取最后一行,再将其传递给解码器。下面我们改进解码器,以便能够使用全部 hs。
我们是专注于某个单词(或者单词集合),随时对这个单词进行转换的,那可以让 seq2seq 学习“输入和输出中哪些单词与哪些单词有关”这样的对应关系
举例
吾輩[わがはい] = I
猫[ねこ] = cat
很多研究都利用“猫 =cat”这样的单词对应关系的知识。这样的表示单词(或者词组)对应关系的信息称为对齐 (alignment)。到目前为止,对齐主要是手工完成的,而我们将要介绍的Attention 技术则成功地将对齐思想自动引入到了 seq2seq 中。 这也是从“手工操作”到“机械自动化”的演变。
结构变化
如何计算
可否将“选择”这一操作换成可微分的运算呢?与其“单选”,不如“全选”。我们另行计算表示各个单词重要度(贡献值)的权重。
a 像概率分布一样,各元素是 0.0 ~ 1.0 的标量,总和是 1。然后,计算这个表示各个单词重要度的权重和单词向量 hs 的加权和,可以获得目标向量。
在处理序列数据时,网络应该更关注输入中的重要部分,而忽略不重要的部分,它通过学习不同部分的权重,将输入的序列中的重要部分显式地加权,从而使得模型可以更好地关注与输出有关的信息。 Attention机制的关键是引入一种机制来动态地计算输入序列中各个位置的权重,从而在每个时间步上,对输入序列的不同部分进行加权求和,得到当前时间步的输出。解码器在生成每个输出时,根据输入序列的不同部分给予不同的注意力,从而使得模型更好地关注到输入序列中的重要信息。
权重a的学习
我们的目标是用数值表示这个 h 在多大程度上和 hs 的各个单词向量“相似”。
这里我们使用最简单的向量内积。
计算向量相似度的方法有好几种。除了内积之外,还有使用小型的神经网络输出得分的做法。
接下来,使用老一套的 Softmax 函数对 s 进行正规化
整合
带Attention的seq2seq的实现
Attention的评价
我们转而通过研究“日期格式转换”问题来确认带 Attention 的 seq2seq的效果
日期格式转换问题
带Attention的 seq2seq的学习
Attention的可视化
关于Attention的其他话题
双向RNN
如果考虑整体的平衡性,我们希望向量能更均衡地包含单词“猫”周围的信息。
双向 LSTM 在之前的 LSTM 层上添加了一个反方向处理的 LSTM 层。
拼接各个时刻的两个 LSTM 层的隐藏状态,将其作为最后的隐藏状态向量(除了拼接之外,也可以“求和”或者“取平均”等)
Attention层的使用方法
Attention 层的输出(上下文向量)被连接到了下一时刻的 LSTM 层的输入处。通过这种结构,LSTM 层得以使用上下文向量的信息。相对地,我们实现的模型则是 Affine 层使用了上下文向量。
seq2seq的深层化和 skip connection
加深 RNN 层
使用了3层LSTM层的带Attention的seq2seq
残差连接
在残差连接的连接处,有两个输出被相加。
因为加法在反向传播时“按原样”传播梯度,所以残差连接中的梯度可以不受任何影响地传播到前一个层。这样一来,即便加深了层,梯度也能正常传播,而不会发生梯度消失(或者梯度爆炸),学习可以顺利进行。
Attention的应用
GNMT
机器翻译的历史
基于规则的翻译
基于用例的翻译
基于统计的翻译
神经机器翻译(Neural Machine Translation)
从 2016 年开始,谷歌翻译就开始将神经机器翻译用于实际的服务。机器翻译系统称为 GNMT
GNMT 需要大量的数据和计算资源。GNMT使用了大量的训练数据,(1 个模型)在将近 100 个 GPU 上学习了 6 天。另外,GNMT 也在设法基于可以并行学习 8 个模型的集成学习和强化学习等技术进一步提高精度。
Transformer
RNN 可以很好地处理可变长度的时序数据。但是,RNN 也有缺点,比如并行处理的问题。
RNN 需要基于上一个时刻的计算结果逐步进行计算,因此(基本)不可能在时间方向上并行计算 RNN。在使用了 GPU 的并行计算环境下进行深度学习时,这一点会成为很大的瓶颈,于是我们就有了避开 RNN 的动机。
Transformer 不用 RNN,而用 Attention 进行处理。我们简单地看一下这个 Transformer。
Self-Attention
Transformer 是基于 Attention 构成的,其中使用了 Self-Attention 技巧,这一点很重要。Self-Attention 直译为“自己对自己的 Attention”,也就是说,这是以一个时序数据为对象的 Attention,旨在观察一个时序数据中每个元素与其他元素的关系。
使用具有一个隐藏层、激活函数为 ReLU 的全连接的神经网络。另外,图中的 Nx 表示灰色背景包围的元素被堆叠了 N 次。
NTM
NTM(Neural Turing Machine,神经图灵机)
利用外部存储装置,神经网络也可以获得额外的能力。
基于 Attention,编码器和解码器实现了计算机中的“内存操作”。换句话说,这可以解释为,编码器将必要的信息写入内存,解码器从内存中读 取必要的信息。
为了模仿计算机的内存操作,NTM 的内存操作使用了两个 Attention,
基于内容的Attention 和我们之前介绍的 Attention 一样,用于从内存中找到某个向量(查询向量)的相似向量。
而基于位置的 Attention 用于从上一个时刻关注的内存地址(内存的各个位置的权重)前后移动。这里我们省略对其技术细节的探讨,具体可以通过一维卷积运算实现。基于内存位置的移动功能,可以再现“一边前进(一个内存地址)一边读取”这种计算机特有的活动。
NTM 成功解决了长时序的记忆问题、排序问题(从大到小排列数字)等。
网络优化与正则化
任何数学技巧都不能弥补信息的缺失 [佐斯 蓝佐斯(Cornelius Lanczos)]
两大难点
优化问题
很难优化,计算量大
泛化问题
拟合能力过强,容易过拟合
网络优化
网络优化的难点
网络结构多样性
我们很难找到一种通用的优化方法。不同的优化方法在不同网络结构上的差异也都比较大。
低维空间的难点
如何选择初始化参数
逃离局部最优点
高维空间的难点
如何选择初始化参数
如何逃离鞍点
一些维度上是最高点,在另一些维度上是最低点
平坦底部
深层神经网络的参数非常多,并且有一定的冗余性,这导致每单个参数对最终损失的影响都比较小
陷入局部最小值
优化算法
梯度下降法类型
批量梯度下降
随机梯度下降
小批量梯度下降
如果在梯度下降时,每次迭代都要计算整个训练数据上的梯度需要比较多的计算资源。此外,大规模训练集中的数据通常也会非常冗余,也没有必要在整个训练集上计算梯度。
学习率衰减
学习率在一开始要保持大些来保证收敛速度,在收敛到最优点附近时要小些以避免来回震荡。
类型
逆时衰减
指数衰减
自然指数衰减
β 为衰减率,一般取值为0.96。
还有些自适应地调整学习率的方法,比如AdaGrad、RMSprop、AdaDelta等。
AdaGrad法
在关于学习率的有效技巧中,有一种被称为学习率衰减的方法,即随着学习的进行,使学习率逐渐减小。
AdaGrad进一步发展了这个想法,为参数的每个元素适当地调整学习率,与此同时进行学习
Ada来自英文单词Adaptive,即“适当的”的意思
和前面的SGD一样,W表示要更新的权重参数,偏导表示梯度,n表示学习率
但出现了新变量h,他保存了以前的所有梯度值的平方和,因此,学习越深入,更新的幅度就越小。
RMSProp法
如果无止境地学习,更新量就会变为 0
RMSProp方法并不是将过去所有的梯度一视同仁地相加,而是逐渐地遗忘过去的梯度,在做加法运算时将新梯度的信息更多地反映出来
这种操作从专业上讲,称为“指数移动平均”,呈指数函数式地减小过去的梯度的尺度
梯度方向优化
Momentum法
在小批量梯度下降中,如果每次选取样本数量比较小,损失会呈现震荡的方式下降。
通过使用最近一段时间内的平均梯度来代替当前时刻的梯度来作为参数更新的方向。
也叫做动量法
SGD的缺点
f(x,y)=(1/20)*x^2+y^2
基于SGD的最优化的更新路径:呈“之”字形朝最小值(0, 0)移动,效率低
改进方法
和前面的SGD一样,W表示要更新的权重参数,偏导表示梯度,n表示学习率
但出现了新变量v,对应物理上的速度,可以理解为物体在梯度方向上受力。
Adam法
Momentum参照小球在碗中滚动的物理规则进行移动,AdaGrad为参数的每个元素适当地调整更新步伐。将他们合并起来就是adam的思路
(目前)并不存在能在所有问题中都表现良好的方法。这4种方法各有各的特点,都有各自擅长解决的问题和不擅长解决的问题
梯度截断
如果梯度突然增大,用大的梯度进行更新参数,反而会导致其远离最优点。
当梯度的模大于一定阈值时,就对梯度进行截断
把梯度的模限定在一个区间,当梯度的模小于或大于这个区间时就进行截断
类型
按值截断
gt = max(min(gt, b), a).
按模截断
参数初始化
Gaussian 分布初始化
Gaussian初始化方法是最简单的初始化方法,参数从一个固定均值(比如0)和固定方差(比如0.01)的Gaussian分布进行随机初始化。
当一个神经元的输入连接数量为 n(in) 时,可以设置其输入连接权重以N(0,sqrt(1/nin))的Gaussian分布进行初始化。
如果同时考虑输出连接的数量nout,则可以按N(0,sqrt(2/(nin+nout)))的Gaussian分布进行初始化
均匀分布初始化
均匀分布初始化是在一个给定的区间 [−r, r] 内采用均匀分布来初始化参数。超参数r 的设置也可以按神经元的连接数量进行自适应的调整。
激活函数类型
logistic函数
tanh
Xavier初始值
我们尝试使用Xavier Glorot等人的论文中推荐的权重初始值
如果前一层的节点数为n,则初始值使用标准差为(1/sqrt(n))的高斯分布
ReLU的权重初始值
当激活函数使用ReLU时,一般推荐使用ReLU专用的初始值,也就是Kaiming He等人推荐的初始值,也称为“He初始值”。
当前一层的节点数为n时,He初始值使用标准差为(2/sqrt(n))的高斯分布
数据预处理
单位不同
每一维特征的来源以及度量单位不同,会造成这些特征值的分布范围往往差异很大。当我们计算不同样本之间的欧氏距离时,取值范围大的特征会起到主导作用。
缩放归一化
通过缩放将每一个特征的取值范围归一到[0, 1]或[−1, 1]之间。
标准归一化
也叫z-score归一化
将每一个维特征都处理为符合标准正态分布(均值为0,标准差为1)。
数据冗余
输入数据经过白化处理后,特征之间相关性较低,并且所有特征具有相同的方差。
白化的一个主要实现方式是使用主成分分析方法去除掉各个成分之间的相关性。
逐层归一化
在使用随机梯度下降来训练网络时,每次参数更新都会导致网络中间每一层的输入的分布发生改变。越深的层,其输入的分布会改变得越明显。
批量归一化
也叫Batch Normalization,BN方法
为了使各层拥有适当的广度,“强制性”地调整激活值的分布
进行使数据分布的均值为0、方差为1的正规化
可以对神经网络中任意的中间层进行归一化操作
优点
可以使学习快速进行(可以增大学习率)
不那么依赖初始值(对于初始值不用那么敏感)
抑制过拟合(降低Dropout等的必要性)
Batch Norm层
Affine->Batch Norm->ReLU
层归一化
批量归一化的局限
批量归一化是对一个中间层的单个神经元进行归一化操作,因此要求小批量样本的数量不能太小,否则难以计算单个神经元的统计信息。
如果一个神经元的净输入的分布在神经网络中是动态变化的,比如循环神经网络,那么就无法应用批量归一化操作
层归一化是对一个中间层的所有神经元进行归一化。
批归一化在卷积神经网络(CNN)中非常有效,而层归一化则在循环神经网络(RNN)和Transformer网络中更为常见。
超参数优化
组成
网络结构
神经元之间的连接关系
层数
每层的神经元数量
激活函数的类型
优化参数
网络的优化方法
学习率
小批量的样本数量
正则化系数
验证数据(验证集)
不能用测试数据评估超参数的性能
如果用测试数据确认超参数的值的“好坏”,就会导致超参数的值被调整为只拟合测试数据。
训练数据用于参数(权重和偏置)的学习,验证数据用于超参数的性能评估。为了确认泛化能力,要在最后使用(比较理想的是只用一次)测试数据
优化方法
网格搜索
通过尝试所有超参数的组合来寻址合适一 组超参数配置的方法。
选择几个“经验”值。比如学习率α,我们可以设置 α ∈ {0.01, 0.1, 0.5, 1.0}.
随机搜索
设定超参数的范围,从设定的超参数范围中随机采样
通过验证数据评估识别精度(但是要将epoch设置得很小)
重复上述(100次等),根据它们的识别精度的结果,缩小超参数的范围
贝叶斯优化
动态资源分配
网络正则化
目的:抑制过拟合
权值衰减
权值衰减是一直以来经常被使用的一种抑制过拟合的方法。该方法通过在学习的过程中对大的权重进行惩罚。
简单来说就是把损失函数变成
λ是控制正则化强度的超参数
丢弃法
Dropout Method
如果网络的模型变得很复杂,只用权值衰减就难以应对了
在学习的过程中随机删除神经元的方法每次选择丢弃的神经元是随机的。最简单的方法是设置一个固定的概率p。对每一个神经元都一个概率p来判定要不要保留。
数据增强
旋转、翻转、缩放、平移、加入噪声
标签平滑
在输出标签中添加噪声来避免模型过拟合
模型独立的学习方式
集成学习
通过某种策略将多个模型集成起来,通过群体决策来提高决策准确率。集成学习首要的问题是如何集成多个模型。比较常用的集成策略有直接平均、加权平均等。
自训练和协同训练
都属于半监督学习
自训练
自训练是首先使用标注数据来训练一个模型,并使用这个模型来预测无标注样本的标签,把预测置信度比较高的样本及其预测的伪标签加入训练集,然后重新训练新的模型,并不断重复这个过程。
协同训练
协同训练(Co-Training)是自训练的一种改进方法
通过两个基于不同视角(view)的分类器来相互促进。很多数据都有相对独立的不同视角。
由于不同视角的条件独立性,在不同视角上训练出来的模型就相当于从不同视角来理解问题,具有一定的互补性。协同训练就是利用这种互补性来来进行自训练的一种方法。首先在训练集上根据不同视角分别训练两个模型f1和f2,然后用f1 和f2 在无标记数据集上进行预测,各选取预测置信度比较高的样本加入训练集,重新训练两个不同视角的模型,并不断重复这个过程。
多任务学习
一般的机器学习模型都是针对单一的特定任务,比如手写体数字识别、物体检测等。不同任务的模型都是在各自的训练集上单独学习得到的。
如果有两个任务比较相关,它们之间会存在一定的共享知识,这些知识对两个任务都会有所帮助。这些共享的知识可以是表示(特征)、模型参数或学习算法等。
类型
迁移学习
如果有一个相关任务已经有了大量的训练数据,虽然这些训练数据的分布和目标任务不同,但是由于训练数据的规模比较大,我们假设可以从中学习某些可以泛化的知识,那么这些知识对目标任务会有一定的帮助。如何将相关任务的训练数据中的可泛化知识迁移到目标任务上,就是迁移学习(Transfer Learning)要解决的问题。
迁移学习是指两个不同领域的知识迁移过程,利用源领域(Source Domain)DS 中学到的知识用来帮助目标领域(Target Domain)DT 上的学习任务。源领域的训练样本数量一般远大于目标领域。
分类
归纳迁移学习
在训练数据集上学习到使得期望风险(即真实数据分布上的错误率)最小的模型。
推导迁移学习
学习一种在给定测试集上错误率最小的模型
微调(fine-tuning)是迁移学习(transfer learning)的一种应用方式。通常指的是在已经训练好的模型基础上,使用新的、特定于任务的数据集进行额外的训练,以提高模型在特定任务上的性能。微调的目的是利用预训练模型在大规模数据上学到的通用知识,来加速和优化在特定任务上的学习过程。
终生学习
问题
一但训练结束模型就保持固定,不再进行迭代更新
要想一个模型同时在很多不同任务上都取得成功依然是一件十分困难的事情。
终生学习(Lifelong Learning),也叫持续学习(Continuous Learning),是指像人类一样具有持续不断的学习能力,根据历史任务中学到的经验和知识来帮助学习不断出现的新任务,并且这些经验和知识是持续累积的,不会因为 新的任务而忘记旧的知识。
在终生学习中,假设一个终生学习算法已经在历史任务T1, T2, · · · , Tm 上学习到一个模型,当出现一个新任务Tm+1 时,这个算法可以根据过去在m个任上学习的知识来帮助第m + 1个任务,同时累积所有的m + 1个任务上的知识。
这个设定和归纳迁移学习十分类似,但归纳迁移学习的目标是优化目标任务的性能,而不关心知识的累积。而终生学习的目标是持续的学习和知识累积。另外,也和多任务学习的不同之处在于终生学习并不在所有任务上同时学习。
元学习
根据没有免费午餐定理,没有一种通用的学习算法在所有任务上都有效。因此,当使用机器学习算法实现某个任务时,我们通常需要“就事论事”,根据任务的特定来选择合适的模型、损失函数、优化算法以及超参数。
自己动态调整学习方式的能力,称为元学习,也称为学习的学习
和元学习比较相关的另一个机器学习问题是小样本学习
两种典型的元学习方法
基于优化器的元学习
不同的优化算法的区别在于更新参数的规则不同,因此一种很自然的元学习就是自动学习一种更新参数的规则,即通过另一个神经网络(比如循环神经网络)来建模梯度下降的过程
模型无关的元学习
是一个简单的模型无关、任务无关的元学习算法