代码
【MindSpore易点通】深度学习系列-提升网络训练速度的方法

【MindSpore易点通】深度学习系列-提升网络训练速度的方法

【MindSpore易点通】深度学习系列-提升网络训练速度的方法

嗨咯,宝子们~天气炎热,小编想更新的心也变得更加火热,正好提供提升网络训练速度的方法给大家烦躁的内心降降温!

归一化输入

训练神经网络时,加速训练可以采用归一化输入的方法。假设训练集有两个特征,输入特征为2维,归一化一共只需两步:

1.零均值

2.归一化方差

特征x1的方差比特征x2的方差要大得多,需要给σ赋值:

σ2是一个向量,它的每个特征都有方差。

代价函数:

如果使用非归一化的输入特征,代价函数的图像如下所示:

假如x1取值范围从1到1000,特征x2的取值范围从0到1,那么参数w1和w2值的范围将会变化很大。在这样的代价函数上运行梯度下降法,只能使用非常小的学习率,多次迭代直到最后找到最小值。

但如果你归一化特征,代价函数更对称,那么不论从哪个位置开始,梯度下降法都能够更直接地找到最小值,步长也可以适当增大。

因此,如果输入特征处于不同范围,有些特征值从0到1,有些从1到1000,那么归一化特征值就非常重要;如果特征x1在0-1之间,x2在-1到1之间,x3在1-2之间,这样的相似范围,那么归一化就不是很重要了。

梯度爆炸/消失

训练深度神经网络经常会面临梯度消失(梯度爆炸)的问题,也就是说,训练时导数或坡度有时会变得非常大,或者非常小,甚至于以指数方式变小,这样会加大训练的难度。

那么如何避免这样的问题呢?

假设训练一个神经网络,含有参数W[1],W[2],W[3],...,W[l],这里我们可以简化一下激活函数,忽略b,直接g(z)=z,输出:

W[1] x=z[1],a[1]=g(z[1]),也就是说,第一项W[1] x=a[1],W[2]W[1] x=a[2]。

假设每个权重矩阵

最后的计算结果^y也等于1.5(L-1) x。因此如果L值较大,那么y^的值也会非常大,呈指数级增长的,从而y的值将爆炸式增长。

相反的,如果权重是0.5,

矩阵

假设x1和x2都是1,激活函数将变成1/2,1/2,1/4,1/4,1/8,1/8等,直到最后一项变成1/2L ,激活函数的值将以指数级下降。

因此,在深度神经网络中,如果激活函数或梯度函数以与L相关的指数增长或递减,它们的值将会变得极大或极小,从而导致训练难度上升。虽然这样的说明并不能彻底解决此问题,但也告诉我们在选择初始化权重问题上需要多多用心,平衡利弊。

神经网络的权重初始化

首先举一个简单的神经单元初始化的例子:

输入特征从x1到x4,经过a=g(z)处理,最终得到^y,输入可以表示为a[l],这里暂用x代替。

z=w1 x1+w2 x2+⋯+wn xn,b=0

为了预防z值过大或过小,所以如果n越大,那么我们就希望wi越小,这里可以设置wi=1/n,n表示神经元的输入特征数量。

n[l-1]是喂给第l层神经单元的数量(即第l-1层神经元数量)。

这时我们会发现如果使用Relu激活函数,方差设置为2/n,效果会更好。

g[l] (z)=Relu(z)

逻辑回归的特征是不会变的。但一般情况下l层上的每个神经元都有n[l-1]个输入。

如果激活函数的输入特征被零均值和标准方差化,方差是1,z也会调整到相似范围,这就没解决梯度消失的问题,当然也确实降低了一点,因为它给权重矩阵w设置了合理值。

实际上,公式只是一方面,它们给出初始化权重矩阵的方差的默认值,如果想添加方差,方差参数也是需要调整的。

希望通过今天的介绍,大家能够在解决梯度消失或爆炸以及如何为权重初始化合理值时,更加从容且有想法,我们下期再见!