deep learning深度學習之學習筆記基於吳恩達coursera課程

世有因果知因求果發表於2017-09-19

feature study within neural network

在regression問題中,根據房子的size, #bedrooms原始特徵可能演算出family size(可住家庭大小), zip code可能演算出walkable(可休閒去處),富人比例和zip code也可能決定了學區質量,這些個可住家庭大小,可休閒性,學區質量實際上對於房價預測有著至關重要的影響,但是他們都無法直接從原始資料輸入獲取,而是進過hidden layer學習抽象得出的特徵。

loss function .vs. cost function

loss function是對任一個樣本點定義的損失函式,而cost function則是對整個資料樣本集來說,將各個樣本點的具體數值帶入進去後計算得出的值。

比如,以邏輯迴歸為例:

$$L(\hat y,y) = -(y log\hat y + (1-y)log(1-\hat y))$$

$$J(w,b) = \frac{1}{m}\sum_{i=1}^{m} L(\hat y ^{(i)},y^{(i)}) = - \frac {1}{m} \sum_{i=1}^{m} [y^{(i)} log\hat y^{(i)} + (1-y^{(i)})log(1-\hat y^{(i)})]$$

在logistic(binary)regression問題中,我們往往不用(y-y~)2方差作為loss函式,其中一個重要的原因是這個函式不是convex函式,因而使用另外一個凸函式作為loss function並使用梯度下降法來訓練w,b引數:

神經網路前向傳遞和後向傳播

前向傳遞根據w,b引數以及dataset來計算出當前引數下的神經網路的輸出及當前模型輸出對應的loss函式值,後向傳播則層層求導計算為引數更新打下基礎,在下一次前向傳遞時,更新w,b引數後繼續計算神經網路的輸出以及對應的loss函式值,最終使得loss值達到最小

上面示例只是給出了梯度下降法在針對一個資料時前向和後向計算過程,下面綜合考察所有資料集取平均數之後的計算方法以及編碼方法:

vectorization

上面的程式碼中,直接使用兩個for loop,但是在深度學習中,一般我們的資料集非常大,這時如果直接用for loop來寫梯度下降發的計算,則效率非常底下,這時我們就要使用numpy的向量化函式來提高效率:

broadcasting

generalize neural network from logistic regression model:

neural network representation

vectorize on neural network

activation functions:

一般在隱藏層,我們使用RELU,或者變種的RELU,而對於羅輯迴歸的輸出層,可能要使用sigmoid函式輸出0,1的概率

為何我們在神經網路中使用非線性啟用函式?

因為如果我們不使用非線性啟用函式,那麼即使有再多的隱藏層數,輸出y實際上就是輸入x的線性函式,而這完全可以用線性迴歸模型來表達,完全沒有必要使用神經網路。

也正因為神經網路中的非線性啟用函式的引入,隨著多層網路複雜度的增加,神經網路能夠表達幾乎任何複雜的非線性關係,這就是神經網路的強大之處

神經網路中的矩陣shape:

 

calculation path forward and backward

batch梯度下降演算法流程(未向量化)圖

mini batch梯度下降演算法

high bias vs high variance及神經網路最常用食譜

 

deep learning 特徵學習(representation learning)

一般地,在機器學習中,非常重要的一環是特徵工程,也就是從輸入資料中變換構造出能夠用資料來有效表達輸入資料的"特徵",將這些特徵作為機器學習演算法的輸入,並且應用學習演算法訓練出捕捉到輸入到輸出對映的"模型"。而在deep learning中,我們有很多hidden layer,每一層hidden layer通過訓練,實際上其係數data以及應用在前一層輸入資料上後執行非線性激勵的輸出data,這些data就包含著資料中的pattern,越靠後的隱蔽層越能構造出更加抽象的特徵。因此在神經網路中,我們甚至可以剔除特徵工程這一步驟,讓網路自己去學習獲得特徵,並且將學習到的這些特徵作為後續網路的輸入繼續學習,直到獲得較好的預測效果

反向傳播到底在幹什麼?

在神經網路訓練過程中,反向傳播的本質是要計算coss function針對所有的係數對應的偏導數,從而使得在下一輪的前向傳播訓練中可以正確地同時更新所有的權重係數以達到損失函式值梯度不斷遞減這個目標。 反向傳播計算導數過程中,為了計算方案,我們需要前向計算時已經算得的z,a,prediction等值

transfer learning

在計算機視覺中,一個大的問題是訓練資料不足,而要獲得一個比較好的模型,往往需要成千上萬甚至數百萬以上的圖片資料,同時深度網路訓練的時間非常長,如何克服這兩個問題同時又能夠快速解決我們感興趣的領域的問題呢?遷移學習就提供了一個非常好的思路。

我們可以使用開源的資料集,比如imageNet 1000 class,有非常多的優秀的網路已經針對該資料集做了訓練,相應的程式碼,權重都可以方便獲得。我們要做的就是站在前人的肩膀上:

1. 基於開源網路結構和權重引數外接我們感興趣的softmax分類器,就好像武林高手內功傳遞一樣將相應知識(比如底層特徵學習能力)傳給後面的網路,而資料則使用我們自己的資料集僅針對後面我們自己增加的網路來做訓練。

2.甚至可以使用預先訓練好的網路針對我們自己的資料集預先做好計算輸出對應的activation作為特徵,來訓練後面我們自己的網路

3.當然,如果我們領域內的圖片也很龐大,則可以從後往前開放部分隱藏層也參與訓練,最終和我們自己加的網路層共同組成model

https://ir.lib.uwo.ca/cgi/viewcontent.cgi?article=6225&context=etd

two sources of knowledge for model to train

labeled data

hand engineered features/network architecture/other components

deep learning networks

梯度gradient計算的兩種方式互補:數值演算法和解析演算法

在網路訓練時,我們需要使用梯度下降法,而梯度就是用來做引數更新的最重要資料。梯度如何獲取呢?一般有兩種方式:

一種是通過數值方法,根據梯度導數的定義

$$\frac{df(x)}{dx} = \lim_{h\rightarrow 0}\frac{f(x+h)-f(x)}{h}$$

這種方法簡單不會出錯,並且總能算得,但是缺點是非常慢,因此常常用來對解析方式結算得來的梯度做檢驗,確認解析求導的演算法正確;

另一種方式是通過解析方法,也就是如果我們能夠得到loss函式對各個引數$\omega$的解析表示式,使用高等數學求導的知識寫出梯度的解析表示式,然後帶入資料就能快速算出其梯度。

解析方式有點是快速,準確,缺點是由於得到函式表示式並不容易,非常容易犯錯。而在神經網路中,往往借用導數的鏈式法則來一步步求得loss針對各層引數的梯度

梯度解析求解利器-compution graph:計算圖

使用計算圖的好處是隻要我們能夠將loss的表示式使用計算圖來表達,那麼就可以再借用鏈式求導法則,使用反向傳播演算法來求解各處的匯出。比如卷積神經網路中,loss的求得是經過輸入層的圖片和各層網路權重引數相乘,再經過池化,啟用函式等層層計算最終才能得到Loss函式的表示式,要得到解析式是非常困難的,但是我們卻可以使用計算圖輕易表達這個前向求解過程。因此,我們只要弄清楚了計算圖中導數求解,就可以藉助鏈式法則一步步求解梯度。

還需要注意的一點是:如果一個節點和後續多個節點直接相連,則從該節點來看反向傳播過來的梯度就有多個,我們需要把這些梯度相加後形成Loss對該節點輸出a的總梯度

dev set和test set必須來自同一個distribution

 假如我們在做一個圖片分類的應用,首先我們可能會從web上爬取大量圖片,這些圖片解析度,質量層次不齊但是可能又是必須的。而隨後我們使用的應用上線後,可能由使用者使用手機拍攝的圖片直接上傳來做分類。這時需要注意的是:dev資料集(validataion set)須要和test set來自同一個分佈。也就是說,在驗證網路效能時直接使用手機拍攝的圖片來做分類驗證。

CNN中filter(kernel)和neuron的連線

CNN中各種常見filter效果比對

CNN輸出維度的計算

H = height, W = width, D = depth

  • 我們有一個輸入維度是 32x32x3 (HxWxD)
  • 20個維度為 8x8x3 (HxWxD) 的濾波器
  • 高和寬的stride(步長)都為 2。(S)
  • padding 大小為1 (P)

計算新的高度和寬度的公式是:

new_height = (input_height - filter_height + 2 * P)/S + 1
new_width = (input_width - filter_width + 2 * P)/S + 1

 

word embedding

將獨熱編碼的稀疏向量對映到另外一個空間中的稠密向量。訓練的方法是讓ML演算法通過讀取大量的語料來學習到詞彙之間的語義

image embedding and document embedding

自編碼器

autoencoder可以用於向量化相似搜尋,比如圖片搜尋圖片

inception網路

 

相關文章