→梯度爆炸的情况是:当初始的权值过大,靠近输入层的hidden layer1的权值变化比靠近输出层的hidden layer3的权值变化更快,就会引起梯度爆炸的问题。
2.2 梯度不稳定问题
在深度神经网络中的梯度是不稳定的,在靠近输入层的隐藏层中或会消失,或会爆炸。这种不稳定性才是深度神经网络中基于梯度学习的根本问题。
梯度不稳定的原因:前面层上的梯度是来自后面层上梯度的乘积。当存在过多的层时,就会出现梯度不稳定场景,比如梯度消失和梯度爆炸。
2.3 产生梯度消失的根本原因
我们以图2的反向传播为例,假设每一层只有一个神经元且对于每一层都可以用公式1表示,其中为sigmoid函数,C表示的是代价函数,前一层的输出和后一层的输入关系如公式1所示。我们可以推导出公式2。
而sigmoid函数的导数如下图右图所示。
可见, 的最大值为1/4,而我们一般会使用标准方法来初始化网络权重,即使用一个均值为0标准差为1的高斯分布。因此,初始化的网络权值通常都小于1,从而有
。对于2式的链式求导,层数越多,求导结果越小,最终导致梯度消失的情况出现。
对于上图,和
有共同的求导项。可以看出,前面的网络层比后面的网络层梯度变化更小,故权值变化缓慢,从而引起了梯度消失问题。
2.4 产生梯度爆炸的根本原因
当,也就是W比较大的情况。则前面的网络层比后面的网络层梯度变化更快,引起了梯度爆炸的问题。
2.5 当激活函数为sigmoid时,梯度消失和梯度爆炸哪个更容易发生
结论:梯度爆炸问题在使用sigmoid激活函数时,出现的情况较少,不容易发生。
量化分析梯度爆炸时x的取值范围:因导数最大为0.25,故 > 4,才可能出现
;按照
可计算出x的数值变化范围很窄,仅在公式3范围内,才会出现梯度爆炸。画图如5所示,可见x的数值变化范围很小;最大数值范围也仅仅0.45,当
= 6.9时出现。因此仅仅在此很窄的范围内会出现梯度爆炸的问题。
2.6 如何解决梯度消失和梯度爆炸
梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑以下三种方案解决:
1、用ReLU、Leaky-ReLU、P-ReLU、R-ReLU、Maxout等替代sigmod函数。
2、用Batch Normalization。
3、LSTM的结构设计也可以改善RNN中的梯度消失问题。
3 激活函数的比较
反之,不满足以上条件的函数则称为非饱和激活函数。
sigmoid和tanh是“饱和激活函数”,而ReLU及其变体则是“非饱和激活函数”。使用“非饱和激活函数”的优势在于两点:(1)“非饱和激活函数”能解决所谓的“梯度消失”问题。(2)它能加快收敛速度。
→Sigmoid函数将一个实值输入压缩至[0,1]的范围---------σ(x) = 1 / (1 + exp(−x))
→tanh函数将一个实值输入压缩至 [-1, 1]的范围---------tanh(x) = 2σ(2x) − 1
由于使用sigmoid激活函数会造成神经网络的梯度消失和梯度爆炸的问题,所以许多人提出了一些改进的激活函数,如:tanh、ReLU、LeakyReLU、PReLU、RReLU、ELU、Maxout。
3.1 Sigmoid
3.1.1 公式
Sigmoid(s形)是常用的非线性的激活函数,它的数学公式如下:
特点:它能够把输入的连续实值变换为0和1之间的输出,特别的,如果是非常大的实数,那么输出就是0;如果是非常大的正数,输出就是1。
Sigmoid函数是深度学习领域开始时使用频率最高的activation function。它是便于求导的平滑函数。
3.1.2 在什么情况下适合使用Sigmoid激活函数?
1、Sigmoid函数的输出范围是0到1,。由于输出值限定在0到1,因此它对每个神经元的输出进行了归一化。
2、用于将预测概率作为输出的模型。由于概率的取值范围是0到1,因此Sigmoid函数非常适合。
3、梯度平滑,避免跳跃的输出值。
4、函数是可微的,这意味着可以找到任意两个点的Sigmoid曲线的斜率。
5、明确的预测,即非常接近1或0。
3.1.3 缺点
1、容易出现梯度消失。
2、函数输出并不是zero-centered。
3、幂运算相对来讲比较耗时。
(1)梯度消失
优化神经网络的方法是反向传播,即导数的后向传递:先计算输出层对应的loss,然后将loss以导数的形式不断向上一层神经网络传递,修正相应的参数,达到降低loss的目的。Sigmoid函数在深度网络中常常会导致导数逐渐变为0,使得参数无法被更新,神经网络无法被优化,原因在于两点:
1、在上图中容易看出,当中x较大或较小时,导数接近0,而向后传递的数学依据是微积分求导的链式法则,当前层的导数需要之前各层导数的乘积,几个小数的相乘,结果会很接近0。
2、Simoid导数的最大值是0.25,这意味着导数在每一层至少会被压缩为原来的1/4,通过两层之后变为1/16,… , 通过10层以后为1/1048576.请注意这里是“至少”,导数达到最大值这种情况还是很少见的。
(2)输出不是zero-centered
Sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。举例来讲,对
来讲,如果所有xi均为正数或负数,那么其对wi的导数总是正数或负数,这会导致如下图红色箭头所示的阶梯式更新,这显然并非一个好的优化路径。深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以总体来讲,训练深度学习网络尽量使用zero-centered数据(可以经过数据预处理实现)和zero-centered输出。
不是zero-centered产生的一个结果就是:如果数据进入神经元的时候是正的,那么w计算出的梯度也会始终是正的。当然了,如果你是按batch去训练,那么batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的kill gradients问题相比还是要好很多的。
(3)幂运算相对耗时
相对于前两项,这其实并不是一个大问题,我们目前是具备相应计算能力的,但面对深度学习中庞大的计算量,最好是能省就省。之后我们会看到,在R额LU函数中,需要做的仅仅是一个thresholding,相对于幂运算来讲会快很多。
3.2 tanh函数
tanh激活函数的图像也是s形,表达式如下:
tanh读作Hyperbolic Tangent(双曲正切),如上图所示,它解决了zero-centered的输出问题,然而梯度消失的问题和幂运算的问题仍然存在。
tanh是一个双曲正切函数。tanh函数和sigmoid函数的曲线相对相似,但是它比sigmoid函数更有一些优势。
1、首先,在输入较大或较小时,输出几乎是平滑的并且梯度较小,这不利于权重更新。二者的区别在于输出间隔,tanh的输出间隔为1(x>=0 y∈[0,1)),并且整个函数以0为中心,比sigmoid函数更好。
2、在tanh图中,负输入将被强映射为负,而零输入被映射为接近零。
注意:在一般的二元分类问题中,tanh函数用于隐藏层,而sigmoid函数用于输出层,但这都不是固定的,需要根据特定问题进行调整。
3.3 ReLU
近年来,ReLU函数变得越来越受欢迎。全称是Rectified Linear Unit(修正线性单元)。ReLU是Krizhevsky、Hinton等人在2012年《ImageNet Classification with Deep Convolutional Neural Networks》论文中提出的一种线性且不饱和的激活函数。它的数学表达式:
ReLU函数其实就是一个取最大值函数,注意这并不是全区间可导的,但是我们可以取sub-gradient,如上图所示。ReLU虽然简单,但却是这几年的重要成果,有以下几大优点:
1、解决了gradient vanishing问题(在正区间上)。
2、 Sigmoid和tanh激活函数均需要计算指数,复杂度高,而ReLU只需要一个阈值即可得到激活值。ReLU函数中只存在线性关系,因此它的计算速度比Sigmoid和tanh更快。计算速度非常快,只需要判断输入是否大于0。
3、收敛速度远快于sigmoid和tanh。
4、ReLU的非饱和性可以有效地解决梯度消失的问题,提供相对宽的激活边界。
5、ReLU的单侧抑制提供了网络的稀疏表达能力。
ReLU也有几个需要特别注意的问题:
1、ReLU函数的输出为0或正数,不是zero-centered。
2、Dead ReLU Problem,指的是某些神经元可能永远都不会被激活,导致相应的参数永远不能被更新。这是由于函数f(x) = max(0,z),导致负梯度在经过ReLU单元时被设置为0,且在之后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生影响。当输入为负时,ReLU完全失效,在正向传播过程中,这不是问题。有些区域很敏感,有些则不敏感。但是在反向传播过程中,如果输入负数,则梯度完全为0,sigmoid函数和tanh函数也具有相同的问题。有两个主要原因可能导致这种情况产生:(1)非常不幸的参数初始化,这种情况比较少见(2)learning rate太高导致在训练过程中参数更新太大,会导致超过一定比例的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或者使用adagrad等自动调节learning rate的算法。
尽管存在这两个问题,ReLU目前仍然是最常用的activation function,在搭建人工神经网络的时候推荐优先尝试!
3.4 Leaky ReLU
人们为了解决Dead ReLU Problem, 提出了将ReLU的前半段设为0.01而非0。注意看,在负区间上不等于0。
为什么Leaky ReLU比ReLU更好?
1、Leaky ReLU通过把x非常小的线性分量给予负输入(0.01x)来调整负值的零梯度(zero gradients)问题。
2、leak有利于扩大ReLU函数的范围,通常a的值为0.01左右。
3、Leaky ReLU的函数范围是(负无穷到正无穷)
但另一方面,a值的选择增加了问题难度,需要较强的人工经验或多次重复训练以确定合适的参数值。
注意:从理论上讲,Leaky ReLU具有ReLU的所有优点,而且Dead ReLU不会有任何问题,但在实际操作中,尚未完全证明Leaky ReLU总是比ReLU更好。
3.5 ELU函数
ELU(Exponential Linear Units)指数线性单位的提出也解决了ReLU的问题。与ReLU相比,ELU有负值,这会使激活的平均值接近零。均值激活接近于零可以使学习更快,因为它们使梯度更接近自然梯度。
显然,ELU具有ReLU的所有优点,并且:
1、没有Dead ReLU问题,输出的平均值接近0,以0为中心。
2、ELU通过减少偏置偏移的影响,使正常梯度更接近于自然单位梯度,从而使均值像0加速学习。
3、ELU在较小的输入下会饱和至负值,从而减少前向传播的变异和信息。
一个小问题是它的计算强度更高。与Leaky ReLU类似,尽管理论上比ReLU更好,但目前在实践中没有充分的证据表明ELU总是比ReLU好。
3.6 PReLU
PReLU也是ReLU的改进版本,想法是基于参数的方法,即Parametric ReLU: ,其中
可由back propagation学出来。
Kaiming He的论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》指出,不仅可以训练,而且效果更好。
看一下PReLU的公式:参数通常为0到1之间的数字,并且通常相对较小。
1、如果a_i = 0, 则f变为ReLU。
2、如果a_i > 0, 则f变为leaky ReLU。
3、如果a_i是可学习的参数,则f变为PReLU。
PReLU的优点如下:
1、在负值域,PReLU的斜率较小,这样也可以避免Dead ReLU问题。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-pd02UqQy-1712815844755)]