一般在DL或者一些ML的算法中,在分類的時候,都需要把算法輸出值映射到[0-1]的概率空間去,或者在網絡內部,神經元激活的時候,都需要一個激活函數。
常見的激活函數有
多分類激活函數softmax
簡而言之,softmax就是把一些輸出映射為0-1之間的實數,並且歸一化保證和為1,因此多分類的概率之和也剛好為1。那么它的計算方式和圖上是一致的,logits通常就是我們NN最后一層神經元的輸出(不做其他的激活),這個值可大可小,其在最終會被映射到01的概率分布中去,代表每個類被取得的概率。softmax經常是和交叉熵一起使用來計算loss。
因為softmax在多分類上的優越性,所以我們很多樹模型像XGB,LGB都是使用softmax來做多分類。GBDT也是可以用類似的思路來實現多分類,LR也是ok的。不過softmax的前提應該是類間是互斥的,就是說每個樣本只可能屬於一個類。相反的如果類間不互斥的話,那只好采用oneVSreset的思路去做。
Sigmoid
Sigmoid也是經常使用的激活函數之一,包括LR,GBDT,XGB和NN內部和2分類時候做激活等。一般樹模型的話都是把每棵樹最終葉子節點的取值相加后通過sigmoid取得一個概率值之后再去計算loss
sigmoid雖然有它自己的優點,但是缺點也很明顯:導數值最大為0.25,兩邊無限接近於0,那么這會導致一個問題:當我需要用到sigmoid的導數的時候,如果我輸入的值很小或者很大,那么被sigmoid激活后這個值就變得很小。所以很多時候,像NN因為涉及loss的back propagation,鏈式求導過程中會有求導sigmoid的情況,如果某個權重\(w\)過小,那么就會導致函數值過小,連乘就會越乘越小,所以這個角度上來說,也是NN出現梯度消失的原因。那么梯度爆炸也是差不多的思路,從公式的角度解釋就是:
另外一個是像在LR上,LR的對數似然損失或者說二分類交叉熵損失在求導之后,還好sigmoid函數被保留而沒有涉及到被求導,不然也會出現就是說loss很小,難以學習的情況。
Tanh
Tanh雖然值域比sigmoid大了很多,但還是會有梯度消失的情況出現
Relu
Relu在負向上,也是存在有上面說到的弊端,但已經好很多了
Leakly Relu
Leakly Relu一般來說,與上面的情況相比,一般不會出現梯度消失的問題