機器學習自學筆記07: Deep Learning

by wenwu
0 comment

機器學習自學筆記07: Deep Learning

今日的課程來自於: https://youtu.be/CXgbekl66jc
參考筆記:https://github.com/Sakura-gh/ML-notes/blob/master/ML-notes-pdf/8_Deep%20Learning.pdf

實際上,Deep learning跟machine learning一樣,也是“大象放進冰箱”的三個步驟:在Deep learning的step1 和 define的function,就是neural network


Neural Network

把多個Logistic Regression前後連結在一起,然後把一個Logistic Regression稱之為neuron,整個稱之為neural network
我們可以用不同的方法連接這些neuron,就可以得到不同的structure,neural network里的每一個 Logistic Regression 都有一組weight和bias,這些weight和bias集合起来,就是這個network的 parameter,我們用θ來描述


Fully Connect Feedforward Network

該怎麼把他們連接起來呢? 這是需要你手動去設計的,最常見的連接方法叫做Fully Connect Feedforward Network (全連接前饋網路)

如果一個neural network的參數weight和bias已知的話,它就是一個function,它的input是一個 vector,output是另一個 vector,這個 vector裡面放的是樣本點的feature,vector的dimension就是feature的個數

如果今天我們還不知道參數,只是定出了這個 network的structure,只是決定好這些 neuron該怎麼連接在一起,這樣的一個 network structure其實是define了一個 function set(model),我們给這個 network設不同的参数,它就變成了不同的function,把這些可能的function集合起來,我們就得到了一個function set

只不過我们用neural network決定 function set的時候,這個 function set是比較大的,它包含了很多原來你做 Logistic Regression、做linear Regression所没有辦法包含的function

上圖中,每一排表示一個layer ,每一個球都代表一個neuron

  • layer 和 layer 之間 neuron是兩兩互相連接的,layer 1的neuron output 會連接给 layer 2的每一個 neuron作為 input
  • 對整個 neural network 來說 ,它需要一個 input,這個 input就是一個feature的vector,而對 layer 1的每一個 neuron來說 ,它的input就是input layer的每一個 dimension
  • 最後的layer L,由於它後面没有接其它東西了,所以它的output就是整個network的output
  • 每一個layer 都是有名子的,最前面叫做 input layer ,中間的叫hidden layer ,最後面叫做output layer
  • 每一個neuron裡面的sigmoid function ,在deep learning 被稱為activation function (激勵函數)(事實上不一定是sigmoid function ,還可以是其他function)
  • 很多層layers 的neural network,被稱為DNN(deep neural network)

Fully connected 的network : layer和layer 之間,所有的neuron都是兩兩相接
Feedforward network : 傳遞的方向是從layer 1→2→3 ,由後往前傳


Matrix Operation

network的運作過程,我們通常會用matirx operation來表示,以下圖為例,假設第一層 hidden layers 的兩個 neuron,它們的 weight 分别是w1=1, w2=-2 ,w1’=-1, w2’=1,那就可以把它們排成一個 2*2 matrix
而我們的input 又是一個 2*1的vector:[1,-1]’ ,將w和x相乘,再加上bias的vector:[1,0]’ ,就可以得到這一層的vector z,再經過activation function得到這一層 的output:

(activation function可以是很多類型的function,這裡還是用Logistic Regression遷移過來的sigmoid function作為運算)

這裡我們把所有的變量都以matrix的形式表示出来,注意W^i的matrix,每一行對應的是一個neuron的weight,行數就是neuron的個數,而input x,bias b和output y都是一個列向量,行數就是feature的個數(也是neuron的個數,neuron的本質就是把feature transform到另一個 space)

把這件事情寫成矩陣運算的好處是,可以用GPU加速,GPU對matrix的運算是比CPU要來的快的,所以寫neural network的時候,習慣把它寫成matrix operation,然后call GPU來加速它


Output Layer (Multi-class classifier)vs Hidden Layer (feature extractor)

我們可以把 hidden layers看做是feature extractor(特徵提取器),feature extractor就取代了我們之前手動做feature engineering or feature transformation,經過這個feature extractor得到的就可以被當作一組新的feature

output layer做的事情,其實就是把它當做一個Multi-class classifier,它是拿經過feature extractor轉換後的那一組比較好的feature(能夠被很好地分類)進行方類的,由於我們把output layer看做是一個Multi-class classifier,所以我們會在最後一個 layer加上softmax


Example Application

Handwriting Digit Recognition

這裡舉一個手寫數字識別的例子,input是一張圖片,對機器來說一張image實際上就是一個 vector,假設這是一張16*16的image,那它有256個pixel,對machine来说,它是一個256维的vector,圖中的每一個都對應到vector中的一個dimension,簡單來說,我們把黑色的pixel的值設為1,白色的pixel的值設為0

而neural network的output,如果在output layer使用了softmax,那它的output就是一個突出極大值的Probability distribution,假設我們的output是10維的話(10個數字,0~9),這個output的每一維都對應到它可能是某一個數字的機率,實際上這個neural network的作用就是計算這張image成為10個數字的機率各自有多少,機率最大(softmax突出極大值的意義所在)的那個數字,就是機器的預測值

在這個手寫字體識別的demo裡,我們唯一需要的就是一個function,這個function的input是一個256維的vector,output是一個10維的vector,這個function就是neural network(這裡我們用簡單的Feedforward network)

input固定為256維,output固定為10維的feedforward neural network,實際上這個network structure就已經確定了一個function set(model)的形狀,在這個 function set 裡的每一個 function 都可以拿來做手寫數字識別,接下来我們要做的事情是用gradient descent去計算出一組參數,挑一個最適合拿来做手寫數字識別的function

input、output的dimension,加上 network structure,就可以確定一個model的形狀,前兩個是容易知道的,而決定這個 network的structure則是整個Deep Learning中最關鍵的步驟

如果你的network structure設計的很差,這個function set裡面根本就没有好的function,那就會像大海撈針一樣,結果針並不在海裡


Step 1: Neural Network

input 256維,output 10維,以及自己design的network structure →function set(model)

Step 2: Goodness of function

定義一個function的好壞,由於現在我們做的是一個Multi-class classification,所以image為數字1的 label “1”告訴我們,現在的target是一個10維的vector,只有在第一維對應數字1的地方,它的值是1,其他都是0

input這張image的256個pixel,通過這個neural network之后,會得到一個output,稱為y;而從這張image的label中轉化而來的target,稱為y^,有了output y 和target y^ 之後,要做的事情是計算它們之間的cross entropy(交叉熵),這個做法跟我們之前做Multi-class classification的時候是一樣的

Step 3: Pick the best function

接下來就去調整參數,讓這個cross entropy越小越好,當然整個training data裡面不會只有一筆data,你需要把所有data的cross entropy都sum起来,得到一個total loss L ,得到loss function之後你要做的事情是找一組network的parameters: θ*,它可以minimize這個total loss,這組 parameter對應的function就是我們最終訓練好的model

那怎麼去找這個使total loss minimize的呢?使用的方法就是我們的老朋友 — — Gradient Descent
實際上在deep learning裡面用gradient descent,跟在linear regression裡面使用完全没有什麼差别,只是function和parameter變得更複雜了而已,其他事情都是一模一樣的

现在你的θ裡面是一大堆的weight、bias參數,先random找一個初始值,接下来去計算每一個參數對 total loss 的偏微分,把這些偏微分全部集合起来,就叫做gradient,有了這些偏微分以後,你就可以更新所有的參數,都減掉learning rate乘上偏微分的值,這個process反覆進行下去,最終找到一组好的參數,就做完deep learning的training了


Why Deep?

為什麼我們要deep learnings呢?一個很直覺的答案是,越deep,performance就越好,一般來說,隨著deep learning中的layers數量增加,error率不斷降低

結果是可想而知的,因為本來model的parameter越多,它cover的function set就越多,它的bias就越小,如果今天你有足夠多的training data去控制它的 variance,一個比較複雜、參數越多的model,它performance比較好,是很正常的,那變deep有什麼特别了不起的地方?

甚至有一個理論是這樣說的,任何連續的function,它input是一個N維的vector,output是一個M維的vector,它都可以用一個hidden layer的neural network來表示,只要你這個hidden layer的neuron夠多,它可以表示成任何的function,既然一個hidden layer的neural network可以表示成任何的function,而我們在做machine learning的時候,需要的東西就只是一個function而已,那做deep有什麼特殊的意義呢?

所以有人說,deep learning就只是一個噱頭而已,因為做deep感覺比較潮,如果你只是增加neuron把它變寬,變成 fat neural network,那就感覺太“虛弱”了,所以我们要做deep learning,给它增加 layers而不是增加 neuron:DNN(deep) is better than FNN(fat)

真的是這樣嗎? 後面的章節会解釋這件事情


Design network structure V.s. Feature Engineering

最後李宏毅老師與我們討論 Design network structure V.s. Feature Engineering的經驗談

其實network structure的design是一件蠻難的事情,我們到底要怎麼決定layer的數量和每一個layer的 neuron的數目呢?
其實這個只能夠憑著經驗和直覺、多方面的嘗試,有時候甚至會需要一些domain knowledge(專業領域的知識),從非deep learning的方法到deep learning的方法,並不是說 machine learning比較簡單,而是我們把一個問題轉化成了另一個問題

本來不是deep learning的model,要得到一個好的結果,往往需要做feature engineering(特徵工程),也就是做feature transform,然後找一組好的feature;一開始學習deep learning的時候,好像會覺得 deep learning的layers之間也是在做feature transform,但實際上在做deep learning的时候,往往不需要一個好的feature ,比如說在做影像辨識的時候,你可以把所有的pixel直接丢進去,但是在過去做圖像識別,你是需要對圖像抽取出一些人定的feature出來的,這件事情就是feature transform,但是有了deep learning之後,你完全可以直接丢pixel進去硬做

但是,今天deep learning製造了一個新的問題,它所製造的問題就是,你需要去design network的structure,所以你的問題從本來的如何抽取feature轉化成怎麼 design network structure,所以deep learning是不是真的好用,取決於你覺得哪一個問題比較容易

Related Articles

發表迴響