1. 回顾
在上一讲中,我们讲到多层神经网络的结构是由每一层有多个神经元组成的线性结构,加上层与层之间的非线性函数构成。我们同时论证了层与层之间的非线性函数是阶跃函数,那么三层神经网络可以模拟任意的决策函数。然而在实际的应用中,问题是反过来的,我们并不知道决策函数是什么,而是只知道特征空间中一些训练样本和这些训练样本的标签。由于我们不知道决策函数的具体形式,因此我们也无法知道如何表征这个神经网络的结构。
2. 思路分析
我们只能采取另一种思路,即首先假定是某一种结构,然后将一堆训练数据输入到网络中去估计这个网络待求的参数。这两个问题都很复杂,首先假定一个多层神经网络的结构就涉及到不确定的因素,其中最重要的两个因素是
(1)网络有多少层?
(2)每层神经元的个数是多少?
遗憾的是尽管人工神经网络的研究已经有了大半个世纪的历史,但是对上述两个问题却没有标准的答案。我们只能从经验上去说一下设计网络结构的两个准则:
- 如果问题是简单的。
例如像前面学到的分割红细胞和白细胞的问题,如下图所示,在特征空间中,两个类别的区分是明显的,那么一条不是很复杂的曲线就能分开两类,对于这样简单问题,我们设计的神经网络结构也可以简单一点。也就是说神经网络的层数以及每层神经元的个数也可以少一点。
- 如果问题本身是很复杂的
例如人脸识别这样的问题,那么神经网络的层数和每层神经元的个数都需要更多一些,这样神经网络产生的非线性函数才会更加复杂,才更有可能捕捉到训练样本的变化。
另一个方面,网络结构设计和训练样本的数量也有很强的相关性。我们前面讲到,算法模型的复杂度要和训练样本的复杂度相匹配。因此,对于训练样本很多的情况,我们可以增加神经网络的层数和每一层神经元的个数,从而增加神经网络的复杂度,使它与训练的复杂度匹配。而对于训练数据很少的情况,神经网络的复杂度一般不能设置得过高。
上述两个原则并没有直接回答对于某个具体的问题神经网络应该设置多少层,每层神经元的个数应该是多少。在实践中,我们只能通过经验来设置这些重要的参数。如果某一个模型表现得不好,我们就换一个。因此,有人说神经网络参数设置不是科学而是艺术,这也是神经网络这种方法时常被诟病的方面之一。
3. 优化网络中待求的参数—梯度下降法
接下来,我们假定神经网络设置已经确定下来,即神经网络的层数以及每一层神经元的个数已经确定。那么在这样的前提下,我们来看一下如何优化网络中待求的参数,这里还是举两层神经网络的例子,如下图所附的这个例子。
输入 ( X , Y ) (X,Y) (X,Y),其中 X = [ x 1 x 2 ] X= \left[ \begin{matrix} x_1 \\ x_2 \end{matrix} \right] X=[x1x2], Y Y Y是 X X X的标签值(label),即我们希望改变 w w w和 b b b,使得标签值 Y Y Y与实际的网络输出 y y y尽量接近。
这里需要注意的是 Y Y Y 是 X X X 的标签,由训练数据直接给定,而 y y y 是神经网络的输出。在前面一讲中,我们知道 y y y可以写成如下的形式:
a 1 = ω 11 x 1 + ω 12 x 2 + b 1 a_1=ω_{11}x_1+ω_{12}x_2+b_1 a1=ω11x1+ω12x2+b1(第一个神经元)
a 2 = ω 21 x 1 + ω 22 x 2 + b 2 a_2=ω_{21}x_1+ω_{22}x_2+b_2 a2=ω21x1+ω22x2+b2(第二个神经元)
z 1 = φ ( a 1 ) z_1=φ(a_1) z1=φ(a1)(非线性函数)
z 2 = φ ( a 2 ) z_2=φ(a_2) z2=φ(a2)(非线性函数)
y = ω 1 z 1 + ω 2 z 2 + b 3 y=ω_1z_1+ω_2z_2+b_3 y=ω1z1+ω2z2+b3(第三个神经元)
或者我们可以用一个统一的式子来表示:
y = w 1 φ ( ω 11 x 1 + ω 12 x 2 + b 1 ) + w 2 φ ( ω 21 x 1 + ω 22 x 2 + b 2 ) + b 3 (1) y=w_1φ(ω_{11}x_1+ω_{12}x_2+b_1)+w_2φ(ω_{21}x_1+ω_{22}x_2+b_2)+b_3\tag{1} y=w1φ(ω11x1+ω12x2+b1)+w2φ(ω