?????? 最近碰到這樣一個問題:為什么ReLU函數作為激活函數不會有梯度消失問題,明明當x<=0時函數的梯度為0,當他往回傳的時候與前面梯度相乘,不就全部為0了嗎,而sigmoid激活函數雖然x很遠時梯度特別特別小,但是至少還是有值的啊。sigmoid函數有梯度消失,而ReLU函數竟然沒有梯度消失,真是太奇怪了。
?????? 原因請看下圖:
假設最后一層relu層是輸出,誤差error取(y*-y)的平方。當這層某個神經元的relu的輸入小于等于0時,梯度為0,x2*w2+b的誤差為此時的梯度乘以這個神經元的輸出的error,也就是為0了。當這層某個神經元的relu的輸入大于0時,梯度為1,x2*w2+b的誤差為它的梯度1乘以這個神經元的error,等于error。找到了后面一層relu函數的輸入的誤差之后,再來尋找前面一層relu函數的輸出的誤差,也就是x2的誤差,因為是找x2的誤差所以用x2*w2+b對x2求偏導,得到w2,這個w2就是梯度,也是斜率,用它乘以后面傳來的誤差就是x2的誤差(相當于在坐標系中斜率乘deltx得到delty,這里的deltx就相當于后面傳來的error,這里也可以將error看成是權重,error大的,往前傳的時候使前面w改變大),用矩陣的形式表示就如上圖的Delt(X2),而當用sigmoid函數時就如下面的那個式子一樣,W2是一個矩陣,它乘以向量里面是做加法,而不是想象的0乘以所有的梯度都為0,這個時候relu函數的優勢就出來了,假設取隨機的一半為0一半為1,Delt(X2)還是有較大更新;而對于sigmoid函數,W2要與后面每個很小的數相乘,所以累加后還是很小,Delt(X2)更新較小。當網絡層數特別深的時候relu的優勢就是巨大的。當層數很淺的時候還是sigmoid函數的性能比較好,因為它畢竟有非常好的非線性能力(比relu函數強太多了),抵消了它的梯度消失問題,而且層數淺時梯度消失問題也不是很嚴重。得到x2的誤差之后可以求前面一層relu函數的輸入也就是x1*w1+b1的誤差,這個誤差的求法是跟前面一層一樣,當x1*w1+b1小于等于0時,梯度為0,乘以delt(x2)為0,當神經元 的輸入大于0時,x1*w1+b1的誤差為delt(x2),有了x1*w1+b1的誤差又能求x1的誤差就是w1乘以delt(x2)或者0,就這樣誤差一步一步向前傳遞。再更新w時就要求w的誤差,同樣就是用x*w+b對w偏導就是x,用x乘以后面面的誤差(也是類似于斜率乘以deltx得到y的變化量,這里的誤差就是deltx,就是類似誤差帶來的權重)得到deltw,就是這層w需要變化的量。