先搞清楚一个基本事实:在实际问题中,我们手头拥有的只有数据及其对应的标签。那个能将输入映射到输出的决策函数——也就是神经网络本身——究竟是什么样,没人知道。
因此,当我们使用神经网络解决实际问题时,通常需要遵循这样一套流程:先假设一个神经网络结构,然后把训练数据输入进去,最后再想办法计算出那些待求的参数。
一、假设人工神经网络结构
这个“假设结构”的环节,主要需要确定两件事:一是网络总共需要多少层,二是每一层放置多少个神经元。
说实话,这两个问题并没有标准答案,更多依赖开发人员的经验和直觉。不过,可以遵循几条基本准则:
如果问题本身比较简单,比如两个类别之间的分界线并不复杂,那么可以选择一个简单的结构——层数少一些,每层神经元也少一些,够用就行。

图片来源:中国慕课大学《机器学习概论》
反之,如果问题较为复杂,例如做人脸识别,就需要采用更复杂的结构——层数更深,神经元数量也更多。
还有一条原则:训练数据量少,就选择简单结构;数据量大,结构就可以大胆复杂一些。
二、求解人工神经网络待求参数
以一个两层神经网络模型为例。如图一所示,输入为(X,Y),其中X=[x1,x2]的转置,Y是标签值。我们的目标非常明确:通过不断调整权重ω和偏置b,让模型的实际输出y尽量逼近真实的标签Y。

图一,图片来源:中国慕课大学《机器学习概论》
根据前文,y的表达式为:y=ω1φ(ω11x1+ω12x2+b1)+ω2φ(ω21x1+ω22x2+b1)+b3。
要让y和Y最接近,在数学上就是求解一个最小化问题:Minimize: E(ω,b) = E(X,Y)[(Y-y)²]。这里的E(X,Y)表示对所有训练样本和标签求期望,也就是平均值。
但问题在于,y是(ω,b)的非凸函数。这意味着,该问题无法找到一个唯一的全局最小值。
因此,在实际工程中,我们通常采用梯度下降法来求解一个局部极小值。梯度下降的步骤如下:
(1)随机给ω和b选取初始值(ω(0), b(0))。
(2)然后开始迭代。在第n步,更新公式为:ω(n+1) = ω(n) - α·∂E/∂ω;b(n+1) = b(n) - α·∂E/∂b。这里的α称为学习率。
学习率由开发人员自行设定。这个参数非常关键:设得太大,容易跨过极值点;设得太小,又可能迟迟找不到极值点。只有设定得当,才能又快又准地收敛到局部极值。
当然,由于神经网络对应的决策函数是未知的,并不存在一种通用方法能直接计算出最优的α值,最终仍需开发人员根据经验进行调整。

图片来源:中国慕课大学《机器学习概论》
梯度下降法的直观含义如下:如图二所示,通过一步一步迭代,逐步遍历x1、x2、x3……直到xn,最终找到函数的一个局部极小值点。这个点,就是我们想要的那个“y和Y最接近”的位置。

图片来源:中国慕课大学《机器学习概论》
