总体上来讲,神经网络的算法是比较复杂的,后面有非常精妙的数学原理,而且对这些数学方法,还需要证明其具有收敛性,所以很多神经网络的书籍,绝大部分都是一些数学模型介绍、推导和证明,对于非数学专业的我们来说,感沉像看天书一样。其实神经网络的精髓是将现实中的问题进行抽象,建立适合神经网络表示的模型,然后应用神经网络进行处理,不断调整优化网络结构和参数,直到最终达到满意的效果。所以成功应用神经网络,不需要太过高深的数学基础。但是如果可以适当掌握神经网络背后的数学原理,对于我们理解参数的含义,选择合适的网络结构等都具有重要的意义。
所以在本篇文章中,我们就对最简单的前向网络(BP)网络进行一下数学上的描述,这基本上是神经网络最础的算法模型,对于理解其他深度学习算法,具有非常重要的基础作用,如果立志于深度学习领域的研发工作,理解BP网络是必须的。
我们首先从最简单的感知器模型说起,所谓感知器就是一个具有N维输入的神经元,同时具有一个偏移量bias,其处理是先对输入信号进行求合,然后进行一个非线性运算(神经元的激活函数),得出的值既为该神经元的输出,如下图所示:
神经元首先对输入信号进行求合运算:
式7.1
然后经过非线性运算(神经元的激活函数),通常为Sigmal函数或Tanh函数,这里以Sigmal函数为例,但是实际应用中,经验表明双曲正切作为激活函数可能收敛更快,具有更好的性能。
式7.2
该函数的图形为:
如上图所示,其值域为(0, 1),可以代表事件的出现概率等概念。
在这里,我们以讨论在线学习算法为主,即每经过一个学习样本,就对权值进行一次调整。与此对应的是,可以进行离线学习,就将所有训练样本都运行一次,然后统一调整一次权值。以及近代为了提高算法效率和适应性,采用了批量处理方式,既以某个批量如100个训练样本,运行一次,根据汇总误差,调整权值,然后进行下一个批次的学习,综合了在线学习和离线学习各自的优点。但是无论是在线学习、离线学习还是批量学习,算法框架都是一样的,所不同的只是对误差处理方式的不同。所以我们以最简单的在线学习为例进行讲解。
对于某个特定的训练样本n,输入到神经网络之后,会产生一个输出,而训练样本正确的输出应该为,就是神经网络对第n个训练样本产生的误差,假设我们定义学习率为?,则我们可以根据误差对相应的权值进行调整,可以将权值调整公式定义为:
式7.3
上面的公式可以用于在线学习时权值调整公式,但是如果对每个训练样本都进行权值调整,可能出现由于不同样本的误差不同,而权值调整出现震荡的情况,使学习收敛速度变慢,因此实际中通常使用的是批量学习,下面我们来讨论批量学习。
如果我们定义所有训练样本数目为D,或者批量学习中批量的大小为D,则我们可以定义误差为:
式7.4
如果对于激活函数为线性函数的神经元,例如只是原封不动地将输入信息之合输出,则很容易求出权值调整公式:
式7.5
根据上面的误差定义公式,可以得到如下结论:
式7.6
所以对于线性神经元来说,其权值调整计算公式为:
式7.6.1
式7.7
但是目前主流神经网络中,神经元都不是线性的,例如其为Sigmal函数,所以其权值求导公式需要用到链式求导公式,对式7.6而言,由于神经元激活函数不是线性的,所以式中就不等于了,我们只能根据链式求导公式:
式7.8
由于式7.1 可知:
式7.9
由于式7.2,则可以推导出:
式7.10
代入7.6公式,可以得到如下公式:
式7.11
式7.12
以上就是感知器模型算法的推导过程,可以看出,只是简单的感知器模型,后面的数学原理也是非常复杂的。
我们在有了这些基础知识之后,我们就可以开始着手理解多层网络的BP算法了,在下一篇博文中,我们将具体讨论BP算法的推导过程。需要注意的是,我们在这里推导这些算法,并不意味着我们在实际算法实现中,要按照这些算法来编程序。因为我们如果按照这些理论来编程,我们自己无法对矩阵等算法进行优化,同时也无法利用GPU,总之我们自己的算法效率与Theano或TensorFlow相比,在效率上要低很多,所以我们还是要采用Theano来进行具体的算法实现。