深度學習Paper系列(01):Deep Learning
Hello 各位大家好!我又開一個新的系列啦,其一是因為之前的機器學習_學習筆記系列寫滿100篇收尾了,其二是貝氏和機率機器學習系列發現後面用到很多Monte Carlo和Probabilistic Graphical Model的概念,本人功力不足還沒辦法寫得很完整。所以在這裡我打算先做一系列深度學習paper系列。
而這個系列最主要是受到toward data science和paper with code的啟發,所以想來寫一系列中文的深度學習筆記。所以對於這個系列,每一篇主要會針對一篇paper來講解。OK那我們就開始我們的第一篇吧!
今天我們要來講的是這篇 [1]
文章:Deep learning
作者:Yann LeCun, Yoshua Bengio & Geoffrey Hinton
相信不管是senior AI engineer還是AI researcher,看到這三位作者一定直接膜拜了。對於這三位科學家,他們可以說是深度學習領域的「pioneer」,還因此在2018年時獲得了「圖靈獎」。
對於深度學習,他可以應用在影像辨識、影像分類、影像分割、影像生成、時間序列、自然語言處理、文字生成、機器語言、機器翻譯、語意理解、推薦系統、生醫影像、財金工程等,可以說是只要你有data,都可以用深度學習幫你train出一個model。
不過這篇paper,他們最主要是review「那個時候」深度學習的發展和應用,沒錯!這篇paper是2015年發的,所以以那個時候來說,neural network架構的深度學習演算法是那個時候的潮流,但有在follow state-of-the-art的paper的朋友一定都知道,在2017年Google發了Attention is all you need之後,transformer開始大殺四方……。
回到這篇paper,其實在Neural Network被廣泛應用以前,大部分的科學家在做機器學習的時候,會花大量的時間在所謂的「feature engineering」,像是影像處理中,會做很多的filter、contract、erosion、denoise,計算材料會花很多時間在做分子中原子間的特徵,像庫倫作用力、鍵結、Gibbs Energy等,因為對於那個時候的機器學習來說,其最主要是著重在像是SVM、Decision Tree等這類的model。
但是對於影像和自然語言處理,其希望求出來的input-out function需要對一些多餘的資訊不敏感,像是分辨貓和狗中忽略旁邊的樹或建築物,辨識語意當中忽略連接詞等等。但對於傳統的機器學習模型,如果沒有做feature engineering把這些東西去掉,訓練時會很容易把這些資訊一起加進去,導致最後訓練結果效果很差。
不過對於深度學習,我們可以直接將資料丟進去,透過每一回training更新model裡面的參數,對於結果來說,其不但省去了很多特徵工程的時間,其準確率和效果也相較於傳統模型大幅的提升。
Supervised Learning
對於監督式學習當中,我們會先將資料集分成training set和testing set,前者拿來訓練model,後者拿來測試model,然後我們的目標就是learn出一個objective function,當我們的資料帶入這個function後output出來的結果和我們的答案差距越小越好。在訓練的過程中,model的參數回隨著每一輪迭代中更新。
而在更新得時候,我們會計算現今輸出結果和答案之間的gradient,並運用此gradient來更新我們參數,而這種更新的方法,在機器學習當中我們就把它叫做「gradient descent」。
不過對於傳統gradient descent的方法,在計算得時候他會拿所有的training set來計算gradient,對於資料量龐大時計算gradient會消耗非常多的計算資源。所以在訓練model的時候,我們通常會用Stochastic Gradient Descent (SGD),對於SGD,我們在計算gradient的時候,我們會從training set裡面隨機挑選一些樣本來計算,如此一來我們就可以減少大量的運算時間,且結果和使用gradient descent的結果幾乎一致。
Neural Network and Backpropagation
對於深度學習中最簡單的一種演算法「Neural Network」。我們可以看到每一層layer當中包含數個neurons,layer與layer之間由edges連接。
每個Neurons所做的事情,就是將上一層計算的結果,加總起來帶入activation function f,而activation function其可以為ReLu、Sigmoid、LeakyReLu、Softmax然後再將其輸出到下一層layer。而在此接受輸入的layer叫input layer、輸出結果的layer叫output layer、中間的layer叫做hidden layer。
而對於edge來說,每個edge上都有一個權重參數weight,所以上一層輸出的結果會乘上這個權重參數weight,再傳送到下一層layer。
所以由上圖中,當我們資料從neuron i輸入後,其會乘上權重w_ij傳送到neuron j。而所有傳送到neuron j的數據,neuron j會將其全部加起來,通過activation function的計算後,就會將其結果輸出到下一層layer,然後這之間一樣,其也會乘上權重w_jk,然後輸入到neuron k,neuron k再把所有輸入進來的數據加總起來通過activation function,之後依此類推直到數據傳送到output layer,最後由neuron l輸出結果。
不過說到為什麼deep learning會這麼成功,並成為圖靈獎的得獎項目,其關鍵點就在「Backpropagation」而backpropagation背後所用到的數學,其實就是我們大一微積分裡面所學的「chain rule」。
在上面我們有提到監督式學習當中,我們可以計算輸出結果和答案之間的gradient來更新現在的權重參數,但是因為每一層layer互相連接,所以我們不能單獨更新一個edge上的權重,要更新的話就要整組更新,所以這裡我們就需要用到backpropagation。
在上面那張圖中,我可以看到我們一開始會對E,也就是輸出結果的錯誤率,對輸出結果y_l來做微分,而這邊我們就可以利用chain rule來得出其數值,而neuron l計算出來的gradient會乘上權重w_kl,傳回上一層的neuron k,然後neuron k就會把下一層計算出來的gradient加總其來,其即就是E對neuron k輸出y_k微分的結果,然後一樣把結果乘上edge上的權重輸出到上一層layer的neuron j,後面一此類推,我們就可以得錯誤率對每一個neuron的微分,進而推算出每一個edge上權重的gradient來更新我們的權重。
最後我們就可以利用上述的方法,將資料輸入neural network算出輸出結果,接下來利用backpropagation,計算gradient更新所有權重,如此一來透過數次的迭代我們就可以得到我們最終離答案最接近的輸出結果。
History of Deep Learning
在這篇Review Paper當中,作者在這邊也有提到
In the late 1990s, neural nets and backpropagation were largely forsaken by the machine-learning community and ignored by the computer-vision and speech-recognition communities.
也就是在1990年代的時候,其實deep learning在電腦視覺和語音辨識的圈子裡被大大忽視,因為那時大家普遍認為用gradient descent,在找最佳解的時候,很容易找到的是local minima,而不是我們真正想要的global minima。
但是作者提出,在大型的neural network中,並不太會出現找到local minima的問題,只不過作者在這邊也沒有寫出為什麼local minima對deep learning不是一個大問題,其只在paper中只寫了一段
Recent theoretical and empirical results strongly suggest that local minima are not a serious issue in general.
也沒有附上citation。不過畢竟三位作者是deep learning始祖,所以這句話還是蠻有說服力的吧XD
結語
在這篇Paper中,其實除了基本的neural network之外,作者還有提到convolution neural network、recurrent neural network,以及如果我們今天data量很小,我們可以用pre-trained model來防止overfitting等等。但是這些東西之後的章節會介紹,所以這篇就姑且先不談了!
Reference
[1] LeCun, Y., Bengio, Y., & Hinton, G. (2015). Deep learning. nature, 521(7553), 436–444.