Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

6.3 前馈神经网络

下面更形式化地介绍最简单的神经网络——前馈网络(feedforward network)。前馈网络是一种无环的多层网络:每层单元的输出传给更高一层,不会传回较低层。(第 14 章将介绍带环的循环神经网络。)

由于历史原因,多层网络尤其是前馈网络有时称为多层感知机(multi-layer perceptron, MLP)。严格说这是误称,因为现代多层网络的单元并非感知机:感知机以简单阶跃函数为激活,而现代网络使用 ReLU、sigmoid 等多种非线性函数。不过,这个名称已经固定下来。

简单前馈网络包含三类节点:输入单元、隐藏单元和输出单元。图 6.8 展示了这种网络。输入层 x\mathbf x 是由标量值组成的向量,与图 6.2 相同。

网络核心是由隐藏单元 hih_i 组成的隐藏层 h\mathbf h。每个隐藏单元都是第 6.1 节所述的神经单元:对输入求加权和,再应用非线性函数。标准架构中的每层都是全连接(fully connected)的,即每个单元接收上一层全部单元的输出,相邻两层的每对单元之间都有连接。因此,每个隐藏单元都会对所有输入单元求和。

单个隐藏单元的参数包括一个权重向量和一个偏置。把每个单元 ii 的权重向量与偏置合并起来,便可用一个权重矩阵 W\mathbf W 和一个偏置向量 b\mathbf b 表示整个隐藏层的参数。WjiW_{ji} 表示从第 ii 个输入单元 xix_i 到第 jj 个隐藏单元 hjh_j 的连接权重。

用单个矩阵表示整层权重的优点是,前馈网络的隐藏层可以通过简单矩阵运算高效计算:权重矩阵乘输入向量 x\mathbf x,加偏置向量 b\mathbf b,再应用激活函数 gg(如 sigmoid、tanh 或 ReLU)。

图 6.8 简单的两层前馈网络,包含一个隐藏层、一个输出层和一个输入层(枚举层数时通常不计输入层)。

以 sigmoid 为激活函数,隐藏层输出向量为:

h=σ(Wx+b)(6.8)\mathbf h=\sigma(\mathbf W\mathbf x+\mathbf b)\tag{6.8}

这里 σ\sigma 作用于向量,而式 6.3 中作用于标量。我们约定任何激活函数 gg 都可逐元素作用于向量:g([z1,z2,z3])=[g(z1),g(z2),g(z3)]g([z_1,z_2,z_3])=[g(z_1),g(z_2),g(z_3)]

下面定义各向量和矩阵的维度。输入层称为第 0 层,输入数为 n0n_0,所以 xRn0\mathbf x\in\mathbb R^{n_0},即形状为 [n0×1][n_0\times1] 的列向量。隐藏层为第 1 层,输出层为第 2 层。隐藏层维数为 n1n_1,所以 h,bRn1\mathbf h,\mathbf b\in\mathbb R^{n_1}(每个隐藏单元可以有不同偏置);权重矩阵 WRn1×n0\mathbf W\in\mathbb R^{n_1\times n_0}。式 6.8 的矩阵乘法会把每个 hjh_j 计算为:

hj=σ(i=1n0Wjixi+bj)h_j=\sigma\left(\sum_{i=1}^{n_0}W_{ji}x_i+b_j\right)

第 6.2 节已经看到,隐藏层结果 h\mathbf h 形成输入的一种表示。输出层接收这个新表示并计算最终输出。输出可以是实数,但网络常用于分类,因此这里聚焦分类情形。

二元情感分类可以只有一个输出节点,其标量 yy 表示正面相对于负面的概率。词性标注等多项分类可为每个候选词性设一个输出节点,各节点输出为该词性的概率,且总和为 1。因此,输出层向量 y\mathbf y 给出所有输出节点上的概率分布。

与隐藏层一样,输出层也有权重矩阵,这里记为 U\mathbf U。有些模型不在输出层使用偏置,因此本例省略。权重矩阵乘输入 h\mathbf h,得到中间输出:

z=Uh\mathbf z=\mathbf U\mathbf h

若输出节点数为 n2n_2,则 zRn2\mathbf z\in\mathbb R^{n_2}URn2×n1\mathbf U\in\mathbb R^{n_2\times n_1}UijU_{ij} 表示从隐藏层单元 jj 到输出层单元 ii 的权重。

z\mathbf z 是实数向量,不能直接作为分类器所需的概率向量。第 4 章介绍的 softmax 可以把实数向量归一化为概率分布,即各值均在 0 与 1 之间且总和为 1。对 dd 维向量 z\mathbf z

softmax(zi)=exp(zi)j=1dexp(zj),1id(6.9)\operatorname{softmax}(z_i)=\frac{\exp(z_i)}{\sum_{j=1}^d\exp(z_j)},\qquad1\le i\le d\tag{6.9}

例如:

z=[0.6,1.1,1.5,1.2,3.2,1.1](6.10)\mathbf z=[0.6,1.1,-1.5,1.2,3.2,-1.1]\tag{6.10}

归一化后(四舍五入)为:

softmax(z)=[0.055,0.090,0.0067,0.10,0.74,0.010](6.11)\operatorname{softmax}(\mathbf z)=[0.055,0.090,0.0067,0.10,0.74,0.010]\tag{6.11}

第 4 章的多项逻辑回归也使用 softmax,把“权重乘特征再求和”得到的实数向量变成概率分布。因此,可以把单隐藏层神经分类器理解为:先构建输入的隐藏层表示 h\mathbf h,再对网络在 h\mathbf h 中形成的特征运行标准多项逻辑回归。第 4 章的特征主要由人工模板设计,而神经网络由先前各层自行归纳特征表示。

换言之,神经网络类似多项逻辑回归,但:(a)深度网络可包含许多层,仿佛一层层叠加逻辑回归分类器;(b)中间层可使用 tanh、ReLU、sigmoid 等多种激活,而非只有 sigmoid;(c)特征表示由网络先前各层归纳,而不是由特征模板形成。

单隐藏层前馈网络的最终方程为:输入 x\mathbf x,输出概率分布 y\mathbf y,参数为权重矩阵 W,U\mathbf W,\mathbf U 和偏置向量 b\mathbf b

h=σ(Wx+b)z=Uhy=softmax(z)(6.12)\begin{array}{ll}\mathbf h=&\sigma(\mathbf W\mathbf x+\mathbf b)\\\mathbf z=&\mathbf U\mathbf h\\\mathbf y=&\operatorname{softmax}(\mathbf z)\end{array}\tag{6.12}

各变量形状为:xRn0\mathbf x\in\mathbb R^{n_0}h,bRn1\mathbf h,\mathbf b\in\mathbb R^{n_1}WRn1×n0\mathbf W\in\mathbb R^{n_1\times n_0}URn2×n1\mathbf U\in\mathbb R^{n_2\times n_1}yRn2\mathbf y\in\mathbb R^{n_2}。该网络称为两层网络:按惯例不计输入层,但计输出层。因此,逻辑回归是一层网络。

6.3.1 前馈网络的更多细节

为讨论深度超过 2 的网络,使用方括号上标表示层号,输入层从 0 开始。W[1]\mathbf W^{[1]}b[1]\mathbf b^{[1]} 表示第一隐藏层的权重矩阵和偏置向量;njn_j 表示第 jj 层的单元数;g()g(\cdot) 表示激活函数,中间层通常用 ReLU 或 tanh,输出层用 softmax;a[i]\mathbf a^{[i]} 表示第 ii 层输出;z[i]=W[i]a[i1]+b[i]\mathbf z^{[i]}=\mathbf W^{[i]}\mathbf a^{[i-1]}+\mathbf b^{[i]};输入 x\mathbf x 也可写作 a[0]\mathbf a^{[0]}

式 6.12 的两层网络可重写为:

z[1]=W[1]a[0]+b[1]a[1]=g[1](z[1])z[2]=W[2]a[1]+b[2]a[2]=g[2](z[2])y^=a[2](6.13)\begin{array}{rcl}\mathbf z^{[1]}&=&\mathbf W^{[1]}\mathbf a^{[0]}+\mathbf b^{[1]}\\\mathbf a^{[1]}&=&g^{[1]}(\mathbf z^{[1]})\\\mathbf z^{[2]}&=&\mathbf W^{[2]}\mathbf a^{[1]}+\mathbf b^{[2]}\\\mathbf a^{[2]}&=&g^{[2]}(\mathbf z^{[2]})\\\hat{\mathbf y}&=&\mathbf a^{[2]}\end{array}\tag{6.13}

这种记号使每层计算具有相同形式。给定输入 a[0]\mathbf a^{[0]}nn 层前馈网络的前向计算为:

for i in 1,,nz[i]=W[i]a[i1]+b[i]a[i]=g[i](z[i])y^=a[n]\begin{array}{l}\text{for }i\text{ in }1,\ldots,n\\\mathbf z^{[i]}=\mathbf W^{[i]}\mathbf a^{[i-1]}+\mathbf b^{[i]}\\\mathbf a^{[i]}=g^{[i]}(\mathbf z^{[i]})\\\hat{\mathbf y}=\mathbf a^{[n]}\end{array}

最终 softmax 之前的最后一组未归一化激活 z[n]\mathbf z^{[n]},即分数向量,通常称为 logit

**为何需要非线性激活函数:**如果每层都没有非线性激活,所得多层网络与单层网络完全等价。考虑前两层均为纯线性的网络:

z[1]=W[1]x+b[1],z[2]=W[2]z[1]+b[2]\mathbf z^{[1]}=\mathbf W^{[1]}\mathbf x+\mathbf b^{[1]},\qquad\mathbf z^{[2]}=\mathbf W^{[2]}\mathbf z^{[1]}+\mathbf b^{[2]}

可改写为:

z[2]=W[2](W[1]x+b[1])+b[2]=W[2]W[1]x+W[2]b[1]+b[2]=Wx+b(6.14)\begin{array}{rcl}\mathbf z^{[2]}&=&\mathbf W^{[2]}(\mathbf W^{[1]}\mathbf x+\mathbf b^{[1]})+\mathbf b^{[2]}\\&=&\mathbf W^{[2]}\mathbf W^{[1]}\mathbf x+\mathbf W^{[2]}\mathbf b^{[1]}+\mathbf b^{[2]}\\&=&\mathbf W'\mathbf x+\mathbf b'\end{array}\tag{6.14}

这个结论可推广到任意层数。因此,没有非线性激活的多层网络,只是换了一组权重的单层网络的另一种写法,会失去多层网络的全部表示能力。

**替换偏置单元:**有时会用一种等价的简化记号,不再显式写偏置节点 bb。为每层增加一个值恒为 1 的虚拟节点 a0a_0,其对应权重即偏置。例如将:

h=σ(Wx+b)(6.15)\mathbf h=\sigma(\mathbf W\mathbf x+\mathbf b)\tag{6.15}

写成:

h=σ(Wx)(6.16)\mathbf h=\sigma(\mathbf W\mathbf x)\tag{6.16}

此时 x\mathbf xn0n_0 个值扩展为 n0+1n_0+1 个值,增加 x0=1x_0=1。原来的:

hj=σ(i=1n0Wjixi+bj)(6.17)h_j=\sigma\left(\sum_{i=1}^{n_0}W_{ji}x_i+b_j\right)\tag{6.17}

变为:

hj=σ(i=0n0Wjixi)(6.18)h_j=\sigma\left(\sum_{i=0}^{n_0}W_{ji}x_i\right)\tag{6.18}

其中 Wj0W_{j0} 取代 bjb_j

图 6.9 用 x0x_0(b)替换偏置节点(a)。

第 6.6 节介绍学习算法时仍会显式写出 bb;本书后续大部分图和部分方程则采用省略显式偏置项的简化记号。