深度學習札記
05-14
基於課程.
基本概念
邏輯回歸
- loss function: <為凸函數,如果這裡使用的是最小二乘法的話,loss_function 是非凸的,有很多局部最小值,不利於問題的求解>
- cost function: 對 loss_function 的求和 < >
- 本身就是一個極簡的神經網路
梯度下降
- 核心是負梯度方向是值減少最快的方向
- 直覺: 兩點之間線段最短
- 導數< >不嚴謹的描述: 描述了 y 隨 x 的變化關係
- 隨機初始化
- 核對矩陣的維數很重要
BP 演算法
- 更新時使用向量化的更新
- 注意使用 broadcasting 的操作
- 這不僅僅是鏈式法則的問題,而是要跳出離散輸出的框架,這種理念上變革並不容易
- sigmoid / tanh<better> / relu (max(0, x))<better, better> / leaky relu
- s * ( 1 - s ) / ( 1 - ) / max(0, 1) / max(0.01, 1)
- 用計算圖的方式比較好理解
- 矩陣維度倒著看,如: 從隱藏層到輸出層
- w 和 dw 維度相同
- BP 演算法實現的時候一種直覺: 可以通過畫出它的神經網路結構實現
- 覺得工程上,或者創新,更需要的是一種直覺思維,但是這需要理論的基礎,需要多少理論呢,因人而異
- 參數和超參數 (eg: learning rate)
優化
- Train/dev/test set (深度學習會面對數據不是同分布的問題,因為數據量很大)
- Bias(系統本身誤差過大,高偏差,欠擬合) / Variance(方差過大,高方差,過擬合)
- 一般情況下,用驗證集來確定是否存在方差/偏差問題
- 正則化( L2正則化):用於緩解過擬合問題(高方差),相當於在後向傳播時給權重添加了一個 類似這樣的係數,造成了權重衰減
- 隨機失活,即 dropout,也是一種正則化方法,即隨機讓一些節點失活,直觀上感受,可以這樣理解,使得前向傳播和後向傳播的一些節點連線失效,類似 L2正則化,實際上也造成了權重衰減
- 反向隨機失活(Inverted dropout)
# keep_drop = 0.8# d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_drop# a3 = np.multiply(a3, d3)# Q: 為什麼要除以 keep_drop ?# A: 確保 a3 的 期望不變# a3 /= keep_drop
- 數據增強(Data augmentation)也是一種正則化方法
- 提前終止(Early stopping)即提前終止訓練神經網路
- 加速訓練神經網路的方法:歸一化輸入 (normalize input),尤其對一些特徵在0 - 1, 而另一些在0-1000 的數據集有用
- vanishing/exploding gradients
- 使用雙邊誤差 進行數值逼近,比單邊誤差更準確,梯度檢驗的原理
優化演算法
- mini-batch:意味著數據集被分成 X 次 batch,完成一次 X batch 的訓練 被稱為 1epoch 的訓練,程序上即需要兩個 for 循環,batch_size 為 1 時(即為 SGD)
- 指數加權(移動)平均<Exponentially weighted(moving) averages>: (重新刻畫了當前值,當前值與前一時刻有關)
- 偏差修正 【不是很理解】
- 動量(momentum)梯度下降法:計算梯度的指數加權平均數
- RMSprop
- Adam 優化演算法
- 學習率衰減
- 局部最優的問題
參數調試
- Batch 歸一化會使參數搜索變得很容易
深度學習框架
- tensorflow 和 pytorch
結構化機器學習項目
- 查准率(precision)查全率(recall)精度(accuracy)
- F1 分數 (結合查准率和查全率的調和平均數)
- choose a dev set and test set to reflect data you expect to get in the future and consider important to do well
- 0.6/0.2/0.2 和 0.98/0.01/0.01 (在大數據時代,舊有的劃分規則已經不現實了)
- set your test set to be big enough to give high confidence in the overall performance of your system
- 可避免偏差
- 理解人類的表現(如何大幅超越人類的表現呢)
- Human-level error (可避免偏差) Training error (方差) Dev error
- 完完整整的一個真實項目會讓你成長的更快,比如提高你在誤差分析方面的經驗...
- 快速骯髒的實現相比與複雜的實現來說,更快幫助你成長,記住你的目的是搭建一個可以工作的系統,而不是發明一個新的機器學習演算法
- 數據不匹配
- 遷移學習 (transfer learning)
- 多任務學習 (eg: 一張圖片對應多個標籤)
- 端到端學習 (即整個系統是用單個神經網路搭建的,這真的是一件很激動人心的事情,但是這是建立在大量數據的基礎上)
推薦閱讀:
※最大子數組查找問題
※K近鄰演算法(內附Kd-tree視頻演示)
※6. ZigZag Conversion(medium) & 7.Reverse Integer(easy)
※精選 TOP45 值得學習的Python項目
※18. 快速冪
TAG:深度學習DeepLearning | 機器學習 | 演算法 |