在《机器学习:神经网络的模型构建》中,我记录了神经网络的一些基础知识,包括神经网络的逻辑单元、模型表示、前向传播等等。这篇笔记中,我会整理神经网络的代价函数以及反向传播算法~
那么如何在给定的训练集下,来为神经网络拟合参数呢?和之前学习的大多数算法一样,要从代价函数开始讨论起了。
神经网络在分类中的应用
神经网络可以应用在两种分类问题中:二分类问题和多分类问题。
在二分类问题中,y 等于 0 或 1,神经网络只有一个输出单元;多分类问题中,y 可能为任何实数,神经网络有多个输出单元。
神经网络的代价函数
现在我们有一个训练集: ,其中有 m 个训练样本,每个包含一组输入 和一组输出 ,我们用 表示神经网络的总层数,用 表示第 层的单元数量,即神经元的数量(不包括偏置单元)。
一般来说,我们使用的神经网络的代价函数是逻辑回归里代价函数的一般形式。
在逻辑回归中,我们的代价函数通常为: ,其中第一项表示预测值与实际值之间的差距,第二项为参数的正则化项。
对于神经网络来说,不再是只有一个输出单元,取而代之的是 K 个,那么其代价函数就表示为:
其中 (K 维向量), 表示第 i 个输出。
即每一个的逻辑回归算法的代价函数,按输出的顺序 1 ~ K,依次相加。
反向传播算法
那么如何将神经网络的代价函数最小化呢?我们来看一下反向传播算法。
在上一个部分中,我们已经得到了代价函数 的表达式,想要用梯度下降法或更高级的优化算法来求参数,就需要来计算 和 。
先回顾一下前向传播算法,如果有一个训练集,只有一组样本 ,那么求训练集在神经网络中各层的输出值的过程为:
就是第一层的激励值,也就是输入层,所以为 ,那么 就等于矩阵 乘 ,第二层的激励值 就为 ,后几层同理,同样用前向传播求出 和 ,其中 为 S 型激励函数。同样, 也是假设函数的输出 。
⚠️接下来,为了计算导数项,我们就需要用到反向传播算法了!
简单来说,我们引入了一个误差变量 ,代表第 层中第 个节点的误差,表示了该节点对最终输出值的残差产生的影响,也就是说这个误差捕捉到了该节点的激励值,然后计算出其误差,例如:
,
向量化表示就是:
,
其中:向量维数等于输出的单元个数。
下一步就是计算前几层的误差项了:
(推导方法有很多种,式子太复杂就不记录了……)
到这里也看出来为什么叫反向传播算法了,因为是从输出层开始,一层一层往前推算的,一直计算到第二层,因为第一层是输入层,不存在误差。
这就是反向传播算法的大致过程,那么面对复杂的训练集时,如何使用反向传播算法呢?
假设训练集为 ,设误差 ,下面是一段伪代码:
For to
{
Set
Perform forward propagation to compute for
Using , cpmpute
Compute
}
if if
简单来说就是,从后向前依次计算每一层的 ,用 代表总误差,每一层都有对应的 ,再引入代价函数对参数进行求导的结果 , 时对应偏置项。
一旦计算出了 ,就可以得到代价函数对每个参数的偏导数,因为可以证明得到:
,
用来累加误差值,最后帮助我们计算偏微分~