李宏毅機器學習課程筆記3:Backpropagation、"Hello world" of Deep Learning、Tips for Training DNN



臺灣大學李宏毅老師的機器學習課程是一份非常好的ML/DL入門資料,李宏毅老師將課程錄像上傳到了YouTube,地址:NTUEE ML 2016
這篇文章是學習本課程第7-9課所做的筆記和自己的理解。


Lecture 7: Backpropagation

神經網絡可能有百萬數量級的參數,爲了在梯度下降時有效地計算梯度,使用反向傳播。
BP
下面只考慮一筆data對參數的偏微分。

BP

根據鏈式法則, ∂C∂w=∂z∂w∂C∂z” role=”presentation” style=”position: relative;”>Cw=zwCz∂C∂w=∂z∂w∂C∂z 稱爲後向過程。

前向過程

前向過程:∂z∂wi=” role=”presentation” style=”position: relative;”>zwi=∂z∂wi=

後向過程

後向過程:根據鏈式法則, ∂C∂z=∂a∂z∂C∂a” role=”presentation” style=”position: relative;”>Cz=azCa∂C∂z=∂a∂z∂C∂a
BP
BP

從另一觀點看待上面的式子:有另外一個neuron(下圖中的三角形,表示乘法/放大器),input是∂C∂z′” role=”presentation” style=”position: relative;”>Cz∂C∂z′
BP

現在的問題是,如何計算∂C∂z′” role=”presentation” style=”position: relative;”>Cz∂C∂z′
第一種情況,z′,z″” role=”presentation” style=”position: relative;”>z,z′′z′,z″ 所接的neuron是output layer的neuron。
BP

第二種情況,z′,z″” role=”presentation” style=”position: relative;”>z,z′′z′,z″ 所接的neuron不是output layer的neuron。
BP

∂C∂z′=σ′(z′)[w5∂C∂za+w6∂C∂zb]” role=”presentation” style=”text-align: center; position: relative;”>Cz=σ(z)[w5Cza+w6Czb]∂C∂z′=σ′(z′)[w5∂C∂za+w6∂C∂zb]

實際上在做Backword Pass的時候,建立一個反向的neural network:
BP

總結

BP
梯度下降時需要計算每筆data的Cost對參數的偏微分∂C∂w” role=”presentation” style=”position: relative;”>Cw∂C∂w 只有一個所指的neuron。
鏈式法則將計算∂C∂w” role=”presentation” style=”position: relative;”>Cw∂C∂w 拆成前向過程與後向過程。
前向過程計算的是∂z∂w” role=”presentation” style=”position: relative;”>zw∂z∂w 相連的值。
後向過程計算的是∂C∂z” role=”presentation” style=”position: relative;”>Cz∂C∂z 所指neuron的input,計算結果通過從後至前遞歸得到。

Lecture 8: “Hello world” of deep learning

Deep Learning的三個步驟

Keras Step 1
使用Keras做MNIST手寫字符識別,第一步定義一個function set。

model = Sequential() 宣告一個model

Dense 代表全連接層

第一個隱層需要設置輸入維度、輸出維度,之後各層只需設置輸出維度

Keras Step 2
第二步,確定損失函數。圖上選的是交叉熵。

Keras Step 3
第三步,訓練。
adam可由機器自己設置學習率。
x_train 與 y_train 都是numpy array.

在已知標籤的測試集上測試,與在無標籤的測試集上測試:
testing

mini-batch 與 epoch

mini-batch與epoch的概念,注意每個batch中的examples都是隨機的:
mini-batch
如果batch_size = 1, 則爲SGD。
如果batch_size = # training data, 則爲(Full Batch) Gradient Descent.
Batch Size會影響訓練速度和訓練結果,需要tune。

以50000 examples爲例,
batch size = 1時,每個epoch更新50000次,用時166s;
batch size = 10時,每個epoch更新5000次,用時17s.
二者在170內都做~5W次更新,且batch size = 10時更穩定。
但是,GPU的平行計算有限度,不能把batch size開得太大。而且Full Batch容易陷入局部最優值。

這裏寫圖片描述
上面做一次矩陣乘法,和下面做一次矩陣乘法,GPU所花時間一樣。

有一招叫做Shuffle,在Keras中是默認的,意思是:在各個epoch中每個batch的組成是不一樣的。

分析結果

對第一個隱層的neuron,可將其weights排成image:
analysis
還有一種分析方法,每個隱層的output都是高維向量,將高維向量降維成二維平面上的點,並保持距離關係(在高維空間中遠,則在二維空間中也遠)。
analysis
可見,數字分得越來越開。最後的隱層的輸出就是得到的feature,分得很開。儘管最後的output layer是線性模型,也可以把數字都分開。

Lecture 9: Tips for Training DNN

明確流程

recipe

判斷overfitting需要看兩個數據集上的結果(training set → good, testing set → bad)。
在試圖解決overfitting之後仍要再看一下training set上的結果!

不能看見所有不好的performance都歸因到overfitting。如只看下右圖,不能斷言56-layer有overfitting,要看training set上的表現。根據下左圖,可以發現原因是train的時候沒有train好(也不能叫underfitting,underfitting:參數不夠多,模型能力不足)。
Not Well Train

對症下藥

在讀到deep learning的方法時,要思考該方法是解決什麼問題。是解決training set上的performance不好,還是解決testing set上的performance不好。比如,Dropout是爲了解決testing set上結果不好的問題,如果是training set上結果不好而用Dropout,不會有好的結果。
解決方法與對應的問題:
recipe

New activation function (for good results on training data)

MNIST手寫數字識別,激活函數用sigmoid,training data上的accuracy與層數的關係曲線:
這裏寫圖片描述
層數>7時,performance下降,原因不是overfitting! train的時候就沒train好。

梯度消失的問題:
vanishing gradient
用sigmoid會出現梯度消失的問題(參數的變化經過sigmoid會逐層衰減,對最後的loss影響很小),改用ReLU(計算快,相當於無數sigmoid疊加,解決梯度消失問題)。
ReLU輸出0或x,輸出0的ReLU神經元相當於不存在,網絡變得瘦長,但是整個網絡仍然是非線性的,只有當input改變十分微小的時候纔是線性的,因爲input不同,輸出爲0的ReLU神經元也不同。

ReLU是Maxout的特例,Maxout可以學出激活函數。
maxout

Adaptive Learning Rate (for good results on training data)

RMSProp

RMSProp
α” role=”presentation” style=”position: relative;”>αα 小,則傾向於相信新的gradient。

Momentum

Momentum

Adam

Adam

Early Stopping (for good results on testing data)

這裏的testing set指的是有label的testing set。
如果learning rate設得對的話,training set的loss會逐漸降低,而testing set與training set可能分佈不同,所以testing set的loss可能先降後升,這時就不要一直train下去,而是要在testing loss最小的地方停止train。這裏的testing set 實際指的是validation set。
early stopping

Regularization (for good results on testing data)

L2正則化

L2
L2正則化讓function更平滑,而bias與函數平滑程度沒有關係。

參數更新:
L2 update
正則化在NN中雖有用但不明顯。
NN參數初始值一般接近0,update參數即是要參數原理0。L2正則化(讓參數接近0)的作用可能與early stopping類似。

L1正則化

L1
L1 update的速度是|ηλ|” role=”presentation” style=”position: relative;”>|ηλ||ηλ| 很大,那麼改變量也很大)。
用L1做training,結果比較sparse,參數中有很多接近0的值,也有很多很大的值。
L2 learn的結果:參數值平均來講比較小。

Dropout (for good results on testing data)

dropout
input layer中每個element也算是一個neuron.
每次更新參數之前都要resample.
用dropout,在training上的結果會變差,但在testing上的結果會變好。

dropout
在testing的時候不做dropout,所有neuron都要用。
如果training時dropout rate = p%, 得參數a, 那麼testing時參數a要乘(1 - p%).

Dropout是ensemble的一種方式。
ensemble
一個複雜model, bias準,但variance大,把多個複雜model ensemble起來,variance變小。
每個dropout後的結構由一個batch來train,但是權重是共享的,每個權重是由多個batch 來train的。

ensemble
在testing的時候,把多個結構的結果取平均,與把所有參數乘以(1 - p%),效果是近似的。
Dropout用在ReLU、Maxout上效果較好。


李宏毅機器學習課程筆記

李宏毅機器學習課程筆記1:Regression、Error、Gradient Descent
李宏毅機器學習課程筆記2:Classification、Logistic Regression、Brief Introduction of Deep Learning
李宏毅機器學習課程筆記3:Backpropagation、”Hello world” of Deep Learning、Tips for Training DNN
李宏毅機器學習課程筆記4:CNN、Why Deep、Semi-supervised
李宏毅機器學習課程筆記5:Unsupervised Learning - Linear Methods、Word Embedding、Neighbor Embedding
李宏毅機器學習課程筆記6:Unsupervised Learning - Auto-encoder、PixelRNN、VAE、GAN
李宏毅機器學習課程筆記7:Transfer Learning、SVM、Structured Learning - Introduction
李宏毅機器學習課程筆記8:Structured Learning - Linear Model、Structured SVM、Sequence Labeling
李宏毅機器學習課程筆記9:Recurrent Neural Network
李宏毅機器學習課程筆記10:Ensemble、Deep Reinforcement Learning

文章轉載處:https://blog.csdn.net/xzy_thu/article/details/69680951

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章