都是学习过程中的个人理解,会涉及有点复杂的数学思路,并且没有辅以方便理解的实例,可能解释得不是那么清楚。
假设W为权值,b为偏置,y为真实输出,loss为损失值。
首先,深度学习中的求导过程,是当给定模型之后,给定W和b之后,通过loss = δ(y), y = σ(W, b)给出的,对损失函数结果进行求导的结果,而结果是W和b各自的梯度。
所以实际上“自变量”是W, b,希望W和b都按着自己的梯度走一小步,这样可以使得loss逐渐靠近最小(不是严格的loss总梯度靠近,而是以每个自变量的偏导数近似靠近)。
如果举一个简单的例子,模型只存在一个隐层,我想求loss对输入层w的导数,有反向:
① loss = δ(y) loss对y求导
② y = wh + b y对隐层激活函数值h求导
③ h = σ(y0) h对输入层线性函数值y0求导
④ y0 = w’x + b’ y0对输入w求导
如果是多个隐层呢,②③来回做,都是对h(输入)而非w(参数)求导,只有求某一层的导数时,是对该层的参数w求导。
而对于W, b初始值为0的情况下,输入层的线性函数值y=wx+b一定是0,0经过激活函数,输出不一定为0,但一定是相同值,由此导致,正向计算函数值时,每层的函数值相同。则逆向求导时,同层loss的导函数值就一定相同。【一定相同的原因:激活函数函数值相同的点一般只有一个,因此求导时求的都是该点导数,导数值相同】
但是输入层的W, b导函数值不一定相同(因为求输入层的导数时,其它层都是对x求导,只有输入层的y =wx+b是对w求导,结果为x,会受输入不同影响),但:
① 中间结构有线性函数
② 线性函数,指的是其它wx+b ————此w非彼w,我数学不好,玩不来符号定义
③ 中间是要对x求导而不是w ————如果这个理解不了可以自己推一推多层导数
④ y对x求导完是w
⑤ 中间层的w也被赋值为0了
则逆向传播还没到输入层,由链式乘法,导函数值就变成了0,所以管它输入层导函数值是啥呢,只要有一个0,算到输入层已经用不上了。
数学完了,下面就是玄学。
这不就导致,第一轮epoch跟没做一样,基本死掉了。
后续可能会让第一层艰难的活过来,其它层再在第一层活了的基础上慢慢地活过来,但这个过程要耗费多少epoch,代价太大了。
既然如此,直接别赋值为0不就好啦。
这里有一个复杂一点的,关于参数为0的计算:
有图有真相,虽然求导过程上简略了点,应该逻辑正确。
用玄学来解释就是,我们给一个深度学习模型初始赋不同值,就是在告诉所有神经网络单元,你就关注这一部分特征,别的特征有别的单元管。
而如果初始赋值为0就是在说,你们所有人全关注同一个特征。(即使较真的说,根据输入不同,后续会导致关注点有所变化,但为啥不直接回避赋相同值呢?就那么想钻牛角尖吗,那么想从数学上解释清楚这个问题吗,惨惨如是批判自己)
很显然会使得模型效果不好,严重点就会导致模型失效。
虽然感觉自己能给自己解释明白了,但其实数学上的问题有数学家去管,平时我依然只需要知道数学家送来的结论。