输入单元的数量 = 特征x(i)的维度;
输出单元的数量 = 分类问题所要区别的类别个数;
隐藏单元的个数以及隐藏层的数目,一个默认的选项是只是用单个隐藏层,如图最左端的神经网络。如果不止一个隐藏层,同样有一个合理的默认选项,即每一个隐藏层通常都应有相同的单元数。实际上左边这个结构是较为合理的默认结构,而对于隐藏单元的个数则是越多越好,当然计算量也会随之增大。一般来说每个隐藏层所包含的单元数量还应和输入x的维度相匹配,即和特征的数目匹配。隐藏单元的数目可以和输入特征的数量相同,或者是它的二倍或者三四倍,都是有效的。
训练一个神经网络的步骤:
- 1.构建一个神经网络,随机初始化权重,通常初始化为很小的接近于零的值;
- 执行前向传播算法,得到hθ(x)和x(i);
- 通过代码计算出代价函数J(θ);
- 执行反向传播算法来算出偏导数项(J(θ)关于参数θ的偏导数);
- 使用梯度检查来比较这些已经计算得到的偏导数项,把用反向传播算法得到的偏导数值与用数值方法得到的估计值进行比较,通过进行梯度检查来确保两种方法得到基本接近的两个值,我们能确保反向传播算法得到的结果是正确的。停用梯度检查,因为梯度检查算法的计算非常慢;
- 使用一个最优化算法,如梯度下降或更加高级的优化算法(LBFGS算法,共轭梯度法,或者其他内置到fminunc函数中的方法)将这些优化算法和反向传播算法相结合,最小化关于θ的代价函数J(θ)。
J(θ)是一个非凸函数,就是说不是凸函数,理论上可能停留在局部最小值的位置,梯度下降算法和其他高级的优化算法
理论上都可能收敛于局部最小值。