目录
一、深度网络训练的问题
总所周知,深度网络训练会遇到两个大问题:梯度消失和梯度爆炸。
假设网络没有使用非线性函数,不考虑偏置b,设每层网络层输入为x(k−1)∈Rnk−1×1
x(k−1)∈Rnk−1×1,参数是W(k)∈Rnk×nk−1W(k)∈Rnk×nk−1,输出为x(k)∈Rnk×1
x(k)∈Rnk×1,每一层网络层的操作是
x(k)=W(k)x(k−1)=W(k)W(k−1)x(k−2)=W(k)W(k−1)⋯W(1)x(0)
x(k)=W(k)x(k−1)=W(k)W(k−1)x(k−2)=W(k)W(k−1)⋯W(1)x(0)
梯度消失
假设W=(0.5000.5)
W=(0.5000.5),即
x(k)=Wkx(0)=(0.5k000.5k)x(0)
x(k)=Wkx(0)=(0.5k000.5k)x(0)
随着k的增大,x的值越来越小,从而梯度呈指数级别下降,接近于0,这会导致梯度下降参数更新的非常缓慢,降低收敛速度。
梯度爆炸
假设W=(1.5001.5)
W=(1.5001.5),即
x(k)=Wkx(0)=(1.5k001.5k)x(0)
x(k)=Wkx(0)=(1.5k001.5k)x(0)
随着k的增大,x的值越来越大,从而梯度呈指数级别上升,甚至超出数据类型能够表达的最大的值,这会导致梯度下降参数变化范围很大,影响模型收敛。
因为梯度消失和梯度爆炸问题,我们在训练网络时都要小心翼翼地设置参数,
- 模型参数,一般由均值为0,方差为0.01的高斯分布初始化
- 学习率,学习率一般很小,比如0.0015(BN论文,训练Inception网络学习率使用0.0015)
使用非线性激活函数可以限制输出值x的取值范围,在一定程度上消除梯度消失和梯度爆炸的影响。
-
Sigmoid g(x)=11+exp(−x)
-
g(x)=1+exp(−x)1 可以把输出值限制在0到1之间,可以消除梯度爆炸的影响。但是x的值一般都非常大,经过Sigmoid激活函数之后,x的值落在Sigmoid的饱和区域(如下图的红色部分),饱和区域的梯度值接近与0,从而减慢了训练的速度。
-
ReLU g(x)=max(0,x)
-
g(x)=max(0,x) ReLU是为了克服Sigmoid具有缺点,模仿生物神经激活函数而提出的。ReLU把一些对梯度没有贡献的神经元设置为0,增加网络的稀疏性,而且ReLU计算量比Sigmoid少,但是ReLU并没有很好的消除梯度消失和梯度爆炸的影响。
Internal Covariate Shift:当深度网络浅层网络参数的发生细微变化,这种变化结果网络传输到深层网络,导致网络层输出数据发生很大的变化,从而网络层参数要发生很大的变动以适应输入数据的变化,这种深度网络中在训练过程中内部节点的数据分布变化的现象,称为Internal Covariate Shift。
为了消除梯度消失、梯度爆炸和Internal Covariate Shift的影响,受机器学习对样本进行归一化的启发,目前已经提出了许多深度学习的标准化操作,比如Batch Normalization、Synchronized Batch Normalization、Group Normalizaiton等。
二、数据标准化的几种方法:
1.标准化:
数据标准化是指数据的各维度减均值除以标准差,这是最常用的标准化方法。
公式:(xi−μ)/σ 其中μ指的是样本的均值,σ指的是样本的标准差。
2.归一化:
数据归一化是指数据减去对应维度的最小值除以维度最大值减去维度最小值,这样做可以将数值压缩到[0,1]的区间。
公式:(xi−min(x))/(max(x)−min(x))
3.白化:
白化的目的是去除输入数据的冗余信息。
例如:训练数据是图像,由于图像中相邻像素之间具有很强的相关性,因此输入是冗余的。白化的目的就是降低输入的冗余性。
输入数据集,经过白化处理后,生成的新数据集满足两个条件:一是特征相关性较低;二是特征具有相同的方差。
白化算法的实现过程:第一步操作是PCA,求出新特征空间中的新坐标,第二步是对新的坐标进行方差归一化操作。
PCA预处理:
左图表示原始数据X,然后我们通过协方差矩阵可以求得特征向量u1、u2,然后把每个数据点,投影到这两个新的特征向量(这两个特征向量是不变且正交的),得到进行坐标如下:
这就是pca处理。
PCA白化
pca白化是指对上面的pca的新坐标X’,每一维的特征做一个标准差归一化处理。
从上面我们看到在新的坐标空间中,(x1,x2)两个坐标轴方向的数据明显标准差不同,因此我们接着要对新的每一维坐标做一个标注差归一化处理。
二、