python深度學習入門筆記全面總結!!(持續更新)

前言

之前有過斷斷續續地學習深度學習的經歷
對深度學習有一定的瞭解
包括激活函數,損失函數,卷積,池化這種基本概念
CNN,RNN,ResNet都有一定的瞭解
去年參加的項目裏還和隊友一起做了個基於CNN的智能搜索引擎
(沒記錯的話還花裏胡哨地用了點jieba分詞)
不過當時纔剛剛大二,知識體系漏洞很大,項目全靠帶
現在再翻翻當時的源碼都得費好大勁才能回想起來在寫什麼。。。

而想想自己到底學了點什麼深度學習,又很難系統地總結出來,東一榔頭西一棒,確實很多片面的知識點都會些,但又不深入
所以以此契機我決定從頭好好梳理一遍深度學習,從最基礎的概念開始補全知識漏洞,同時呢就當是對相關的知識也做一個複習(比如線性代數,概率論,python之類的)

話不多說,希望能在新一遍的學習中有所收穫吧——

神經網絡基礎

Logistic迴歸

Logistic迴歸主要是適用於分類問題的算法
畢竟是入門筆記,這裏就只對二元分類做簡述比給出概念定義

其基本的線性迴歸形式爲:
y=wTx+b y = w^{T}x + b
當然,用最基礎的數學知識來看,這裏的 y 取得是一系列的實值
甚至在理論上值域爲 R
而我們期望得到的值域爲
[0,1] [0, 1]
即我們輸入一個 x 後,我們需要知道一個概率區間
這就需要需要在外層嵌套函數,轉變函數的值域
最理想的自然是單位階躍函數,但單位階躍函數一個缺點就是其不連續,不能保證可微的嚴格性,所以不能直接使用
所以這裏需要對單位躍遷函數進行替換,
也就是sigmoid函數
y=11+ex y = \frac{1}{1 + e^{-x}}
也就是說最後可以表示爲:
y=σ(wTx+b) y = \sigma (w^{T}x + b)
其中
σ(x)=11+ex \sigma (x) = \frac{1}{1 + e^{-x}}
而當我們在進行神經網絡訓練時,此時產生的 y’ 只能說是理論值,爲了使這個理論值 y’ 和實際值 y 接近,我們需要定義一個損失函數loss去衡量 y’ 和 y 之間的誤差:
注:推導過程可以參考周志華教授的《機器學習》,這裏只寫結論
L(y^,y)=(ylogy^+(1y)log(1y^)) L (\widehat{y}, y) = -(ylog\widehat{y} + (1-y)log(1 - \widehat{y}))
函數的前一個參數爲理論值後一個參數爲實際期望值
(實際上這就是一個經典的交叉熵損失函數
也許有人會覺得爲什麼不用誤差平方進行求值
但實際上,至少我所接觸的神經網絡都是利用梯度下降法進行訓練的
而在梯度下降的過程中會面臨很多凸函數問題
到那時你就會發現誤差平方並不精確,不能有效地找到局部最小值
所以綜上,我們選擇上述功能相近的loss函數作爲替換
再回看loss函數
L(y^,y)=(ylogy^+(1y)log(1y^)) L (\widehat{y}, y) = -(ylog\widehat{y} + (1-y)log(1 - \widehat{y}))
這裏並沒有標明log的底數(並不是默認爲10),而實際上 log 的底數並不影響函數的實際含義:
我們使用loss函數的目的是爲了衡量理論值和實際值的誤差
所以對上述函數進行分析
你會發現當理論值 y = 1 時, y’ 也需要趨於1,反之理論值 y = 0 時 y’ 趨於0亦成立,從而確保了理論值和實際期望值最大程度上的吻合

明確了loss之後,我們還需明確另一個概念cost
loss是神經網絡在單個訓練集上的表現
cost則是神經網絡在整個訓練集上的表現
若訓練集爲:
{(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))} \{(x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}),...,(x^{(m)}, y^{(m)})\}
cost爲:
J(w,b)=1mi=1mL(y^(i),y(i)) J(w, b) = \frac{1}{m}\sum_{i = 1}^{m}L (\widehat{y}^{(i)}, y^{(i)})
w 和 b 就是Logistic迴歸中的參數,在實際訓練中應該是作爲超參處理的

梯度下降法

在上個子標題中我簡單梳理了Logistic迴歸以及 losscost
那麼在已知cost表達式的情況下,我們對初次訓練的神經網絡進行參數 w 和 b 的設定,顯然,除非你運氣夠好,不然初次設定的參數一定是具有較大偏差的——
我們對 w , b , J(w, b) 建立空間座標系,得到如下的空間曲線:
注:下圖截取自吳恩達老師的深度學習
在這裏插入圖片描述
爲了達到理論值和實際期望值最貼近的狀態
我們需要 J(w, b) 取到局部最小值
而實際上對 w 和 b 的初次調參往往會有很大的誤差
這時候我們就需要神經網絡遵循一套規則漸進找到這個最低點
這裏使用的就是梯度下降法

現在具體的解釋梯度下降法的原理:
爲了方便研究,我們先將上圖的空間座標系降維至平面座標系
假定 b 是已知確定的
此時我們只需研究 w 和 J(w) 的圖像:
注:下圖截取自吳恩達老師的深度學習
在這裏插入圖片描述
在原圖的基礎上我添加了紅點和藍點
分別對應局部最小值和初次調參值
爲了使神經網絡能漸進地從 B 過渡至 A ,我們對 w 進行以下修正:
w=wαdJ(w)dw w = w - \alpha \frac{dJ(w)}{dw}
這便是梯度下降法的核心思路
其中:
dJ(w)dw \frac{dJ(w)}{dw}
是函數在當前點的斜率,對應了梯度下降的方向
而參數 α 是學習率,對應了沿當前點的斜率方向下降的深度
參數 α 非常重要,其取值決定了梯度下降的效率
太大則容易錯失最低點
太小則下降速率過慢,降低了程序執行的速度

當你將 B 點選定在 A 點左側時,再從公式上理解時:
你會發現橫座標在增加
但從函數趨勢上是在下降的,仍然對應了梯度下降
清楚理解一維情形後,我們重新迴歸空間座標系
實際上空間座標系和平面座標系建立在完全一致的數學規則上
只是需要對 w 和 b 同時進行修正:
w=wαJ(w,b)w w = w - \alpha \frac{\partial J(w, b)}{\partial w}
b=bαJ(w,b)b b = b - \alpha \frac{\partial J(w, b)}{\partial b}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章