# **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  # **Neural Network** ## **Concept** 把多個Logistic Regression前後connect在一起,然後把一個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,每個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)  **因為layer和layer之間,所有的neuron都是兩兩連接,所以它叫Fully connected的network;因為現在傳遞的方向是從layer 1->2->3,由後往前傳,所以它叫做Feedforward network** 那所謂的deep,是什麽意思呢?有很多層hidden layer,就叫做deep,具體的層數並沒有規定,現在只要是neural network base的方法,都被稱為Deep Learning,下圖是一些model使用的hidden layers層數舉例  你會發現使用了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:,而我們的input又是一個2*1的vector:,將w和x相乘,再加上bias的vector:,就可以得到這一層的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來加速它 ## **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  # **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突出極大值的意義所在)的那個數字,就是機器的預測值  在這個手寫字體識別的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**  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 ,得到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了  ## **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有什麽特殊的意義呢?  所以有人說,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傳統的方法,覺得沒有像其他領域一樣進步得那麽顯著(但還是有一些進步的) 長久而言,可能文字處理中會有一些隱藏的資訊是人自己也不知道的,所以讓機器自己去學這件事情,還是可以占到一些優勢,只是眼下它跟傳統方法的差異看起來並沒有那麽的驚人,但還是有進步的
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up