在了解神经网络的代价函数之后,下一步就是找到让代价函数最小化的参数。
但首先我要先计算出它的梯度,也就是对代价函数J(θ)求导:
这里,我们要介绍一种反向传播(Back Propagation)算法。
例如前面我们的神经网络是:
我们之前在笔记《神经网络算法》中提到的,是前向传播( Forward Propagation)的计算方式。对于这样的神经网络,具体的执行步骤是:
那所谓的反向传播,其实就是把这个过程倒过来。
我们可以根据最后一层真实值和预测值之间的误差,来反向得到每一层的误差,然后计算得到执行算法所需要的梯度。
下面我们来看看公式,和详细的推导过程。
我们暂时不考虑正则化项,可以暂时只看代价函数左边的部分:
这可以近似看作:
我们再假设只有一个样本集 ( x , y ) ,得到的误差平方函数是:
这里的 K 代表着分类的个数,例如上面的网络就是4,aL 是神经网络最后一层的计算结果,也是神经网络的预测值。
对于实际值和预测值之间的误差,我们定义为:
这代表着第 l 个层次,第 j 个节点的误差。
下面涉及到函数的求导,我们先做一些准备,下面是一些求导的原则:
对于逻辑函数:
我们的求导过程如下:
向量化的表达就是:
其中 ⊙ 代表矩阵或向量之间点对点的乘法运算。
为什么要求导逻辑函数呢?因为我们下面会用到。
回到误差的计算,对于最后一层,计算的过程是这样的:
为了方便计算,我们也可以认为是对aL的求导,然后计算如下:
向量化的表达就是:
对于每一层误差的计算,也是类似的:
这里的 sl+1 是第 l+1 层单元的数量。因为我们计算第 l 层的某个单元的误差,起码我们先计算得到 l+1 层的全部单元的误差,对吧。所以这里有一个加总。
向量化的表达就是:
使用个公式,我们计算每一层的误差: δ(L−1),δ(L−2),…,δ(2) 。
需要注意的是,这里没有 δ(1) ,因为这是我们的输入节点 x 。
例如对于上面的神经网络,我们可以这么计算:
得到每一层的误差之后,我们就可以计算梯度了。
梯度是相对于 θ 的求导,我们的求导过程如下:
向量化的表达就是:
因为我们的样本集是:
对于这样m个样本集,我们将所有的误差累加起来:
向量化的表达就是:
加上正则化项,并将这个累加的结果平均化,就是除以训练样本数量 m 可以得到:
i = 0 代表着偏差单元的下标,这里表示不对偏差项计算正则化。
最终,我们对代价函数的求导,就得到:
文章转载自公众号:止一之路