6.3 前馈神经网络
下面更形式化地介绍最简单的神经网络——前馈网络(feedforward network)。前馈网络是一种无环的多层网络:每层单元的输出传给更高一层,不会传回较低层。(第 14 章将介绍带环的循环神经网络。)
由于历史原因,多层网络尤其是前馈网络有时称为多层感知机(multi-layer perceptron, MLP)。严格说这是误称,因为现代多层网络的单元并非感知机:感知机以简单阶跃函数为激活,而现代网络使用 ReLU、sigmoid 等多种非线性函数。不过,这个名称已经固定下来。
简单前馈网络包含三类节点:输入单元、隐藏单元和输出单元。图 6.8 展示了这种网络。输入层 x 是由标量值组成的向量,与图 6.2 相同。
网络核心是由隐藏单元 hi 组成的隐藏层 h。每个隐藏单元都是第 6.1 节所述的神经单元:对输入求加权和,再应用非线性函数。标准架构中的每层都是全连接(fully connected)的,即每个单元接收上一层全部单元的输出,相邻两层的每对单元之间都有连接。因此,每个隐藏单元都会对所有输入单元求和。
单个隐藏单元的参数包括一个权重向量和一个偏置。把每个单元 i 的权重向量与偏置合并起来,便可用一个权重矩阵 W 和一个偏置向量 b 表示整个隐藏层的参数。Wji 表示从第 i 个输入单元 xi 到第 j 个隐藏单元 hj 的连接权重。
用单个矩阵表示整层权重的优点是,前馈网络的隐藏层可以通过简单矩阵运算高效计算:权重矩阵乘输入向量 x,加偏置向量 b,再应用激活函数 g(如 sigmoid、tanh 或 ReLU)。

图 6.8 简单的两层前馈网络,包含一个隐藏层、一个输出层和一个输入层(枚举层数时通常不计输入层)。
以 sigmoid 为激活函数,隐藏层输出向量为:
h=σ(Wx+b)(6.8) 这里 σ 作用于向量,而式 6.3 中作用于标量。我们约定任何激活函数 g 都可逐元素作用于向量:g([z1,z2,z3])=[g(z1),g(z2),g(z3)]。
下面定义各向量和矩阵的维度。输入层称为第 0 层,输入数为 n0,所以 x∈Rn0,即形状为 [n0×1] 的列向量。隐藏层为第 1 层,输出层为第 2 层。隐藏层维数为 n1,所以 h,b∈Rn1(每个隐藏单元可以有不同偏置);权重矩阵 W∈Rn1×n0。式 6.8 的矩阵乘法会把每个 hj 计算为:
hj=σ(i=1∑n0Wjixi+bj) 第 6.2 节已经看到,隐藏层结果 h 形成输入的一种表示。输出层接收这个新表示并计算最终输出。输出可以是实数,但网络常用于分类,因此这里聚焦分类情形。
二元情感分类可以只有一个输出节点,其标量 y 表示正面相对于负面的概率。词性标注等多项分类可为每个候选词性设一个输出节点,各节点输出为该词性的概率,且总和为 1。因此,输出层向量 y 给出所有输出节点上的概率分布。
与隐藏层一样,输出层也有权重矩阵,这里记为 U。有些模型不在输出层使用偏置,因此本例省略。权重矩阵乘输入 h,得到中间输出:
z=Uh 若输出节点数为 n2,则 z∈Rn2,U∈Rn2×n1;Uij 表示从隐藏层单元 j 到输出层单元 i 的权重。
z 是实数向量,不能直接作为分类器所需的概率向量。第 4 章介绍的 softmax 可以把实数向量归一化为概率分布,即各值均在 0 与 1 之间且总和为 1。对 d 维向量 z:
softmax(zi)=∑j=1dexp(zj)exp(zi),1≤i≤d(6.9) 例如:
z=[0.6,1.1,−1.5,1.2,3.2,−1.1](6.10) 归一化后(四舍五入)为:
softmax(z)=[0.055,0.090,0.0067,0.10,0.74,0.010](6.11) 第 4 章的多项逻辑回归也使用 softmax,把“权重乘特征再求和”得到的实数向量变成概率分布。因此,可以把单隐藏层神经分类器理解为:先构建输入的隐藏层表示 h,再对网络在 h 中形成的特征运行标准多项逻辑回归。第 4 章的特征主要由人工模板设计,而神经网络由先前各层自行归纳特征表示。
换言之,神经网络类似多项逻辑回归,但:(a)深度网络可包含许多层,仿佛一层层叠加逻辑回归分类器;(b)中间层可使用 tanh、ReLU、sigmoid 等多种激活,而非只有 sigmoid;(c)特征表示由网络先前各层归纳,而不是由特征模板形成。
单隐藏层前馈网络的最终方程为:输入 x,输出概率分布 y,参数为权重矩阵 W,U 和偏置向量 b:
h=z=y=σ(Wx+b)Uhsoftmax(z)(6.12) 各变量形状为:x∈Rn0,h,b∈Rn1,W∈Rn1×n0,U∈Rn2×n1,y∈Rn2。该网络称为两层网络:按惯例不计输入层,但计输出层。因此,逻辑回归是一层网络。
6.3.1 前馈网络的更多细节¶
为讨论深度超过 2 的网络,使用方括号上标表示层号,输入层从 0 开始。W[1]、b[1] 表示第一隐藏层的权重矩阵和偏置向量;nj 表示第 j 层的单元数;g(⋅) 表示激活函数,中间层通常用 ReLU 或 tanh,输出层用 softmax;a[i] 表示第 i 层输出;z[i]=W[i]a[i−1]+b[i];输入 x 也可写作 a[0]。
式 6.12 的两层网络可重写为:
z[1]a[1]z[2]a[2]y^=====W[1]a[0]+b[1]g[1](z[1])W[2]a[1]+b[2]g[2](z[2])a[2](6.13) 这种记号使每层计算具有相同形式。给定输入 a[0],n 层前馈网络的前向计算为:
for i in 1,…,nz[i]=W[i]a[i−1]+b[i]a[i]=g[i](z[i])y^=a[n] 最终 softmax 之前的最后一组未归一化激活 z[n],即分数向量,通常称为 logit。
**为何需要非线性激活函数:**如果每层都没有非线性激活,所得多层网络与单层网络完全等价。考虑前两层均为纯线性的网络:
z[1]=W[1]x+b[1],z[2]=W[2]z[1]+b[2] 可改写为:
z[2]===W[2](W[1]x+b[1])+b[2]W[2]W[1]x+W[2]b[1]+b[2]W′x+b′(6.14) 这个结论可推广到任意层数。因此,没有非线性激活的多层网络,只是换了一组权重的单层网络的另一种写法,会失去多层网络的全部表示能力。
**替换偏置单元:**有时会用一种等价的简化记号,不再显式写偏置节点 b。为每层增加一个值恒为 1 的虚拟节点 a0,其对应权重即偏置。例如将:
h=σ(Wx+b)(6.15) 写成:
h=σ(Wx)(6.16) 此时 x 从 n0 个值扩展为 n0+1 个值,增加 x0=1。原来的:
hj=σ(i=1∑n0Wjixi+bj)(6.17) 变为:
hj=σ(i=0∑n0Wjixi)(6.18) 其中 Wj0 取代 bj。

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