深度學習札記

基於課程.

基本概念

邏輯回歸

  • y\_pred = sigma(w^{T}x + b),sigma(z) = frac{1}{1 + e^{-z}}
  • loss function: loss\_function = -[ylog(y\_pred) + (1- y)log(1 - y\_pred)] <為凸函數,如果這裡使用的是最小二乘法的話,loss_function 是非凸的,有很多局部最小值,不利於問題的求解>
  • cost function: 對 loss_function 的求和 < J(omega, b) >
  • 本身就是一個極簡的神經網路

梯度下降

  • 核心是負梯度方向是值減少最快的方向
  • 直覺: 兩點之間線段最短
  • 導數< frac{dy}{dx} >不嚴謹的描述: 描述了 y 隨 x 的變化關係
  • 隨機初始化
  • 核對矩陣的維數很重要

BP 演算法

  • 更新時使用向量化的更新
  • 注意使用 broadcasting 的操作
  • 這不僅僅是鏈式法則的問題,而是要跳出離散輸出的框架,這種理念上變革並不容易
  • sigmoid / tanh<better> / relu (max(0, x))<better, better> / leaky relu
  • s * ( 1 - s ) / ( 1 - t^2 ) / max(0, 1) / max(0.01, 1)
  • 用計算圖的方式比較好理解
  • 矩陣維度倒著看,如: 從隱藏層到輸出層
  • w 和 dw 維度相同
  • BP 演算法實現的時候一種直覺: 可以通過畫出它的神經網路結構實現
  • 覺得工程上,或者創新,更需要的是一種直覺思維,但是這需要理論的基礎,需要多少理論呢,因人而異
  • 參數和超參數 (eg: learning rate)

優化

  • Train/dev/test set (深度學習會面對數據不是同分布的問題,因為數據量很大)
  • Bias(系統本身誤差過大,高偏差,欠擬合) / Variance(方差過大,高方差,過擬合)
  • 一般情況下,用驗證集來確定是否存在方差/偏差問題
  • 正則化( frac{lambda}{2m}omega^Tomega L2正則化):用於緩解過擬合問題(高方差),相當於在後向傳播時給權重添加了一個 1-frac{lambda}{m} 類似這樣的係數,造成了權重衰減
  • 隨機失活,即 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
  • 使用雙邊誤差 frac{f(	heta + varepsilon) - f(	heta - varepsilon)}{2varepsilon} 進行數值逼近,比單邊誤差更準確,梯度檢驗的原理

優化演算法

  • mini-batch:意味著數據集被分成 X 次 batch,完成一次 X batch 的訓練 被稱為 1epoch 的訓練,程序上即需要兩個 for 循環,batch_size 為 1 時(即為 SGD)
  • 指數加權(移動)平均<Exponentially weighted(moving) averages>: V_{t} = eta V_{t-1} + (1-eta) 	heta_{t} (重新刻畫了當前值,當前值與前一時刻有關)
  • 偏差修正 【不是很理解】
  • 動量(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 | 機器學習 | 演算法 |