1,代价函数
在逻辑回归中我们只有一个输出变量,,但是在神经网络中,我们有很多的输出变量,我们的是一个维度为K的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些。
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察 算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出 ?个预测,基本上我们可以利用循环,对每一行特征都预测?个不同结果,然后在利用循环 在?个预测中选择可能性最高的一个,将其与?中的实际数据进行比较。
注意:正则化那一项只是排除了每一层后,每一层参数矩阵的和。最里面的循环j循环所有的行(由 + 1层的激活单元数决定),循环i则循环所有的列,由该层(层)的激活单元数决定。
注意:ℎ?(?)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行 regularization 的 bias 项处理所有参数的平方和。
2,反向传播算法
在之前的文章中,信息或者说是数据是一种向前传播的过程,一直到最后,现在我们为了计算代价函数 的偏导数,我们需要采用一种反向传播的算法,先计算最后一层的误差,然后一层一层反向求各层的误差,直到倒数第二层。
咱们先看一下前向传播:(假设分四类,最后一层神经元个数,四层神经元。)
m:训练样本
L:神经网络层数
:每层的神经元数目
:输出层神经元数目
K:k类分类
然后来看反向传播:
我们从最后一层的误差开始计算,误差是激活单元的预测()和实际值()之间的误差。我们用来表示:那么输出层的误差就是:;我们利用这一层的误差值来计算前一层的误差: ,其中是S形函数的导数, = 。而则是权重导致的误差的和。下一步就是计算第二层的误差:。
我们有了所有误差的表达式后,就可以计算待机函数的偏导数,假设我们不做任何正则化处理,有:.。
式子中表示的含义有;
l:表示目前所计算的是第几层
j ;代表目前计算层中的激活单元的下标,也将是下一层的第j个输入变量的下标
i:表示下一层中误差单元的下标,是收到权重矩阵中第i行影响的下一层中的误差单元的下标。
也就是说,计算层的某一个节点到下一层的某一个节点的代价函数的偏导数等于计算节点的输出值乘以下一层计算节点的误差值。首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的 结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。
如果我们考虑正则化处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊 情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中, 我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误 差单元也是一个矩阵,我们用来表示这个误差矩阵。第 ? 层的第 ? 个激活单元受到第 ? 个参数影响而导致的误差。
算法表示为:
在求出误差矩阵之后,我们就可以计算代价函数的偏导数:
3,反向传播算法的直观理解
假设这是一个前向传播的例子,有两个特征值:
将训练样本输入之后得到,每一层和参数的加权和以及sigmoid函数的输出值:
4,梯度检验
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些 不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。 为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking) 方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后 计算两个点的平均值用以估计梯度。即对于某个特定的 ?,我们计算出在 ?-? 处和 ?+? 的 代价值(?是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 ? 处的代价值。
当?是一个向量时,我们则需要对偏导数进行检验。因为代价函数的偏导数检验只针对 一个参数的改变进行检验,下面是一个只针对?1进行检验的示例:
5,小结反向传播算法