Try   HackMD

視訊串流與追蹤筆記整理

什麼是機器學習

機器學習就是讓機器能自動找到一個function

主要分成幾大類

  • 回歸(Regression)
    輸出是一個連續的數值,比如PM2.5數值預測。
  • 分類(Classification)
    輸出是一個離散的值。
    • Binary Classification 輸出 0或、Yes或No
    • Multi-Category Classification 輸出[1,2,3,…,N],比如圖像分類里判斷一張圖片是貓還是狗還是其他動物等
  • 生成(Generation)
    指讓機器學習如何創造/生成,產生有結構的複雜東西,比如生成翻譯、圖片等。

該如何提供機器學習的資料

通常在數據集當中存在特徵與標籤(label),透過使用 Loss function 判斷現在找到的函數好壞,Loss越小,函數越好。

以 AlpahGo 為例子解說

  • Supervised Learning
    我們需要為機器提供的數據就類似棋譜(如果現在棋局長這樣,那下一步我們該怎麽落棋最好)
  • Reinforcement Learning
    讓機器跟自己、別人下棋,把下棋之結果作為Reward,引導機器學習該怎麼下棋。
  • 無監督學習(Unsupervised Learning)
    只提供數據特徵,但不提供標籤。

如何選擇訓練模型

模型越複雜,在訓練集上的誤差越小,但在測試集上的誤差不一定越小。
因為當模型過於複雜時,越容易被數據影響,可能導致overfitting 的現象。

誤差主要又可分成兩大類

  • Bias: 使用相同模型在不同數據上所得到的函數是不同的,取這些函數的期望值與實際真實的函數的差距就稱為​ Bias
  • Variance: 使用相同模型在不同數據上所得到的函數不會是相同的,而函數之間的離散程度就稱為 Variance

Bias V.S Variance

越簡單的 Model , Bias 越大 Variance 越小
越難的 Model , Bias 越小 Variance 越大

Error 可來自 Bias 或 Variance

  • 若 Error 主要來自 Bias 則稱為 underfitting

    • 需要設計更複雜的模型
    • 在 input 中增加可能會造成影響的 feature
    • 增加訓練的疊代次數
    • 調整超參數 ( 修改模型架構 )
    • 如果有使用正規化 ( Regularization ) 可先將其移除
  • 若 Error 主要來自 Variance 則稱為 overfitting

    • 增加資料量
    • 如果沒有使用正規化 ( Regularization ) 可以將其加入
    • Early Stopping
    • 降低特徵維度
    • 調整超參數 ( 修改模型架構 )
    • 更換一個較為簡單的模型​

交叉驗證(Cross Validation)

在機器學習中,通常不能將全部的數據用於訓練模型,否則我們將沒有數據集可以用來評估模型的正確率。

The Validation Set Approach:
將數據集劃分成 Training Set 以及 Validation Set,只用部分的數據訓練模型,剩餘的用來檢驗模型正確性。缺點是依賴於訓練集和測試集的劃分方法。

Gradient Descent

Gradient Descent 可以降低 loss function 的值,loss function 越小,通常也代表更好的模型。

假設現在的模型 f 中只有一個參數 w ,則 Loss function 為 L(f)=L(w),梯度下降算法如下(若模型有多個參數,按照相同的方法更新各參數即可)

  • Step1 :初始化參數

    • 選取初始值
      w0
      w0
      並不一定是隨機選取),令
      w=w0
  • Step2 :計算梯度

    • dL(f)dw|w=w0
      ,也就是圖形在
      w0
      上的點對
      w
      做微分,判斷接下來參數該移動的方向,如果模型有多個參數,則計算Loss functuon 在各個參數方向上的偏微分
  • Step3 : 更新模型參數

    • w1=w0ηdL(f)dw|w=w0
      ,
      η
      為 Learning Rate

w 的變化量取決於梯度和學習率(Learning Rate)的大小:梯度絕對值或學習率越大,則 w 變化量越大,接著反覆迭代 Step2 與 Step3 可以使 Loss function 的值達到局部最小值。

如果模型有多個參數,用 Step2 計算出的各項偏微分更新對應之參數,並且反覆迭代 Step2 與 Step3。

優點:

    1. 梯度是在全部的數據上計算出來的,因此每次迭代都是朝著整體的最優化方向進行更新。

缺點:

    1. 每更新一次參數,就要遍歷全部數據集,計算起來非常慢。
    1. 容易陷入局部極小值點,因為在極小值點(鞍點)梯度為0,所以參數不會更新。

Stochastic Gradient Descent

普通梯度下降中(BGD)需要計算所有樣本的Loss值再進行梯度下降,而 SGD 隨機選擇計算一個樣本的 Loss 值,就進行梯度下降

優點:

    1. 與 BGD 相比,更新參數速度較快。
    1. 與 BGD 相比,SGD可能會跳出局部極小值點,因為在極小值(鞍點)的時候它計算梯度是隨機選擇的一個樣本,這個梯度未必是0。

缺點:

    1. SGD 每次的更新並不是向著整體最優化方向,速度快,但準確度可能下降,找的並非全局最優解。

Mini-Batch Gradient Descent

MBGD每次使用一部份的數據更新,是 BGD 和 SGD 的一個折衷。

缺點:

    1. 不能保證很好的收斂性,依賴學習率。如果學習率太小,收斂慢,如果太大就會在極小值附近震蕩。
    1. 要如何選擇 batch-size 的大小仍是個不好判斷的議題

Adaptive Learning Rate

梯度下降的過程中,學習率如果一直是個定值其實不合理,我們應該在初始時學習率較大,找到局部極值時再縮小學習率
比如:

ηt=ηt1
但更好的方法其實是讓每個參數擁有各自的學習率,比如 Adagrad

分類問題

假設有兩個不同的類別 A 和 B ,要判斷 input 屬於哪種類別,可以將此分類問題看成計算 input 屬於該類別的機率,因此我們將分類問題看成了機率計算的問題。

給定一隻烏龜找他的屬性分類,我們在水系的神奇寶貝訓練集分佈中雖然找不到烏龜的這個點,但這不代表水系中沒有這隻烏龜。
下圖中的藍色點代表訓練集,但訓練集並不代表整體的水系神奇寶貝,因為水系神奇寶貝可能有好幾千隻,但我們的資料只有部份神奇寶貝。
我們假定我們的樣本屬於常態分佈(Gaussian distribution),因此要計算烏龜屬於水系的常態分佈的機率是否高於其他系的機率,是的話則將其歸類在水系。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

常態分佈的公式又可被2個參數影響,分別是 Mean(常態分布的中心位置)和 Covariance Matrix(常態分布的離散程度)
我們試圖特定之 Mean 以及 Covariance Matrix 使訓練集特徵機率達到最大的常態分佈(Maximum likelihood)

每個類別的特徵符合一個常態分布,每個常態分布也有不同的Mean 和 Covariance Matrix,通常我們會讓每個類別對應的常態分布共享一個 Covariance Matrix(由各別 Covariance Matrix 對樣本數做加權平均和),這樣可以有效減少模型的參數,緩解 overfitting 的現象。

使用常態分佈以及共用 Covariance Matrix 可以得到一個結論

P(C1|x)=σ(z)=11+ez , sigmoid function

z=i=1Nwixi+b

詳細推導的過程請觀看線上影片時長59分以後的部份 Classification

Logistic Regression

邏輯迴歸是用來處理二分類問題,目標是找到一條直線可以將資料做分類。主要是利用 sigmoid function 將輸出轉換成 0~1 的值,表示可能為這個類別的機率值。而線性迴歸是用來預測一個連續的值,目標是想找一條直線可以逼近真實的資料

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

假設訓練集如下圖所示,有2個類別

C1
C2
Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

從模型

fw,b(x)=Pw,b(C1|x) 取樣得到訓練集的機率為
L(w,b)=fw,b(x1)fw,b(x2)(1fw,b(x3))...fw,b(xN)

我們想求得

w,
b
兩個參數 使得
L(w,b)
之機率為最高 , 也就是
arg
maxw,bL(w,b)
,這也相當於求
arg
minxw,blnL(w,b)

lnL(w,b)=lnfw,b(x1)lnfw,b(x2)ln(1fw,b(x3))....

其中

lnfw,b(xn)=y^lnfw,b(xn)+(1y^)ln(1fw,b(xn))

因此

lnL(w,b))=n=1N[y^lnfw,b(xn)+(1y^)ln(1fw,b(xn))]

Entropy

當我們使用二進位來表達一個事件的狀態時,假設一個城市有 8 種不同的天氣狀況 , 我們需要使用至少 3 個 bits 來表達狀況 , 假設事件機率是均等的 , 即

P=0.125
我們所需要的 bit 數之公式為
log2P

從這個公式我們可以發現 ,當事件機率發生越高時,我們所需要的 bit 數越少 ,這代表的是 低機率事件我們需要用更多的 bit 去表示(低機率事件需要更多的資訊量去傳達隱含的資訊)。

Entropy 即為表達事件所需要的平均 bit 數,公式為

Entropy=P(i)log2P(i)

Cross-Entropy

Cross-entropy 用意是在觀測預測的機率分佈與實際機率分布的誤差範圍 ,如上面所述,當我們的預測值與實際值差的越多,代表內涵的資訊量愈大,也就是不確定的因素越多, Cross-entropy 會越高,而我們要所要找的是 Cross-Entropy 越低的結果。
這個結論也等價於 loss function 的結論 ,找到預測與實際誤差最小的函數, 所以在分類問題上,我們可以將 Cross-Entropy 當成 loss function。

公式如下:

P : true distribution
Q : predicted distribution

H(p,q)=P(i)log2Q(i)

Loss 與 Cross-Entropy 之關係

模型

fw,b(x)=Pw,b(C1|x) 想求得
w
,
b
兩個參數 , 使得
L(w,b)
之機率為最高的這個問題 等價於
arg
minxw,blnL(w,b)

lnL(w,b))=n=1N[y^lnfw,b(xn)+(1y^)ln(1fw,b(xn))]

又恰好等價於有兩個 Bernoulli distribution

p
q

p
中有
p(x=1)=yn^
,
p(x=0)=1yn^

q
中有
q(x=1)=f(xn)
,
q(x=0)=1f(xn)

p 跟 q 的 Cross-Entropy

當我們對

lnL(w,b)wi=n=1N(ynfw,b(xn)^)(xin) (推導過程省略)

梯度更新為 :

wi+1=wiηn=1N(ynfw,b(xn)^)(xin)

更新的步伐跟學習率 ,實際值與預測值之差距以及input 有關係。

為什麽 Logistic Regression model 中的 Loss function 不使用 Square Error

如上圖所示 , 當選取的點離目標太遙遠或是很接近時,參數更新速度過於緩慢或是不更新。

下圖為比較兩種不同 Loss fuction 的的曲線圖。

Multi-Class Classification

不能把 多種類別的 Classification 問題用 Logistic regression​ 的方式處理

比如: 數字1 , 2 ,3 分別當作三個不同的 class

機器會以為 3跟2 這兩個類別 比 3跟1 這兩個類別更接近,但實際上有可能根本不存在這種關係。

Softmax

可以看出 softmax 類似於 normalization , 但 softmax 做的是使值較大的更好被辨識。

binary-class 分類時 使用 sigmoid function
Multi-class 分類時使用 softmax

邏輯回歸的限制

如下圖所示,假如有2個類別,數據集中有4個樣本,每個樣本有2維特徵,將這4個樣本畫在圖上。

我們無法在當前的圖上使用邏輯回歸找到一條將兩種 class 區分開來的 boundry,那我們可以怎麽辦呢?
我們可以嘗試 Feature Transformation

我們可以把原始的數據/特徵轉換到另外一個空間,在這個新的特徵空間中,找到一條 boundry 將不同類別區隔開。

但並不是每次做 Feature Transformation 都很好找到轉換的方法,我們並不一定知道怎麽進行特徵變換,於是我們想讓機器自己學會進行特徵變換,這可以通過 cascade 多個邏輯回歸模型實現,即把多個邏輯回歸模型連接起來。

我們將上圖中每一個邏輯回歸模型稱做神經元(Neuron),多個Neuron形成一個神經網絡(Neuron network)

神經網絡

結構

  • 輸入層(Input Layer)
  • 隱藏層(Hidden Layers)
    • 輸入層和輸出層之間的層。Deep指有很多隱藏層,多少層才稱為"Deep"並沒有一個明確的標準,我們可以將 Hidden Layers 可以看成特徵提取器(Feature Extractor),作用是替代特徵工程(Feature Engineering)。
  • 輸出層(Output Layer)
    • 可以看成分類器

  • 機器學習中,人類需要手工做特徵工程(Feature Engineering),人類需要思考如何提取特征。
  • 深度學習中,人類可以不做特徵工程,但遇到新的問題:如何設計一個合適的神經網絡結構。

有些問題適合用機器學習 , 有些適合用深度學習 ,端看你想處理什麼問題。

給定 Layer層數 , 以及各層 Layer 有幾個 neuron 就相當於決定 function set , 而決定一個好的 function set 很重要。

激活函數

激活函數可以分為線性激活函數(線性方程控制輸入到輸出的映射,如f(x)=x等)以及非線性激活函數(非線性方程控制輸入到輸出的映射,比如Sigmoid、Tanh、ReLU等)

因為神經網絡中每一層的輸入輸出都是一個線性求和的過程,下一層的輸出只是承接了上一層輸入函數的線性變換,所以如果沒有激活函數,那麽無論你構造的神經網絡多麽複雜,有多少層,最後的輸出都是輸入的線性組合,純粹的線性組合並不能夠解決更為覆雜的問題。而引入激活函數之後,我們會發現常見的激活函數都是非線性的,因此也會給神經元引入非線性元素,使得神經網絡可以逼近其他的任何非線性函數,這樣可以使得神經網絡應用到更多非線性模型中

神經網絡訓練問題(DNN)

在深度學習中,一般有兩種問題:

  • 在訓練集上性能不好
    • 修改神經網絡架構,比如換成更好的激活函數,因為sigmoid函數會導致梯度消失,可以換成ReLU、Leaky ReLU、Parametric ReLU、Maxout等方法。
    • 有關激活函數可以參照此文 激活函數
    • 調整學習率,比如RMSProp、Momentum、Adam
    • 有關調整學習率可以參照此文 調整學習率
  • 在測試集上性能不好
    • Early Stopping
      • 如果學習率調整得較好,隨著迭代次數增加,神經網絡在訓練集上的loss會越來越小,但因為驗證集(Validation set)和訓練集不完全一樣,所以神經網絡在驗證集上的loss可能不降反升,所以我們應該在神經網絡在驗證集上loss最小時停止訓練
    • Regularization
      • 比較不常用
    • dropout

當深度學習中有一個新的方法被提出時,它往往是針對這兩個問題其中之一進行改善。

Backpropagation

由於在神經網路中要更新梯度的參數量過於龐大,我們用了一個更有效的梯度下降方式,也就是Backpropagation

如下圖所示,

z=x1w1+x2w2+b,根據 chain rule 可知
CW=ZWCZ
,其中
ZW
為 Forward Pass、
CZ
為Backward Pass

Forward Pass

由於

z=x1w1+x2w2+b,每個 weight 計算出來的 Forward Pass 值 = 上一層 layer 的輸出值

Backward Pass

CZ 為Backward Pass,從下圖中我們可以發現 Backward Pass 還跟下一層layer 的 Backward Pass 有關係

仔細區分還可區分成 2種 case

  • 下一層為 Output layer
  • 下一層不為 Output layer

輸出層的

CZ" 可輕易求得

如果下一層不為 Output layer,則我們遞迴前進直到下一層為 Output layer

當我們從後面往前面算完之後,即可求出

CZ

有了

ZW 也有了
CZ
即可求得我們想要的梯度

CNN

常常被用來做圖像處理

常見的圖片性質

  • Some patterns are much smaller than the whole image
    • 在識別某個 pattern時,神經元並不需要圖片的所有像素點,對於一張人類全身照的圖片,我們只需要看到頭部而非整張圖片就可以判斷它是一個人臉
  • The same patterns appear in different regions
    • 人臉可以在圖片的中間區域,也可以在圖片的某個角落區域,所以識別不同區域中的相同 pattern 的多個分類器(或detector)應該用同一組參數或者共享參數
  • Subsampling the pixels will not change the object
    • 將圖片縮小並不會影響我們理解圖片,所以我們可以通過將圖片變小,進而用更少的參數處理圖片

CNN 架構說明

圖片經過 convolution layer 然後再進行 max pooling,這個步驟可以進行多次;之後將數據展開(Flatten),再將展開的數據傳進 Fully Connected Feedforward network 得到最後的圖片分類結果

Convolution


以上圖說明, network 的 input 是一張 6x6 的黑白圖片,所以每個 pixel 可以用 0 or 1 表達

上圖中的 filter 是 3x3 的 size,意味著他在偵測一個 3*3 的 pattern,偵測過程中,並不會去看整張 image,而是只看部份的圖片中的 pixel,並判斷某一個 pattern 有沒有出現

Fliter 其實就是一個 matrix ,matrix 中的每一個 element,就跟 neuron 的 weight 和 bias 一樣 需要通過 training data 學習出來的,而不是人去設計的

所以每個 Fliter 裡面的值是甚麼,要做什麼事情,都是學習出來的成果

從圖片的左上角開始進行 convolution , 每次向右移動一個距離,這個距離就叫做 stride ,由你自己設定,每次filter 停下來的時候就跟對應的 filter size pixel matrix 做一個內積

觀察上圖的 filter 1 ,它的斜對角是 1,1,1,所以這個fliter 的工作就是找出有沒有連續的從左上角到右下角的1,1,1 出現在這個image中, 檢測到的結果已在上左圖用藍色標示出來,此時 fliter 在左上和左下得到最大的值,也就是說該 fliter 所要偵測的 pattern 出現在 image 的左上角和左下角

Feature map


在一個 convolution 的layer裡面,會有一堆 filter ,每一個 filter 做完會得到一個 4x4 matrix,將所有的 filter 做完之後,就會得到很多個 4*4matrix,將這些matrix 合起來,就叫做 Feature Map

CNN 對不同 scale 的相同 pattern 在處理上存在一定的困難,因為現在每一個 filter size都是一樣的,如果有同一個pattern,它有不同的size,CNN並不能夠自動處理這個問題

Convolution vs Fully Connected


比照 fully connected 的 neuron 是必須連接到所有36個 input 上的,但是我們現在只用連接 9 個 input ,因為我們知道要 detect 一個 pattern,不用看整張 image,看 9 個 input pixel 就夠了,所以當我們這麼做的時候,就用了比較少的參數

Max pooling


根據 filter 1,我們得到一個 4x4 的 matrix,根據filter2,你得到另外一個 4x4 的 matrix,接下來,我們要做什麼事呢?

我們把 output 四個分為一組,每一組裡面通過選取平均值或最大值的方式,把原來 4 個value合成一個 value,這件事情相當於在image每相鄰的四塊區域內都挑出一塊來檢測,這種subsampling 的方式就可以讓你的 image 縮小!

Convolution + Max pooling

做完一次 convolution 加一次 max pooling,我們就把原來 6x6 的image,變成了一個 2x2的 image;至於這個2x2的 image ,它每一個 pixel 的深度,也就是每一個 pixel 用幾個 value 來表示,取決於你有幾個 filter,也就是說filter 數量代表深度多深。
新的比較小的 image,它表示的是不同區域上提取到的特徵,實際上不同的 filter 檢測的是該 image 同一區域上的不同特徵屬性,所以每一層 channel (通道)代表的是一種屬性,一塊區域有一種不同的屬性,就有一層不同的channel,對應的就會有一個不同的filter對其進行 convolution 操作。

Flatten

Normalization

在訓練過程中,隨著網絡加深,分布逐漸發生變動,導致整體分布逐漸往激活函數(e.g sigmoid)的飽和區間移動,從而反向傳播時底層出現梯度消失,也就是收斂越來越慢的原因。

而Normalization則是把分布強行拉回到均值為0方差為1的標準正態分布,使得激活輸入值落在非線性函數對輸入比較敏感的區域,這樣輸入的小變化就會導致損失函數較大的變化,避免梯度消失問題產生,加速收斂。

Batch Normalization

BN 是針對 batch 去做計算 隱式的默認每個 batch 間的分布是大致相同的的,當batch size足夠大時,每個 mini-batch 可以較好地反映真實數據的分布;但是,若batch size較小,每個mini-batch 就無法反映所有數據的真實分布,因此,BN 操作對batch size的選擇有較高的要求。

BN , LN ,IN ,GN 差異請點選此文

常見 CNN

GoogLeNet

ResNet

  • 提出 Residual net 使很深的模型效能上升

SENet

  • 預測 channel 的重要性

DenseNet

  • 是前面所有層與後面層的密集連接(dense connection)。DenseNet的特色是通過特徵在channel上的連接來實現特徵重用(feature reuse)

MobileNet

  • 使 convolution 計算量減少

3-2 Object detection and localization

傳統的物件偵測

  • sliding windows 的運算量太大

OverFeat 論文提出的改善

  • 使用 卷積層 取代 FC 層 , 使用卷積化的方式實作 Sliding Windows (可共用大量運算)
  • 缺點:邊界框(Bounding Box)的位置並不會太準確

使用 Region proposal 抓取可能有物體存在的區塊 (Selective Search) 再送入神經網路中

RCNN

  • 對 2000 個 region 進行特徵提取 , 計算量整體還是偏多

SPPnet

  • 對於最後一層卷積層的輸出pooling一下,但是這個pooling窗口的尺寸及步伐設置為相對值,也就是輸出尺寸的一個比例值,這樣對於任意輸入經過這層後都能得到一個固定的輸出
  • 輸入不需要放縮到指定大小,增加了一個池化層,還有最重要的一點是每幅圖片只需要提取一次特徵
  • SPP也需要訓練CNN提取特徵,然後訓練SVM分類這些特徵。需要巨大的存儲空間,並且分開訓練也很複雜。而且selective search的方法提取特徵是在CPU上進行的,相對於GPU來說還是比較慢的

Fast RCNN

  • SoftMax 取代 SVM 識別檢測全部放到了卷積神經網絡的框架里面,速度快,美中不足的是,區域建議網絡還是Selective Search,網絡其他部分都能在GPU中運行,而這部分需要在CPU中運行

Faster RCNN

  • 將 Region proposal放入 CNN 中

上述提及的方法皆為 two-stage