算法工程师面试准备——深度学习

神经网络梯度消失与梯度爆炸

简述现象

层数比较多的神经网络模型在训练的时候会出现梯度消失和梯度爆炸问题。梯度消失问题和梯度爆炸问题一般会随着网络层数的增加变得越来越明显

  • 梯度消失问题发生时,靠近输出层的hidden layer 3的权值更新相对正常,但是靠近输入层的hidden layer1的权值更新会变得很慢,导致靠近输入层的隐藏层权值几乎不变,扔接近于初始化的权值。这就导致hidden layer 1 相当于只是一个映射层,对所有的输入做了一个函数映射,这时此深度神经网络的学习就等价于只有后几层的隐藏层网络在学习。
  • 梯度爆炸的情况是:当初始的权值过大,靠近输入层的hidden layer 1的权值变化比靠近输出层的hidden layer 3的权值变化更快,就会引起梯度爆炸的问题
    在这里插入图片描述

产生梯度消失的根本原因

在这里插入图片描述
在这里插入图片描述
最大值是1/4。我们一般会使用标准方法来初始化网络权重,即使用一个均值为0标准差为1的高斯分布。因此,初始化的网络权值通常都小于1。层数越多,求导结果越小,最终导致梯度消失的情况出现

梯度爆炸的根本原因

w比较大的情况。则前面的网络层比后面的网络层梯度变化更快,引起了梯度爆炸的问题

当激活函数为sigmoid时,梯度消失和梯度爆炸哪个更容易发生?

梯度爆炸问题在使用sigmoid激活函数时,出现的情况较少,不容易发生。
因为要剃度爆炸就要求在这里插入图片描述,对于sigmod而言,x数值变化范围很窄

如何解决梯度消失和梯度爆炸

梯度消失和梯度爆炸问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑以下三种方案解决:

  1. 用ReLU、Leaky ReLU、PReLU、RReLU、Maxout等替代sigmoid函数。
  2. 用Batch Normalization。
  3. LSTM的结构设计也可以改善RNN中的梯度消失问题。

激活函数

sigmod

Sigmoid函数在历史上曾经非常的常用,输出值范围为[0,1]之间的实数。然而现在它已经不太受欢迎,实际中很少使用。原因是sigmoid存在3个问题:

  1. sigmoid函数饱和使梯度消失
  2. sigmoid函数输出不是“零为中心”
    一个多层的sigmoid神经网络,如果你的输入x都是正数,那么在反向传播中w的梯度传播到网络的某一处时,权值的变化是要么全正要么全负。
    当梯度从上层传播下来,w的梯度都是用x乘以f的梯度,因此如果神经元输出的梯度是正的,那么所有w的梯度就会是正的,反之亦然。
  3. 指数函数的计算是比较消耗计算资源的

tanh

  • 优点:
    1.tanh解决了sigmoid的输出非“零为中心”的问题。

  • 缺点:
    1.依然有sigmoid函数过饱和的问题。
    2.依然指数运算。

ReLU

  • 优点:
    1.ReLU解决了梯度消失的问题,至少x在正区间内,神经元不会饱和。
    2.由于ReLU线性、非饱和的形式,在SGD中能够快速收敛。
    3.计算速度要快很多。ReLU函数只有线性关系,不需要指数计算,不管在前向传播还是反向传播,计算速度都比sigmoid和tanh快。

  • 缺点:
    1.ReLU的输出不是“零为中心”(Notzero-centered output)。
    2.随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。这种神经元的死亡是不可逆转的死亡。

Leaky ReLU

  • 优点:
    1.神经元不会出现死亡的情况。
    2.对于所有的输入,不管是大于等于0还是小于0,神经元不会饱和。
    2.由于Leaky ReLU线性、非饱和的形式,在SGD中能够快速收敛。
    3.计算速度要快很多。Leaky ReLU函数只有线性关系,不需要指数计算,不管在前向传播还是反向传播,计算速度都比sigmoid和tanh快。

  • 缺点:
    1.Leaky ReLU函数中的α,需要通过先验知识人工赋值。
    在这里插入图片描述

Batch Normalization

为什么传统的神经网络在训练开始之前,要对输入的数据做Normalization?

  • 神经网络学习过程本质上是为了学习数据的分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;
  • 另一方面,一旦在mini-batch梯度下降训练的时候,每批训练数据的分布不相同,那么网络就要在每次迭代的时候去学习以适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对所有训练数据做一个Normalization预处理的原因

深度神经网络模型的训练为什么会很困难

深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致后面层的输入数据分布发生变化,数据通过层层叠加的网络,靠近输出层的隐层网络输入分布变化会非常的剧烈,这就使得靠近输出层的隐层网络需要不断的去重新适应前面层的参数更新

什么是Batch Normalization?

难点:归一化容易,但是我们变换之后之前学习的东西就消失了
解决办法:变换重构。变换重构是为了让因训练所需而刻意加入的Normalization能够有可能还原到最初的输入
在这里插入图片描述
BN算法在CNN中往往放在每个卷积层之后,ReLU操作之前。在CNN中使用BN是把每个特征图看做一个神经元,计算该特征图对应数据的均值和方差进行归一化,并且每个特征图对应两个学习变量γ、β

Batch Normalization的优点

(1)可以使用更高的学习率,BN有快速收敛的特性
(2)模型中BN可以代替dropout或者使用较低的dropout
(3)减少L2权重衰减系数。用了Batch Normalization后,可以把L2权重衰减系数降低,论文中降低为原来的5倍。
(4)BN本质上解决了反向传播过程中梯度消失的问题
因为数据使用BN后,归一化的数据仅使用了sigmoid线性的部分。
(5)可以把训练数据彻底打乱。防止了每批训练的时候,某一个样本经常被挑选到。论文中指出这个操作可以提高1%的精度

神经网络训练

学习率/网络训练方法

网络参数初始化

网络参数可以都设置0么

在感知器和逻辑回归中,一般将参数初始化为0,但是在神经网络中如果把参数初始化为0,就会导致在第一次前向计算时,所有隐藏层神经元的激活值都相同,这样会导致深层神经元没有区分性,这种现象称为对称权重现象

有什么常见的初始化方法

  1. 高斯初始化。参数服从一个固定均值和固定方差的高斯分布进行随机初始化。
    当一个神经元的输入连接数量为n时,可以考虑其输入连接权重以的高斯分布进行初始化,如果同时考虑神经元的输出连接数量为m时,可以按照进行高斯分布初始化
  2. 均匀分布初始化。参数可以在[-r,r]之间采用均匀分布进行初始化。
    在这里插入图片描述
    总结:实际中均匀初始化用的多。

超参数如何优化

  1. 网格搜索
  2. 随机搜索。
    有的超参数(比如正则项系数)对模型的影响有限,有的超参数(比如学习率)对模型的影响比较大,网格搜索会在影响不大的超参数上浪费时间。
    一种在实践中比较有效的方法是对超参数进行随机组合(比如不太重要的参数进行随机抽取,重要的参数可以按照网格搜索的方式选择),选择表现最好的参数作为结果,这就是随机搜索

思考:
网格搜索和随机搜索没有利用超参数之间的相关性,即如果模型的超参数组合比较类似,其模型的性能表现也是比较接近的,这时候网格搜索和随机搜索就比较低效。下面介绍两种自适应的超参数优化方法:贝叶斯优化和动态资源分配

  1. 动态资源分配
    在超参数优化中,每组超参数配置的评估代价很高,如果我们可以在较早的阶段就估计出该组超参数效果就比较差,然后提前终止该组参数的测试,从而将更多的资源留给其他。这个问题可以归结为多臂赌博机问题的一个泛化问题,即最优臂问题,即在给定有限次数的情况下,如何获取最大收益。
    动态资源分配的一种有效方法是逐层减半(successive halving),将超参数优化看作是一种非随机的最优臂问题
  2. 贝叶斯优化。是一种自适应的超参数优化方法,根据当前已经试验的超参数组合,来预测下一个可能带来最大收益的组合
发布了79 篇原创文章 · 获赞 8 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_34219959/article/details/104481318