---
schema_version: "library-reader-v1"
source_type: "original_book"
title: "人工智能与大数据技术导论"
author: null
edition: null
publisher: null
year: null
isbn: "9787302517986"
library_document_id: "cd4f7678-cd9b-4971-bde0-e9ad46a6cc71"
source_sha256: "5011cdcf83cd5e047c93a1ce7465f970fc88be69c93b94be3d7fa5fbddbb43f0"
pdf_physical_page_count: 490
pdf_physical_page_index_base: 0
range_start: 210
range_count: 10
html_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71?start=210&limit=10"
markdown_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=210&limit=10"
previous_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=200&limit=10"
next_url: "https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=220&limit=10"
---

# 人工智能与大数据技术导论

> 页码规则：PDF_PHYSICAL_PAGE_INDEX 是从 0 开始的权威文件物理页索引；PRINTED_PAGE 是页面中识别出的印刷页码，可能为空，二者不得混用。

## PDF_PHYSICAL_PAGE_INDEX=210 | PRINTED_PAGE=194

7.1.1 深度学习为何崛起

深度学习并不是新兴理论，早在几十年前，深度学习和神经网络的基本理念就已经比较完备了。关于深度学习之所以现在才开始流行的原因，我们先来看图7-2。

模型能达到好的效果，背后是数据、计算力和算法在支持。深度学习之所以最近火起来，数据量的增加、计算力的提升和算法的进步都为之做出了贡献。但从图7-2可以看出，数据量的增加是最主要的因素。模型的表现力随着数据量的增加而提升，这是毋庸置疑的。但在数据量比较少的时候，神经网络模型相比传统的学习算法没有明显的优势，只有当训练集很大时，神经网络的效果才会比传统算法更好。所以，随着近些年数据接触量爆炸式增加，深度学习的优势越来越明显。

7.1.2 从逻辑回归到浅层神经网络

我们知道，深度学习主要指多层神经网络，让我们先来了解一下什么是神经网络。神经网络并没有听起来那么高深，其本质上也属于机器学习的一种模型，就像前几章介绍的常见模型一样。

还记得逻辑回归模型吗？这是我们在第6章介绍过的一种分类器。逻辑回归模型将输入变量按一定权重线性组合求和，然后对得到的值施加一个名为sigmoid的函数变换，即 $\ g ( z ) =$

人工智能与大数据技术导论

194

## PDF_PHYSICAL_PAGE_INDEX=211 | PRINTED_PAGE=195

$1 / ( 1 + e ^ { \wedge } - Z )$ 。这个过程可以用图7-3表示，其中 $\mathbf { X } _ { 1 }$ ${ \bf X } _ { 2 } .$ ${ \bf X } _ { 3 }$ 为输入变量，也是我们数据集中的特征，将它们线性组合得到一个数值，再对这个数值进行sigmoid函数变换，得到yhat，从而可以预测实际的 ${ \tt y }$ 9

逻辑回归模型本质上是一个浅层神经网络（ShallowNeuralNetworks）。这里它只有输入层和输出层。输入层经过线性组合，然后被施加一个函数，这里把这个函数叫作激活函数（ActivationFunction），随后得到输出层的结果。我们把它暂时称为“简单结构”。如果我们在输入层和输出层之间加入中间层，那么一个严格意义的神经网络就形成了，如图7-4所示。

这个模型与图7-3相比，在输入层和输出层之间多了一个隐藏层（HiddenLayer），这个隐藏层有三个神经元，它们在结构图中作为节点与前一层（输入层）的节点 $( \mathbf { \boldsymbol { x } } _ { 1 } , \mathbf { \boldsymbol { x } } _ { 2 } , \mathbf { \boldsymbol { x } } _ { 3 } )$ 通过有向线段两两相连。听起来复杂，如果我们把中间三个神经元分开来看，每一个神经元与上一层都有如图7-5所示的关系。

这三张图的形式与逻辑回归模型图的形式完全相同。 $\mathbf { X } _ { 1 } , \ \mathbf { X } _ { 2 } , \ \mathbf { X } _ { 3 }$ 通过一定的权重比例线性组合，得到一个新的数，然后这个新的数被施加一个激活函数，得到一个输出值（虽然图中没有表现出施加函数的过程，但实际上是有的）。中间层实际上就是三个“简单结构”并行运行出来的结果，并将得到的三个结果存储在中间层神经元中，然后作为新的输入变量传给下一层。这里三个“简单结构”并行运行，并不是把一个过程重复三次。虽然数据变量都是一样的，但每个结构中线性组合的权重（也就是参数）是不一定相同的。因此，三个神经元的数值是不一样的。将得到的三个数值作为输入变量传递给下一层，这个过程如图7-6所示。

第7章 深度学习

195

## PDF_PHYSICAL_PAGE_INDEX=212 | PRINTED_PAGE=196

于是在第二层将中间层计算的结果当作输入变量，重新进行“线性组合+激活函数”的操作，最终得到输出值。这样一个2层的神经网络的计算过程就完成了。

7.1.3 深度神经网络

神经网络可以有多个隐藏层，当我们使用更多的层数时，实际上就是在构造所谓的深度神经网络。在实际应用中，我们会使用几十个甚至几百个隐藏层。并且事实证明，让网络变得更深层确实会提高模型的准确率。几百层的结构的确会比简单的几层网络表现得更优秀。

我们再来看深度神经网络的结构。每个隐藏层可以有任意数量的神经元，可以大于、小于或等于输入层变量个数，但一般至少要有2个，每层的数量也可以各不相等。图7-7是一个2个隐藏层的神经网络案例。在每一层一般使用同一个激活函数，不同层之间的激活函数可以不相同。

在介绍神经网络的训练前，我们要先弄明白一件事。前面所提到的神经网络的层数、每层的神经元节点数以及每个地方激活函数的选择都是预先指定的，而不是被训练的，也就是说，它们是神经网络模型的超参数。

神经网络由神经元、网状结构和激活函数构成。图7-7中的每一个节点都是一个神经元，神经网络通过网状结构将每一层的信息传递给下一层。而信息传递的方式正是前文描述的通过线性组合生成新的神经元的形式。神经网络看似复杂，但简单来说，其实只干了三件事：

（1)对输入变量施加线性组合。

(2) 套用激活函数。

(3) 重复前两步。

人工智能与大数据技术导论

196

## PDF_PHYSICAL_PAGE_INDEX=213 | PRINTED_PAGE=197

7.1.4正向传播

前文中反复提到两个关键词：“线性组合”和“激活函数”，就是神经网络的两大“法宝”。很多人喜欢把神经网络看成一个黑匣子，认为从输入到输出之间经过了复杂的计算程序。不过看清这个计算过程之后，其实整个流程很简单，就是不断重复“线性组合”和“激活”的过程：

$$
\begin{array} { r }  \frac { d ^ { 2 } \sinh } { d \sinh } \lambda  \frac { - 4 \sinh } { 2 \sqrt { 3 } } + \frac { 1 + 4 \cosh } { 2 \sqrt { 2 } } \frac { \sinh } { \sinh } \frac { \sinh } { 2 \cosh } + \frac { 4 \sinh } { 2 \sqrt { 3 } } \frac { 1 + 4 \cosh } { 2 \sqrt { 3 } } \frac { \sinh } { \cosh } + \frac { \sqrt { 6 } \sqrt { 7 } \sqrt { 2 } \sinh } { 2 \sqrt { 3 } } \frac { 1 + \cosh } { 2 \sqrt { 3 } \sqrt { 1 + 4 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh } { 2 \sqrt { 3 } } \frac { 1 + \sinh }  2 \sqrt  \end{array}
$$

像这样从输入端 $\mathbf { X } _ { 1 } , \mathbf { X } _ { 2 } , \ldots$ 到输出端生成y的计算过程叫作正向传播(forward propagation)。上述步骤正是正向传播的步骤。在给定各层权重参数的情况下，我们可以通过正向传播由已知x，计算出y。至此，我们知道了神经网络是如何从输入计算到输出的。

7.1.5激活函数

神经网络的核心在于激活函数。激活函数的存在使得神经网络由线性变为非线性。如果不使用激活函数或者使用线性激活函数都不能达到这个目的。这是因为线性组合的线性组合仍然是原变量的线性组合。激活函数通常有ReLU、Sigmoid、Tanh等。读者在没有具体的想法时，不妨尝试使用以上几种主流的选择，特别是ReLU。这个函数虽然简单，但随着时间的推移，人们发现这个激活函数不仅会给运算上带来方便，效果在很多实际问题中也是最好的。早期一些学者的论文中使用Sigmoid以及其他激活函数的地方在如今的应用中都被换成了ReLU。

7.2 神经网络的训练

7.2.1 神经网络的参数

要使神经网络模型具有预测能力，我们必须要让输入和输出之间的道路“畅通”。要达到这一点，我们需要训练神经网络中的参数。那么神经网络的参数究竟有哪些呢？读者可以试着想一下，图7-8中的神经网络包含多少个参数。

第7章 深度学习

197

## PDF_PHYSICAL_PAGE_INDEX=214 | PRINTED_PAGE=198

我们知道神经网络计算主要包括线性组合和激活函数。激活函数在模型训练之前是定死的，不存在参数。神经网络的所有参数都集中在线性组合器的权重系数上。所以，这里的参数就是指权重系数。

在这个例子中，第一个隐藏层有4个节点，也就是有4个并行的线性组合器结构。对于每个线性组合器，因为输入变量有3个，将它们线性组合需要3+1=4个参数（包括常数项）。因此，这一层一共需要 $4 \times 4 = 1 6$ 个参数。第二层有3个线性组合器结构，但此时输入变量变为4个，所以每个组合器需要4+1=5个参数，本层一共包含5×3=15个参数。同理，可计算出输出层包括 $( 3 + 1 ) \times 2 = 8$ 个参数。整个神经网络包含 $1 6 + 1 5 + 8 = 3 9$ 个参数。

7.2.2向量化

神经网络的参数数量庞大。上述例子只是一个简单的3层网络，就有39个参数。在人们通常使用的网络模型中，拥有成千上万的参数是非常的。这还是最简单的普通网络模型，后文要叙述的卷积神经网络的参数数量量级甚至可以达到十万到百万。为了方便，我们需要借助向量和矩阵来表示这些参数以及中间运算的产物。这样不仅表示起来更加清晰简单，编写代码时也能充分利用矩阵化计算的优势，省去一些循环，从而使运算速度大幅提升。

7.2.3 价值函数

要找到最合适的参数，首先我们要确定一个优化目标，也就是要定义一个价值函数（CostFunction）。价值函数衡量的是模型预测值和真实值之间的偏离程度。我们要设法让预测值和真实值之间尽可能接近，可以按如下方式定义价值函数。

首先，价值函数是所有样本损失函数的叠加。损失函数（LossFunction）是定义在一条样本数据上的。为了定量刻画某一条样本记录预测值与真实值的差异，在神经网络中可以使用交叉熵来定义损失函数：

$$
\scriptstyle \mathrm { J } ( \mathbf { x } , \mathbf { y } ) = \mathrm { L } ( \mathbf { y } , \mathbf { y } \mathrm { h a t } )
$$

计算每一个样本的损失函数，然后遍历整个样本，取均值后即可得到价值函数：

$$
\mathrm { C ( x , y ) { = } 1 / m \ ^ { * } \ s i g m a ( J ( x , y ) ) }
$$

7.2.4梯度下降和反向传播

在介绍反向传播前，我们先来了解梯度下降。首先，梯度下降是一种优化方法，是用来找函数最优值的一种思路。

反向传播是为了优化价值函数，修正神经网络中参数的过程。反向传播是神经网络的核心理念。简单来说，我们训练神经网络的目标和所有机器学习模型一样，是为了找到模型的参数。这里用“找到”这个词比“计算”或者“求解”更为恰当。因为计算机是通过将初始化的参数一次次修正最终得到结果，这个过程是一步步探索的过程。随着计算机一次次地迭代，参数在不断朝着最优的结果去修正，从而越来越接近最优值。这个过程的核心就是在贯彻梯度下降思想。梯度下降的目的是找到当前状态下使得待优化函数下降最快的点。

人工智能与大数据技术导论

198

## PDF_PHYSICAL_PAGE_INDEX=215 | PRINTED_PAGE=199

正向传播的目标是计算损失函数，而反向传播的目的是修正参数。在实际应用中，通常我们会在编程环境中记录价值函数值并观察其变化。我们会在第10章详细介绍正向/反向传播算法。

7.3 神经网络的优化和改进

7.3.1 神经网络的优化策略

优化的目的是让算法能更快收敛，使得训练速度加快。优化是神经网络建模中极其重要的环节，它直接决定了模型的训练时间和投入产出的性价比。在神经网络模型搭建中，优化包括任何可以使算法更快收敛、模型训练加快的手段。下面让我们来看一些常见的优化策略。

1. Mini-Batch

为了加快训练速度，我们先不说算法，首先从读取数据“开刀”。传统的训练过程中的一个最大痛点是在漫长的迭代过程中，每一次都要读入整个样本集数据。样本量非常大的时候会成为限制运算速度的主要因素。为了让一次迭代数据缩短，我们是否可以考虑在一次迭代中仅使用部分样本数据？答案是可以的。Mini-Batch的原理是分批次读入样本数据，从而缩短一次迭代的运算时间。

为了充分利用样本集，我们将样本随机分成若干组（batches），使得每一组有N个样本。假设共有m个样本，那么一共分成m/N个组（若N取值不能整除m，则进行取整，整除多出来的样本单独作为一组）。通常N取值为2的整数次方，比如128、256等。

N通常被称为Mini-Batch Size，属于超参数之一。假设我们有m=2000条样本，Mini-BatchSizeN=256，那么第一次读取的是第1\~256个样本（样本顺序已随机打乱），进行一次迭代（正向传播和反向传播）后，在第二次迭代时读取第257\~512个样本，以此类推……第7次迭代读取第1537\~1792个样本，第8次迭代读取第1793\~2000个样本（本次样本量小于256）。在8次迭代后，整个样本进行了一次遍历。我们把到此为止的过程叫作一个周期（epoch)。在此之后重新开始下一个周期，整个样本集重新洗牌，随机分成8个组，然后重复类似上一个周期的操作，如此往复。

由此可见，Mini-Batch和常规算法的最大区别就是，每次迭代时，读取的样本是不一样的。每一次训练过程是在样本集的一个随机子集上进行的，而不是整个样本集。这样一来大大缩短了一次迭代的运算时间，从而使得训练时间大大缩短。

有的读者会想，这样做是否会影响收敛的轨迹呢？每次样本不一样，在整个训练过程刚开始的时候，参数的行进轨迹的确会显得不太规律，但经过一段时间后会步入正轨，最终逐渐向最优值靠拢。通常Mini-Batch只会缩短训练时间，不会给训练带来任何负面影响。所以在实际应用中，当样本量很大的时候，几乎总是会用到Mini-Batch。

第7章 深度学习

199

## PDF_PHYSICAL_PAGE_INDEX=216 | PRINTED_PAGE=200

2. 输入数据标准化

了解Mini-Batch之后，我们把目光投向标准化。标准化指的是将所有数据减去其均值，再除以标准差的过程。标准化后的样本点在每个维度上分散程度更加均衡，也就是说每个特征的波动区间更加接近。设想一组包含100个记录的样本，每个样本有2个特征 $\mathrm { X } _ { 1 }$ 和 $\mathbf { X } _ { 2 0 } \quad \mathbf { X } _ { 1 }$ 分布在0\~100，而 $\mathbf { X } _ { 2 }$ 分布在0\~1。这种情况下，我们非常有必要对数据进行标准化处理的，如图7-9所示。

经过标准化处理后，样本在每一个分量的波动幅度相当。为什么要这样做呢？因为这样一来价值函数曲线将变得更加均匀、圆滑，而不是呈扁平状。而后者会导致参数的行进轨迹呈现“锯齿形”，最终花更长的时间才能抵达最优点，如图7-10所示。

像图7-10左图中出现的情况就是样本特征之间量级相差太大的结果。特征之间量级的差距直接导致参数 $^ { ( \mathrm { { w } , \mathrm { { b } } ) } }$ 在各个维度之间量级的不均衡，最终的结果就是让左图的价值函数曲线呈现扁平形状，而价值函数曲线的切面（左下图），也就是等高线呈现椭圆形。在这样一个“扭曲”的椭圆中，每个点的梯度方向和指向中心的方向会有很大的偏差，所以梯度会出现“锯齿形”行进的轨迹。当我们对训练集的样本做了标准化处理后，在验证集和测试集上不要忘了对样本做相同的处理。

人工智能与大数据技术导论

200

## PDF_PHYSICAL_PAGE_INDEX=217 | PRINTED_PAGE=201

3. Momentum

Momentum的出发点和标准化有些类似，也是为了让梯度轨迹在迭代中能够不走弯路，不过Momentum是从算法下手去改进的。梯度轨迹出现“锯齿形”是学习过程中非常常见的情况。事实上，即使进行了标准化处理，价值函数曲线经常不是完美的“圆形”，图7-10右图只是非常理想化的情况。一般情况下，梯度曲线都是很难轻易地“径直”走向终点的。

Momentum的思想是将过去几次梯度进行平均作为当前的梯度。Momentum在物理学中是“动量”的意思，实际上这种方法借用了物理学的思想。动量对应于空间中的概念是速度。我们换个角度看这个算法。Momentum的思想是，与其每一次去试图修正“位移”，不如去修正“速度”。

7.3.2 正则化方法

正则化的目的是防止模型过拟合。在神经网络中，通常有L1/L2正则化、Dropout两种方式。

1.L1/L2 正则化

这种方法很简单，和之前在逻辑回归中介绍的技巧类似，是在模型的价值函数的基础上加上一个惩罚项。

由于价值函数的变化，反向传播的计算也会相应地改变，但不用担心，我们完全不用推翻原来的反向传播计算过程，只需要在原来的基础上稍作改变。由于新的J(w,b)为两项求和的形式，在求梯度之后仍为两项求和，因此计算的第一步只需在原来的基础上添加一项，即lamda/2m\*||w||2,2 对w 的导数。

后续计算与正常情况类似。

2. Dropout

另一种有效的正则化技巧是Dropout。Dropout的原理是在每次迭代过程中，随机让一部分神经元“失效”。这个过程可以这样理解，假设图7-11是一个过拟合的网络，现在我们在每个神经元上安装一个“开关”。在每次迭代中，随机关闭其中一部分。每个神经元被关闭的概率都是相同的，等于预设值，比如0.5（实际上每一层的预设概率值可以有差异，但通常被设成同一个值。在实际操作中，绝大多数情况都只设一个通用的概率值，所以后文假设每一层概率都相同）。

第7章 深度学习

201

## PDF_PHYSICAL_PAGE_INDEX=218 | PRINTED_PAGE=202

结果在第一批样本进来后，图7-11中标记的神经元被关闭，在这次传播过程中，神经网络实际上变成了图7-12的样子，一个被压缩的神经网络。

这个缩小的网络适用且仅适用于这一批样本，包括正向传播与反向传播。在这次反向传播后，只有这个小网络对应的权重参数被修正。在下一批样本进来后，将所有开关打开，然后重新执行随机关闭的过程，以此类推。因此，在每次迭代中，我们在使用一个随机的、缩小的网络在训练，每次训练模型都不一样。

在实际编程操作中，每一层的“开关”是通过引入一个布尔向量d[1]实现的（维度与该层输出值a[1]相同，每个维度为0或1，表示关闭或打开），让d[1]与a[1]相乘，被关闭的神经元的输出值变为0，而未关闭的神经元保留原来a[1]的数值，然后将得到的值作为新的、被修正的a[1]，并当作输入变量传递给下一层。

值得注意的是，在正向传播中，每一层神经元在计算后通常要进行数值修正。第1层的激活函数计算得到的数值a[1]要除以预设值概率p，这里的p是指开关为开启的概率(如此定义便于运算）。比如p=0.7，就意味着每个神经元被关闭的概率是30%，开启的概率是70%。这样做是为了保持a[1]的后续运算单元的期望值不变。因为在Dropout之后，神经元减少，传递给下一层的被修正的a[1]的所有维度中，只有期望为 $\mathfrak { p } ^ { * } \mathfrak { n }$ [1]的维度为非空值。为了让z[1+1]从数值上期望不变，会在a[1]进行dropout修正之后，再进行一个数值修正a[1]=a[1]/p,这样z[1+1]的数值就不会因为Dropout而“萎缩”了。这通常被称为反向失活(inverteddropout)。

Dropout只用在训练过程中，一旦参数被训练好后，在测试集计算中不使用Dropout，也就是说要开启所有神经元。另外要注意的是，要记住Dropout是一种正则化方法，只有当模型确实出现过拟合时才使用，否则无须使用。

人工智能与大数据技术导论

202

## PDF_PHYSICAL_PAGE_INDEX=219 | PRINTED_PAGE=203

7.4.1 卷积运算

卷积运算是卷积神经网络中的核心演算步骤。卷积运算是将一个矩阵和另一个“矩阵乘子”通过特定规则计算出一个新的矩阵的过程。这个“矩阵乘子”叫作卷积核（Filter）。比如一个5\*5的矩阵和一个3\*3的卷积核进行卷积，可以得到一个3\*3的矩阵，如图7-13所示。

卷积运算按照下述方式进行：首先，根据卷积核的规格，对应原矩阵左上角的矩阵。在这个例子中，是如图7-14所示的3\*3的矩阵。

将选中的矩阵和卷积核矩阵“相乘”。这里的乘指的是对应元素相乘，然后求和，将得到的数放入矩阵的左上角，如图7-15所示。

$$
3 ^ { * } 1 + 3 ^ { * } 1 + 0 ^ { * } 0 + 5 ^ { * } 2 + 2 ^ { * } 0 + 2 ^ { * } ~ ( - 1 ) ~ + 2 ^ { * } ~ ( - 2 ) ~ + 2 ^ { * } 1 + 0 ^ { * } 3 = 1 2
$$

这样我们就得到了卷积矩阵中的一个元素。然后将原矩阵的选定区域平移，放到如图7-16所示的位置。

第7章 深度学习

7.4

卷积神经网络

203

下一段：[继续读取](https://workshop.closeclaw.top/api/ai/read/cd4f7678-cd9b-4971-bde0-e9ad46a6cc71.md?start=220&limit=10)
