【吃瓜教程】第五章 神经网络

第五章 神经网络

5.1 神经元模型

神经元带有一定的阈值,只有输入的刺激(量化为数值形式)超过该阈值,这个神经元才会对刺激产生反应,可以想象成一扇门,力气足够大,才能推开,这里的力气足够大是一种条件,也就是说满足神经元的某种条件时,神经元被激活,此时我们称神经元兴奋

有时候刺激不只是来源于一方,想象有好几个人在推同一扇门,那么这些人的力共同构成了对门的推力,在神经元模型中叫做总输入,同时,每个推门人的作用不一样,给一个权重,如下引用西瓜书的图更直观

在这里插入图片描述

5.1.1 激活函数

可以想象成推开门后,一种东西被激活,这种东西将这些推门人变成了另外一种形式,类似于一个缝合怪,然后多个缝合怪又一起去激活下一道门。。。

从数学角度来讲,缝合怪这里是用了一种函数,一个无所不能的函数,当然,为了适应游戏规则,函数的适当选择才能使游戏的结果更优。我们称它为激活函数

为啥要用激活函数呢?

激活函数向神经网络中引入了非线性因素,通过激活函数神经网络就可以拟合各种曲线。

这里的非线性,类似于对缝合怪的一个综合打分吧,而不是简单的线性加和

5.1.1.1 饱和激活函数
5.1.1.1.1 Sigmoid

![[Pasted image 20220927193156.png]]

很显然,这个缝合怪的取值在0-1之间,可以当作是门对推门人的打分吧,越靠近1,神经元越兴奋,然后缝合怪带着这个打分,去激活下一道门

5.1.1.1.2 梯度消失(Vanishing Gradients)
  • Sigmoid极容易导致梯度消失问题。饱和神经元会使得梯度消失问题雪上加霜,假设神经元输入Sigmoid的值特别大或特别小,对应的梯度约等于0,即使从上一步传导来的梯度较大,该神经元权重(w)和偏置(bias)的梯度也会趋近于0,导致参数无法得到有效更新。
  • 计算费时。 在神经网络训练中,常常要计算Sigmid的值进行幂计算会导致耗时增加。
  • Sigmoid函数不是关于原点中心对称的
5.1.1.1.2 tanh

Tanh激活函数解决了原点中心对称问题。

5.1.1.2 非饱和激活函数

1.非饱和激活函数可以解决梯度消失问题。

2.非饱和激活函数可以加速收敛。

5.1.1.2.1 ReLU

ReLU解决梯度消失问题

ReLU激活函数的提出就是为了解决梯度消失问题。ReLU的梯度只可以取两个值:0或1,当输入小于0时,梯度为0;当输入大于0时,梯度为1。好处就是:ReLU的梯度的连乘不会收敛到0,连乘的结果也只可以取两个值:0或1 。如果值为1,梯度保持值不变进行前向传播;如果值为0 ,梯度从该位置停止前向传播。

Sigmoid函数是双侧饱和的,即朝着正负两个方向函数值都会饱和;但ReLU函数是单侧饱和的,即只有朝着负方向,函数值才会饱和。严格意义上来说,将ReLU函数值为0的部分称作饱和是不正确的(饱和应该是取值趋近于0),但效果和饱和是一样的。

假设神经元为检测某种特定特征的开关,高层神经元负责检测高级的/抽象的特征(有着更丰富的语义信息),例如眼睛或者轮胎;低层神经元负责检测低级的/具象的特征(曲线或者边缘)。当开关处于开启状态,说明在输入范围内检测到了对应的特征,且正值越大代表特征越明显。加入某个神经元负责检测边缘,则正值越大代表边缘区分越明显(sharp)。假设一个负责检测边缘的神经元,激活值为1相对于激活值为0.5来说,检测到的边缘区分地更明显;但激活值-1相对于-0.5来说就没有意义了,因为低于0的激活值都代表没有检测到边缘。所以用一个常量值0来表示检测不到特征是更为合理的,像ReLU这样单侧饱和的神经元就满足要求。

单侧饱和还能使得神经元对于噪声干扰更具鲁棒性。假设一个双侧都不饱和的神经元,正侧的不饱和导致神经元正值的取值各不相同,这是所希望的,因为正值的大小代表了检测特征信号的强弱。但负值的大小引入了背景噪声或者其他特征信息,这会给后续的神经元带来无用的干扰且可能导致神经元之间的相关性,相关性是容易造成模型病态的。例如检测直线的神经元和检测曲线的神经元可能有负相关性。在负值区域单侧饱和的神经元则不会有上述问题,噪声的程度大小被饱和区域都截断为0,避免了无用信息的干扰。

使用ReLU激活函数在计算上也是高效的。相对于Sigmoid函数梯度的计算,ReLU函数梯度取值只有0或1。且ReLU将负值截断为0 ,为网络引入了稀疏性,进一步提升了计算高效性。

5.1.1.2.3 神经元死亡

ReLU尽管稀疏性可以提升计算高效性,但同样也可能阻碍训练过程。通常,激活函数的输入值有一偏置项(bias),假设bias变得太小,以至于输入激活函数的值总是负的,那么反向传播过程经过该处的梯度恒为0,对应的权重和偏置参数此次无法得到更新。如果对于所有的样本输入,该激活函数的输入都是负的,那么该神经元再也无法学习,称为神经元”死亡“问题。

Leaky ReLU可以解决神经元”死亡“问题

Leaky ReLU的提出就是为了解决神经元”死亡“问题,Leaky ReLU与ReLU很相似,仅在输入小于0的部分有差别,ReLU输入小于0的部分值都为0,而LeakyReLU输入小于0的部分,值为负,且有微小的梯度。函数图像为(d)。

使用Leaky ReLU的好处就是:在反向传播过程中,对于Leaky ReLU激活函数输入小于零的部分,也可以计算得到梯度(而不是像ReLU一样值为0),这样就避免了梯度方向锯齿问题。

α的分布满足均值为0,标准差为1的正态分布,该方法叫做随机Leaky ReLU(Randomized Leaky ReLU)。原论文指出随机Leaky ReLU相比Leaky ReLU能得更好的结果,且给出了参数α的经验值1/5.5(好于0.01)。至于为什么随机Leaky ReLU能取得更好的结果,解释之一就是随机Leaky ReLU小于0部分的随机梯度,为优化方法引入了随机性,这些随机噪声可以帮助参数取值跳出局部最优和鞍点。将α作为了需要学习的参数,该激活函数为PReLU(Parametrized ReLU)。

5.1.1.2.3 ELU(Exponential Linear Unit)

理想的激活函数应满足两个条件:

1.输出的分布是零均值的,可以加快训练速度。

2.激活函数是单侧饱和的,可以更好的收敛。

LeakyReLU和PReLU满足第1个条件,不满足第2个条件;而ReLU满足第2个条件,不满足第1个条件。两个条件都满足的激活函数为ELU(Exponential Linear Unit)。其表达式如下:

f ( x ) = x , x > 0. α ( e x − 1 ) , x ≤ 0 f(x)={x,x>0.α(ex−1),x≤0} f(x)=x,x>0.α(ex1),x0

5.1.1.2.4 梯度爆炸

梯度误差是在神经网络训练期间计算的方向和梯度,神经网络以正确的方向和数值更新网络权重。在深度网络或递归神经网络中,梯度误差可能在更新过程中累积,造成非常大的梯度。这反过来会导致网络权重的大量更新,进而导致网络不稳定。在极端情况下,权重值可能变得太大,以至于溢出并导致NaN值现成梯度爆炸现象。

梯度爆炸是通过指数增长发生的,通过在网络层(其值大于1.0)中重复乘以梯度。

梯度爆炸现象

比较明显的现象:

  • 1.模型无法“加入”训练数据,比如损失函数很差。

  • 2.模型不稳定,每次更新的损失变化很大。

  • 3.模型损失在训练过程中变为NaN

另外还有一些不太明显的现象:

  • 1.模型权重在训练期间很快变化很大。

  • 2.模型权重在训练过程中变为NaN.

  • 3.训练期间每个节点和层的梯度误差始终高于1.0。

如何解决梯度爆炸

  • 1.重现设计神经网络,减少网络层数、减小batch szie、截断。

  • 2.使用LSTM

  • 3.使用梯度裁剪

  • 4.使用权重正则

5.1.1.2.5 如何选择激活函数
  • 1.除非在二分类问题中,否则请小心使用Sigmoid函数。

  • 2.可以试试Tanh,不过大多数情况下它的效果会比不上 ReLU 和 Maxout。

  • 3.如果你不知道应该使用哪个激活函数, 那么请优先选择ReLU。

  • 4.如果你使用了ReLU, 需要注意一下Dead ReLU问题, 此时你需要仔细选择 Learning rate, 避免出现大的梯度从而导致过多的神经元 “Dead” 。

  • 5.如果发生了Dead ReLU问题, 可以尝试一下leaky ReLU,ELU等ReLU变体, 说不定会有很好效果。

5.2 感知机与多层网络

5.2.1 感知机

感知机由两层神经元构成,第一层的输出作为第二层的输入,其中的权重以及阈值都是可以学习的,由感知机第二层的输出与真实值作比较,然后进行矫正,类似于线性魔性

感知机的局限在于线性,没法做到非线性,所以引入多层网络,你可以想象成多层感知机,变为非线性

5.2.2 多层网络

现在我们有三层神经元,除了输入与输出的两层以外,中间那一层我们称之为隐层,隐层中的神经元也是同输出层一样拥有激活函数的神经元(也就是说,输入层是没有的,只负责输入数据)

![[Pasted image 20220927201533.png]]![[Pasted image 20220927201547.png]]在这里插入图片描述

中间隐层的权重和阈值,就是我们模型要学习的东西,看到这密密麻麻的线,就可以知道权重项是有多少个了,这还仅仅是四个输入,两层隐层,如果是大型神经网络模型,参数动辄数亿计

参数是如何去学到的?

看下面的反向传播

5.3 误差反向传播

这里用到了梯度更新,比如说下山,每次向下走的时候,都会调整下山的方向,力求找到一个最快下山的路径,在这个过程中不断调整方向,这个方向不断更新就是说参数在不断更新,每次行走一段距离,就是训练一个数据的过程,调整方向,就是将这个错误进行纠正,回传,然后调整参数。

由于可能陷入局部最优,比如山里面突然有个小山谷,误以为可以下山,其实还在山里面,所以要多次训练。而且你每次调整方向不一定对,可能上一个让你往左,下一个又觉得向右比较好,存在抵消,所以也需要多次训练。

这里用到的指标是均方误差,目标是让累计误差最小,你可以理解为到最低点的垂直距离,比如想象一个 y = x 2 + 1 y = x^2+1 y=x2+1函数图像。在 x = 1 x=1 x=1取得最小值 1 1 1,这个1就是我们要找的最低点,而梯度下降方向就是曲线上一点的导数方向

如何防止过拟合

最常见的Dropout,早停,近年来有批正则化,又叫BN

5.4 局部最优与全局最优

  • 初始参数随机,用不同的初始参数进行多组实验找出最优的一组解,这相当于从不同的位置进行搜索
  • 带动量的梯度下降,可能会越过最低点
  • 随机梯度下降,加入随机因素,每次取一个样本计算梯度,因为单点的最优方向可能不是全局的最优方向,表现在图像上就是在寻找全局最优的路上饶了很多弯路才到达最优点。
  • 使用模拟退火算法,每次以一定的概率允许移动到比当前解差的点,可以跳过局部最优

5.5 深度学习

显然,深度是代表网络层数之多,学习代表整个模型从数据中不断学习到参数,当模型从足够多的数据里面学习到一种规律后,就可以用来解决很多问题。

本质上是隐层更多的感知器,不过后续有很多变形来缓解深层的代价,因为层数太多了,导致误差反向传播时会发散,所以后续进展陷入瓶颈,直到残差神经网络的出现(resnet),才使得深度更深。

引用部分文章:
详解激活函数(Sigmoid/Tanh/ReLU/Leaky ReLu等) - 知乎 (zhihu.com)
(62条消息) 如何跳出局部最优_很吵请安青争的博客-CSDN博客_跳出局部最优
以及西瓜书的一些图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值