在《机器学习:神经网络的模型构建》中,我记录了神经网络的一些基础知识,包括神经网络的逻辑单元、模型表示、前向传播等等。这篇笔记中,我会整理神经网络的代价函数以及反向传播算法~
那么如何在给定的训练集下,来为神经网络拟合参数呢?和之前学习的大多数算法一样,要从代价函数开始讨论起了。
神经网络在分类中的应用
文章图片
神经网络可以应用在两种分类问题中:二分类问题和多分类问题。
在二分类问题中,y 等于 0 或 1,神经网络只有一个输出单元;多分类问题中,y 可能为任何实数,神经网络有多个输出单元。
神经网络的代价函数 现在我们有一个训练集:,其中有 m 个训练样本,每个包含一组输入和一组输出,我们用表示神经网络的总层数,用表示第层的单元数量,即神经元的数量(不包括偏置单元)。
一般来说,我们使用的神经网络的代价函数是逻辑回归里代价函数的一般形式。
在逻辑回归中,我们的代价函数通常为:,其中第一项表示预测值与实际值之间的差距,第二项为参数的正则化项。
对于神经网络来说,不再是只有一个输出单元,取而代之的是 K 个,那么其代价函数就表示为:
文章图片
其中(K 维向量),表示第 i 个输出。
即每一个的逻辑回归算法的代价函数,按输出的顺序 1 ~ K,依次相加。
反向传播算法 那么如何将神经网络的代价函数最小化呢?我们来看一下反向传播算法。
在上一个部分中,我们已经得到了代价函数的表达式,想要用梯度下降法或更高级的优化算法来求参数,就需要来计算和。
先回顾一下前向传播算法,如果有一个训练集,只有一组样本,那么求训练集在神经网络中各层的输出值的过程为:
文章图片
就是第一层的激励值,也就是输入层,所以为,那么就等于矩阵乘,第二层的激励值就为,后几层同理,同样用前向传播求出和,其中为 S 型激励函数。同样,也是假设函数的输出。
??接下来,为了计算导数项,我们就需要用到反向传播算法了!
简单来说,我们引入了一个误差变量,代表第层中第个节点的误差,表示了该节点对最终输出值的残差产生的影响,也就是说这个误差捕捉到了该节点的激励值,然后计算出其误差,例如:
,
向量化表示就是:
,
【机器学习|机器学习(神经网络的代价函数及反向传播算法)】其中:向量维数等于输出的单元个数。
下一步就是计算前几层的误差项了:
(推导方法有很多种,式子太复杂就不记录了……)
到这里也看出来为什么叫反向传播算法了,因为是从输出层开始,一层一层往前推算的,一直计算到第二层,因为第一层是输入层,不存在误差。
这就是反向传播算法的大致过程,那么面对复杂的训练集时,如何使用反向传播算法呢?
假设训练集为,设误差,下面是一段伪代码:
Forto简单来说就是,从后向前依次计算每一层的,用代表总误差,每一层都有对应的,再引入代价函数对参数进行求导的结果 ,时对应偏置项。
{
Set
Perform forward propagation to computefor
Using, cpmpute
Compute
}
ifif
一旦计算出了,就可以得到代价函数对每个参数的偏导数,因为可以证明得到:
,
用来累加误差值,最后帮助我们计算偏微分~
推荐阅读
- python机器学习|从零到一实现神经网络(五):数学微分法更新权重参数
- 人工智能|我的天,强化学习还能用在自动驾驶领域()
- 前沿技术|深度学习框架中的自动微分及高阶导数
- python|python学习计划大全(从入门到实战)
- 深度学习|二、机器学习基础13(熵、信息增益、剪枝处理、SVM)
- 深度学习|二、机器学习基础14(核函数)
- 深度学习|二、机器学习基础15(SVM优缺点、聚类与降维)
- 大数据|一文看懂数据清洗(缺失值、异常值和重复值的处理)
- 算法|【机器学习基础】数学推导+纯Python实现机器学习算法26(随机森林)