3.9 训练一个 Softmax 分类器-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
| 3.8 Softmax 回歸 | 回到目錄 | 3.10 深度學習框架 |
訓練一個 Softmax 分類器 (Training a Softmax Classifier)
上一個視頻中我們學習了Softmax層和Softmax激活函數,在這個視頻中,你將更深入地了解Softmax分類,并學習如何訓練一個使用了Softmax層的模型。
回憶一下我們之前舉的的例子,輸出層計算出的 z[l]z^{[l]}z[l] 如下, z[l]=[52?13]z^{[l]}=\left[\begin{matrix}5\\2\\-1\\3\end{matrix}\right]z[l]=?????52?13?????? 我們有四個分類 C=4C=4C=4 , z[l]z^{[l]}z[l] 可以是4×1維向量,我們計算了臨時變量 ttt , t=[e5e2e?1e3]t=\left[\begin{matrix}e^5\\e^2\\e^{-1}\\e^3\end{matrix}\right]t=?????e5e2e?1e3?????? ,對元素進行冪運算,最后,如果你的輸出層的激活函數 g(L)()g^{(L)}()g(L)() 是Softmax激活函數,那么輸出就會是這樣的:
簡單來說就是用臨時變量 ttt 將它歸一化,使總和為1,于是這就變成了 a[L]a^{[L]}a[L] ,你注意到向量 zzz 中,最大的元素是5,而最大的概率也就是第一種概率。
Softmax這個名稱的來源是與所謂hardmax對比,hardmax會把向量 zzz 變成這個向量 [1000]\left[\begin{matrix}1\\0\\0\\0\end{matrix}\right]?????1000?????? ,hardmax函數會觀察 zzz 的元素,然后在 zzz 中最大元素的位置放上1,其它位置放上0,所這是一個hard max,也就是最大的元素的輸出為1,其它的輸出都為0。與之相反,Softmax所做的從 zzz 到這些概率的映射更為溫和,我不知道這是不是一個好名字,但至少這就是softmax這一名稱背后所包含的想法,與hardmax正好相反。
有一點我沒有細講,但之前已經提到過的,就是Softmax回歸或Softmax激活函數將logistic激活函數推廣到 CCC 類,而不僅僅是兩類,結果就是如果 C=2C=2C=2 ,那么 C=2C=2C=2 的Softmax實際上變回了logistic回歸,我不會在這個視頻中給出證明,但是大致的證明思路是這樣的,如果 C=2C=2C=2 ,并且你應用了Softmax,那么輸出層 a[L]a^{[L]}a[L] 將會輸出兩個數字,如果 C=2C=2C=2 的話,也許輸出0.842和0.158,對吧?這兩個數字加起來要等于1,因為它們的和必須為1,其實它們是冗余的,也許你不需要計算兩個,而只需要計算其中一個,結果就是你最終計算那個數字的方式又回到了logistic回歸計算單個輸出的方式。這算不上是一個證明,但我們可以從中得出結論,Softmax回歸將logistic回歸推廣到了兩種分類以上。
接下來我們來看怎樣訓練帶有Softmax輸出層的神經網絡,具體而言,我們先定義訓練神經網絡使會用到的損失函數。舉個例子,我們來看看訓練集中某個樣本的目標輸出,真實標簽是 [0100]\left[\begin{matrix}0\\1\\0\\0\end{matrix}\right]?????0100?????? ,用上一個視頻中講到過的例子,這表示這是一張貓的圖片,因為它屬于類1,現在我們假設你的神經網絡輸出的是 y^\hat{y}y^? , y^\hat{y}y^? 是一個包括總和為1的概率的向量, y=[0.30.20.10.4]y=\left[\begin{matrix}0.3\\0.2\\0.1\\0.4\end{matrix}\right]y=?????0.30.20.10.4?????? ,你可以看到總和為1,這就是 a[l]a^{[l]}a[l] , a[l]=y=[0.30.20.10.4]a^{[l]}=y=\left[\begin{matrix}0.3\\0.2\\0.1\\0.4\end{matrix}\right]a[l]=y=?????0.30.20.10.4?????? 。對于這個樣本神經網絡的表現不佳,這實際上是一只貓,但卻只分配到20%是貓的概率,所以在本例中表現不佳。
那么你想用什么損失函數來訓練這個神經網絡?在Softmax分類中,我們一般用到的損失函數是 L(y^,y)=?∑j=14yjlog?y^jL(\hat{y},y)=-\sum_{j=1}^4y_j\log\hat{y}_jL(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_jyj? 的項都等于0,最后只剩下 ?y2tlog?y^2-y_2t\log\hat{y}_2?y2?tlogy^?2? ,因為當你按照下標 jjj 全部加起來,所有的項都為0,除了 j=2j=2j=2 時,又因為 y2=1y_2=1y2?=1 ,所以它就等于 ?log?y^2-\log\hat{y}_2?logy^?2? 。 L(y^,y)=?∑j=14yjlog?y^j=?y2log?y^2=?log?y^2L(\hat{y},y)=-\sum_{j=1}^4y_j\log\hat{y}_j=-y_2\log\hat{y}_2=-\log\hat{y}_2L(y^?,y)=?∑j=14?yj?logy^?j?=?y2?logy^?2?=?logy^?2?
這就意味著,如果你的學習算法試圖將它變小,因為梯度下降法是用來減少訓練集的損失的,要使它變小的唯一方式就是使 ?log?y^2-\log\hat{y}_2?logy^?2? 變小,要想做到這一點,就需要使 y^2\hat{y}_2y^?2? 盡可能大,因為這些是概率,所以不可能比1大,但這的確也講得通,因為在這個例子 xxx 中是貓的圖片,你就需要這項輸出的概率盡可能地大( y=[0.30.20.10.4]y=\left[\begin{matrix}0.3\\0.2\\0.1\\0.4\end{matrix}\right]y=?????0.30.20.10.4?????? 中第二個元素)。
概括來講,損失函數所做的就是它找到你的訓練集中的真實類別,然后試圖使該類別相應的概率盡可能地高,如果你熟悉統計學中最大似然估計,這其實就是最大似然估計的一種形式。但如果你不知道那是什么意思,也不用擔心,用我們剛剛講過的算法思維也足夠了。
這是單個訓練樣本的損失,整個訓練集的損失 JJJ 又如何呢?也就是設定參數的代價之類的,還有各種形式的偏差的代價,它的定義你大致也能猜到,就是整個訓練集損失的總和,把你的訓練算法對所有訓練樣本的預測都加起來, J(w[1],b[1],?)=1m∑i=1mL(y^(i),y(i))J(w^{[1]},b^{[1]},\cdots)=\frac1m\sum_{i=1}^mL(\hat{y}^{(i)},y^{(i)})J(w[1],b[1],?)=m1?∑i=1m?L(y^?(i),y(i))
因此你要做的就是用梯度下降法,使這里的損失最小化。
最后還有一個實現細節,注意因為 C=4C=4C=4 , yyy 是一個4×1向量, yyy 也是一個4×1向量,如果你實現向量化,矩陣大寫 YYY 就是 [y(1)y(2)??y(m)]\left[\begin{matrix}y^{(1)}y^{(2)}\cdots\cdots y^{(m)}\end{matrix}\right][y(1)y(2)??y(m)?] ,例如如果上面這個樣本是你的第一個訓練樣本,那么矩陣 Y=[001?100?010?000?]Y=\left[\begin{matrix}0&0&1&\cdots\\1&0&0&\cdots\\0&1&0&\cdots\\0&0&0&\cdots\end{matrix}\right]Y=?????0100?0010?1000??????????? ,那么這個矩陣 YYY 最終就是一個 4?m4*m4?m 維矩陣。類似的, Y^=[y^(1)y^(2)??y^(m)]\hat{Y}=\left[\begin{matrix}\hat{y}^{(1)}\hat{y}^{(2)}\cdots\cdots \hat{y}^{(m)}\end{matrix}\right]Y^=[y^?(1)y^?(2)??y^?(m)?] ,這個其實就是 y^(1)(a[l](1)=y(1)=[0.30.20.10.4])\hat{y}^{(1)}(a^{[l](1)}=y^{(1)}=\left[\begin{matrix}0.3\\0.2\\0.1\\0.4\end{matrix}\right])y^?(1)(a[l](1)=y(1)=?????0.30.20.10.4??????) ,或是第一個訓練樣本的輸出,那么 Y^=[0.3?0.2?0.1?0.4?]\hat{Y}=\left[\begin{matrix}0.3&\cdots\\0.2&\cdots\\0.1&\cdots\\0.4&\cdots\end{matrix}\right]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 ,然后又能由此計算出損失。我們已經講了如何實現神經網絡前向傳播的步驟,來得到這些輸出,并計算損失,那么反向傳播步驟或者梯度下降法又如何呢?其實初始化反向傳播所需要的關鍵步驟或者說關鍵方程是這個表達式 dz[l]=y^?ydz^{[l]}=\hat{y}-ydz[l]=y^??y ,你可以用 y^\hat{y}y^? 這個4×1向量減去 yyy 這個4×1向量,你可以看到這些都會是4×1向量,當你有4個分類時,在一般情況下就是 C?1C*1C?1 ,這符合我們對 dzdzdz 的一般定義,這是對 z[l]z^{[l]}z[l] 損失函數的偏導數( dz[l]=?J?z[l]dz^{[l]}=\frac{\partial J}{\partial z^{[l]}}dz[l]=?z[l]?J? ),如果你精通微積分就可以自己推導,或者說如果你精通微積分,可以試著自己推導,但如果你需要從零開始使用這個公式,它也一樣有用。
有了這個,你就可以計算 dz[l]dz^{[l]}dz[l] ,然后開始反向傳播的過程,計算整個神經網絡中所需要的所有導數。
但在這周的初級練習中,我們將開始使用一種深度學習編程框架,對于這些編程框架,通常你只需要專注于把前向傳播做對,只要你將它指明為編程框架,前向傳播,它自己會弄明白怎樣反向傳播,會幫你實現反向傳播,所以這個表達式值得牢記( dz[l]=y^?ydz^{[l]}=\hat{y}-ydz[l]=y^??y ),如果你需要從頭開始,實現Softmax回歸或者Softmax分類,但其實在這周的初級練習中你不會用到它,因為編程框架會幫你搞定導數計算。
Softmax分類就講到這里,有了它,你就可以運用學習算法將輸入分成不止兩類,而是 CCC 個不同類別。接下來我想向你展示一些深度學習編程框架,可以讓你在實現深度學習算法時更加高效,讓我們在下一個視頻中一起討論。
課程PPT
| 3.8 Softmax 回歸 | 回到目錄 | 3.10 深度學習框架 |
總結
以上是生活随笔為你收集整理的3.9 训练一个 Softmax 分类器-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.8 Softmax 回归-深度学习第
- 下一篇: 3.10 深度学习框架-深度学习第二课《