反向传播算法是求代价函数小时参数θ的一种算法。
以监督学习为例,假设我们有训练样本集
,那么神经网络算法能够提供一种复杂且非线性的假设模型 ,它具有参数 ,可以以此参数来拟合我们的数据。
为了描述神经网络,我们先从最简单的神经网络讲起,这个神经网络仅由一个“神经元”构成,以下即是这个“神经元”的图示:
这个“神经元”是一个以
可以看出,这个单一“神经元”的输入-输出映射关系其实就是一个逻辑回归(logistic regression)。
虽然本系列教程采用sigmoid函数,但你也可以选择双曲正切函数(tanh):
以下分别是sigmoid及tanh的函数图像
函数是sigmoid函数的一种变体,它的取值范围为 ,而不是sigmoid函数的 。
注意,与其它地方(包括OpenClassroom公开课以及斯坦福大学CS229课程)不同的是,这里我们不再令
最后要说明的是,有一个等式我们以后会经常用到:如果选择
神经网络模型
所谓神经网络就是将许多个单一“神经元”联结在一起,这样,一个“神经元”的输出就可以是另一个“神经元”的输入。例如,下图就是一个简单的神经网络:
我们使用圆圈来表示神经网络的输入,标上“
”的圆圈被称为偏置节点,也就是截距项。神经网络最左边的一层叫做输入层,最右的一层叫做输出层(本例中,输出层只有一个节点)。中间所有节点组成的一层叫做隐藏层,因为我们不能在训练样本集中观测到它们的值。同时可以看到,以上神经网络的例子中有3个输入单元(偏置单元不计在内),3个隐藏单元及一个输出单元。
我们用
我们用
我们用
这样我们就可以得到一种更简洁的表示法。这里我们将激活函数
我们将上面的计算步骤叫作前向传播。回想一下,之前我们用
将参数矩阵化,使用矩阵-向量运算方式,我们就可以利用线性代数的优势对神经网络进行快速求解。
目前为止,我们讨论了一种神经网络,我们也可以构建另一种结构的神经网络(这里结构指的是神经元之间的联接模式),也就是包含多个隐藏层的神经网络。最常见的一个例子是
神经网络也可以有多个输出单元。比如,下面的神经网络有两层隐藏层:
要求解这样的神经网络,需要样本集
,其中 。如果你想预测的输出是多个的,那这种神经网络很适用。(比如,在医疗诊断应用中,患者的体征指标就可以作为向量的输入值,而不同的输出值 可以表示不同的疾病存在与否。)
反向传导算法
假设我们有一个固定样本集
,它包含 个样例。我们可以用批量梯度下降法来求解神经网络。具体来讲,对于单个样例 ,其代价函数为:这是一个(二分之一的)方差代价函数。给定一个包含
个样例的数据集,我们可以定义整体代价函数为:以上关于
定义中的第一项是一个均方差项。第二项是一个规则化项(也叫权重衰减项),其目的是减小权重的幅度,防止过度拟合。
[注:通常权重衰减的计算并不使用偏置项
权重衰减参数
以上的代价函数经常被用于分类和回归问题。在分类问题中,我们用
我们的目标是针对参数
梯度下降法中每一次迭代都按照如下公式对参数
其中
是学习速率。其中关键步骤是计算偏导数。我们现在来讲一下反向传播算法,它是计算偏导数的一种有效方法。
我们首先来讲一下如何使用反向传播算法来计算
以上两行公式稍有不同,第一行比第二行多出一项,是因为权重衰减是作用于
而不是 。
反向传播算法的思路如下:给定一个样例
- 进行前馈传导计算,利用前向传导公式,得到 直到输出层 的激活值。
- 对于第 层(输出层)的每个输出单元 ,我们根据以下公式计算残差:
- 对 的各个层,第 层的第 个节点的残差计算方法如下:
- 计算我们需要的偏导数,计算方法如下 :
最后,我们用矩阵-向量表示法重写以上算法。我们使用“
” 表示向量乘积运算符(在Matlab或Octave里用“.*”表示,也称作阿达马乘积)。若 ,则 。在上一个教程中我们扩展了 的定义,使其包含向量运算,这里我们也对偏导数 也做了同样的处理(于是又有 )。
那么,反向传播算法可表示为以下几个步骤:
- 进行前馈传导计算,利用前向传导公式,得到 直到输出层 的激活值。
- 对输出层(第 层),计算:
- 对于 的各层,计算:
- 计算最终需要的偏导数值:
实现中应注意:在以上的第2步和第3步中,我们需要为每一个
最后,我们将对梯度下降算法做个全面总结。在下面的伪代码中,
- 对于所有 ,令 , (设置为全零矩阵或全零向量)
- 对于 到 ,
- 使用反向传播算法计算 和 。
- 计算 。
- 计算 。
- 更新权重参数:
现在,我们可以重复梯度下降法的迭代步骤来减小代价函数
的值,进而求解我们的神经网络。参考:https://blog.csdn.net/qq_29762941/article/details/80343185