Skip to content

第3章 浅层神经网络

第 2 章介绍了使用一维线性回归进行监督学习。然而,该模型只能将输入/输出关系描述为一条直线。本章介绍浅层神经网络。这类网络描述分段线性函数,其表达能力足以逼近多维输入与输出之间任意复杂的关系。

3.1 神经网络示例

浅层神经网络是带有参数 ϕ 的函数 y=f[x,ϕ],将多维输入 x 映射到多维输出 y。我们将完整的定义推迟到 3.4 节,先用一个将标量输入 x 映射到标量输出 y 的示例网络 f[x,ϕ] 来介绍主要思想。该网络有十个参数 ϕ={ϕ0,ϕ1,ϕ2,ϕ3,θ10,θ11,θ20,θ21,θ30,θ31}

(3.1)y=f[x,ϕ]=ϕ0+ϕ1a[θ10+θ11x]+ϕ2a[θ20+θ21x]+ϕ3a[θ30+θ31x].

我们可以将这个计算分为三个部分:首先,计算输入的三个线性函数(θ10+θ11xθ20+θ21xθ30+θ31x)。其次,将这三个结果通过一个激活函数(activation function)a[]。最后,用 ϕ1ϕ2ϕ3 对三个激活值加权求和,再加上偏移量 ϕ0

为了完成描述,我们需要定义激活函数 a[]。激活函数有很多种选择,但最常用的是修正线性单元(rectified linear unit)或 ReLU

(3.2)a[z]=ReLU[z]={0z<0zz0.

它在输入为正时返回输入值本身,否则返回零(图 3.1)。

方程 3.1 所表示的输入/输出关系族可能并不直观。然而,前一章的思想同样适用。方程 3.1 表示一族函数,其中特定的族成员取决于十个参数 ϕ。如果我们知道这些参数,就可以通过对给定输入 x 求值方程来进行推断(预测 y)。给定训练数据集 {xi,yi}i=1I,我们可以定义最小二乘损失函数 L[ϕ],并用它来衡量模型对任意参数值 ϕ 下数据集的描述效果。要训练模型,就是搜索使损失最小的参数值 ϕ

3.1.1 神经网络的直觉

事实上,方程 3.1 表示一族连续的分段线性函数(图 3.2),最多有四个线性区域。现在我们分解方程 3.1,说明为什么它描述了这样一族函数。为便于理解,我们将函数拆为两部分。首先,引入中间量:

h1=a[θ10+θ11x]h2=a[θ20+θ21x](3.3)h3=a[θ30+θ31x],

我们将 h1h2h3 称为隐藏单元(hidden units)。其次,用一个线性函数将这些隐藏单元组合起来计算输出:

(3.4)y=ϕ0+ϕ1h1+ϕ2h2+ϕ3h3.

图 3.3 展示了生成图 3.2a 中函数的计算流程。每个隐藏单元计算输入的一个线性函数 θ0+θ1x,然后被 ReLU 函数 a[] 将负值截断为零。这三条线与零交叉的位置成为最终输出中的三个"折点"。三条截断后的线接着分别乘以权重 ϕ1ϕ2ϕ3,再加上控制整体高度的偏移 ϕ0

图 3.3j 中的每个线性区域对应隐藏单元中不同的激活模式(activation pattern)。当一个单元被截断(输出为零)时,我们称其为不活跃的(inactive);当它未被截断时,称其为活跃的(active)。例如,图中阴影区域接收来自 h1h3(它们是活跃的)的贡献,但不接收来自 h2(不活跃的)的贡献。

每个隐藏单元为函数贡献一个"折点",因此三个隐藏单元最多可产生四个线性区域。但只有三个区域的斜率是独立的;第四个要么为零(如果所有隐藏单元都不活跃),要么是其他区域斜率的线性组合。

图 3.1

图 3.1 修正线性单元(ReLU)。该激活函数在输入小于零时返回零,否则返回输入值本身。换言之,它将负值截断为零。虽然激活函数有许多其他选择(见图 3.13),但 ReLU 是最常用且最易于理解的。

图 3.2

图 3.2 方程 3.1 定义的函数族。a–c) 十个参数 ϕ 的三种不同选择。在每种情况下,输入/输出关系都是分段线性的。但折点的位置、各线性区域的斜率和整体高度各不相同。

图 3.3

图 3.3 图 3.2a 中函数的计算过程。a–c) 输入 x 通过三个线性函数处理,每个函数有不同的截距 θ0 和斜率 θ1。d–f) 每条线通过 ReLU 激活函数截断负值。g–i) 三条截断后的线分别乘以权重 ϕ1ϕ2ϕ3。j) 最后,截断加权后的函数相加,再加上控制整体高度的偏移 ϕ0。四个线性区域中的每一个对应隐藏单元中不同的激活模式。在阴影区域中,h2 不活跃(被截断),而 h1h3 都是活跃的。

3.1.2 神经网络的图示

我们一直在讨论一个具有一个输入、一个输出和三个隐藏单元的神经网络。图 3.4a 对其进行了可视化。输入在左侧,隐藏单元在中间,输出在右侧。每个连接表示十个参数之一。为简化表示,通常不画截距参数,因此该网络通常如图 3.4b 所示。

图 3.4

图 3.4 神经网络的图示。a) 输入 x 在左,隐藏单元 h1,h2,h3 在中,输出 y 在右。计算从左到右流动。十个箭头中的每一个代表一个参数。b) 更常见的简化图示省略了截距、ReLU 函数和参数名称;这个更简洁的表示描述的是同一个网络。

3.2 万能近似定理

上一节介绍了一个具有一个输入、一个输出、ReLU 激活函数和三个隐藏单元的示例神经网络。现在稍加推广,考虑具有 D 个隐藏单元的情况,其中第 d 个隐藏单元为:

(3.5)hd=a[θd0+θd1x],

这些隐藏单元线性组合形成输出:

(3.6)y=ϕ0+d=1Dϕdhd.

浅层网络中隐藏单元的数量是网络容量(network capacity)的度量。使用 ReLU 激活函数时,具有 D 个隐藏单元的网络输出最多有 D 个折点,因此是一个最多有 D+1 个线性区域的分段线性函数。随着隐藏单元的增加,模型可以逼近越来越复杂的函数。

事实上,只要隐藏单元(即容量)足够多,浅层网络可以以任意精度描述定义在实数线紧致子集上的任何连续一维函数。直觉上,每增加一个隐藏单元就多一个线性区域。随着区域数量增多,它们代表函数的更小片段,每段都可以用一条直线越来越好地逼近(图 3.5)。万能近似定理(universal approximation theorem)证明了:对于任何连续函数,都存在一个能以任意指定精度逼近该函数的浅层网络。

图 3.5

图 3.5 用分段线性模型逼近一维函数(虚线)。a–c) 随着区域数增加,模型越来越接近连续函数。具有标量输入的神经网络每个隐藏单元增加一个线性区域。这个思想可推广到 Di 维的函数。万能近似定理证明,只要有足够多的隐藏单元,就存在一个浅层网络能够以任意精度逼近定义在 RDi 紧致子集上的任何给定连续函数。

3.3 多维输入与输出

在上面的例子中,网络只有标量输入 x 和标量输出 y。然而,万能近似定理也适用于更一般的情况,即网络将多维输入 x=[x1,x2,,xDi]T 映射到多维输出预测 y=[y1,y2,,yDo]T。我们首先讨论如何扩展模型以预测多维输出,然后考虑多维输入。最后,在 3.4 节给出浅层神经网络的一般定义。

3.3.1 多维输出的可视化

要将网络扩展到多维输出 y,只需对每个输出使用隐藏单元的不同线性函数。因此,一个具有标量输入 x、四个隐藏单元 h1,h2,h3,h4 和二维输出 y=[y1,y2]T 的网络定义如下:

h1=a[θ10+θ11x],h2=a[θ20+θ21x](3.7)h3=a[θ30+θ31x],h4=a[θ40+θ41x],

以及

y1=ϕ10+ϕ11h1+ϕ12h2+ϕ13h3+ϕ14h4(3.8)y2=ϕ20+ϕ21h1+ϕ22h2+ϕ23h3+ϕ24h4.

两个输出是隐藏单元的两个不同线性函数。如图 3.3 所示,分段函数中的"折点"取决于初始线性函数 θ0+θ1x 在隐藏单元处被 ReLU 函数 a[] 截断的位置。由于 y1y2 都是同一组四个隐藏单元的不同线性函数,两个输出中的四个"折点"必然在相同位置。但各线性区域的斜率和整体垂直偏移可以不同(图 3.6)。

图 3.6

图 3.6 具有一个输入、四个隐藏单元和两个输出的网络。a) 网络结构可视化。b) 该网络产生两个分段线性函数 y1[x]y2[x]。这两个函数的四个"折点"(位于竖直虚线处)被约束在相同位置,因为它们共享相同的隐藏单元,但斜率和整体高度可以不同。

3.3.2 多维输入的可视化

为了处理多维输入 x,我们将输入与隐藏单元之间的线性关系进行扩展。一个具有两个输入 x=[x1,x2]T 和标量输出 y 的网络(图 3.7)可以有三个隐藏单元:

h1=a[θ10+θ11x1+θ12x2]h2=a[θ20+θ21x1+θ22x2](3.9)h3=a[θ30+θ31x1+θ32x2],

其中每个输入现在有一个斜率参数。隐藏单元以通常的方式组合形成输出:

(3.10)y=ϕ0+ϕ1h1+ϕ2h2+ϕ3h3.

图 3.8 展示了该网络的处理过程。每个隐藏单元接收两个输入的线性组合,这在三维输入/输出空间中形成一个有方向的平面。激活函数将这些平面的负值截断为零。截断后的平面随后在第二个线性函数(方程 3.10)中重新组合,生成一个由凸多边形分段线性区域组成的连续曲面(图 3.8j)。每个区域对应隐藏单元中不同的激活模式。

当输入维度超过两个时,难以可视化,但解释类似。输出将是输入的连续分段线性函数,其中线性区域是多维输入空间中的凸多面体。

注意随着输入维度增加,线性区域的数量迅速增长(图 3.9)。为直觉理解其增速,考虑每个隐藏单元定义一个超平面,将其活跃(输出不被截断)的空间部分与不活跃的部分分开。如果隐藏单元数量与输入维度 Di 相同,我们可以将每个超平面与一个坐标轴对齐(图 3.10)。对于二维输入,这将空间分成四个象限;三维输入则分成八个卦限;Di 维输入创建 2Di 个正交象限。浅层神经网络的隐藏单元数量通常远多于输入维度,因此它们一般能创建远超 2Di 个线性区域。

图 3.7

图 3.7 具有二维输入 x=[x1,x2]T 和标量输出 y 的神经网络可视化。

图 3.8

图 3.8 具有两个输入 x=[x1,x2]T、三个隐藏单元 h1,h2,h3 和一个输出 y 的网络处理过程。a–c) 每个隐藏单元的输入是两个输入的线性组合,对应一个有方向的平面。亮度表示函数输出值。d–f) 每个平面被 ReLU 激活函数截断(青色线是等值线,相当于图 3.3d–f 中的"折点")。g–i) 截断后的平面分别加权。j) 加权函数相加,加上控制整体高度的偏移。结果是由凸多边形分段线性区域组成的连续曲面。

图 3.9

图 3.9 线性区域数与隐藏单元数的关系。a) 五种不同输入维度 Di={1,5,10,50,100} 下最大可能区域数关于隐藏单元数的函数。高维情况下区域数增长极快;D=500 个单元、输入维度 Di=100 时,区域数可超过 10107(实心圆)。b) 相同数据以参数数量为横轴。实心圆对应 (a) 中 D=500 的模型,拥有 51,001 个参数,按现代标准非常小。

图 3.10

图 3.10 线性区域数与输入维度的关系。a) 单输入维度下,一个隐藏单元创建一个折点,将轴分为两个线性区域。b) 二维输入下,两个隐藏单元可用两条线将输入空间分成四个区域。c) 三维输入下,三个隐藏单元可用三个平面将输入空间分成八个区域。推而广之,Di 维输入和 Di 个隐藏单元可用 Di 个超平面将空间分成 2Di 个线性区域。

3.4 浅层神经网络:一般形式

我们已经描述了若干示例浅层网络,以帮助建立关于它们工作方式的直觉。现在给出浅层神经网络的一般方程:y=f[x,ϕ] 将多维输入 xRDi 映射到多维输出 yRDo,使用 D 个隐藏单元。每个隐藏单元的计算为:

(3.11)hd=a[θd0+i=1Diθdixi],

这些隐藏单元线性组合形成输出:

(3.12)yj=ϕj0+d=1Dϕjdhd,

其中 a[] 是非线性激活函数。模型的参数为 ϕ={θ,ϕ}。图 3.11 展示了一个具有三个输入、三个隐藏单元和两个输出的示例。

激活函数使模型能够描述输入与输出之间的非线性关系;如果没有激活函数或使用线性激活函数,从输入到输出的整体映射将被限制为线性的。人们尝试过许多不同的激活函数(见图 3.13),但最常用的是 ReLU(图 3.1),它易于解释。使用 ReLU 激活时,网络将输入空间划分为由 ReLU 函数中"折点"的超平面交集定义的凸多面体。每个凸多面体内包含一个不同的线性函数。不同输出的多面体划分相同,但其中包含的线性函数可以不同。

图 3.11

图 3.11 具有三个输入和两个输出的神经网络可视化。该网络有二十个参数:十五个斜率(由箭头表示)和五个偏移(未显示)。

3.5 术语

本章最后介绍一些术语。令人遗憾的是,神经网络有大量相关术语。它们通常用(layers)来描述。图 3.12 左侧是输入层(input layer),中间是隐藏层(hidden layer),右侧是输出层(output layer)。我们说图 3.12 中的网络有一个隐藏层,包含四个隐藏单元。隐藏单元有时也被称为神经元(neurons)。当数据通过网络传递时,输入到隐藏层之前的值(即 ReLU 函数应用之前的值)称为预激活值(pre-activations),隐藏层的值(即 ReLU 函数应用之后的值)称为激活值(activations)。

出于历史原因,任何至少有一个隐藏层的神经网络也被称为多层感知器(multi-layer perceptron),简称 MLP。只有一个隐藏层的网络(如本章所述)有时被称为浅层神经网络(shallow neural networks)。具有多个隐藏层的网络(如下一章所述)被称为深度神经网络(deep neural networks)。连接形成无环图(即无循环的图,如本章所有示例)的神经网络被称为前馈网络(feed-forward networks)。如果一层中的每个元素都连接到下一层的每个元素(如本章所有示例),则该网络是全连接的(fully connected)。这些连接代表底层方程中的斜率参数,被称为网络权重(network weights)。偏移参数(图 3.12 中未显示)被称为偏置(biases)。

图 3.12

图 3.12 术语。浅层网络由输入层、隐藏层和输出层组成。各层之间通过前向连接(箭头)相连。因此,这些模型被称为前馈网络。当一层中的每个变量都连接到下一层中的每个变量时,我们称之为全连接网络。每个连接代表底层方程中的一个斜率参数,这些参数称为权重。隐藏层中的变量称为神经元或隐藏单元。输入隐藏单元之前的值(即 ReLU 函数应用之前)称为预激活值,隐藏单元的值(即 ReLU 函数应用之后)称为激活值。

3.6 总结

浅层神经网络有一个隐藏层。它们 (i) 计算输入的若干线性函数,(ii) 将每个结果通过激活函数,然后 (iii) 取这些激活值的线性组合形成输出。浅层神经网络基于输入 x 做出预测 y,方式是将输入空间划分为由分段线性区域组成的连续曲面。只要隐藏单元(神经元)数量足够,浅层神经网络可以以任意精度逼近任何连续函数。

第 4 章讨论深度神经网络,它通过增加更多隐藏层来扩展本章的模型。第 5–7 章描述如何训练这些模型。

基于 CC-BY-NC-ND 许可协议