神经网络是模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。
在深度学习领域,神经网络就是我们深度学习的灵魂,如果我们想依靠算法实现一些功能,就必须依托不同的神经网络结构,所以很有必要搞懂神经网络的类型和结构。
神经网络按照不同的分类方式,会有多种形式的划分。
第一种分类方式是按照类型来分,包含两种类型,分别为前馈神经网络和反馈神经网络。
我们分别解释下,首先前馈神经网络(Feedforward Neural Networks),它是我们最常用的神经网络类型。比如我们所说的BP神经网络,DNN网络,CNN网络等,举例如图所示:
这种结构一般定义为一个有向无环图,信号只能沿着最终输出的那个方向传播,每一时刻间的输入互不影响。
然后另一种结构是反馈神经网络(Feedback Neural Networks),也称为递归神经网络(Recurent Neural Networks),它是一个网络中环的结构,如下图所示的RNN网络:
可以发现信号不再是沿直线传播,而是有一些环路。这里环路的原因是因为在RNN网络中上一时刻的输出要给到下一时刻,比如图中的Xt-时刻的输出St-会作为Xt时刻的输入,时刻间的输入不再是独立的。
第二种分类方式是按照网络的深浅来分类的,包含浅层神经网络和深度神经网络。
浅层神经网络就是我们所说的传统神经网络,这种网络结构包含的层次比较少,一般不会超过两层,所以浅层神经网络最开始的效果并不理想。如下图所示为浅层神经网络。
我们可以发现只有其中只有两个隐藏层。
另外一种就是深度神经网络。所谓深度实际上就是把把层次加深,增加其中的隐藏层。比如下图:
可以发现深度神经网络中包含着最少两层隐藏层,这些隐藏层经过高阶的特征提取会让我们的神经网络真正去发掘数据内部隐藏的特性。所以深度神经网络的发展和演变让神经网络的枝叶更加枝繁叶茂,从而能够模拟更多的场景,解决更多的算法需求。
了解完深度学习的类型划分之后,我们再看下神经网络的具体结构。我们现在所说的神经网络是指深度神经网络,即隐藏层大于层的这种结构。
我们以层的结构为例为大家讲解,包含一个输入层(Input Layer),个隐藏层,分别为隐藏层(Hidden Layer),隐藏层(Hidden Layer),和一个输出层(Output Layer)。如图所示:
我们需要了解各个层次之间的参数关系。
首先看下输入层和第一个隐藏层之间的结构,如图所示:
这里面x,x,x是指样本特征属,相当于有个特征。假设我们的数据有条,当数据给到输入层的时候,每个样本有个特征,所以我们X的形状即为X=(,)这样的一个输入矩阵,其中的为样本个数,为特征个数。
那这之间的参数个数是多少呢?举个例子来分析下,比如对于其中的一个特征x来说,连接到下一层的个节点z,z,z,z上。如图所示:
可以发现一个特征对应个参数,而输入的时候总共有个特征,所以中间的这种连线总的个数也就是*=个,即我们的输入层和隐藏层之间的W形状为W=(,)这样的一个矩阵。
输入层和隐藏层之间需要按照线性组合WX+b这种形式进行组合。所以输入数据矩阵X和W点乘的结果为(,)*(,)=(,)这样一个形状的矩阵。即行列,表示的含义为个数据经过第一个隐藏层的变化,每个数据转变成个隐特征。相当于隐藏层把我们上一层的输入在本层做了特征的转换和抽取,而这正是隐藏层节点的功能和作用。特征转换完以后再经过激活函数Sigmod的激活输入到下一层。
然后再来看下隐藏层和隐藏层之间的结构,如图所示:
可以发现隐藏层和隐藏层之间的结构类似于输入层和隐藏层之间结构,所以参数个数的分析也是类似的。这里面z到z所构成的输入矩阵是由上一层传递过来的,形状为行列的矩阵。
那两个隐藏层之间的参数个数为多少呢?我们还是举一个例子来说明下,看下z的输出,如图所示:
可以发现,对于z来说,与下一层的每个节点h到h都相连,所以对应个参数。而像z这样的输出节点有z到z,总共个。所以隐藏层和隐藏层之间对应的参数矩阵W为W=(,)的形状,即每个特征对应个输出,总共个特征输入。
同样这两层结构也需要满足线性组合的方式,所以X和W相乘后即为(,)*(,)=(,),即从隐藏层输出时为行列的矩阵形式。相当于隐藏层又做了一次特征转换,转换为新的个特征。然后再做一次非线性变换函数的激活例如Sigmod函数后传递给下一层。
最后再来看下隐藏层和输出层之间的结构,如图所示:
此时隐藏层输出的形状为行列的矩阵 ,以h为例,看下隐藏层和输出层之间的参数矩阵W。如图所示:
可以发现h分别连线到输出层节点的y和y上,对应个参数。而类似h这样的结构总共有个,所以对应的参数矩阵为W=(,)的形状。
然后再经过线性组合的原理XW+b=(,)*(,)+(,)=(,)。即个样本,每个样本由两个预测输出。这也刚好符合我们的理解,对于二分类来说,每一个样本需要有各个类别的预测 。
这里需要提醒一点的是在最后一个隐藏层和输出层之间,我们也要做一次非线性变化,只不过此时的非线性变换函数为SoftMax函数,区别于前面几层的Sigmod函数。这里之所以是SoftMax函数,是因为SoftMax函数可以将最后预测结果做概率化的输出,表示每个类别的概率。
经过以上分析,我们对神经网络结构做下总结,可以得出以下几个结论。
、隐层到隐层之间是非线性变换,对应Sigmod函数。隐层到输出之间是分类或者是回归变化,不做激活,因此需要SoftMax函数。
、层与层之间的矩阵参数为上一层节点的个数和下一层节点个数之间所组成的矩阵。比如上面案例中输入层有个节点,隐藏层有个节点,所以中间对应的参数矩阵形状为(,),即行列的形式。同理其它层之间也是如此。
所以掌握神经网络层与层之间的结构后,会有助于我们对神经网络的理解,从而更好的理解参数模型,找到算法合适的参数。