開始斷斷續續看吳恩達老師的深度學習課程一段時間了,學習完了第一部分,不管是看視頻還是做課後練習都讓我有瘋狂吹一下這個課程的衝動,是真的講的很好啊!!
看完也想着自己慢慢總結一下加深理解,嗯,希望我不是下一個從入門到放棄的案例
單神經元(感知機)
感知機聽着高大上一點,但是單神經元還是通俗易懂,就是字面意思一個神經元,這個概念來源於生物學,當一個神經元受到刺激信號(輸入),自身的電位就會發生變化,如果這個電位超過了某個閾值,它就會興奮起來並向其他神經元傳遞刺激信號(輸出),將這個生物過程數學化就得到了以下模型:
其中 w 表示輸入到神經元的連接的權重,b 表示閾值,f 表示激活函數,輸出 y可以由下式得到 y=f(i=0∑nwixi+b) n爲輸入神經元的個數,對於上圖 n=3。上式就是一個神經元的輸入–輸出機制。
激活函數 f 常用的有 sigmoid, tanh和ReLU。Logistic迴歸使用的就是sigmoid函數。
Logistic迴歸解決二分類問題
簡單來說,分類問題可以表示爲給定一個特徵向量,分類器得出這組特徵對應的標籤,對於二分類問題就是輸出0或1。如果將輸入特徵和權重向量化,則分類問題可以表示爲這樣的一個映射關係(就是上面感知機的輸入輸出關係啊!):wTx+b⟶y^ 其中w∈Rn, x∈Rn, n爲輸入特徵的數量。輸出y^=p(y=1∣x),表示分類到1的概率,因此y^∈[0,1]。
那麼爲什麼不用線性函數來進行分類,直接讓 y^=wTx+b ?顯然這樣計算會導致 y^ 的值無限增大,不滿足y^∈[0,1] 這個條件。
上面提到Logistic迴歸使用了sigmoid函數,首先看看sigmoid函數的表達式:σ(x)=1+e−x1 從表達式就可以看出sigmoid函數的函數值是一個小於等於1的正數,從函數圖像能夠更直觀地看到這一點:
可以看出曲線從0平滑增長到1,所以可以很好地滿足二分類任務的需求。這樣對於Logistic迴歸y^=σ(wTx+b)接下來就是怎麼訓練出一個Logistic迴歸分類器。訓練這個分類器的過程實質上就是根據給定的樣本的特徵和標籤(所以這是一個有監督的學習任務)來學習出感知機的權重和閾值參數。
爲了訓練出一個Logistic迴歸分類器,首先需要定義損失函數,進而通過梯度下降的方式優化這個損失函數得到最優的權重和閾值。直觀上來講,最簡單的損失函數就是計算分類器的輸出值y^ 和真實值之間的誤差 error=21(y^−y)2,但這樣做的問題是error函數是非凸的,存在多個局部最優解,因此在使用梯度下降法可能會陷入局部最優解而無法找到全局最優解。所以在Logistic迴歸中損失函數用另一個函數來替代 L(y,y^)=−(ylogy^+(1−y)log(1−y^)) 這個函數有一個很好的特性就是它是一個凸函數,也就是說我們可以使用梯度下降的方法很好地去逼近它的全局最優。
上面的損失函數是對於單個樣本的,對於一次訓練的多個樣本需要對損失函數進行求和得到總的損失,進而求得使的這個總的損失最小的 w 和 b 。即
minJ(w,b)=m1i=1∑mL(y(i),y^(i))=−m1i=1∑my(1)logy^(i)+(1−y(i))log(1−y^(i)) 式中 m爲樣本數量。在得到總的損失之後,就可以通過梯度下降的方式不斷地更新 w 和b,也就是重複以下過程,直到找到全局最優解(或是一個理想的解)w=w−αdwdJ(w,b) b=b−αdbdJ(w,b) 其中α表示學習率(通常是一個正值),通俗地說就是梯度下降的步長。
可以以一個一維 y=f(x) 凸函數爲例來簡單理解一下梯度下降法的原理。
如圖最優解對應 x∗,假設初始解爲 x0,顯然此時梯度 dxdy<0,則根據梯度下降的參數更新方式 x=x−αdxdy 知 x 會增大,假定第一次更新後到達 x1,以同樣的方式順着圖中的軌跡最終到達最優解 x∗ 的位置。同理,如果初始解爲x0′,則梯度大於0,x 在更新的過程中會減小最終到達 x∗。可以看到步長參數 α 會影響參數下一步的位置,因此 α 的設置對求解結果也有很大的影響。關於梯度下降原理更詳細的介紹可以看另外一位不知名大佬的文章。
至於梯度的求解,也就是分別求 J(w,b) 關於 w 和b的偏導數。首先先來看看 L(y,y^)關於它們的偏導:
dw=dwdL(y,y^)=dy^dL(y,y^)dwdy^ 這下是不是就有頭緒了 dy^dL(y,y^)=−y^y+1−y^1−y 再結合上面求解y^的過程,dwdy^=xσ′(w)但是 σ′(w) 怎麼求呢,這裏就必須提到sigmoid函數的一個優秀的性質了:
σ′(w)=σ(w)(1−σ(w)) 這樣dwdy^=xσ′(w)=xσ(w)(1−σ(w))=xy^(1−y^)代入求 dw的式子就可以得到
dw=dwdL(y,y^)=x(y^−y)優不優秀,厲不厲害!同樣的方式可以求得 L(y,y^)關於 b 的偏導
db=dbdL(y,y^)=(y^−y),這樣,由於 J(w,b) 是 L(y,y^)的線性加和,所以
dw=dwdJ(w,b)=m1X(Y^−Y)Tdb=dbdJ(w,b)=m1i=1∑m(y^(i)−y(i))
這裏將 dw寫成了向量的形式,X=[x(1),x(2),...,x(m)] ,Y^=[y^(1),y^(2),...,y^(m)],Y=[y(1),y(2),...,y(m)]。
至此,Logistic迴歸的過程就完了。總結一下就是
- 根據樣本的輸入特徵求預測標籤值(利用感知機和sigmoid激活函數);
- 利用所有樣本的真實標籤和預測得到的標籤計算損失函數( J(w,b);
- 分別求解損失函數對 w和 b的梯度,進而更新 w和 b;
- 重複上面三個步驟直到求得令 J(w,b) 最小的 w和 b。
程序
python版本的代碼可以在我的GitHub上下載。