Softmax函數(shù)原理及Python實(shí)現(xiàn)過程解析
Softmax原理
Softmax函數(shù)用于將分類結(jié)果歸一化,形成一個(gè)概率分布。作用類似于二分類中的Sigmoid函數(shù)。
對(duì)于一個(gè)k維向量z,我們想把這個(gè)結(jié)果轉(zhuǎn)換為一個(gè)k個(gè)類別的概率分布p(z)。softmax可以用于實(shí)現(xiàn)上述結(jié)果,具體計(jì)算公式為:

對(duì)于k維向量z來(lái)說,其中zi∈R,我們使用指數(shù)函數(shù)變換可以將元素的取值范圍變換到(0,+∞),之后我們?cè)偎性厍蠛蛯⒔Y(jié)果縮放到[0,1],形成概率分布。
常見的其他歸一化方法,如max-min、z-score方法并不能保證各個(gè)元素為正,且和為1。
Softmax性質(zhì)
輸入向量x加上一個(gè)常數(shù)c后求softmax結(jié)算結(jié)果不變,即:

我們使用softmax(x)的第i個(gè)元素的計(jì)算來(lái)進(jìn)行證明:

函數(shù)實(shí)現(xiàn)
由于指數(shù)函數(shù)的放大作用過于明顯,如果直接使用softmax計(jì)算公式

進(jìn)行函數(shù)實(shí)現(xiàn),容易導(dǎo)致數(shù)據(jù)溢出(上溢)。所以我們?cè)诤瘮?shù)實(shí)現(xiàn)時(shí)利用其性質(zhì):先對(duì)輸入數(shù)據(jù)進(jìn)行處理,之后再利用計(jì)算公式計(jì)算。具體使得實(shí)現(xiàn)步驟為:
查找每個(gè)向量x的最大值c; 每個(gè)向量減去其最大值c, 得到向量y = x-c; 利用公式進(jìn)行計(jì)算,softmax(x) = softmax(x-c) = softmax(y)代碼如下:
import numpy as npdef softmax(x): ''' softmax函數(shù)實(shí)現(xiàn) 參數(shù): x --- 一個(gè)二維矩陣, m * n,其中m表示向量個(gè)數(shù),n表示向量維度 返回: softmax計(jì)算結(jié)果 ''' assert(len(X.shape) == 2) row_max = np.max(X, axis=axis).reshape(-1, 1) X -= row_max X_exp = np.exp(X) s = X_exp / np.sum(X_exp, axis=axis, keepdims=True) return s
測(cè)試一下:
a = [[1,2,3],[-1,-2,-3]]b = [[1,2,3]]c = [1,2,3]a = np.array(a)b = np.array(b)c = np.array(c)
print(softmax(a))print(softmax(b))print(softmax(c)) # error
輸出結(jié)果為:
[[ 0.09003057 0.24472847 0.66524096][ 0.66524096 0.24472847 0.09003057]][[ 0.09003057 0.24472847 0.66524096]]Traceback (most recent call last):assert(len(X.shape) == 2)AssertionError
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. 詳解Android studio 動(dòng)態(tài)fragment的用法2. 解決Android studio xml界面無(wú)法預(yù)覽問題3. Android如何加載Base64編碼格式圖片4. 圖文詳解vue中proto文件的函數(shù)調(diào)用5. 基于android studio的layout的xml文件的創(chuàng)建方式6. 什么是python的自省7. Spring Boot和Thymeleaf整合結(jié)合JPA實(shí)現(xiàn)分頁(yè)效果(實(shí)例代碼)8. Vuex localStorage的具體使用9. 使用Android studio查看Kotlin的字節(jié)碼教程10. Vue封裝一個(gè)TodoList的案例與瀏覽器本地緩存的應(yīng)用實(shí)現(xiàn)

網(wǎng)公網(wǎng)安備