分享

机器学习笔记019 | 反向传播算法与神经网络的梯度

 昵称16619343 2017-09-27

在了解神经网络的代价函数之后,下一步就是找到让代价函数最小化的参数。

但首先我要先计算出它的梯度,也就是对代价函数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 代表着偏差单元的下标,这里表示不对偏差项计算正则化。

最终,我们对代价函数的求导,就得到:

文章提前发布在公众号:止一之路

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多