1. 前言
神经网络技术起源于上世纪五、六十年代,当时叫感知机(perceptron),拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果。但是,Rosenblatt的单层感知机有一个严重得不能再严重的问题,即它对稍复杂一些的函数都无能为力。
随着数学的发展,这个缺点直到上世纪八十年代才被Rumelhart、Williams、Hinton、LeCun等人(反正就是一票大牛)发明的多层感知机(multilayer perceptron)克服。多层感知机,顾名思义,就是有多个隐含层的感知机。
2. 感知机原理
我之前博文的已经详细的介绍了感知机,现在我们进行一个简单的回顾。
先看下人工神经元的结构:
输出是线性的
\[ z=\sum\limits_{i=1}^mw_ix_i + b \]
因为感知机是二分类算法,所以会套一个函数:
\[ sign(z)= \begin{cases} -1& {z<0}\\ 1& {z\geq 0} \end{cases} \]
在神经网络中,套在线性变换外面的这个函数称作激活函数,激活函数可以是线性的\(f(x) = x\),或者是非线性的,例如\(sigmoid,tanh,relu\)等常用的。
3. 神经网络原理
神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具。典型的神经网络具有以下三个部分:
- 结构 (Architecture) 结构指定了网络中的变量和它们的拓扑关系。例如,神经网络中的变量可以是神经元连接的权重(weights)和神经元的激励值(activities of the neurons)。
- 激励函数(Activity Rule) 大部分神经网络模型具有一个短时间尺度的动力学规则,来定义神经元如何根据其他神经元的活动来改变自己的激励值。一般激励函数依赖于网络中的权重(即该网络的参数)。
- 学习规则(Learning Rule)学习规则指定了网络中的权重如何随着时间推进而调整。这一般被看做是一种长时间尺度的动力学规则。一般情况下,学习规则依赖于神经元的激励值。它也可能依赖于监督者提供的目标值和当前权重的值。
神经网络则在感知机的模型上做了扩展,总结下主要有三点:
- 加入了隐藏层,隐藏层可以有多层,增强模型的表达能力,如下图实例,当然增加了这么多隐藏层模型的复杂度也增加了好多。
- 输出层的神经元也可以不止一个输出,可以有多个输出,这样模型可以灵活的应用于分类回归,以及其他的机器学习领域比如降维和聚类等。多个神经元输出的输出层对应的一个实例如下图,输出层现在有4个神经元了。
- 对激活函数做扩展,感知机的激活函数是\(sign(z)\),虽然简单但是处理能力有限,因此神经网络中一般使用的其他的激活函数,比如我们在逻辑回归里面使用过的\(Sigmoid\)函数,即:
4. DNN的网络结构
DNN我们可以理解为多隐层的神经网络,此外,它有时也叫多层感知机(Multi-Layer perceptron,MLP),它内部的神经网络层分为三类,输入层,隐藏层和输出层。
层与层之间是全连接的,也就是说,第\(i\)层的任意一个神经元一定与第\(i+1\)层的任意一个神经元相连。虽然DNN看起来很复杂,但是从小的局部模型来说,还是和感知机一样,即一个线性关系\(z=\sum{w_ix_i}+b\)加上一个激活函数\(a=\sigma(z)\)。
5. DNN前向传播过程
DNN的前向传播算法不算太难。所谓的DNN的前向传播算法也就是利用我们的若干个权重系数矩阵\(W\),偏倚向量\(b\)来和输入值向量\(x\)进行一系列线性运算和激活运算,从输入层开始,一层层的向后计算,一直到运算到输出层,得到输出结果为值。
输入: 总层数\(L\),当前层是\(l\),当前层隐藏层和输出层对应的矩阵\(W^l\),偏倚向量\(b^l\),输入值向量\(a^{l-1}\),神经元个数\(dim^l\)
输出:输出层的输出\(a^L\)
- 初始化\(a^0=input\)
- \(for\;\;l=1\;\;to\;\;L-1\), 计算:
\[ a^l=\sigma(z^l)=\sigma(W^la^{l-1}+b^l) \]
其中每个变量的维度是\(W^l=[dim^l,dim^{l-1}]\),\(a^{l-1}=[dim^{l-1}, batch\_size]\),\(b^l=[dim^l,1]\),\(z^l=[dim^l,batch\_size]\),\(a^l=[dim^l,batch\_size]\)- 最后的结果即为输出\(a^L\)。
6. 总结
我们现在了解了DNN的前向传播的过程,但是我们会有疑问,DNN中如何更新这么多的\(W,b\)呢,当然还是运用神奇的梯度下降法来更新。在神经网络中运用梯度下降法的过程就是反向更新。