深度学习笔记012数值稳定性、模型初始化、激活函数

数值稳定性

1、常见的两个问题

梯度爆炸:比如1.5的100次方,是4x10^17;

  值超出值域:对于16位浮点数尤为严重

  对学习率比较敏感:

    如果学习率太大,参数值就会大,带来的就是更大的梯度,就容易炸掉;

    但是学习率太小,训练就会没有进展,因此在训练过程需要不断的调整学习率(经典炼丹)

梯度消失:比如0.8的100次方,是2x10^-10;

  梯度值变成零:对16位浮点数尤为严重

  训练没有进展:不管如何选取学习率,因为权重就是学习率乘以梯度,梯度是0,训练不会有进展

  对于底层尤为严重:仅仅顶部层训练的较好,无法让神经网络更深(顶部梯度还比较正常,底部梯度趋于零,网络无法在更深层取得进展)

因为浮点数处理常常要求数据在一个合适的范围,所以这两个问题很容易出问题。

 

如何让训练更加稳定

目标:让梯度值在合理的范围里面,比如【1e-6,1e3】

常见手段:

  将乘法变成加法(ResNet、LSTM)

  归一化:梯度归一化,梯度裁剪(比如将梯度控制在[-5,5],如果梯度小于-5,则将其设为-5,;如果梯度大于5,则将其设为5)

  合理的权重初始和激活函数

 

让每层的输出和梯度都看做随机变量,让它们的均值和方差(始终)都保持一致。

 

权重初始化

1、在合理值区间里随机初始参数,而不是完全随机。我们应该能够将最优解限制在某一个区间内。否则,训练开始的时候更容易有数值不稳定的情况,因为远离最优解的地方损失函数表面可能很复杂,而最优解附近的表面会比较平滑。

2、使用N(0,0.01)来初始化可能对小网络没问题,但是不能保证深层次的网络,因为很有可能初始化的值太小或者太大。

 

独立同分布:https://zhuanlan.zhihu.com/p/134230464

 

 

首先,这个W属于R属实没太理解……(喵喵不解)

因为XY符合独立同分布,所以E(XY)=E(X)E(Y)

所以下面的式子没问题。

 

 

 

 

 

 方差D(X)=E(X^2)-E(X)^2

E[hit]2为0,直接消掉将上式带入展开。

展开之后的交叉项,因为原样本服从独立同分布,所以交叉项可以认为和为0(喵喵不解)

均值可加,所以将E直接挪进去。

这里将E均值换成了Var方差,是因为二者的均值都为0,所以计算方差的时候第二项都为0,那么方差自然就和样本平方的均值相等了,但是……hjt-1的均值=0是什么时候说的?难道说是因为认为只要不是第一层,它都等于0,因为每层都乘以了均值为0的权重矩阵?(喵喵不解)

最终推导出了,想要保持方差不变,需要保证二者之积为1,也就是第t-1层的个数乘以W的方差=1;

反向同理,结论:第t层的个数n乘以W的方差=1.

n t-1和t,前者是t层输入维度,后者是输出维度。

 

Xavier初始化

上述结论,难以同时满足二者之积为1,因为除非你的输入刚好等于输出,否则无法满足此条件。

方法Xavier取了个折中:

 

 也就是:

 

可以推导出正态分布和均匀分布:

 

 

 正态分布公式简单就是标准差,均匀分布的a与方差的关系是:[-a,a],其中分布的方差为a²/3

 

激活函数的选取

 

 想保证方差不变,意味着激活函数必须是f(x)=x,是一个线性的激活函数

tanh和relu在0点附近,近似f(x)=x;同时,神经网络通常来说权重都是在0点附近的比较小的数,所以这两个函数没什么大问题;

sigmoid不过原点,可以调整,调整好之后基本过原点,也基本可以认为其在0点附近符合正比例函数。(这个调整后的sigmoid常常解决很多问题)

 

总结一句话:合理的权重初始值和激活函数可以提升数值稳定性;

 

Q&A

1、inf:数值太大;nan:一般是除以0(梯度消失)了,或者是梯度爆炸。

常用的解决inf和nan的方法:调小学习率、合理地初始化权重、激活函数不要选错

2、代码能力==CPU频率,出活;数学能力==内存大小,出多大的活。

3、硬件会尽可能的把浮点数做小,因为比较高效;这与机器学习的浮点精度需求是矛盾的,我们只能取折中。

4、正态分布符合大数定理,容易推导。

5、把输出特征值规定在均值为0,方差为1的区间内,不会影响模型的可表达性(相当于数值的放缩,相对值不会改变,个人理解),这样做只是为了方便硬件处理。

6、整个深度学习,都是为了让数值更加稳定,但永远没有解决数值稳定性的问题。

 

posted @   爱和九九  阅读(314)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示