训练前的准备
在训练一个神经网络时,第一个要做的事情就是选择一种网络框架,即神经元之间的连接模式
也就是说,我们需要决定我们的网络有多少层以及每层分别有多少个单元。
第一层,即输入层的单元数是我们训练集的特征数量,在我们确定训练集的特征时就需要确定好了。
最后一层,即输出层的单元数是我们训练集的结果的类的数量,当分类数为2时,输出层仅需一个单元即可,此时模型的输出为一个实数;当分类数 K K K大于等于三时,输出层的单元数就需要 K K K个,此时模型的输出为一个向量,并且向量的维数为 R K × 1 \R^{K\times1} RK×1
因此真正要决定的是隐藏层的乘数以及每个中间层的单元数。
训练神经网络需要实现的步骤
-
构建一个神经网络,并且随机初始化权重,通常我们把权重初始化为很小的值,接近于零,
-
执行向前传播算法,也就是对于该网络的任何一个输入 x ( i ) x^{(i)} x(i),计算出对应的输出 h Θ ( x ( i ) ) h_\Theta(x^{(i)}) hΘ(x(i)),也就是一个输出值y的向量
-
通过代码计算出代价函数 J ( Θ ) J(\Theta) J(Θ)
-
执行反向传播算法来算出对于每个参数的偏导数项: ∂ ∂ Θ j k ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{jk}^{(l)}}J(\Theta) ∂Θjk(l)∂J(Θ)
-
使用梯度检测来比较使用反向传播算法与使用数值差分方法得到的偏导数项,确保两种方法得到基本接近的两个值,通过梯度检测我们可以确保我们的反向传播算法得到的结果是正确的
切记,在这里验证结束后需要将梯度检测关闭掉,因为梯度检测计算速度是非常慢的
-
最后,我们可以使用梯度下降算法或者更加高级的优化方法,比如说是LBFGS算法、共轭梯度法与发现传播算法相结合,来最小化关于 θ \theta θ的代价函数 J ( θ ) J(\theta) J(θ)
反向传播算法计算出这些偏导数项的值,也就是计算出梯度下降的方向,而梯度下降的作用就是沿着这个方向一点一点的下降,一直到我们希望得到的点,如下图所示