深度學習筆記(一):logistic分類
深度學習筆記(二):簡單神經網絡,後向傳播算法及實現
深度學習筆記(三):激活函數和損失函數
深度學習筆記:優化方法總結(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
深度學習筆記(四):循環神經網絡的概念,結構和代碼註釋
深度學習筆記(五):LSTM
深度學習筆記(六):Encoder-Decoder模型和Attention模型
這個系列主要記錄我在學習各個深度學習算法時候的筆記,因爲之前已經學過大概的概念,所以這輪學習比較着重於公式推導和具體實現,而對概念上的描述不多,因此比較適合對此有一定基礎的同學。
在正式開始寫深度學習的知識之前,會有兩節傳統神經網絡的內容,因爲深度學習中大量運用了以往神經網絡的知識。搞懂傳統的神經網絡如何工作是很有必要的,有助於對之後的學習打下堅實的基礎。
1. logistic分類
幾乎所有的教材都是從logistic分類開始的,因爲logistic分類實在太經典,而且是神經網絡的基本組成部分,每個神經元(cell)都可以看做是進行了一次logistic分類。
所謂logistic分類,顧名思義,邏輯分類,是一種二分類法,能將數據分成0和1兩類。
logistic分類的流程比較簡單,主要有線性求和,sigmoid函數激活,計算誤差,修正參數這4個步驟。前兩部用於判斷,後兩步用於修正。本文分爲3部分,前2部分講普通logistic分類的流程,第三部分則稍作擴展。
1.1 線性求和以及sigmoid函數
第1,2步是用於根據輸入來判斷分類的,所以放在一起說。假設有一個n維的輸入列向量
此時因爲z的值域是
其形狀爲
圖1 sigmoid函數
可以看到x越大,
當 a 大於0.5的時候,我們判定x應屬於1類,如果小於0.5,則屬於0類。這樣,就完成了判斷的工作
1.2 誤差計算以及參數修正
上面完成的判斷過程中用到了參數向量h和偏置量b。 可以說,h和b的值直接關係到logistic判斷的準確性。那麼這兩組參數是如何獲得的呢?這就涉及到了參數的修正。在最開始的時候,h中的值是隨機的,而b的值是0. 我們通過不斷的訓練來使得h和b能夠儘可能的達到一個較優的值。
那麼如何訓練呢?假設我們期望輸入x的判定是y,而實際得到的判定值是a,那麼我們定義一個損失函數C(a,y),通過修正h和b的值來使得C最小化,這是一個優化問題。在凸優化問題中,可以通過
來直接算得h和b的最優解。然而在某些情況下,例如數據規模很大,或者非凸優化問題中,則不能這麼做,而是用迭代的方法來得到局部最優解。
其中
這樣,就能夠得到每次迭代的參數更新公式爲
1.3 將logistic擴展到多分類
從之前可以看出,普通的logistic只能進行二分類,即只能夠分爲0或者1。那麼如果這些樣本屬於多個類該怎麼辦呢?人們想了很多辦法,例如一對多法,依次把某個類別的樣本歸爲一類,其他剩餘的樣本歸爲另一類,這樣k個類需要構建k個分類器。還有一對一法,在任意兩類樣本之間設計一個分類器,k個類需要k(k-1)/2個分類器。
在這裏,我們將輸出由一個值更改爲一個向量。例如有3個類,那麼輸出就是一個長度爲3 的列向量,對應項的值爲1,其他爲0.即
分別表示第0,1,2個類。 也可以看成是原來若干個logistic分類器組合在一起。對應的某個分類器只對該類輸出1,其他情況都輸出0.從這一點上來講,這個做法有點類似於一對多法。此時,由於輸出從一個數成爲一個向量,之前的公式都要加以修改。首先,原來的y,a,z,b變成了列向量, 向量
此時的
得到的a向量中,其最大值所在的位置索引即爲判斷出的分類。
參數修正部分的公式也是類似的,
注意有些向量之間是進行點乘的。