第一章 python

Python除了高性能之外,凭借着 NumPy、SciPy等优秀的数 值计算、统计分析库,在数据科学领域占有不可动摇的地位。深度学习的 框架中也有很多使用Python的场景,比如Caffe、TensorFlow、Chainer、 Theano等著名的深度学习框架都提供了Python接口。因此,学习Python 对使用深度学习框架大有益处。

深度学习框架

如Caffe、TensorFlow、Chainer、 Theano

NumPy库

NumPy是用于数值计算的库,提供了很多高级的数学算法和便利的数 组(矩阵)操作方法。 NumPy数组(np.array)可以生成N维数组,即可以生成一维数组、 二维数组、三维数组等任意维数的数组。数学上将一维数组称为向量, 将二维数组称为矩阵。另外,可以将一般化之后的向量或矩阵等统 称为张量(tensor)。本书基本上将二维数组称为“矩阵”,将三维数 组及三维以上的数组称为“张量”或“多维数组”。

广播

NumPy中,形状不同的数组之间也可以进行运算。之前的例子中,在 2×2的矩阵A和标量10之间进行了乘法运算。在这个过程中,如图1-1所示, 标量10被扩展成了2 × 2的形状,然后再与矩阵A进行乘法运算。这个巧妙 的功能称为广播(broadcast)。

Matplotlib

Matplotlib是用来画图的库。使用Matplotlib能将实验结果可视化,并 在视觉上确认深度学习运行期间的数据。可以使用matplotlib的pyplot模块绘制图形

Python

Python解释器也被称为“对话模式”,用户能够以和Python对话的方式 进行编程。比如,当用户询问“1 + 2等于几?”的时候,Python解释器会回 答“3” Python中的type()函数可以用来查看数据 类型。

init方法,这是进行初始化的方法,也称为构造 函数(constructor),只在生成类的实例时被调用一次。此外,在方法的第一 个参数中明确地写入表示自身(自身的实例)的self是Python的一个特点(学 过其他编程语言的人可能会觉得这种写self的方式有一点奇怪)。

第2章 感知机

因为感知机也是作为神经网络(深度学习)的起源的算法。因此, 学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想。

感知机理解

x1、x2是输入信号, y是输出信号,w1、w2是权重(w是weight的首字母)。图中的○称为“神 经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重 A 严格地讲,本章中所说的感知机应该称为“人工神经元”或“朴素感知机”,但是因为很多基本的处 理都是共通的,所以这里就简单地称为“感知机”。 (w1x1、w2x2)。神经元会计算传送过来的信号的总和,只有当这个总和超过 了某个界限值时,才会输出1。这也称为“神经元被激活”。这里将这个界 限值称为阈值,用符号θ表示。 感知机 -- 感知机

导入权重和偏置

把式(2.1)的θ换成−b,于 是就可以用式(2.2)来表示感知机的行为。 权重偏置 -- 权重偏置 w1和w2是控制输入信号的重要性的参数,而偏置是调 整神经元被激活的容易程度(输出信号为1的程度)的参数。

多层感知机

多层感知门 -- 多层感知门

第三章 神经网络

神经网络的一 个重要性质是它可以自动地从数据中学习到合适的权重参数。

激活函数

激活函数 -- 激活函数 的h(x)函数会将输入信号的总和转换为输出信号,这种函数 一般称为激活函数(activation function)。如“激活”一词所示,激活函数的 作用在于决定如何来激活输入信号的总和。 激活函数原理 -- 激活函数原理 如图3-4所示,表示神经元的○中明确显示了激活函数的计算过程,即 信号的加权总和为节点a,然后节点a被激活函数h()转换成节点y。

输入输出

输出层的激活函数用σ()表示,不同于隐 藏层的激活函数h()(σ读作sigma)。 输出层所用的激活函数,要根据求解问题的性质决定。一般地,回 归问题可以使用恒等函数,二元分类问题可以使用 sigmoid函数, 多元分类问题可以使用 softmax函数。

恒等函数和 softmax函数

恒等函数会将输入按原样输出,对于输入的信息,不加以任何改动地直 接输出。因此,在输出层使用恒等函数时,输入信号会原封不动地被输出。 softmax函数 -- softmax函数 上面的softmax函数的实现虽然正确描述了式(3.10),但在计算机的运算 上有一定的缺陷。这个缺陷就是溢出问题。softmax函数的实现中要进行指 数函数的运算,但是此时指数函数的值很容易变得非常大。 softmax函数改进版 -- softmax函数改进版 首先,式(3.11)在分子和分母上都乘上C这个任意的常数(因为同时对 分母和分子乘以相同的常数,所以计算结果不变)。然后,把这个C移动到 指数函数(exp)中,记为log C。最后,把log C替换为另一个符号C 

softmax函数的特征

softmax函数的输出是0.0到1.0之间的实数。并且,softmax 函数的输出值的总和是1。输出总和为1是softmax函数的一个重要性质。正 因为有了这个性质,我们才可以把softmax函数的输出解释为“概率”。

阶跃函数

阶跃函数图形 -- 阶跃函数图形 说感知机中使用了阶跃函数作为 激活函数。如 果将激活函数从阶跃函数换成其他函数,就可以进入神经网络的世界了。

sigmoid函数

向sigmoid函数输入1.0或2.0 后,就会有某个值被输出,类似h(1.0) = 0.731 …、h(2.0) = 0.880 …这样 sigmod函数 -- sigmod函数

ReLU函数

ReLU函数在输入大于0时,直接输出该值;在输入小于等于0时,输 出0

神经网络的内积

使用np.dot(多维数组的点积),可以一次性计算出Y 的结果。 这意味着,即便Y 的元素个数为100或1000,也可以通过一次运算就计算出 结果!如果不使用np.dot,就必须单独计算Y 的每一个元素(或者说必须使 用for语句),非常麻烦。因此,通过矩阵的乘积一次性完成计算的技巧,在 实现的层面上可以说是非常重要的。

手写数字识别

和求解机器学习问题的步骤(分成学习和推理两个阶段进行)一样, 使用神经网络解决问题时,也需要首先使用训练数据(学习数据)进 行权重参数的学习;进行推理时,使用刚才学习到的参数,对输入 数据进行分类。

归一化

我们把load_mnist函数的参数normalize设置成了 True。将normalize设置成True后,函数内部会进行转换,将图像的各个像 素值除以255,使得数据的值在0.0~1.0的范围内。像这样把数据限定到某 个范围内的处理称为正规化(normalization)。此外,对神经网络的输入数据 进行某种既定的转换称为预处理(pre-processing)。这里,作为对输入图像的 一种预处理,我们进行了正规化。

批处理

批处理对计算机的运算大有利处,可以大幅缩短每张图像的处理时 间。那么为什么批处理可以缩短处理时间呢?这是因为大多数处理 数值计算的库都进行了能够高效处理大型数组运算的最优化。并且, 在神经网络的运算中,当数据传送成为瓶颈时,批处理可以减轻数 据总线的负荷(严格地讲,相对于数据读入,可以将更多的时间用在 计算上)。也就是说,批处理一次性计算大型数组要比分开逐步计算 各个小型数组速度更快。

第四章 神经网络的学习

神经网络的特征就是可以从数据中学习。所谓“从数据中学习”,是指 可以由数据自动决定权重参数的值。

特征量

的“特征量”是指可以 从输入数据(输入图像)中准确地提取本质数据(重要的数据)的转换器。。图 像的特征量通常表示为向量的形式。在计算机视觉领域,常用的特征量包括 SIFT、SURF和HOG等。使用这些特征量将图像数据转换为向量,然后对 转换后的向量使用机器学习中的SVM、KNN等分类器进行学习。 深 度 学 习 有 时 也 称 为 端 到 端 机 器 学 习(end-to-end machine learning)。这里所说的端到端是指从一端到另一端的意思,也就是 从原始数据(输入)中获得目标结果(输出)的意思

数据处理

机器学习中,一般将数据分为训练数据和测试数据两部分来进行学习和 实验等。首先,使用训练数据进行学习,寻找最优的参数;然后,使用测试 数据评价训练得到的模型的实际能力。实现是模型的泛化能力

泛化

泛化能力是指处理未被观察过的数据(不包含在训练数据中的数据)的 能力。获得泛化能力是机器学习的最终目标。

过拟合

只对某个数据集过度拟合的状态称为过拟合(over fitting),避免 过拟合也是机器学习的一个重要课题。

损失函数

神经网络的学习通过某个指标表示现在的状态。然后,以这个指标为基 准,寻找最优权重参数。神经网络以某个指标为线索寻找最优权重参数。神经网络的学习中 所用的指标称为损失函数(loss function)。这个损失函数可以使用任意函数, 但一般用均方误差和交叉熵误差等。

第五章 误差反向传播法

数值微 分虽然简单,也容易实现,但缺点是计算上比较费时间

计算图

正向传播是从计算图出发点到结束点的传播。 既然有正向传播这个名称,当然也可以考虑反向(从图上看的话,就是从右向左) 的传播。

局部计算

计算图可以集中精力于局部计算。无论全局的计算有多么复杂, 各个步骤所要做的就是对象节点的局部计算。虽然局部计算非常简单,但是 通过传递它的计算结果,可以获得全局的复杂计算的结果。

链式法则

将局部导数向正方向的反方向(从右到左)传递,一开始可能会让人感到困惑。 传递这个局部导数的原理,是基于链式法则(chain rule)的

复合函数

如果某个函数由复合函数表示,则该复合函数的导数可以用构成复 合函数的各个函数的导数的乘积表示

Affine层

几何中,仿射变换包括一次线性变换和一次平移,分别对应神经网络的加权和运算与加偏置运算。 神经网络中进行的处理有推理(inference)和学习两个阶段。神经网 络的推理通常不使用 Softmax层。比如,用图 5-28的网络进行推理时, 会将最后一个 Affine层的输出作为识别结果。神经网络中未被正规 化的输出结果(图 5-28中 Softmax层前面的 Affine层的输出)有时 被称为“得分”。也就是说,当神经网络的推理只需要给出一个答案 的情况下,因为此时只对得分最大值感兴趣,所以不需要 Softmax层。 不过,神经网络的学习阶段则需要 Softmax层。

梯度确认

确认数值 微分求出的梯度结果和误差反向传播法求出的结果是否一致(严格地讲,是 非常相近)的操作称为梯度确认(gradient check)

第六章 与学习相关的技巧

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻 找最优参数的问题,解决这个问题的过程称为最优化(optimization)。

随即梯度下降法(SGD)

为了找到最优参数,我们将参数的梯度(导数)作为了线索。 使用参数的梯度,沿梯度方向更新参数,并重复这个步骤多次,从而逐渐靠 近最优参数,这个过程称为随机梯度下降法 SGD -- SGD 这里把需要更新的权重参数记为W,把损失函数关于W的梯度记为 。 η表示学习率,实际上会取0.01或0.001这些事先决定好的值。式子中的← 表示用右边的值更新左边的值。

Momentum

Momentum是“动量”的意思,和物理有关。

AdaGrad

有一种被称为学习率衰减(learning rate decay)的方法,即随着学习的进行,使学习率逐渐减小。实际上,一开始“多” 学,然后逐渐“少”学的方法,在神经网络的学习中经常被使用。

Adam

Adam是2015年提出的新方法。它的理论有些复杂,直观地讲,就是融 合了Momentum和AdaGrad的方法。通过组合前面两个方法的优点,有望 实现参数空间的高效搜索。此外,进行超参数的“偏置校正”也是Adam的特征。

权重

提高泛化能力的技巧——权值衰减(weight decay)。简单地说,权值衰减就是一种以减小权重参数的值为目的进行学习 的方法。通过减小权重参数的值来抑制过拟合的发生。 当激活函数使用ReLU时,权重初始值使用He初始值,当 激活函数为sigmoid或tanh等S型曲线函数时,初始值使用Xavier初始值。 这是目前的最佳实践。

梯度消失

偏向0和1的数据分布会造成反向传播中梯度的值不断变小,最 后消失。这个问题称为梯度消失(gradient vanishing)。

过拟合

发生过拟合的原因,主要有以下两个。 • 模型拥有大量参数、表现力强。 • 训练数据少。

权值衰减

权值衰减是一直以来经常被使用的一种抑制过拟合的方法。该方法通过 在学习的过程中对大的权重进行惩罚,来抑制过拟合。损失函数加上权重的L2范 数的权值衰减方法。

Dropout

Dropout是一种在学习的过程中随机删除神经元的方法。训练时,随机 选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递。

超参数验证

这里所说的超参数是指,比如各层的神经元数量、batch大小、参 数更新时的学习率或权值衰减等。如果这些超参数没有设置合适的值,模型 的性能就会很差。

第7章 卷积神经网络

本章的主题是卷积神经网络(Convolutional Neural Network,CNN)。 CNN被用于图像识别、语音识别等各种场合,在图像识别的比赛中,基于 深度学习的方法几乎都以CNN为基础。相邻层的所有神经元之间都有连接,这称为全 连接(fully-connected)。 cnn -- cnn

全连接的问题

输入数据是图像时,图像通常是高、长、通道方向上的3维形状。但是,向全 连接层输入时,需要将3维数据拉平为1维数据。CNN 中,有时将卷积层的输入输出数据称为特征图(feature map)。其中,卷积层的输入数据称为输入特征图(input feature map),输出 数据称为输出特征图(output feature map)。

卷积运算

卷积层进行的处理就是卷积运算。卷积运算相当于图像处理中的“滤波 器运算” 卷积运算过程 -- 卷积运算过程

填充

在进行卷积层的处理之前,有时要向输入数据的周围填入固定的数据(比 如0等),这称为填充(padding),是卷积运算中经常会用到的处理。 使用填充主要是为了调整输出的大小。比如,对大小为(4, 4)的输入 数据应用(3, 3)的滤波器时,输出大小变为(2, 2),相当于输出大小 比输入大小缩小了 2个元素。这在反复进行多次卷积运算的深度网 络中会成为问题。为什么呢?因为如果每次进行卷积运算都会缩小 空间,那么在某个时刻输出大小就有可能变为 1,导致无法再应用 卷积运算。为了避免出现这样的情况,就要使用填充。在刚才的例 子中,将填充的幅度设为 1,那么相对于输入大小(4, 4),输出大小 也保持为原来的(4, 4)。因此,卷积运算就可以在保持空间大小不变 的情况下将数据传给下一层。

步幅

应用滤波器的位置间隔称为步幅(stride)。

3维数据的卷积运算

之前的卷积运算的例子都是以有高、长方向的2维形状为对象的。但是, 图像是3维数据,除了高、长方向之外,还需要处理通道方向。需要注意的是,在3维数据的卷积运算中,输入数据和滤波器的通道数 要设为相同的值。

池化层

池化是缩小高、长方向上的空间的运算。除了Max池化之外,还有Average池化等。相对于Max池化是从 目标区域中取出最大值,Average池化则是计算目标区域的平均值。 在图像识别领域,主要使用Max池化。因此,本书中说到“池化层” 时,指的是Max池化。

im2col

im2col这个名称是“image to column”的缩写,翻译过来就是“从 图像到矩阵”的意思。Caffe、Chainer 等深度学习框架中有名为 im2col的函数,并且在卷积层的实现中,都使用了im2col。

LeNet

LeNet在1998年被提出,是进行手写数字识别的网络。和“现在的CNN”相比,LeNet有几个不同点。第一个不同点在于激活 函数。LeNet中使用sigmoid函数,而现在的CNN中主要使用ReLU函数。 此外,原始的LeNet中使用子采样(subsampling)缩小中间数据的大小,而 现在的CNN中Max池化是主流。

AlexNet

大多数情况下,深度学习(加深了层次的网络)存在大量的参数。因此, 学习需要大量的计算,并且需要使那些参数“满意”的大量数据。可 以说是 GPU和大数据给这些课题带来了希望。

第8章 深度学习

深度学习是加深了层的深度神经网络。基于之前介绍的网络,只需通过 叠加层,就可以创建深度网络。

提高识别精度

Data Augmentation

Data Augmentation基于算法“人为地”扩充输入图像(训练图像)。Data Augmentation还可以通过其他各 种方法扩充图像,比如裁剪图像的“crop处理”、将图像左右翻转的“fl ip处 理”A 等。对于一般的图像,施加亮度等外观上的变化、放大缩小等尺度上 的变化也是有效的。

加深层的动机

说得详细一点,就是与没有加深层的网络相比,加深了层的网络可以 用更少的参数达到同等水平(或者更强)的表现力。这一点结合卷积运算中 的滤波器大小来思考就好理解了。 加深层的另一个好处就是使学习更加高效。与没有加深层的网络相比, 通过加深层,可以减少学习数据,从而高效地进行学习。

VGG

VGG是由卷积层和池化层构成的基础的CNN。VGG中需要注意的地方是,基于3×3的小型滤波器的卷积层的运算是 连续进行的。重复进行“卷积层重叠2次到4次,再通过池化 层将大小减半”的处理,最后经由全连接层输出结果。

GoogLeNet
迁移学习

实践中经常会灵活应用使用ImageNet这个巨大的数据集学习到的权 重数据,这称为迁移学习,将学习完的权重(的一部分)复制到其他 神经网络,进行再学习(fine tuning)。比如,准备一个和 VGG相同 结构的网络,把学习完的权重作为初始值,以新数据集为对象,进 行再学习。迁移学习在手头数据集较少时非常有效。

GPU的高速化

深度学习中需要进行大量的乘积累加运算(或者大型矩阵的乘积运算)。 这种大量的并行运算正是GPU所擅长的(反过来说,CPU比较擅长连续的、 复杂的计算)。 GPU主要由NVIDIA和AMD两家公司提供。虽然两家的GPU都可以 用于通用的数值计算,但与深度学习比较“亲近”的是NVIDIA的GPU。实 际上,大多数深度学习框架只受益于NVIDIA的GPU。这是因为深度学习 的框架中使用了NVIDIA提供的CUDA这个面向GPU计算的综合开发环境。 通过im2col可以将卷积层进行的运算转换为大型矩阵的乘积。这个 im2col方式的实现对 GPU来说是非常方便的实现方式。这是因为, 相比按小规模的单位进行计算,GPU更擅长计算大规模的汇总好的 数据。也就是说,通过基于im2col以大型矩阵的乘积的方式汇总计算, 更容易发挥出 GPU的能力。

RNN

RNN的R表示Recurrent(递归的)。这个递归指的是神经网络的递归 的网络结构。根据这个递归结构,神经网络会受到之前生成的信息 的影响(换句话说,会记忆过去的信息),这是 RNN的特征。比如, 生成“我”这个词之后,下一个要生成的词受到“我”这个词的影响, 生成了“要”;然后,再受到前面生成的“我要”的影响,生成了“睡觉” 这个词。对于自然语言、时间序列数据等连续性的数据,RNN以记 忆过去的信息的方式运行。

作者 littlepudding

奇瑞汽车,车载智能语音开发

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注