AI主要分為機器學習(Machine Learning)與深度學習(Deep Learning),機器學習的數學整理於前一篇,而深度學習的基本數學整理於此篇,取自於台大大神李弘毅之線上課程,並記錄一些筆記提供給未來的自己做參考。
[Deep Learning]
把多個Logistic Regression前後連接在一起,每個Logistic Regression就稱做neuron,所有neuron形成一個network。
neuron的連接方式決定了這個模型的structure,模型裏頭所有的參數如weight、bias全部集合起來,就是整個network的參數,用θ表示。
整個模型主要分成三個部分:
輸入層(input layer)
隱藏層(hidden layer)
輸出層(output layer)
其中,hidden layer又可以視為是一個feature extractor(特徵提取器)。 而output layer則可以視為是一個Multi-class classifier(多分類器) ,通常用 softmax。
決定一個模型的形狀(function set)是由三個元素組成: input dimension、output dimension、network structure
其中,決定network structure是整個deep learning的關鍵點。
所以,在做deep learning的時候,流程分為三步驟:
Step1. Build Neural Network
Step2. Goodness of function
Step3. Pick the best function
Step1. Build Neural Network
決定模型的structure,就決定了function set(model) ,接下來要做的就是從這個function set裏頭找出最好的function,當然也有可能找不到,因為structure設計得太爛
Step2. Goodness of function
定義一個function的好壞,分類問題裏頭,預測值跟真值之間的差值就用cross-entropy(交叉熵)去計算
Step3. Pick the best function
調整參數,使cross-entropy愈低愈好
做法是 把所有data的cross-entropy都做加總,得到一個total loss,接著透過Gradient Descent(梯度下降法)來找一組可以minimize這個total loss的最佳network parameters,用θ’表示 。
找到之後,這組network parameters對應到的function就是最終訓練好的模型。
[deep learning與machine learning的差異]
簡單來說就是,問題從如何extract features轉換成如何design network structure。
至於要用哪一個,取決於要解決的問題。
舉例來說,在做影像辨識或是語音辨識,因為人類難以表達我們怎麼分辨的,也就是不知道自己如何extract features,更遑論讓機器也學會,因此這個時候design network structure就比extract features來的容易許多。
[Backpropagation 反向傳播]
傳統的network是feedforward前饋式的架構,這個名詞是相對於Backpropagation。
在deep learning裏頭,計算Gradient Descent的微分方法其實就是Backpropagation。
在neuron network裏頭,參數相當龐大,要計算微分是比較費力的,所以如何有效地解微分就是Backpropagation在做的事情。簡單來說,Backpropagation就是一個求微分比較有效率的Gradient Descent。
過程就是chain-rule,詳細推導 參考此篇
[Tips for deep learning]
overfitting是指在訓練過程中表現很好,但測試的時候表現很差
所以在做deep learning的時候,要先檢查模型在訓練過程中是否表現優良,如果好,但是測試卻差才叫overfitting,而不是任何時候看到模型表現差都怪罪於overfitting。
檢查的SOP:
- training data上是否表現優良?
- YES: 下一步就test資料
- NO:
- 換新的activation function
- ReLU、Maxout
- 調整learning rate
- Adagrad、RMSProp、Momentum、Adam…
- 換新的activation function
- testing data上是否表現優良?
- YES: 可以apply to實際應用
- NO:
- Early Stopping
- Regularization
- Dropout
接著,細講每一個步驟:
1. 換新的activation function
主要是為了解決梯度消失(Vanishing gradient) 的問題。
梯度消失(Vanishing gradient):
梯度消失發生的原因是因為sigmoid函式會把大的input,壓縮成小的output。所以愈多層layer,梯度消失的問題愈嚴重。
第一種activation function: ReLU
ReLU在input<0的時候output會等於0,在input>0的時候output=input。
所以當拿掉所有output=0的neuron之後,整個network會變瘦長的linear network,linear的好處是output=input,不會像sigmoid一樣有梯度消失的問題。
第二種activation function: Maxout
行為類似於在每個layer上做max pooling,將原先幾個neuron的input按一定規則分組,再選取最大值作為這組neuron的output。
透過maxout可以產生ReLU,甚至更自由彈性的ReLU。
- 調整learning rate
Adagrad:
精神: 考慮不同參數wi在不同方向上的gradient大小,如果gradient比較小,代表比較平坦,則給他較大的learning rate,反之亦然。
缺點: 現實情況沒有那麼理想,可能平坦陡峭來回出現,必須快速的應對RMSProp:
精神: learning rate底下除的分母一樣是對所有的gradient進行平方和開根號,但多了一個α來調整對新舊gradient的相信程度。
缺點: 仍然無法解決卡在local minimum、saddle point、plateau的問題Momentum:
精神: 把慣性的概念引入,第二個時間點要走的方向是由第一個時間點移動的方向和gradient的反方向共同決定的。Adam:
精神: RMSProp+Momentum=Adam
Early Stopping
訓練過程中total loss會愈來愈小,但training data跟testing data的表現未必相同,所以應該以testing data為準,當testing data的loss最小的時候就停止。
這裡的testing data指的是validate用途的data,因為testing data是未知的。
Regularization
詳另一篇Dropout
在training的時候,每次update參數之前,都先對每個neuron做取樣(input layer也要),每個neuron都有P%機率被丟棄掉,當某個neuron被丟棄掉,則相連的weight也要丟棄掉。也就是說每次update參數都只保留network的某一部份來做訓練。
Dropout就是要讓training set上表現差,讓testing set上表現好
<注意> testing的時候不做dropout
dropout可以視為是一種終極的ensemble方法,每次training的時候都是拿一個minibatch來做一次update,而每個neuron都是drop或不drop,所以會有很多種組合來訓練。
當network很接近linaer的時候,dropout得到的表現會比較好,而這就是為什麼我們常常會把ReLU、Maxout的network拿來與Dropout配合使用,因為ReLU、Maxout也是接近於linear的。
參考
ML Lecture 6: Brief Introduction of Deep Learning
ML Lecture 7: Backpropagation