深层神经网络(DNN)前向传播推导

深度神经网络(Deep Neural Networks,以下简称DNN),是深度学习的基础,本文将结合具体例子分析DNN模型的前向传播。

1、从感知机到神经网络

感知机模型
  • 感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。假设输入空间(特征空间)是\(\chi \subseteq {R}^ {n}\),输出空间是={+1, -1},输入\(x\in\chi\)表示实例的特征向量,输出表示实例的类别。由输入空间到输出空间的如下函$$f(x) = sign(w \cdot x + b)$$称为感知机。其中w和b为感知机模型的参数,\(w \subseteq {R}^ {n}\)叫做权重向量(weight vector),\(b\subseteq{R}\)叫做偏置(bias),\(w \cdot x\)表示w和x的内积,sign是符号函数,即
  • 所以感知机模型用一句话总结就是,学习到输入与输出之间的一个线性关系,然后通过符号函数得到最终的二分类结果。从以上可以看出,感知机模型只能用于二分类问题,且无法学习复杂的非线性模型,局限性很大,而神经网络则是在感知机模型的基础上做了扩展,主要总结为以下三点:
  • 1️⃣加入了隐藏层,隐藏层可以有多层,增强模型的表达能力;
  • 2️⃣输出层的神经元可以不止一个输出,可以多个输出,这样模型可以灵活的应用于分类回归,以及其他机器学习领域;
  • 3️⃣响应的也对激活函数做了扩展,感知机的激活函数是sign(x),虽然简单但是处理能力有限,因此神经网络中一般使用其他的激活函数,比如Sigmoid函数、ReLU、Softmax和tanh函数等,通过不同的激活函数,神经网络的表达能力进一步提升。

2、DNN的基本结构

DNN网络结构
  • 神经网络是基于感知机的扩展,而DNN可以理解为有很多隐藏层的神经网络。从DNN按不同层的位置划分,DNN内部的神经网络层可以分为三类,输入层,隐藏层和输出层,一般来说第一层是输入层,最后一层是输出层,而中间侧层数都是隐藏层。由于DNN层数多,则线性关系系数w和偏置b的数量也就会很多,具体的参数在DNN中是如何定义的?来看下图
DNN中weight和bias参数定义图
  • 首先说明一下,\(x_1^1, x_2^1\),其中上标表示的该样本属于样本数据集中的第一个样本,下标表示的是样本的特征向量维度;
  • 然后看偏置b的定义,这个比较容易理解,如上图所示,\(b_i^k\)上标k表示的是该偏置所在的层数,下标i表示该偏置所在的神经元的索引号。
  • 接着看最重要的线性关系系数w的定义,这个稍微有点复杂,例如上图中的\(w_{21}^2\)上标2表示的是线性系数所在的层数为2,主要看小标,对应的是输出层的神经元索引号2和输入层的神经元索引号1将输出层神经元的索引号放在前面,则进行线性运算时,不用转置,直接为\(w \cdot x + b\),如下所示:
  • 接着这里有一个稍微对于初学者来说的一个小疑惑,那为什么不是\(w_{12}^2\),也就是将输入层的神经元的索引号放在前面呢?在其他网页上看到的就是说为了便于模型用于矩阵表示运算,如果是\(w_{12}^2\)的话,则每次进行矩阵运算时需要进行转置,即\(w^T \cdot x+b\),而将输出的索引号放在前面的话,则线性运算不用转置,即直接为\(w \cdot x+b\),前面已经展示了输出索引号放在前面对应的线性运算方式,所以接下来就主要是理解输入索引号放在前面,则进行线性运算需要转置这句话,以下是个人理解,如有错误,还望指教。
  • 如果表示成\(w_12^2\),则如下图所示:
  • 此时对应的线性运算部分应该是这样的,首先需要对w进行转置,然后再进行线性运算。
  • 所以通过对比发现,在定义线性关系系数w是,将输出神经元的索引号放在前面的话,便于模型用于矩阵表示运算,也方便前向传播和后向传播的推导。

3、DNN前向传播矩阵运算原理

  • 下面以一个相对比较简单的具体DNN模型来详细说明前向传播,首先对该图进行简单说明:
  • 该DNN模型包含一个输入层,两个隐藏层以及一个输出层;
  • 隐藏层和输出层使用的都是Sigmoid激活函数;
  • 输入层有2个神经元(n_input=2),第一个隐藏层有3个神经元(n_h=3),所以\(w^2\)的shape为(n_h, n_input)=(3, 2),\(b^2\)的shape为(n_h, 1)=(3, 1) ;
  • 同理第二个隐藏层的也有3个神经元,所以\(w^3\)的shape为(n_h,n_h)=(3, 3),\(b^3\) 的shape为(n_h, 1)=(3, 1);
  • 输出层有1个神经元,所以\(w^4\)的shape为(n_output, n_h)=(1, 3),\(b^4\)的shape为(n_output,1)=(1, 1);
  • Layer L2层的输出\(a^2\)
  • Layer L3层的输出\(a^3\)
  • Layer L4层的输出\(a^4\)

4、DNN前向传播算法

  • 所谓DNN前向传播算法就是利若干线性关系系数矩阵w,偏置向量b和输入向量x进行一系列线性运算和非线性激活运算,从输入层来说,一层层地向后计算,直到运算到输出层,得到输出结果。
  • 输入:总的层数L,所有隐藏层和输出层对应的线性关系系数矩阵w,偏置向量b和输入向量x,每一层使用的激活函数
  • 输出:输出层的输出
  • 1️⃣初始化\(a^1\)=x;
  • 2️⃣For l=2 to L,计算:
  • $$a^l = activation(z^l)=activation(w^l \cdot a^{l-1} + b^l)$$
  • 3️⃣得到最终的输出结果为\(a^L\)

具体DNN的前向传播实现过程推荐吴恩达老师的深度学习课程中的assignmen4_1,Building your Deep Neural Network: Step by Step,就会更加深对DNN的理解。接着下一篇文章再说说DNN的反向传播过程,加油⛽️。