深度学习入门笔记(十四):Softmax
歡迎關注WX公眾號:【程序員管小亮】
專欄——深度學習入門筆記
聲明
1)該文章整理自網上的大牛和機器學習專家無私奉獻的資料,具體引用的資料請看參考文獻。
2)本文僅供學術交流,非商用。所以每一部分具體的參考資料并沒有詳細對應。如果某部分不小心侵犯了大家的利益,還望海涵,并聯系博主刪除。
3)博主才疏學淺,文中如有不當之處,請各位指出,共同進步,謝謝。
4)此屬于第一版本,若有錯誤,還需繼續修正與增刪。還望大家多多指點。大家都共享一點點,一起為祖國科研的推進添磚加瓦。
文章目錄
- 歡迎關注WX公眾號:【程序員管小亮】
- 專欄——深度學習入門筆記
- 聲明
- 深度學習入門筆記(十四):Softmax
- 1、Softmax 回歸
- 2、訓練一個 Softmax 分類器
- 推薦閱讀
- 參考文章
深度學習入門筆記(十四):Softmax
1、Softmax 回歸
- 如果是二分分類的話,只有兩種可能的標記——0或1,如果是貓咪識別例子,答案就是:這是一只貓或者不是一只貓;
- 如果有多種可能的類型的話呢?有一種 logistic 回歸的一般形式,叫做 Softmax 回歸,能在試圖識別某一分類時做出預測,或者說是多種分類中的一個,不只是識別兩個分類,一起看一下。
假設不單單需要識別貓,而是想識別貓,狗和小雞,其中把貓稱為類1,狗為類2,小雞是類3,如果不屬于以上任何一類,就分到“其它”或者說“以上均不符合”這一類,把它稱為類0。
這里顯示的圖片及其對應的分類就是一個例子,這幅圖片上是一只小雞,所以是類3,貓是類1,狗是類2,如果猜測是一只考拉,那就是類0,下一個小雞,類3,以此類推。假設用符號大寫的 CCC 來表示輸入會被分的類別總個數,那么在這個例子中,共有4種可能的類別,包括貓、狗、小雞,還有“其它”或“以上均不符合”這一類。當有這4個分類時,指示類別的數字就是從0到 C?1C-1C?1,換句話說就是0、1、2、3。
如果在這個例子中想要建立一個神經網絡,那么其輸出層需要有4個,或者說 CCC 個輸出單元,如圖:
我們想要輸出層單元通過數字的方式,告訴我們這4種類型中判別為每個類別的概率有多大,所以這里的:
- 第一個節點輸出的應該是或者說希望它輸出“其它”類的概率;
- 第二個節點輸出的應該是或者說希望它輸出貓的概率;
- 第三個節點輸出的應該是或者說希望它輸出狗的概率;
- 第四個節點輸出的應該是或者說希望它輸出小雞的概率;
因此這里的輸出 y^\hat yy^? 將是一個 4×14×14×1 維向量,它必須輸出四個數字,代表四種概率,并且輸出中的四個數字加起來應該等于1才對。如果想讓網絡做到這一點,那么需要用到的標準模型是 Softmax 層,以及輸出層來生成輸出。
在神經網絡的最后一層,z[l]z^{[l]}z[l] 是最后一層的 zzz 變量,計算方法是:
z[l]=W[l]a[L?1]+b[l]z^{[l]} = W^{[l]}a^{[L-1]} + b^{[l]}z[l]=W[l]a[L?1]+b[l]
算出了 zzz 之后就需要應用 Softmax 激活函數了,這個激活函數對于 Softmax 層而言是有些不同,它的作用是這樣的:
- 首先,計算一個臨時變量 t=ez[l]t=e^{z^{[l]}}t=ez[l],這適用于每個元素,而這里的 z[l]z^{[l]}z[l],在我們的例子中,z[l]z^{[l]}z[l] 是4×1的,四維向量 t=ez[l]t=e^{z^{[l]}}t=ez[l],這是對所有元素求冪;
- 然后計算輸出的 a[l]a^{[l]}a[l],基本上就是向量 ttt,但是要做歸一化,使和為1,計算公式 a[l]=ti∑j=14ti=ez[l]∑j=14tia^{[l]} = \frac{t_{i}}{\sum_{j =1}^{4}t_{i}} = \frac{e^{z^{[l]}}}{\sum_{j =1}^{4}t_{i}}a[l]=∑j=14?ti?ti??=∑j=14?ti?ez[l]?。
你可能不是很懂這個意思,別擔心,來看一個例子,詳細解釋一下上面的公式。
假設算出了z[l]z^{[l]}z[l],z[l]=[52?13]z^{[l]} = \begin{bmatrix} 5 \\ 2 \\ - 1 \\ 3 \\ \end{bmatrix}z[l]=?????52?13??????,我們要做的就是用上面的方法來計算 ttt,所以 t=[e5e2e?1e3]t =\begin{bmatrix} e^{5} \\ e^{2} \\ e^{- 1} \\ e^{3} \\ \end{bmatrix}t=?????e5e2e?1e3??????,當然如果按一下計算器的話,就會得到以下值 t=[148.47.40.420.1]t = \begin{bmatrix} 148.4 \\ 7.4 \\ 0.4 \\ 20.1 \\ \end{bmatrix}t=?????148.47.40.420.1??????。對向量 ttt 歸一化就能得到向量 a[l]a^{[l]}a[l],方法是把 ttt 的元素都加起來,得到176.3,計算公式是 a[l]=t176.3a^{[l]} = \frac{t} {176.3}a[l]=176.3t?,即可得:
- 第一個節點,輸出 e5176.3=0.842\frac{e^{5}}{176.3} =0.842176.3e5?=0.842,這意味著,這張圖片是類0的概率就是84.2%。
- 第二個節點,輸出 e2176.3=0.042\frac{e^{2}}{176.3} =0.042176.3e2?=0.042,這意味著,這張圖片是類1的概率就是4.2%。
- 第三個節點,輸出 e?1176.3=0.002\frac{e^{- 1}}{176.3} =0.002176.3e?1?=0.002,這意味著,這張圖片是類2的概率就是0.2%。
- 最后一個節點,輸出 e3176.3=0.114\frac{e^{3}}{176.3} =0.114176.3e3?=0.114,也就是這張圖片是類3的概率就是11.4%,也就是小雞組,對吧?
這就是它屬于類0,類1,類2,類3的可能性。
神經網絡的輸出 a[l]a^{[l]}a[l],也就是 y^\hat yy^?,是一個4×1維向量,就是算出來的這四個數字([0.8420.0420.0020.114]\begin{bmatrix} 0.842 \\ 0.042 \\ 0.002 \\ 0.114 \\ \end{bmatrix}?????0.8420.0420.0020.114??????),所以這種算法通過向量z[l]z^{[l]}z[l]計算出總和為1的四個概率。
Softmax 分類器還可以代表其它的什么東西么?
舉幾個例子,假設有兩個輸入 x1x_{1}x1?,x2x_{2}x2?,它們直接輸入到 Softmax 層,有三四個或者更多的輸出節點,輸出 y^\hat yy^?。如果是一個沒有隱藏層的神經網絡,就是計算 z[1]=W[1]x+b[1]z^{[1]} = W^{[1]}x + b^{[1]}z[1]=W[1]x+b[1],而輸出的 a[l]a^{[l]}a[l],或者說 y^\hat yy^?,a[l]=y=g(z[1])a^{[l]} = y = g(z^{[1]})a[l]=y=g(z[1]),就是 z[1]z^{[1]}z[1] 的 Softmax 激活函數。
這個例子中(左邊圖),原始輸入只有 x1x_{1}x1? 和 x2x_{2}x2?,一個 C=3C=3C=3 個輸出分類的 Softmax 層能夠代表這種類型的決策邊界,請注意這是幾條線性決策邊界,但這使得它能夠將數據分到3個類別中。在這張圖表中,我們所做的是選擇這張圖中顯示的訓練集,用數據的3種輸出標簽來訓練 Softmax 分類器,圖中的顏色顯示了 Softmax 分類器的輸出閾值,輸入的著色是基于三種輸出中概率最高的那種。因此可以看到這是 logistic 回歸的一般形式,有類似線性的決策邊界,但有超過兩個分類,分類不只有0和1,而是可以是0,1或2。中間圖是另一個 Softmax 分類器可以代表的決策邊界的例子,用有三個分類的數據集來訓練,還有右邊圖也是。
但是直覺告訴我們,任何兩個分類之間的決策邊界都是線性的,這就是為什么可以看到,比如黃色和紅色分類之間的決策邊界是線性邊界,紫色和紅色之間的也是線性邊界,紫色和黃色之間的也是線性決策邊界,但它能用這些不同的線性函數來把空間分成三類。
我們來看一下更多分類的例子:
這個例子中(左邊圖)C=4C=4C=4,因此這個綠色分類和 Softmax 仍舊可以代表多種分類之間的這些類型的線性決策邊界。另一個例子(中間圖)是 C=5C=5C=5 類,最后一個例子(右邊圖)是 C=6C=6C=6,這顯示了 Softmax 分類器在沒有隱藏層的情況下能夠做到的事情,當然更深的神經網絡會有 xxx,然后是一些隱藏單元,以及更多隱藏單元等等,因此可以學習更復雜的非線性決策邊界,來區分多種不同分類。
2、訓練一個 Softmax 分類器
如何學習訓練一個使用了 Softmax 層的模型?
回憶之前舉的的例子,輸出層計算出的 z[l]z^{[l]}z[l] 如下,z[l]=[52?13]z^{[l]} = \begin{bmatrix} 5 \\ 2 \\ - 1 \\ 3 \\ \end{bmatrix}z[l]=?????52?13??????,輸出層的激活函數 g[L]()g^{[L]}()g[L]() 是 Softmax 激活函數,那么輸出就會是這樣的:
簡單來說就是歸一化,使總和為1,注意到向量 zzz 中,最大的元素是5,而最大的概率也就是第一種概率,為啥會這樣?
這要從頭講起,Softmax 這個名稱的來源是與所謂 hardmax 對比,hardmax 會把向量 zzz 變成這個向量 [1000]\begin{bmatrix} 1 \\ 0 \\ 0 \\ 0 \\ \end{bmatrix}?????1000??????,hardmax 函數會觀察 zzz 的元素,然后在 zzz 中最大元素的位置放上1,其它位置放上0。
與之相反,Softmax 所做的從 zzz 到這些概率的映射更為溫和,不知道這是不是一個好名字,但至少這就是 softmax 這一名稱背后所包含的想法,與 hardmax 正好相反。
有一點沒有細講,但之前已經提到過的,就是 Softmax 回歸或 Softmax 激活函數將 logistic 激活函數推廣到 CCC 類,而不僅僅是兩類,如果 C=2C=2C=2,那么 Softmax 變回了 logistic 回歸。
接下來看怎樣訓練帶有 Softmax 輸出層的神經網絡,具體而言,先定義訓練神經網絡使會用到的損失函數。舉個例子,看看訓練集中某個樣本的目標輸出,真實標簽是 [0100]\begin{bmatrix} 0 \\ 1 \\ 0 \\ 0 \\ \end{bmatrix}?????0100??????,這表示這是一張貓的圖片,因為它屬于類1,現在假設神經網絡輸出的是 y^\hat yy^?,y^\hat yy^? 是一個包括總和為1的概率的向量,y=[0.30.20.10.4]y = \begin{bmatrix} 0.3 \\ 0.2 \\ 0.1 \\ 0.4 \\ \end{bmatrix}y=?????0.30.20.10.4??????,總和為1,這就是 a[l]a^{[l]}a[l],a[l]=y=[0.30.20.10.4]a^{[l]} = y = \begin{bmatrix} 0.3 \\ 0.2 \\ 0.1 \\ 0.4 \\ \end{bmatrix}a[l]=y=?????0.30.20.10.4??????。所以你可以明顯看到對這個樣本來說神經網絡的表現不佳,這實際上是一只貓,但是貓的概率卻只有20%。
那么用什么損失函數來訓練這個神經網絡?
在 Softmax 分類中,一般用到的損失函數是 L(y^,y)=?∑j=14yjlogy^jL(\hat y,y ) = - \sum_{j = 1}^{4}{y_{j}log\hat y_{j}}L(y^?,y)=?∑j=14?yj?logy^?j?,現在用上面的樣本來驗證一下,方便更好地理解整個過程。注意在這個樣本中 y1=y3=y4=0y_{1} =y_{3} = y_{4} = 0y1?=y3?=y4?=0,因為這些都是0,只有 y2=1y_{2} =1y2?=1,所以如果看這個求和,所有含有值為0的 yjy_{j}yj? 的項都等于0,最后只剩下 ?y2tlogy^2-y_{2}t{log}\hat y_{2}?y2?tlogy^?2?,因為當按照下標 jjj 全部加起來,所有的項都為0,除了 j=2j=2j=2 時,又因為 y2=1y_{2}=1y2?=1,所以它就等于 ?logy^2- \ log\hat y_{2}??logy^?2?。即:
L(y^,y)=?∑j=14yjlog?y^j=?y2logy^2=?logy^2L\left( \hat y,y \right) = - \sum_{j = 1}^{4}{y_{j}\log \hat y_{j}} = - y_{2}{\ log} \hat y_{2} = - {\ log} \hat y_{2}L(y^?,y)=?j=1∑4?yj?logy^?j?=?y2??logy^?2?=??logy^?2?
這就意味著,如果學習算法試圖將損失函數變小,就是使 ?log?y^2-{\log}\hat y_{2}?logy^?2? 變小,要想做到這一點,就需要使 y^2\hat y_{2}y^?2? 盡可能大,logloglog 函數雖然是遞增的,但是 ?log-log?log 函數是遞減的,這就講得通了。又因為在這個例子中 xxx 是貓的圖片,就需要貓這項輸出的概率盡可能地大(y=[0.30.20.10.4]y= \begin{bmatrix} 0.3 \\ 0.2 \\ 0.1 \\ 0.4 \\ \end{bmatrix}y=?????0.30.20.10.4?????? 中第二個元素)。
概括一下,損失函數所做的就是找到訓練集中的真實類別,然后試圖使該類別相應的概率盡可能地高,如果你熟悉統計學中最大似然估計,這其實就是最大似然估計的一種形式。但如果你不知道那是什么意思,也不用擔心,用剛講過的算法思維也足夠理解了。
上面所講的,是單個訓練樣本的損失,那么整個訓練集的損失 JJJ 又如何呢?也就是設定參數的代價之類的,還有各種形式偏差的代價,還是和之前講過的一樣,你大致也能猜到,就是整個訓練集損失的總和,把訓練算法對所有訓練樣本的預測都加起來:
J(w[1],b[1],……)=1m∑i=1mL(y^(i),y(i))J( w^{[1]},b^{[1]},\ldots\ldots) = \frac{1}{m}\sum_{i = 1}^{m}{L( \hat y^{(i)},y^{(i)})}J(w[1],b[1],……)=m1?i=1∑m?L(y^?(i),y(i))
因此用梯度下降法,使損失最小化。
最后還有一個實現細節,注意!因為 C=4C=4C=4,yyy 是一個4×1向量,如果向量化,矩陣大寫 YYY 就是 [y(1)y(2)……y(m)]\lbrack y^{(1)}\text{}y^{(2)}\ldots\ldots\ y^{\left( m \right)}\rbrack[y(1)y(2)……?y(m)],舉個例子,如果上面的樣本是第一個訓練樣本,那么矩陣 Y=[001…100…010…000…]Y =\begin{bmatrix} 0 & 0 & 1 & \ldots \\ 1 & 0 & 0 & \ldots \\ 0 & 1 & 0 & \ldots \\ 0 & 0 & 0 & \ldots \\ \end{bmatrix}Y=?????0100?0010?1000?…………??????,那么這個矩陣 YYY 最終就是一個 4×m4×m4×m 維矩陣。
類似的,Y^=[y^(1)y^(2)……y^(m)]\hat{Y} = \lbrack{\hat{y}}^{(1)}{\hat{y}}^{(2)} \ldots \ldots\ {\hat{y}}^{(m)}\rbrackY^=[y^?(1)y^?(2)……?y^?(m)],其實就是 y^(1){\hat{y}}^{(1)}y^?(1)(a[l](1)=y(1)=[0.30.20.10.4]a^{[l](1)} = y^{(1)} = \begin{bmatrix} 0.3 \\ 0.2 \\ 0.1 \\ 0.4 \\ \end{bmatrix}a[l](1)=y(1)=?????0.30.20.10.4??????),那么 Y^=[0.3…0.2…0.1…0.4…]\hat{Y} = \begin{bmatrix} 0.3 & \ldots \\ 0.2 & \ldots \\ 0.1 & \ldots \\ 0.4 & \ldots \\ \end{bmatrix}Y^=?????0.30.20.10.4?…………??????,Y^\hat{Y}Y^ 本身也是一個 4×m4×m4×m 維矩陣。
最后還是來看一下,在有 Softmax 輸出層時,如何實現梯度下降法,這個輸出層會計算 z[l]z^{[l]}z[l],它是 C×1C×1C×1 維的,在上面的例子中是4×1,然后用 Softmax 激活函數來得到 a[l]a^{[l]}a[l] 或者說 yyy,然后又能由此計算出損失。具體操作還是和之前見過的反向傳播一樣,不懂或者忘記的同學可以去查閱一下前面的筆記。
關于具體如何實現這個函數,下次課會開始使用一種深度學習編程框架,對于這些編程框架,通常只需要專注于把前向傳播做對即可,編程框架它自己會弄明白怎樣反向傳播,這也是為什么很多人被稱為調包俠的原因,因為編程框架會幫你搞定導數計算。
給一個 Python 實現 softmax 的小例子,理解理解公式:
# softmax函數,將線性回歸值轉化為概率的激活函數。 # 輸入s要是行向量 def softmax(s):return np.exp(s) / np.sum(np.exp(s), axis=1)推薦閱讀
- 深度學習入門筆記(一):深度學習引言
- 深度學習入門筆記(二):神經網絡基礎
- 深度學習入門筆記(三):求導和計算圖
- 深度學習入門筆記(四):向量化
- 深度學習入門筆記(五):神經網絡的編程基礎
- 深度學習入門筆記(六):淺層神經網絡
- 深度學習入門筆記(七):深層神經網絡
- 深度學習入門筆記(八):深層網絡的原理
- 深度學習入門筆記(九):深度學習數據處理
- 深度學習入門筆記(十):正則化
- 深度學習入門筆記(十一):權重初始化
- 深度學習入門筆記(十二):深度學習數據讀取
- 深度學習入門筆記(十三):批歸一化(Batch Normalization)
- 深度學習入門筆記(十四):Softmax
- 深度學習入門筆記(十五):深度學習框架(TensorFlow和Pytorch之爭)
- 深度學習入門筆記(十六):計算機視覺之邊緣檢測
- 深度學習入門筆記(十七):深度學習的極限在哪?
- 深度學習入門筆記(十八):卷積神經網絡(一)
- 深度學習入門筆記(十九):卷積神經網絡(二)
- 深度學習入門筆記(二十):經典神經網絡(LeNet-5、AlexNet和VGGNet)
參考文章
- 吳恩達——《神經網絡和深度學習》視頻課程
總結
以上是生活随笔為你收集整理的深度学习入门笔记(十四):Softmax的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英语初级语法--句子成分(词性)(名词)
- 下一篇: iframe 接班人-微前端框架 qia