危险,危险,危险——好久不见,等你在这里见面~在经过前两期关于神经网络的简单介绍后,今天小Mi将进一步介绍神经网络的代价函数、前向传播和反向传播,废话不多说,我们开干吧~
1 代价函数
首先引入一些便于稍后讨论的新标记方法:
假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y,L表示神经网络层数,表示每层的neuron个数(表示输出层神经元个数),代表最后一层中处理单元的个数。
将神经网络的分类定义为两种情况:二类分类和多类分类,
二类分类:,表示哪一类;
K类分类:,表示分到第类;
小Mi带大家回顾一下,逻辑回归问题中的代价函数为:
在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量y,但是在神经网络中,可以有很多输出变量,我们的是一个维度为K的向量,并且训练集中的因变量也是同样维度的一个向量,因此代价函数会比逻辑回归更加复杂一些,为:
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,都会给出K个预测,基本上可以利用循环对每一行特征都预测K个不同结果,然后在利用循环在K个预测中选择可能性最高的一个,将其与y中的实际数据进行比较。
正则化的那一项只是排除了每一层后,每一层的矩阵的和。最里层的循环循环所有的行(由层的激活单元数决定),循环i则循环所有的列,由该层(层)的激活单元数所决定。即:与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization的bias项处理所有参数的平方和。
2 反向传播算法
之前小Mi在计算神经网络预测结果的时候采用了一种正向传播方法,需要从第一层开始正向一层一层进行计算,直到最后一层的。
现在,为了计算代价函数的偏导数,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。下面用一个例子来说明反向传播算法。
假设我们的训练集只有一个样本,我们的神经网络是一个四层的神经网络,其中K=4,,L=4:
前向传播算法:
从最后一层的误差开始计算,误差是激活单元的预测与实际值之间的误差,,用来表示误差,则: 。利用这个误差值来计算前一层的误差:, 其中是S形函数的导数,。而则是权重导致的误差的和。下一步是继续计算第二层的误差: ,因为第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设,即不做任何正则化处理时有:
值得注意的是,需要清楚地知道上面式子中上下标的含义:
l代表目前所计算的是第几层。
j 代表目前计算层中的激活单元的下标,也将是下一层的第j个输入变量的下标。
i代表下一层中误差单元的下标,是受到权重矩阵中第i行影响的下一层中的误差单元的下标。
如果我们考虑正则化处理,并且训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,可以用来表示这个误差矩阵。第l层的第i个激活单元受到第j个参数影响而导致的误差。
我们的算法表示为:
即首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。
在求出了之后,便可以计算代价函数的偏导数了,计算方法如下:
3 反向传播算法的直观理解
在上一节中,我们介绍了反向传播算法,对很多人来说,当第一次看到这种算法时,第一印象通常是,啊,这个算法看起来好难,需要那么多繁杂的步骤,简直是太复杂了!实在不知道这些步骤,到底应该如何合在一起使用。就好像一个黑箱,里面充满了复杂的步骤。如果你对反向传播算法也有这种感受的话,实际上是很正常的。相比于线性回归算法和逻辑回归算法而言,从数学的角度上讲,反向传播算法并不是一个简洁的算法,而且常常会让人感觉并不是很清楚反向传播算法究竟究竟在做什么。当然啦,小Mi始终认为,practice makes perfect!多做一些编程练习可以帮助我们将这些复杂的步骤梳理梳理,从而可以更深一步地理解反向传播算法具体是如何实现的,最终可以独立使用这个算法。
下面小Mi会帮助大家巩固反向传播的一些固定步骤,使大家有一个更加全面直观的感受,理解这些步骤究竟是在做什么,同时也可以证明,它至少还是一个合理且合格的算法。当然啦,可能最终大家还是会觉得反向传播依然很复杂,依然像一个黑箱,包含了太多复杂的步骤,甚至有点神奇,这也OK。
下面我们再来仔细研究一下前向传播的原理:
为了更好地理解反向传播,我们先看研究下前向传播的过程,这是一个包含2个输入单元的神经网络结构(当然啦,我们并没有把偏置单元算进去),然后第二层有2个隐藏单元,再下一层也有2个,不过最后只有一个输出单元。
为了更好地说明前向传播,可以用不同的颜色来表示这个网络。在进行前向传播时,可能会有一些特性的样本,比如,将其传到输入层中,因此可以把它们表示为,它们时我们为输入层设置的值,对其进行前向传播传播到第一个隐藏层时,然后计算出,它们是输入单元的加权和,然后我们将sigmoid逻辑函数,还有sigmoid激活函数应用到z值上得到这些激活值,也就是,然后继续向前传播,计算出,应用sigmoid逻辑函数和激活函数得到,就这样以此类推,最终得到,它是网络中最后的输出值。
进一步研究下计算过程,比如紫红色表示的隐藏单元,将其权值表示出来,也就是,红色线这边的权值是,蓝色线的则是,因此计算的方法就是:,这就是前向传播。
事实上,后面我们会发现反向传播的过程和前向传播非常相似,只是这两个算法计算的方向不一样而已,在反向传播算法中是从右往左进行运算:
首先我们先看看代价函数,这个代价函数一般应用于只有一个输出单元的情况,如果不止一个输出单元,只需对它们进行求和即可;但如果只有一个输出单元,代价函数就会是这样,我们同一组样本中,同时使用了前向传播和反向传播,可以择出一组单独的样本进行研究分析,,由于只有一个输出单元,就是一个实数,可以忽略正则化,即,所以最后这个正则化项就没有了,观察括号中的这个求和项,会发现代价函数对应第i个训练样本,即代价函数对应的训练样本,是由式子:给出。所以第i个样本的代价函数扮演了一个类似方差的角色,可以直接写成:,近似地当成是神经网络输出值与实际值的方差,就像逻辑回归中会偏向于选择比较复杂的带对数形式的代价函数,但是为了可以把这个代价函数看作是某种方差函数,因此表示了预测样本值的准确程度,也就是网络的输出值,和实际观测值的接近程度。
现在再看看反向传播的过程,简单来说反向传播就是在计算项,其实看作在第层第个单元中得到的激活项的“误差”,更正式地说,项实际上代价函数关于的偏导数,也就是计算出的z项的加权和或者说代价函数关于z项的偏导数,具体来说这个代价函数是一个关于标签y和神经网络中的输出值的函数,如果分析网络的内部,稍微改动下项,就可以影响神经网络的这些值,最终将改变代价函数的值。
另外,对于输出层而言,比如我们假设等于,当我们对样本做前向传播和反向传播的时候,设,这是一个误差值,也就是y的实际值与预测值的差,就可以算出的值,然后对这些值进行反向传播,最后可以计算出前一层的这些项,也就是和,然后继续进行传播,最后计算出和,反向传播的计算过程和前向传播非常地相似,只是方向翻过来了。
可以看一下是如何计算出的值的,可以先标出权重,紫红色的权重为,红色的权重为,然后再来看是怎么计算的:
再举一个例子,的计算方式就是:。顺带一提,这些值都只关于隐藏单元,并不包括偏置单元,这个包不包括取决于对于反向传播的定义以及实现算法的方式,所以也可以用其他方法来计算包含偏置单元的值。偏置单位的输出总是“+1”,由于它们并不影响偏导数的计算,所以可以最后计算。
好啦,今天小Mi的分享就到这啦,希望今天大家能对反向传播这个复杂的函数有一个更加深入的理解,虽然有点复杂,但是好算法不怕多,对不对!下期的话小Mi还会针对神经网络的整体结构以及案例运用进行介绍,我们下期再见~(挥手十分钟!)
PS:身在南京的小Mi也心系河南,一直在心中为大家默默祈祷!胡辣汤挺住,风雨面前盐水鸭和你们一起扛!!!