最近博主在學習深度學習,選擇的是看吳恩達的DeepLearning課程,因爲Coursera上完成課程要申請助學金不然要錢(白嫖警告),並且要完成作業。博主沒那麼多時間也沒那麼多錢,所以選擇了b站上刷視頻。刷視頻的時候就邊看邊作總結,本來找了一些比較著名的筆記,一看發現還是字幕比較多,不利於複習,所以對部分常用的深度學習概念做了一些知識點盤點,然後又決定發到博客上,所以我儘量以看得懂的形式記錄,希望在大家某天想找某個知識點的時候可以通過這篇博客得到幫助。
爲什麼深度學習會興起
原因1. 在大規模的數據集上深度學習的性能比傳統機器學習的更好
這張圖是吳恩達在解釋的時候畫的,意思是在數據集規模比較小的時候,傳統機器學習的表現非常好,但是在數據集規模變得非常巨大之後,深度學習相對傳統機器學習的優勢就變得非常明顯了。它的表現可以大幅度超越傳統機器學習。
在數據集比較小的時候,機器學習算法之間的優劣並不明顯,通常差別都是發生在對數據集的處理以及手工實現機器學習算法時候的細節處理。
原因2. 在深度學習領域的算法創新,如ReLU
之前一直使用的激活函數都是sigmoid函數,但是它有一些固有缺點,在ReLu函數被設計出來之後,深度學習的性能和訓練時間得到了大幅提升,使他變得更加popular了。
邏輯迴歸
邏輯迴歸是神經網絡最基本的組成部分,一個完整的神經網絡可以拆分成許多個邏輯迴歸單元
1. 用途:
二分類問題,也就是在機器學習中的邏輯迴歸
作爲神經網絡的單元
2. 公式:
3. sigmoid函數:
通常邏輯迴歸都是使用sigmoid函數作爲激活函數的。
4. 損失函數:
這是二分類問題最常用的損失函數,稱爲交叉熵損失函數,上面式子是單個樣本的交叉熵損失函數,完整的交叉熵損失函數需要將所有樣本的損失累加起來,這裏就不寫了。
它的簡單推導過程如圖:
5. 邏輯迴歸的計算圖模型
激活函數
爲什麼激活函數需要是非線性的
因爲如果激活函數是線性的話,無論神經網絡有多少層,它都是在計算線性函數,最終結果都是線性的,100層和10層沒有任何區別。純線性的神經網絡只能劃分出一條線性決策平面,然而大多數情況下決策平面都不是線性的,其擬合複雜函數的能力就不存在了。
下面是幾種常用的激活函數形式
1. sigmoid函數
公式:
2. tanh函數
公式:
tanh激活函數的優點:可以使得數據的平均值更接近0而不是0.5,讓下一層學習更簡單一點(可以理解爲做了類似歸一化的操作)
tanh函數在幾乎所有場合都優於sigmoid函數,除了在二分類的輸出層,因爲需要輸出爲(0,1)而可以sigmoid函數,其餘情況下基本不會使用sigmoid而使用tanh。
3. ReLu函數 修正線性單元函數
公式:
只要z值爲正,ReLu的導數恆爲1,當z爲複數的時候,ReLu的導數恆爲0,當z剛好等於0的時候,可以對其導數單獨賦值,一般賦值爲0.
4. Leaky ReLu函數
公式:
這個函數通常要比ReLu效果要好,儘管在實際中使用leaky的不多
ReLu和leaky ReLu的優點
- 在z的值變動很大的時候(橫軸很廣)激活函數的導數都很容易計算,而sigmoid函數的導數則需要很複雜的運算才能得到,因此實際中使用ReLu激活函數的神經網絡學習的要比sigmoid的要快
- sigmoid和tanh函數的導數在z很大或者很小的時候都會出現梯度消失的情況(導數接近0)使得學習變得非常慢,而ReLu就不會有這個問題,它的導數值是恆定的。
神經網絡的初始化和調參
對於神經網絡,把權重全部初始化爲0是不行的
如果將所有的權重都初始化爲0,你會發現每一層的a值都是0(都是相等的),梯度下降就不會進行任何更新。
但是在邏輯迴歸的時候(只有一層的神經網絡)就可以初始化爲0,或者將偏置項初始化爲0。
神經網絡權重初始化的策略
將權重隨機初始化。比如生成一個隨機數,然後乘以0.001。
要保證每層的權重都是不一樣的
爲什麼還要乘以0.001
假設激活函數使用tanh,它的計算步驟是這樣的:
當初始權重W很大的時候,z就會很大,在這種情況下可能會停在tanh函數比較平坦的地方,導致梯度下降變得很慢。如果W十分接近0,z就會很小,會在tanh函數斜率比較大的地方開始,梯度下降就會比較快。
神經網絡中的超參數
什麼是超參數
兩個條件:(1)需要使用者手動設置的參數,(2)這些參數實際上控制了最後的權重值。
比如學習率,迭代次數,隱藏層的數量,隱藏層每一層的節點數量等等,這些都是超參數。
一般超參數是怎麼設置的
想法->編碼->實驗->想法
這是一個很經驗性的過程,必須通過一定的嘗試和實踐才能找到最合適的超參數,當然需要在一定理論的指引下進行嘗試,不能盲目嘗試。
深層神經網絡的優化
訓練集,驗證集和測試集的劃分
爲什麼要特地分出驗證集
先看下各個數據集的作用是什麼
- 訓練集:訓練模型,這個不用說了
- 測試集:評估訓練好的模型的性能
那麼在訓練模型之後是不是可以直接放到測試集裏面呢?一般是可以的,但是別忘了還有超參數,包括隱藏層數量,隱藏單元的數量,等等。每次確定一個超參數,就相當於一個新模型,就要重新評估一次(有可能需要重新訓練),而這些超參數並不是一開始就能完全確定的,需要逐個比較哪個超參數下的模型比較好,那怎麼比較呢?千萬不能把多個模型放到測試集裏面看看哪個好,測試集僅僅是用來作爲最終評估的,在那之前,絕對不能使用測試集,因爲這樣會造成數據泄露,使得模型提前適應測試集,並且這樣最後挑選出來的模型也僅僅是在測試集上表現良好罷了,這樣訓練出來的模型是毫無意義的。可以把測試集看成一個只能用一次的資源,所有準備就緒了才能用。這時候驗證集的作用就體現出來了,它就是用來挑選超參數的。所以
3. 驗證集:用來選擇模型(包括選擇超參數等等)
每個數據集怎麼劃分大小
在數據集比較小的時候(幾萬的級別),通常的做法是:60%訓練,20%驗證,20%測試
但是數據集比較龐大的時候(幾百萬的級別),驗證集和測試集在總數據中的佔比就會變得更小,一般是:98%訓練,1%驗證,1%測試。或者99.5%訓練,0.25%驗證,0.25%測試。
神經網絡的訓練
偏差和方差問題
偏差和方差的解決方案分類常見的就幾種,列成表格就像下面這樣:
問題 | 偏差高(high bias) | 方差高(high variance) |
---|---|---|
換一個更大的網絡 | 使用正則化 | |
迭代更多次 | 使用更多數據訓練 | |
使用其他優化方法 | ----- |