习题4-1 对于一个神经元,并使用梯度下降优化参数w时,如果输入x恒大于0,其收敛速度会比零均值化的输入更慢.
sigmoid函数图像:
sigmoid函数的导数图像:
零均值化的输入,使得神经元在0附近,sigmoid函数在零点处的导数最大,所有收敛速度最快。当输入为非零均值化的时候,w的梯度要么大于0要么小于0,得到的梯度用于权重更新的时候,不是平缓地迭代变化,而总是朝着某同一方向变化,是类似锯齿状的突变,影响梯度下降速度。所以输入x恒大于0,其收敛速度比零均值化的输入更慢。
习题4-5 如果限制一个神经网络的总神经元数量(不考虑输入层)为N+1,输入层大小为,输出层大小为1,隐藏层的层数为L,每个隐藏层的神经元数量为,试分析参数数量和隐藏层层数L的关系.
对于全连接网络,每一个隐藏层中的单个神经元都会与前一层的所有输出产生连接,并且每一个神经元都带有偏置。
输入到第一层隐藏层的参数数量为:
隐藏层之间的参数数量为:
最后一层隐藏层到输出的参数数目为:
偏置的数目为:
综上,参数的总数目为:
习题4-7 为什么在神经网络模型的结构化风险函数中不对偏置b进行正则化?
我觉得神经网络中w,b参数的作用(偏置B的作用)这里写的很好理解,于是我就拿来用了:
1.偏置b的作用,这里我用可视化的方法进行解释:
b参数的作用,是决定竖直平面沿着垂直于直线方向移动的距离,当b>0的时候,直线往左边移动,当b<0的时候,直线往右边移动.
假设我们有直线方程x1+x2-3=0,画出这个图像如下:
此时我们将b减小到0,图像变为如下:
我们从上面图像中很容易得到结论:
当b>0的时候,直线往左边移动,当b<0的时候,直线往右边移动.
2.每个神经元为什么要加上偏置
假如现在的样本点是如下这种:
此时我们希望得到的线性方程分割线是下面这种,能够正确的将俩类进行分开:
到这个时候,我想我们已经明白了,如果没有偏置的话,我们所有的分割线都是经过原点的,但是现实问题并不会那么如我们所愿.都是能够是经过原点线性可分的。
正则化的作用是为了限制模型的复杂度避免模型过拟合,提高模型的泛化能力。
对于某个神经元的输入来说,input = w(0)x(0) + w(1)x(1) + w(2)x(2) + ······ + b
对于样本特征向量X,其对input的贡献只与权重向量W有关。
若W向量中的值都很大,若特征向量X中的值发生细微的变化会导致input值的突变。
这就导致了模型的不稳定,所有我们希望得到较小的权重值。而偏置b对于所有输入样本来说都是一致的,是一个不变量,所以不需要考虑对B进行正则化。
以下专业解释:
正则化主要是为了防止过拟合,而过拟合一般表现为模型对于输入的微小改变产生了输出的较大差异,这主要是由于有些参数 w过大的关系,通过对||w||进行惩罚,可以缓解这种问题。而如果对||b||进行惩罚,其实是没有作用的,因为在对输出结果的贡献中,参数b对于输入的改变是不敏感的,不管输入改变是大还是小,参数b的贡献就只是加个偏置而已。
或者说,模型对于输入的微小改变产生了输出的较大差异,这是因为模型的“曲率”太大,而模型的曲率是由w决定的,b不贡献曲率(对输入进行求导,b是直接约掉的)。
习题4-8 为什么在用反向传播算法进行参数学习时要采用随机参数初始化的方式而不是直接令W = 0,b = 0?
若将𝑾和𝒃都初始化为0,则在输入层之后的所有隐藏层神经元接收到的输入都是一样的,那么在使用反向传播算法进行梯度的传递时,每一隐藏层的权重梯度值都是相同的,这种现象称为对称权重现象。这就导致了权重只能向同一方向下降,主要是是从权重和偏置方面导致了输入X值的非零均值化(更极端的是所有值相同)。
习题4-9 梯度消失问题是否可以通过增加学习率来缓解
增加学习率在一定程度上可以缓解。适当增大学习率可以使学习率与导数相乘结果变大,缓解梯度消失;过大学习率可能梯度巨大,导致梯度爆炸。
梯度消失问题是由于激活函数为类似于sigmoid与tanh,由于其双饱和的性质,其值太大或太小时导数都趋于0;并且在深层神经网络中,误差反向传播时,传播到前几层时梯度信息也会很小。问题是可否通过增大学习率来增大梯度,以至于梯度信息可以在更新时变大。
答案是不行,增大学习率带来的缺陷会比梯度消失问题更加严重,学习率变大时,很容易使得参数跳过最优值点,然后梯度方向改变,导致参数优化时无法收敛。
为什么会产生梯度消失和梯度爆炸:
【梯度消失】经常出现,产生的原因有:一是在深层网络中,二是采用了不合适的激活函数,比如sigmoid。当梯度消失发生时,接近于输出层的隐藏层由于其梯度相对正常,所以权值更新时也就相对正常,但是当越靠近输入层时,由于梯度消失现象,会导致靠近输入层的隐藏层权值更新缓慢或者更新停滞。这就导致在训练时,只等价于后面几层的浅层网络的学习。
【梯度爆炸】一般出现在深层网络和权值初始化值太大的情况下。在深层神经网络或循环神经网络中,误差的梯度可在更新中累积相乘。如果网络层之间的梯度的绝对值> 1.0,那么重复相乘会导致梯度呈指数级增长,梯度变的非常大,然后导致网络权重的大幅更新,并因此使网络变得不稳定。
梯度消失的解决方法:
1) pre-training+fine-tunning
此方法来自Hinton在2006年发表的一篇论文,Hinton为了解决梯度的问题,提出采取无监督逐层训练方法,其基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
(2) 梯度剪切:对梯度设定阈值
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
(3) 权重正则化
另外一种解决梯度爆炸的手段是采用权重正则化(weithts regularization),正则化主要是通过对网络权重做正则来限制过拟合。如果发生梯度爆炸,那么权值就会变的非常大,反过来,通过正则化项来限制权重的大小,也可以在一定程度上防止梯度爆炸的发生。比较常见的是 L1 正则和 L2 正则,在各个深度框架中都有相应的API可以使用正则化。
关于 L1 和 L2 正则化的详细内容可以参考我之前的文章——欠拟合、过拟合及如何防止过拟合
(4) 选择relu等梯度大部分落在常数上的激活函数
relu函数的导数在正数部分是恒等于1的,因此在深层网络中使用relu激活函数就不会导致梯度消失和爆炸的问题。
关于relu等激活函数的详细内容可以参考我之前的文章——温故知新——激活函数及其各自的优缺点(5) batch normalization
BN就是通过对每一层的输出规范为均值和方差一致的方法,消除了权重参数放大缩小带来的影响,进而解决梯度消失和爆炸的问题,或者可以理解为BN将输出从饱和区拉倒了非饱和区。
参考文章:
NNDL 作业4 第四章作业_死亡relu问题-CSDN博客
总结:
通过完成这次作业,我有以下几点体会:
1.我对偏置b的作用有了更深的理解,偏置b的主要作用是偏移。对b正则化作用很小,不如直接对w进行正则化。
2.梯度爆炸和梯度消失一般都出现在深层神经网络中,原因主要是激活函数的选择不恰当,模型不稳定等。如果出现梯度消失问题增加学习率可以适当缓解,但是治标不治本。梯度消失的解决方法我在题目4-8的回答中已经给出。
3.前馈神经网络的参数数量主要由权重W和偏置b构成。计算时可以分为输入--->第一层隐藏层,隐藏层之间,以及最后一层隐藏层--->输出,最后计算偏置的思路计算。