本节中,我们将使用正向传播(forward propagation)来计算多层感知器(MLP)模型的输出。为理解正向传播是如何通过学习来拟合多层感知器模型,我们将多层感知器的学习过程总结为三个简单步骤:
1)从输入层开始,通过网络向前传播(也就是正向传播)训练数据中的模式,以生成输出。
2)基于网络的输出,通过一个代价函数(稍后将有介绍)计算所需最小化的误差。
3)反向传播误差,计算其对于网络中每个权重的导数,并更新模型。
最终,通过对多层感知器模型权重的多次迭代和学习,我们使用正向传播来计算网络的输出,并使用阈值函数获得独热法所表示的预测类标,独热表示法介绍详见上节。
现在,让我们根据正向传播算法逐步从训练数据的模式中生成一个输出。由于隐层每个节点均完全连接到所有输入层节点,我们首先通过以下公式计算的激励:
其中,为净输入,φ(·)为激励函数,此函数必须是可微的,以方便根据梯度方法学习得到连接神经元的权重。为了解决图像分类等复杂问题,我们需要在多层感知器模型中使用非线性激励函数,例如,在第3章的逻辑斯谛回归中所使用的sigmoid激励函数:
我们应该还记得,sigmoid函数的图像为S型曲线,它可以将净输入映射到一个介于[0,1]区间的逻辑斯谛分布上去,分布的原点为z=0.5处,如下图所示:
多层感知器是一个典型的前馈人工神经网络。与本章后续要讨论的递归神经网络不同,此处的前馈是指每一层的输出都直接作为下一层的输入。由于此网络架构中,人工神经元是典型的sigmoid单元,而不是感知器,因此多层感知器这个词听起来有些不够贴切。直观上说,我们可以将多层感知器中的神经元看作是返回值位于[0,1]连续区间上的逻辑斯谛回归单元。
为了提高代码的执行效率和可读性,我们将使用线性代数中的基本概念,并以紧凑的方式实现一个激励单元:借助NumPy使用向量化的代码,而不是使用效率低下的Python多层for循环嵌套:
其中,A(1)是一个n×[m+1]维的矩阵,而上式中两个矩阵相乘的结果为一个h×n维的净输入矩阵z2。最后,我们将激励函数φ(·)应用于净输入矩阵中的每个值,便为下一层(本例中为输出层)获得一个h×n维的激励矩阵A(2):
类似地,我们以向量的形式重写输入层的激励:
这里,我们将一个t×h维的矩阵W(2)(t为输出单元的数量)与h×n维的矩阵A(3)相乘,得到了t×h维的矩阵z(3)(此矩阵中的列对应每个样本的输出)。
最后,通过sigmoid激励函数,我们可以得到神经网络的连续型输出: