李沐-动手学深度学习(4)数值稳定性、模型初始化、激活函数

【总结】

当数值过大或者过小时会导致数值问题;

常发生在深度模型中,因为其会对n个数累乘。

合理的权重初始值和激活函数的选取可以提升数值稳定性。(使每一层的输出和每一层的梯度都是一个均值为0,方差为一个固定数的随机变量)(权重初始用Xavier,激活函数用tanh、relu或变化的sigmoid)


一、数值稳定性

t在这里表示层。

向量关于向量的导数是一个矩阵,所以这里要做太多的矩阵乘法,会带了两个问题。

(假设梯度都是比1大一点的数,假设梯度都是比1小一点的数)

seigema是一个按元素的函数,对向量,变成一个对角矩阵。

因为diag那个矩阵中全是0和1,意味着把某一列全留住了,或者把某一列全变0了。随意最后求得结果矩阵中的元素值,会是来自于所有没有变成0的那些列的乘法。

使用GPU时会比较经常用到16位浮点数,数值取件有点小,超出了就变无穷大了。即时没有到无穷大,还有别的问题,对学习率敏感。

学习率大,一步走的比较远,权重会变得比较大,因为那个梯度是权重的乘法,就会带来更大的梯度,又会导致更大的权重。


二、模型初始化

1、让训练更加稳定

今天的重点是合理的权重初始化和激活函数。

2、合理的权重初始化


j假设输出100维,那就把它看成100维的随机变量。例如,让每一层的输出都是均值为0方差为某个值的随机变量。就是不管多深,让最后一层和第一层都差不多。


t是第t层,i是第i个元素,h_i^t是一个标量(随机变量)。

n_t-1和n_t是输入输出的两个维度,除非相同,否则很难同时满足这两个条件。解决-->Xavier初始,取个折中。

Xavier是常用的一个权重初始化的方法。

前面都是假设没有激活函数,再看下加上激活函数怎么办。

3、合理的激活函数

不用线性函数(没法产生非线性性),这里只是为了简化举例。

意味着激活函数必须是f(x)=x。


tanh和relu问题不大,基本满足在零点附近,是x本身这个要求。(权重本身也基本在零点附近。)sigmoid不满足,但可以调整。


三、问答

(1)inf就是太大了,一般是学习率调的太大了,或者权重初始时那些值太大了。nan一般就是因为除零了,例如把梯度除了个0。

如果网络层的输出的中间层特征元素值突然变成nan一般是因为梯度爆炸。

一般学习率不要选太大,权重初始的方差也不要太大。可以先小点,慢慢调大。

(2)Q:

A:一般就是因为权重坏掉了,参数已经乱了。一般就是数值稳定性出了问题。可以把学习率调小点,如果不能解决,通常是因为模型的数值稳定性不行。

(3)输出和梯度用正太分布,或者均匀分布纯粹因为好算,按道理用什么都可以。

(4)Q:

A:不会。数值就是一个区间,拉到什么样都是可以的。这只是为了硬件上好处理,数学上不影响的。

你可能感兴趣的:(李沐-动手学深度学习(4)数值稳定性、模型初始化、激活函数)