9.1 代价函数
在神经网络的学习中, 我们需要用到新的标记方法,假设神经网络的训练样本有个,每个包含一组输入和一组输出信号:
表示神经网络层数
表示每层的neuron个数(表示输出层神经元个数)
代表最后一层中处理单元的个数。
神经网络的分类定义为两种情况:二类分类和多类分类:
二类分类:,0和1对应表示二分类中的一类;
类分类:表示分到第类;
我们回顾逻辑回归问题中我们的代价函数为:
在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量,但是在神经网络中,我们可以有很多输出变量。
例如:上图的神经网络中, 我们的 是一个维度为的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为:
看上去有点复杂,但其本质上还是说这个网络对于输入的一个向量给出的预测值与实际值之间的差距的一种衡量手段,如果能让代价函数最小也对应的能让这个网络算的最准。这个思想是贯穿在所有机器学习代价函数中的。
再回过头来看上图中的代价函数,前半部分的那两个求和符号:
第一层K它是神经网络输出层的K个单元(对应于K分类问题)
第二层的m是指的训练集中有m组样本。
这个其实就和逻辑回归一样,只是神经网络比逻辑回归更有一般性。
前半部分的3个求和符号,就是神经网络的正则化项而已,也就是对整个神经网络(所有层)中所有的参数的一个求和处理(排除了每一层的偏移量)。
9.2 反向传播算法
上一小节讲了神经网络的代价函数,这一小节讲解一个让代价函数最小化的算法:反向传播算法。
算法目标: 找到合适的参数,让代价函数最小。那我们要怎么做呢?
- 已知代价函数:
2.需要求
我们需要有一种能够用编码实现的算法,梯度下降也好、其它更高级的算法也好,我们需要能够通过一种迭代的办法不停改变这些参数的值,使得代价函数最小。而参数每次改变的大小,需要计算偏导数,通过偏导数的值来确定每一步参数改变的大小和正负。 也就是说,我们把代价函数的值作为了函数的因变量,把参数作为自变量来进行求函数最小值。
前向传播
从最左边的输入层一层一层的算到输出层,然后给出一组结果。
前向传播的含义,就是从输入层向前逐层向前运算最后得到输出。
反向传播
我们从神经网络的外面当然是只能看到输出层上,实际值和计算值之间的差值。但是,我们也知道最后输出上计算值和实际值之间的差值,是由前面从输入层到每个隐藏层慢慢地把这个误差给积累下来的。那我们该怎么算每一层上的误差呢?
: 代表第层的第个单元的误差(真实值和神经网络的计算值之间的差)
- 先从输出层上开始,将输出层上的每个神经元的计算结果和这个分量上训练样本实际的结果之间求差值。输出层上的误差:
- 有了输出层的误差,倒数第二层的误差该怎么计算呢? 本质上,输出层的误差是由上一层的误差经过输出层上的运算之后得到的,那我们再经过一次逆反运算就可以算出来:
- 后面的一项, 指的是激活函数的导数,
- 前面一项, 是权重导致的误差的和。
- 类似的,可以把第二层的也给算出来。这样,我们就有了每一层上的误差表达式, 便可以计算代价函数的偏导数了。
假设,即我们不做任何正则化处理时有:
- 代表目前所计算的是第几层。
- 代表目前计算层中的激活单元的下标,也将是下一层的第个输入变量的下标。
- 代表下一层中误差单元的下标,是受到权重矩阵中第行影响的下一层中的误差单元的下标。
-
如果我们考虑正则化处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用来表示这个误差矩阵。第 层的第 个激活单元受到第 个参数影响而导致的误差。
我们的算法表示为:
即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。 在求出了之后,我们便可以计算代价函数的偏导数了,计算方法如下: