- 代价函数
假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y,L表示神经网络层数,Sl表示每层的neuron个数(表示输出层神经元个数),SL代表最后一层中处理单元的个数。将神经网络的分类定义为两种情况:二类分类和多类分类。二类分类:Sl=0,y=0ory=1表示哪一类;K类分类:SL=k,yi表示分到第i类。
逻辑回归问题中我们的代价函数扩展到神经网络中:
- 反向传播算法
为了计算代价函数的偏导数,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。 以一个例子来说明反向传播算法。假设我们的训练集只有一个样本,我们的神经网络是一个四层的神经网络,其中K=4,SL=4,L=4,前向传播算法:
我们从最后一层的误差开始计算,误差是激活单元的预测与实际值
之间的误差,我们用δ来表示误差,计算过程如下:
因为第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了。假设λ=0,即我们不做任何正则化处理时有: 。l 代表目前所计算的是第几层,j代表目前计算层中的激活单元的下标,也将是下一层的第j个输入变量的下标,i代表下一层中误差单元的下标,是受到权重矩阵中第i行影响的下一层中的误差单元的下标。我们的算法表示为:
即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。
- 反向传播算法的直观理解
前向传播算法:
反向传播算法做的是:
- 梯度检验
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。
- 随机初始化
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。我们通常初始参数为正负ε之间的随机值。
- 综合起来
使用神经网络时的步骤:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。第一层的单元数即我们训练集的特征数量。最后一层的单元数是我们训练集的结果的类的数量。如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。我们真正要决定的是隐藏层的层数和每个中间层的单元数。
训练神经网络:
- 参数的随机初始化
- 利用正向传播方法计算所有的hθ(x)
- 编写计算代价函数J的代码
- 利用反向传播方法计算所有偏导数
- 利用数值检验方法检验这些偏导数
- 使用优化算法来最小化代价函数