連云港做鴨網(wǎng)站2022最新新聞
Softmax原理
Softmax函數(shù)用于將分類結(jié)果歸一化,形成一個概率分布。作用類似于二分類中的Sigmoid函數(shù)。
對于一個k維向量z,我們想把這個結(jié)果轉(zhuǎn)換為一個k個類別的概率分布p(z)
。softmax可以用于實現(xiàn)上述結(jié)果,具體計算公式為:
對于k維向量z來說,其中zi∈Rzi∈R,我們使用指數(shù)函數(shù)變換可以將元素的取值范圍變換到(0,+∞)(0,+∞),之后我們再所有元素求和將結(jié)果縮放到[0,1],形成概率分布。
常見的其他歸一化方法,如max-min、z-score方法并不能保證各個元素為正,且和為1。
Softmax性質(zhì)
輸入向量x加上一個常數(shù)c后求softmax結(jié)算結(jié)果不變,即:
我們使用softmax(x)的第i個元素的計算來進行證明:
函數(shù)實現(xiàn)
由于指數(shù)函數(shù)的放大作用過于明顯,如果直接使用softmax計算公式
進行函數(shù)實現(xiàn),容易導致數(shù)據(jù)溢出(上溢)。所以我們在函數(shù)實現(xiàn)時利用其性質(zhì):先對輸入數(shù)據(jù)進行處理,之后再利用計算公式計算。具體使得實現(xiàn)步驟為:
- 查找每個向量x的最大值c;
- 每個向量減去其最大值c, 得到向量y = x-c;
- 利用公式進行計算 s o f t m a x ( x ) = s o f t m a x ( x ? c ) = s o f t m a x ( y ) softmax(x) = softmax(x-c) = softmax(y) softmax(x)=softmax(x?c)=softmax(y)
import numpy as np
def softmax(x, axim=1):'''x: m*n m個樣本,n個分類輸出return s:m*n'''row_max = np.max(x, axis=axis) # 計算最大值row_max = row_max.reshape(-1, 1) # 將數(shù)據(jù)展開為m*1的形狀,方便使用廣播進行作差x = x - row_max # 減去最大值x_exp = np.exp(x) # 求exps = x_exp / np.sum(x_exp, axis=axis, keepdim=True) # 求softmaxreturn s