【总结】
当数值过大或者过小时会导致数值问题;
常发生在深度模型中,因为其会对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:不会。数值就是一个区间,拉到什么样都是可以的。这只是为了硬件上好处理,数学上不影响的。