将一个进行科学计算的数学模型形象化为一个神经元,模仿人类大脑的工作原理,构成神经网络。多层神经网络一般包括一个输入层,若干隐藏层,一个输出层,每一层都会有若干神经元。隐藏层中进行着大量的运算,如同一个黑箱,“不管是什么数据,我都能给你算”。每个上一层的输出都是下一层的输入,这样便给特征附加了多样性,每层神经元不再都是处理完全相同的原始数据,而是经过上一层处理的不一样的数据。以一个最基本的含有1个隐藏层的神经网络为例,介绍多层神经网络工作原理。
1.前向传播算法(Forward Propagation)
n*1维列向量X为输入层,m*n维权重矩阵(即参数矩阵)θ与向量X作向量积后得到m*1维列向量z,z作为激活函数active function的自变量,得到g(z),其中,m为下一层神经网络的神经元个数,n为特征数。
一般要在每层的神经网络上添加一个偏差单位(bias unit)x0,并使之恒等于1。上图清楚地用下标表示了各θ在权重矩阵中的位置,矩阵第一行的4个θ为下一层第一个神经元所拥有的参数,第二行4个θ为下一层第二个神经元所拥有的参数,并以此类推。由此可以给列向量z的形成以直观理解,g(z)而非z便是神经元a的输出。第二层共有3个神经元,所以会输出含有3个g(z)的列向量,将之作为第三层的输入,与权重矩阵作向量积然后代入激活函数,最终得到输出层的结果h(θ)如图:
至于多层神经网络,就是将上述神经网络的隐藏层扩展至多层,以达到更好的拟合效果;而最终的输出结果不一定是二分类的,当要求输出k分类结果时,若各种分类间并不互斥(午餐、蔬菜、肉类),可建立多个逻辑回归分类器,其中概率最大分类即为预测值;若各种分类间互斥(古典、摇滚、爵士),就需要使用Softmax回归,输出层公式如图:
将输入的列向量各维度的值作指数后作分子,或作指数后然后求和,并作为函数的分母,输出的概率最大者作为分类结果。特别的,当k=2时,Softmax回归变成逻辑回归。
2.反向传播算法(Back Propagation)
利用前向传播得到模型假设后,要求得合适的权重矩阵,便要建立代价函数、使用梯度下降法求得最小值,这一过程在多层神经网络中被称为反向传播算法。
首先建立代价函数,对最后一层即输出层的激活函数求梯度,接下来不要立刻更新各个参数,要运用多元复合函数的求导法则,分别求各层的权重矩阵中的参数,最后一起更新权重矩阵。多次重复上述过程、迭代参数,直到参数的变化量小于预定阈值时停止迭代,得到最后的权重矩阵。
3.关于梯度爆炸与梯度消失
如果使用Sigmoid函数作为激活函数、均方差函数作为损失函数时,在反向传播的过程中,因为深度神经网络的层数过多,当求前几层的梯度时,其梯度会达到相当大或相当小的数量级,导致参数迭代非常缓慢,深度越大,此效应越明显。这是多层神经网络目前仍未良好解决的问题。能稍微改善这一问题的方法,可以是换用其他激活函数、换用其他损失函数。激活函数比如:
ReLU函数:PReLU函数:
损失函数比如:
交叉熵函数:
求输出层的梯度公式为:
4.DNN的正则化
多层神经网络较为常见的问题便是过拟合,因此需要对模型假设进行正则化处理,L1与L2正则化方法效果并不好,采用的方法之一为通过Dropout进行正则化:在训练模型时,将训练数据分为n个部分,每个部分分别使用正向传播与反向传播算法,在传播过程中,将原本的每个隐藏层的随机a个神经元弃置不用,仅利用其他的神经元来拟合模型;一部分数据训练结束后,再利用其他部分数据、随机弃置每层的a个神经元来继续拟合模型。