1. 批量归一化(BN) 也能够解决梯度消失和梯度爆炸
(1) 一般来说在CV深度学习模型训练中,我们是要在卷积层后加入BN层的,原因来于Feature map在经过卷积层后,特征分布可能会有变化,BN就是为了解决这个问题加入的,它使得feature map的分布重新归于均值0和方差1,但是一般的归一化就是分子减去均值,分母是方差的开跟,这有一个严重的问题,见(2)。
(2) 如果对feature map使用单纯的归一化操作,就可能发生,网络中间某一层学习到特征数据本身就分布在S型激活函数的两侧,归一化强制把标准差限制在了1,把数据变换成分布于s函数的中间部分,这样就相当于破坏了这一层网络所学习到的特征分布。因此提出使用BN层的作者构建了方法“变换重构”,引入了可学习参数γ、β。原谅我抄袭别人的图。。我也是想学习一下。
代码实现:
# 计算均值
m = K.mean(X, axis=-1, keepdims=True)
# 计算标准差
std = K.std(X, axis=-1, keepdims=True)
# 一般归一化,如果只应用到这个地方,那么会出现(2)中的问题
X_normed = (X - m) / (std + self.epsilon)
# 重构变换 核心操作,引入了可以学习的参数
out = self.gamma * X_normed + self.beta
由公式可以发现,引入的γ和β,如果分别等于某特征图的方差和均值,实际上最后的out == X(输入),它们的分布一致,因此可以将其分布恢复。
(3) BN层在train和Inference中是有区别的。在train中我们的特征图格式一般是[batch size, channels, width, height],所以我们在没每次前向迭代进入BN层时,它的均值和方法是根据这batch size个特征图共同计算的(并不是所有训练集),因此不同的输入样本均值和方差一般不一样,这样也达到了训练β和γ的作用。
但是在inference的时候,输入往往是一张图像,没有batch size,无法计算均值和方差,这个时候我们就要应用在训练过程中的所有batch的均值和方差了。具体操作如下:图还是别人的。。哈哈
公式可以理解成,inference中的均值就是训练中所有batch均值的平均;方差就是训练中每个batch的方差的无偏估计。
(4) 一些细节,[batch size, channels, width, height]这个是输入维度,在真实操作中,是以channels为单位对每一组特征Ci(大小为 [batch size,width, height],包含了batch size个channel对应的特征图(比如都是每个batch中的第一通道的特征图)) ,对 Ci 中所有神经元求均值和方差,然后更新归一化这个Ci,其实最终训练了channels对β和伽马(这一块我理解了,写的可能不好,请细品)
(5) 为什么说BN也有轻微的正则化效果:可以把它看做正则化的一种方法,因为每层的输出,每个激活值和这些输出都来源于输入X以及批量中被采样的其他样本。因为你将通过这一批样本的经验化均值对输入数据进行归一化,所以,它不在对给定的训练样本提供确定性的值,而是将这些输入放入批中,因为它不再是确定值,就像往X中加入一些抖动,从而实现正则化的效果。
2. 梯度消失和梯度爆炸
(1) 这两种情况的出现,其实是因为反向传播策略的本质造成的,可以简单的想象,反向传播其实就是对loss链式求导,那么如果在接近输出位置的初始化权重w大于10,那么随着不断的像输入方向求导相乘,这个权重可能会以指数增大,那么在几个回合后将会对梯度有一个巨大的更新,这个就是梯度爆炸;同理初始化的权重w很小接近0,那么它可能会越来越小直至消失,梯度消失出现。所以,在一般的神经网络中,权重的初始化一般都利用高斯分布(正态分布)随机产生权重值。
(2) 解决方法很多,前辈们都给做出来了,ReLU/Leaky ReLU/各种ReLU的变体,L1/L2正则化,BN,残差结构,LSTM具体下面解释。
(3) 再解释一下(1),公式 + 图来自 :反向梯度计算公式图
梯度消失:根据链式求导法则,如果使用高斯分布初始化网络,并且激活函数选择Sigmoid这一类函数,sigmoid求导后值=1/4,因此在连续的相乘之后,值会变得非常小,导致梯度消失。
梯度爆炸:
# f函数为激活函数
f'(z) > 1
当权重初始化较大时候,前面网络层参数更新比后面的要快,因此产生梯度爆炸。因此参数初始化一般可以选择高斯/正太分布初始化参数。
3. ReLU和Leaky ReLU为啥有用能解决梯度消失和爆炸
首先看ReLU:
优点:它的倒数在负数部分恒0,正数部分恒1,那么看链式求导公式,在深度网络中不可能出现消失或爆炸的情况;同时,该结构也加速了网络的训练。
缺点:由于负数部分恒为0,会导致一些神经元无法激活的问题(可以通过设置小学习率部分解决);输出不是以0为中心的。
再看Leaky-ReLU:
优点:解决了ReLU在负数区间的缺点,并且包含了ReLU的优点。
缺点:计算更耗时。
x if x > 0
α(e的x次方 - 1) otherwise
4. L1 L2 正则化:能够解决梯度消失和爆炸,主要是为了防止过拟合
(1)L1正则化能够解决梯度消失和爆炸,但是会导致权重结果趋于0,导致稀疏性,提高模型泛化能力,防止过拟合。具体公式很简单,我下面这个是因为不好写公式。
L1:Loss = (y−WTx)2+α||W||1
在L1正则化中,额外项是权值向量中所有元素的绝对值之和。
当L1的正则化系数很小的时候,最优解也会很小,使得网络更简单,避免了过拟合。
L1正则化也成Lasso正则化
(2)L2正则化,主要防止过拟合,解决爆炸
L2 : Loss = (y−WTx)2+α||W||2
在L2正则化中,额外项是权值向量中所有元素的平方和,再求平方根,但是一般在最外面还有一个平方(抵消平方根)
L2正则化也成Ridge正则化、岭正则化。
L2项的存在,使得反向传播求梯度的时候,wi一直会乘一个小于1的数字,所有防止了wi很大,防止了梯度爆炸。同样的理由,使得模型更加简单,拟合能力更强,解决过拟合
5. ResNet中残差结构的作用,主要还是解决梯度消失和退化
(1) 本质是为了解决退化问题,随着网络的加深,拟合在饱和之后逐渐下降,是因为当饱和拟合时,加深网络就意味着在不降低准确率的前提下,开始学习H(x)=x这一类恒等变化,很困难(神经网络不容易拟合恒等映射),如果改变思路,让它学习H(x)=x+f(x),学习这个x的残差函数,使得f(x)趋于0一样能达到目的。
在前向传播时,输入信号可以从任意低层直接传播到高层。由于包含了一个天然的恒等映射,一定程度上可以解决网络退化问题
反向传播时,错误信号可以不经过任何中间权重矩阵变换直接传播到低层,一定程度上可以缓解梯度弥散问题(即便中间层矩阵权重很小,梯度也基本不会消失)
(2) 解决梯度消失
在反向传播的时候,可以看到导数是一个类似 1 + f'(x)的公式,f'(x)不可能每次都是-1(不严谨),同时即使f'(x)接近0,因为1的存在也使得梯度不会消失。
总结:本节5个内容,其实大体上/或多或少都能够解决梯度消失和梯度爆炸,其实BN就是为了梯度更新策略本质问题而创建的;L1,L2正则化本质是为了防止过拟合;选择合适的激活函数也是为了梯度更新策略本质缺陷;ResNet本质是为了解决深度网络下的退化问题。