---
# System prepended metadata

title: '**Machine Learning Class7**'

---

# **Machine Learning Class7**

+ 1958：Perceptron(linear model)，感知機的提出
  - 和Logistic Regression類似，只是少了sigmoid的部分
+ 1969：Perceptron has limitation，from MIT
+ 1980s：Multi-layer Perceptron，多層感知機
  - 和今天的DNN很像
+ 1986：Backpropagation，反向傳播
  - Hinton propose的Backpropagation
  - 存在problem：通常超過3個layer的neural network，就train不出好的結果
+ 1989: 1 hidden layer is “good enough”，why deep？
  - 有人提出一個理論：只要neural network有一個hidden layer，它就可以model出任何的function，所以根本沒有必要疊加很多個hidden layer，所以Multi-layer Perceptron的方法又壞掉了，這段時間Multi-layer Perceptron這個東西是受到抵制的
+ 2006：RBM initialization(breakthrough)：Restricted Boltzmann Machine，受限玻爾茲曼機
  - Deep learning -> another Multi-layer Perceptron ？在當時看來，它們的不同之處在於在做gradient descent的時候選取初始值的方法如果是用RBM，那就是Deep learning；如果沒有用RBM，就是傳統的Multi-layer Perceptron
  - 那實際上呢，RBM用的不是neural network base的方法，而是graphical model，後來大家試驗得多了发現RBM並沒有什麽太大的幫助，因此現在基本上沒有人使用RBM做initialization了
  - RBM最大的貢獻是，它讓大家重新對Deep learning這個model有了興趣(石頭湯的故事)
+ 2009：GPU加速的發現
+ 2011：start to be popular in speech recognition，語音識別領域
+ 2012：win ILSVRC image competition，Deep learning開始在圖像領域流行開來

實際上，Deep learning跟machine learning一樣，也是“大象放進冰箱”的三個步驟：
※在Deep learning的step1里define的那個function，就是neural network
 ![](https://i.imgur.com/1sWO3Ou.png)
 
# **Neural Network**
## **Concept**
把多個Logistic Regression前後connect在一起，然後把一個Logistic Regression稱之為neuron，整個稱之為neural network

![](https://i.imgur.com/azbpWyd.png)

我們可以用不同的方法連接這些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的個數
![](https://i.imgur.com/gqYSrGV.png)

如果今天我們還不知道參數，只是定出了這個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，每個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的地方，叫做**input layer，輸入層**(嚴格來說input layer其實不是一個layer，它跟其他layer不一樣，不是由neuron所組成的)
  - output的地方，叫做**output layer，輸出層**
  - 其余的地方，叫做**hidden layer，隱藏層**
+ 每一個neuron里面的sigmoid function，在Deep Learning中被稱為**activation function(激勵函數)**，事實上它不見得一定是sigmoid function，還可以是其他function(sigmoid function是從Logistic Regression遷移過來的，現在已經較少在Deep learning里使用了)
+ 有很多層layers的neural network，被稱為DNN(Deep Neural Network)

![](https://i.imgur.com/hmEPQ5K.png)

**因為layer和layer之間，所有的neuron都是兩兩連接，所以它叫Fully connected的network；因為現在傳遞的方向是從layer 1->2->3，由後往前傳，所以它叫做Feedforward network**

那所謂的deep，是什麽意思呢？有很多層hidden layer，就叫做deep，具體的層數並沒有規定，現在只要是neural network base的方法，都被稱為Deep Learning，下圖是一些model使用的hidden layers層數舉例

![](https://i.imgur.com/n3oyrcL.png)

你會發現使用了152個hidden layers的Residual Net，它識別圖像的準確率比人類還要高，當然它不是使用一般的Fully Connected Feedforward Network，它需要設計特殊的special structure才能訓練這麽深的network

## **Matrix Operation**
network的運作過程，我們通常會用Matrix Operation來表示，以下圖為例，假設第一層hidden layers的兩個neuron，它們的weight分別是$w1=1,w2=-2,w1'=-1,w2'=1$，那就可以把它們排成一個matrix：![](https://i.imgur.com/jDod0KT.png)，而我們的input又是一個2*1的vector：![](https://i.imgur.com/0nxEA4k.png)，將w和x相乘，再加上bias的vector：![](https://i.imgur.com/O7MgbbX.png)，就可以得到這一層的vector z，再經過activation function得到這一層的output：(activation function可以是很多類型的function，這里還是用Logistic Regression遷移過來的sigmoid function作為運算)

![](https://i.imgur.com/XhoAWCb.png)
![](https://i.imgur.com/62QfLxT.png)

這里我們把所有的變量都以matrix的形式表示出來，注意$W^i$的matrix，每一行對應的是一個neuron的weight，行數就是neuron的個數，而input x，bias b和output y都是一個列向量，行數就是feature的個數(也是neuron的個數，neuron的本質就是把feature transform到另一個space)
![](https://i.imgur.com/ViH51jz.png)

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

## **Hidden Layer**
我們可以把hidden layers這部分，看做是一個**feature extractor(特征提取器)**，這個feature extractor就replace了我們之前手動做feature engineering，feature transformation這些事情，經過這個feature extractor得到的$x1,x2,...,xk$就可以被當作一組新的feature

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

![](https://i.imgur.com/bZjAgoR.png)

# **Application Example**
## **Handwriting Digit Recognition**
這里舉一個手寫數字識別的例子，input是一張image，對機器來說一張image實際上就是一個vector，假設這是一張16*16的image，那它有256個pixel，對machine來說，它是一個256維的vector，image中的每一個都對應到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突出極大值的意義所在)的那個數字，就是機器的預測值

![](https://i.imgur.com/aNzQJSh.png)

在這個手寫字體識別的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進行design，之前在做Logistic Regression或者是linear Regression的時候，我們對model的structure是沒有什麽好設計的，但是對neural network來說，我們現在已知的constraint只有input是256維，output是10維，而中間要有幾個hidden layer，每個layer要有幾個neuron，都是需要我們自己去設計的，它們近乎是決定了function set長什麽樣子

如果你的network structure設計的很差，這個function set里面根本就沒有好的function，那就會像大海撈針一樣，結果針並不在海里(滑稽

### **Step 1：Neural Network**
![](https://i.imgur.com/pbT5rZK.png)

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
![](https://i.imgur.com/AorDyFA.png)

input這張image的256個pixel，通過這個neural network之後，會得到一個output，稱之為y；而從這張image的label中轉化而來的target，稱之為y^，有了output y和target y^之後，要做的事情是計算它們之間的cross entropy(交叉熵)，這個做法跟我們之前做Multi-class classification的時候是一模一樣的
![](https://i.imgur.com/7pZmgmb.png)

### **Step 3：Pick the best function**
接下來就去調整參數，讓這個cross entropy越小越好，當然整個training data里面不會只有一筆data，你需要把所有data的cross entropy都sum起來，得到一個total loss ![](https://i.imgur.com/7Kmaic7.png)，得到loss function之後你要做的事情是找一組network的parameters：$θ^*$，它可以minimize這個total loss，這組parameter對應的function就是我們最終訓練好的model
![](https://i.imgur.com/kooYIeh.png)

那怎麽去找這個使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了
![](https://i.imgur.com/vpHeuit.png)

## **toolkit**
你可能會問，這個gradient descent的function式子到底是長什麽樣子呢？之前我們都是一步一步地把那個算式推導出來的，但是在neural network里面，有成百上千個參數，如果要一步一步地人工推導並求微分的話是比較困難的，甚至是不可行的

其實，在現在這個時代，我們不需要像以前一樣自己去implement Backpropagation(反向傳播)，因為有太多太多的toolkit可以幫你計算Backpropagation，比如**tensorflow、pytorch**

注：Backpropagation就是算微分的一個比較有效的方式

## **有一些常見的問題：**
Q：有人可能會問，機器能不能自動地學習network的structure？
   + 其實是可以的，基因演算法領域是有很多的technique是可以讓machine自動地去找出network structure，只不過這些方法目前沒有非常普及

Q：我們可不可以自己去design一個新的network structure，比如說可不可以不要Fully connected layers(全連接層)，自己去DIY不同layers的neuron之間的連接？
   + 當然可以，一個特殊的接法就是CNN(Convolutional Neural Network)，即卷積神經網絡，這個下一章節會介紹

## **Why Deep？**
最後還有一個問題，為什麽我們要deep learning？一個很直覺的答案是，越deep，performance就越好，一般來說，隨著deep learning中的layers數量增加，error率不斷降低

但是，稍微有一點machine learning常識的人都不會覺得太surprise，因為本來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有什麽特殊的意義呢？
![](https://i.imgur.com/kZMhUQK.png)

所以有人說，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**
> 下面聊一些經驗之談

其實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是不是真的好用，取決於你覺得哪一個問題比較容易

如果是影響辨識或者是語音辨識的話，design network structure可能比feature engineering要來的容易，因為，雖然我們人都會看、會聽，但是這件事情，它太過潛意識了，它離我們意識的層次太遠，我們無法意識到，我們到底是怎麽做語音辨識這件事情，所以對人來說，你要抽一組好的feature，讓機器可以很方便地用linear的方法做語音辨識，其實是很難的，因為人根本就不知道好的feature到底長什麽樣子；所以還不如design一個network structure，或者是嘗試各種network structure，讓machine自己去找出好的feature，這件事情反而變得比較容易，對影像來說也是一樣的

有這麽一個說法：deep learning在NLP上面的performance並沒有那麽好。語音辨識和影像辨識這兩個領域是最早開始用deep learning的，一用下去進步量就非常地驚人，比如錯誤率一下子就降低了20%這樣，但是在NLP上，它的進步量似乎並沒有那麽驚人，甚至有很多做NLP的人，現在認為說deep learning不見得那麽work，這個原因可能是，人在做NLP這件事情的時候，由於人在文字處理上是比較強的，比如叫你設計一個rule去detect一篇document是正面的情緒還是負面的情緒，你完全可以列表，列出一些正面情緒和負面情緒的詞匯，然後看這個document里面正面情緒的詞匯出現的百分比是多少，你可能就可以得到一個不錯的結果。所以NLP這個task，對人來說是比較容易設計rule的，你設計的那些ad-hoc(特別的)的rule，往往可以得到一個還不錯的結果，這就是為什麽deep learning相較於NLP傳統的方法，覺得沒有像其他領域一樣進步得那麽顯著(但還是有一些進步的)

長久而言，可能文字處理中會有一些隱藏的資訊是人自己也不知道的，所以讓機器自己去學這件事情，還是可以占到一些優勢，只是眼下它跟傳統方法的差異看起來並沒有那麽的驚人，但還是有進步的