吴恩达深度学习专项课程共分为五个部分,本篇博客将介绍第一部分神经网络和深度学习专项的第三周课程:浅层神经网络,浅层指的是单隐藏层神经网络。本周课程主要学习单隐层神经网络的结构、符号表示、前向/反向传播及向量化实现、浅层神经网络的梯度下降法、常用的激活函数以及参数初始化的技巧。
目录
1.神经网络概览
- 什么是神经网络
首先我们回顾一下逻辑回归模型:
逻辑回归模型的计算图:
其中,为输入特征向量,权重参数(向量),偏置参数(标量).模型中的圆圈对应两部分操作,首先是对输入特征进行线性组合得到,接着通过sigmoid函数得到。最后与(样本标签)计算损失函数,以上为前向传播计算输出的过程。
图中的红线代表反向传播,在前向传播结束后,反向传播计算最终的输出(损失函数)对模型参数的偏导数/梯度,记做.其中使用链式求导法则依次求解,直到求解出。
神经网络可以看作是逻辑回归的堆叠,一个单隐层神经网络结构如下所示:
用上标(i)代表第i个样本;用上标[i]代表神经网络的第i层,其中输入层是第0层,输入层的单元数对应输入特征数;第1层为隐藏层,隐藏层的单元数可以设置;第2层为输出层,单元数也可以设置,上图中输出层只有一个单元,代表进行2分类。上图中的每个单元(圆圈),和逻辑回归一样,均包含两部分操作,计算.
上述神经网络的计算图(对于单个样本来说):(与逻辑回归相比,反复计算)
其中代表输入特征向量;代表第i-1层和第i层之间的权重参数矩阵,维度为(每一列表示一个样本),代表第i层的单元数;代表第i-1层和第i层之间的偏置参数向量,维度;代表第i层的线性组合输入;代表第i层的激活输出。
注意也可以表示为,可以表示为。
上述神经网络的计算图也包括前向/反向传播,前向传播反复的计算,直到损失函数;反向传播则利用链式法则,求解损失函数对模型参数的偏导数(梯度)。
2.神经网络表示
- 单隐层神经网络结构
我们把单隐层神经网络称为浅层神经网络,其结构如下:
一般称上图中的神经网络为双层结构,输入层不算在内,它是第0层。输入层的特征竖向堆叠,单个样本会构成输入特征向量。
当输入是一个样本的特征向量时,之后的隐层和输出层的输入和激活输出的维度,取决于该层的单元数。如上图中隐藏层有4个单元,那么是一个四维向量;输出层只有一个单元,是一个标量。
3.计算神经网络的输出
- 浅层神经网络的前向传播(单个输入样本)
回顾一下逻辑回归的前向传播:
实际上,神经网络的前向传播可以看作是逻辑回归前向传播的反复堆叠。
可以把上述表达式用向量化实现,把整合为一个列向量记做,把整合为一个矩阵:
前向传播的向量化实现:
输入层,隐层,输出层的单元数实际上可以任意设置,只需改变一下上述式子中矩阵和向量的维度即可。
对于深层神经网络,它会有多个隐层,此时就是把上述式子继续重复的写下去,直到输出层。
本小节实现了对一个输入样本前向传播的向量化,输入是样本特征向量(列向量);下一小节将讲解m个输入样本前向传播的向量化过程,此时输入将是一个特征矩阵,其中每一列为一个样本的特征向量。
4.多个例子中的向量化
- 单样本的前向传播方程
- m个样本前向传播(非向量化实现)
[i]代表第i层,(i)代表第i个样本。
- m个样本前向传播(向量化实现)
小写字母代表向量或标量,大写字母代表矩阵或向量。
把m个样本的特征向量堆叠在一起构成特征矩阵X(,矩阵的每一列是每个样本的特征向量):
把特征矩阵X作为输入,可以同时并行实现m个样本的前向传播,此时中间结果(向量或标量)都相应的扩展为(矩阵或向量)。
m个样本前向传播(向量化实现):
中间结果形式(从向量扩展为矩阵):
矩阵的横向对应不同的样本,纵向对应该层的单元。
5.向量化实现的解释
手动计算每个样本的前向传播(忽略偏置项):
是一个矩阵,将会得到向量.如果把堆叠成矩阵,那么相应的也会堆叠成矩阵:
上图解释了多样本的向量化实现方程:,其他方程也是类似的。至于偏置项可以利用Python广播,矩阵加列向量,相当于对的每一列加上。
- 多样本前向传播总结
非向量化实现:
向量化实现:
上述方程都是基于单隐层神经网络,之后还会讲解深度神经网络,会有多个隐层,前向传播过程也是如此,重复计算而已。
6.激活函数
- 单隐层神经网络前向传播方程(单个样本)
在之前的学习中,隐层和输出层的激活函数都是使用的sigmoid。实际上激活函数有多种选择,而且不同层的激活函数可以不同,用代表第i层的激活函数,它是一个非线性函数。
- 不同类型激活函数
1.sigmoid激活函数:
值域:(0,1) ;z=0时,a=0.5。
在实际应用中几乎不使用sigmoid激活函数,因为tanh激活函数几乎在所有方面都优于sigmoid。一种使用sigmoid激活函数的情况是当使用神经网络进行2分类时,即输出层只有一个单元,此时输出层一般使用sigmoid激活函数。是输出介于0-1之间(转为概率分布)。
sigmoid函数缺点:1)当输入z太大或太小时,梯度会接近于0,算法优化速度会非常慢 2)输出以0.5为中心,不是以0为中心,输出值没有中心化的效果(输出数据以0为中心化可以方便下一层的学习,之后的优化课程会详细讲解)
2.tanh(双曲正切)激活函数:
值域:(-1,1); z=0时,a=0
实际应用中除了输出层进行2分类使用sigmoid外,其余能使用sigmoid函数的地方一般都可以用tanh替代,tanh几乎在所有方面都优于sigmoid。
tanh优点:输出值以0为中心,有数据中心化的效果。方便下一层的学习。
tanh缺点:和sigmoid类似,当输入z太大或太小时,梯度会接近于0,算法优化速度会非常慢。
3.ReLu(修正线性单元)激活函数:
当时,a=z;当时,a=0.
ReLu优点:克服了sigmoid/tanh的缺点,不存在梯度接近于0的情况,算法优化速度比sigmoid/tanh快很多。
ReLu缺点:当输入时,梯度=0,但是这影响不大,对于大部分隐藏层的单元来说,输入,此时梯度都是不为0的(=1)。
注意:从数学角度来看,当z=0时,ReLu函数是不可微的。在编程时,可以指定z=0时的导数(为0或为1都行)。
4.Leaky-ReLu激活函数
当时,a=z;当时,a=0.01z
Leaky-ReLu优点:ReLu的改进版本,克服了ReLu的缺点:当输入时,a=0,梯度=0。
Leaky-ReLu缺点:增加了一个超参数,时的系数需要手动设置,一般设为0.01,实际操作中,可以进行尝试,选一个最优的。
- 激活函数选择规则
一般来说隐藏层的激活函数使用ReLu,输出层如果进行2分类的话使用sigmoid。
当然也可以尝试不同的激活函数,在交叉验证集上比较效果,选择一个最好的。
7.为什么需要非线性激活函数
事实上,使用非线性激活函数可以让神经网络得到有趣的输出。
回顾一下单隐层神经网络的前向传播过程(单输入样本):
如果不使用非线性激活函数,即使用线性(恒等)激活函数,可以证明上图神经网络最后的输出是输入特征的线性组合,证明如下:
也就是说无论使用多少个隐层,如果每个隐层和输出层都采用线性激活函数,那么最后的输出可以表示为输入特征的线性组合。也就是说,此时的隐层是没有意义的,不需要任何隐层也可以得到该输出。
同理,如果隐层使用线性激活函数,输出层使用sigmoid。该神经网络就相当于逻辑回归,证明过程类似,此时无论有多少个隐层都没有意义,都等价于对输入特征的线性组合。
不过有一种情况输出层可以使用线性激活函数,神经网络如果用于回归问题时,输出层可以使用线性激活函数,此时的隐层要使用非线性激活函数(否则隐层就没有存在意义了).因为此时,输出变量,神经网络的输出.
对于具体的回归问题可能也会稍有不同,如果回归问题是进行房价预测,因为房价是非负的,所以输出层可以使用ReLU激活函数。
8.激活函数的导数
- sigmoid激活函数
导数:
- tanh激活函数
导数:
- ReLu激活函数
导数:
从数学角度看,g(z)在z=0处是不可微的,不过在实际应用中这无关紧要,可以设置或0.
- Leaky-ReLu激活函数
导数:
从数学角度看,g(z)在z=0处是不可微的,不过在实际应用中这无关紧要,可以设置或0.
9.神经网络的梯度下降法
单隐层神经网络的梯度下降:
- m个样本前向传播和反向传播公式(向量化)
本小节将给出这些公式,下一小节具体推导:
前向传播:
反向传播:
用代表,的维度和相同。
np.sum是NumPy中的聚合函数,可用于对矩阵的某一个维度求和,axis=1对矩阵的每一行求和;keepdims=True,如果聚合函数返回的是一个向量(返回标量就无所谓了),该参数的作用是保持维度,用2维数组(n,1)表示该向量,避免产生一维数组(n,)表示向量;也可以不使用该参数,把计算出的结果再调用reshape(-1,1)函数调整为2维数组表示该向量。
*代表矩阵或向量对应位置元素相乘,运算符两侧的矩阵或向量维度必须相同。
10.直观理解反向传播
- 逻辑回归计算图
计算图包括前向/反向传播两部分,前向计算输出,反向计算最终的输出对模型参数的偏导数(链式法则),记做:
对于单个输入样本的反向传播公式:
- 单隐层神经网络的计算图
计算图包括前向/反向传播两部分,前向计算输出,反向计算最终的输出对模型参数的偏导数(链式法则),记做:
对于单个输入样本的反向传播公式推导:
注意:
dvar和var的维度一样;
输出层只有一个单元(2分类),使用sigmoid激活函数,隐层使用激活函数。
代表第i层的单元数,,计算过程考虑维度是否能对应起来。图中标出的维度是不考虑转置的情况,维度对应不起来加转置或调整运算次序(可以自己学习一下矩阵或向量的微分,这样就更清楚了)。
*代表矩阵或向量对应位置元素相乘,要求2者同维;点乘代表向量或矩阵之间的内积或者标量和矩阵或向量的乘法(相当于矩阵或向量中的每个元素都乘以该标量)
单个样本的反向传播公式总结:
m个样本的反向传播公式总结:
对单个样本的公式稍微做一些修改即可,保证维度能对应起来:
11.随机初始化
- 权重参数初始化为0会发生什么
用以下神经网络结构进行说明,这是一个单隐层神经网络,输入特征两维,隐藏层有两个单元:
若初始化权重参数和偏置参数为0:
那么这两个隐藏单元前向传播计算的激活输出和反向传播计算的梯度将会是一模一样:
我们得到的矩阵的每一行都会是相同的:
使用梯度下降法优化参数时,相关参数都是初始值一样,更新幅度也是一样的,最后都还是相同的。
也就是说把权重参数都初始化为0,各个隐藏单元具有对称性,那么存在多个隐藏单元就没有任何意义了。
上述隐藏层只有两个单元,同理如果有若干个隐藏单元,采用上述初始化方式,那么这些单元也都将是对称的。
之前逻辑回归之所以可以把w,b都初始化为0,是因为如果把逻辑回归看作是神经网络的话,他只有输入/输出层,不存在隐层,也就没有隐层单元对称性的问题。
- 正确的初始化方式
正确的初始化方式,应该是随机初始化权重参数W,randn代表这些随机初始化的参数服从标准高斯分布(均值0,标准差0),偏置参数b可以初始化为0,因为只要W保证随机初始化,就可以破坏隐藏单元对称性。
一般随机初始化权重参数时,还要乘以一个非常小的数,如0.01。因为如果采用sigmoid或tanh激活函数时,不至于使z过大或过小,导致计算梯度时接近于0,降低算法的优化速度。