神经网络是机器学习中的一种经典模型,也是现在深度学习的前身和基础,因此如果要想掌握深度学习,必须通透地了解神经网络。关于神经网络需要做到以下几点:了解神经网络的线性结构,了解非线性激活函数,掌握参数训练的反向传播算法(BP, backpropagation),了解多层神经网路的梯度弥散问题。
神经元和感知机
神经网络是由一个个基本的神经元组合而成的,而这些神经元模拟人脑中神经细胞,拥有若干个输入和输出(对应树突和轴突),通常在学术界我们将其称为感知机。下面是神经元的图片
对于一个神经元细胞,拥有接受信号的树突和输出信号的轴突,根据这种模式,学者设计一个输入输出模式的单元,并命名为感知机:
输入表示为 X=[x1,x2,x3,...,xi]T ,对于输入 xi 有一个权重系数 wi ,表示为 W=[w1,w2,w3,...,wi] ,另外加一个常数偏置 b ,为了实现二分类,最后的输出写作:
其中sign表示符号函数,这是一个很典型的线性分类方式。如上图的右侧,假如在二维平面,存在一条直线 y=WX+b ,那么这条直线就可以把空间分为两部分,分别对应 WX+b>0 和 WX+b<0 两部分。而对于高维空间,这条直线就变成了一个超平面,将空间同样分为大于0和小于0两部分。但是仍然只能实现线性分类,为了实现非线性分类,学者在感知机后面加入一个非线性单元——激活函数。在神经网络刚出来的时候,常用的激活函数有sigmoid函数和tanh,它们的公式为:
他们的曲线表示为
左边为sigmoid函数,值域范围为[0,1],右边为tanh函数,值域范围[-1,1],通过多个这样的非线性感知机,那么理论上我们最终可以逼近任意一个超曲面,如果这个非线性的激活函数我们只能得到一个由若干个超平面组合而成多边形超平面。那么为什么选择这些激活函数了,我们不妨以sigmoid函数为例,求一下sigmoid的导数:
所以sigmoid函数的导数可以用自身来表示,有兴趣的读者不妨自己推导tanh的导数,是否也满足这一个规律。这一点对于编程实现非常重要,可以得到导数的解析解而不是数值解,因为神经网络的训练都是基于梯度(导数)实现的。
多层前馈神经网络
之前我们已经介绍了单个神经元(感知机),我们仿照人脑神经系统,把这些神经元给全连接起来,便可以得到一个多层感知机 (Multi-layer Perceptron, MLP),也叫做多层神经网络。在多层神经网络中,第一层叫做输入层(input layer),最后一层叫做输出层(output layer),中间的都叫做隐层(hidden layer),下面是一个单隐层神经网络的教材例子
从输入到输出的过程是把数值从低层传向高层,这个过程叫做前馈传播。两层神经元之间都有一条线连接,这条线代表着这两个神经元之间的权重系数。 w(1)ij 表示输入层第 i 个神经元到隐层第