參考資料

Nerual Network

主要參考:- ML Lecture 6: Brief Introduction of Deep Learning


  • 每個 neuron 都有一組 weight 跟 bias,下一個neuron = 上一個 neuron 連到的線中,進行運算以上圖為例 11+(-1)(-2) 再加上 bias 1 進行 sigmoid function 得到數值。
  • 就是把 input * weight + bias 進行 activation function (ex. sigmoid ),得到 output,然後再進行下一層的運算。
  • 如果你知道當下 nerual network 當下計算出結果的所有 weight 和 bias ,一個neuron 就像是一個function一樣提供了weight跟bias,而梯度下降就是在多組 function set中找到最佳的那組 function。

Goal

  • 透過 Cross Entropy 來看預測的結果跟實際的結果有多接近,越大表示差越多,越小表示差越少。
  • Loss function 就是把所有的 Cross Entropy 加起來,就是我們要最小化的目標

  • 找到一個 function in function set,讓 Loss function 最小化,就是我們要找的 function。
  • 找到的過程就是透過 梯度下降法 (Gradient Descent) 來找到 network parameters θ (weight, bias) 的最佳解。

hidden layer

  • 一個 layer 就是把 input * metrix + bias 通過 activation function (ex. sigmoid funciton)得到最後的結果

output layer

  • 又稱 Multi-class Classifier ,因為output layer是把前一個layer ouput當作feature,他不是直接使用原始的input(x),而是經過很多hidden layer很多複雜轉換後抽出一組最好的feature。
  • Multi-Class Classifier 要通過一個 Softmax function,把每個類別的機率加起來等於1,然後取最大的機率當作預測的類別。

決定的參數

  • 要決定整個network的structure,決定你的function set長什麼樣子
    • 幾個 layer ?
    • 每個 layer 有幾個 node (neuron) ?
    • 可不可以自己決定 nerual 要使用的 input 自己串?=> 可以,使用CNN

Epoch, Batch size, Iteration

主要參考:- Epoch, Batch size, Iteration, Learning Rate

  • Epoch

    • 字面:直接翻譯又稱「時代」或「時期」的意思,但是在神經網路上類似「期」。
    • 意思:表示在訓練過程中,所有的訓練資丟入神經網路進行一次訓練,稱為一個 Epoch
    • 例子:如果有一個資料集10筆資料,這時筆資料丟入神經網路後進行一次訓練表示完成 1 個 Epoch 的訓練。
  • Batch size

    • 字面:批次大小
    • 意思:如果資料量太大,例如有100萬筆,但是因為 memory 無法一次放入這麼多資料,就可以透過調整batch size分批把資料放入。
    • 例子:假設有100萬筆資料,batch size設定為1000,那麼一個 epoch 就要訓練 1000 次 才能完成。
    • 補充:
      • batch size 越大,因為考慮較多參數,進行梯度下降時修正的方向較為準確,雖然每次iteration計算較久,但是調整方向的次數較少,Epoch可以不用很大。
      • 相反的batch size 越小,Batch size = 1 又稱 Incremental mode,因為一次 iteration 只需算一筆資料,所以權重會配頻繁更新導致方向不太準確,因此 Epoch 要設定大一點,才能讓權重更新的次數多一點,以找到最佳解。
    • 總結:
      • 我可以用較大的 Batch size 搭配較大的 η,那結果可能是不用那麼多的 Epoch 就能達到我的期望。
  • Iteration

    • 字面:迭代
    • 意思:因為資料量太大,我們需要透過 batch 的方式將資料送進神經網路,在程式語言上會需要透過迴圈進行迭代才能將所有資料批次送入訓練,已完成一次Epoch。
    • 例子:假設有100萬筆資料,batch size設定為1000,那麼一個 epoch 就要金行 1000 次 的迭代才能完成。

Data set size = Iteration * Batch size * (1 Epoch)
100 萬 = 1000 次 * 1000 批次 = 1 Epoch

Iteration = (Data set size / Batch size) * (n Epoch)
如果決定使用Batch size = 1000,訓練5個Epoch總共要迭代幾次?
Ans: 100萬/1000 * 5 = 5000次

Learning Rate

在進行「梯度下降」(Gradient Descent)時,每次計算誤差後會做偏微分來更新權重,更新的程度會由 ∇E(Gradient)乘上一個「 η(Learning rate)」來決定,目的就是為了讓更新的幅度不要太大或太小,讓每次更新 weight, bias 尋找最小的 Loss 時,移動至下一組(weight, bias)的幅度。


(左圖)learning rate的變化:

  • 如果learning rate很低,那Loss value會呈現 linear
  • 如果learning rate高,則是會呈現 exponential
  • learning rate 過高 可能會卡在比較糟的 loss value (green line)因為優化過程中「能量」過多,參數亂跳,導致無法在優化領域(optimization landscape)找到一個好的位置。

(右圖)the amount of wiggle (擺動) 與 batch size 有關:

  • 如果batch size很大,那wiggle就會很小,因為每次更新的方向都會比較準確,除非learning rate設定太高。
  • 相反的,如果batch size很小,那wiggle就會很大

我可以用較大的 Batch size 搭配較大的 η,那結果可能是不用那麼多的 Epoch 就能達到我的期望。
相對的,如果我想用Batch size = 1的條件下去訓練,那可能就要配置較小的 η ,才不會在接近 Minima 的時候來回走動,也就不用走太多冤枉路。但也因為 η 較小,我可能就需要比較多的 Epoch 才會走到 Minima。

Adagrad

  • 現在每個 parameters 都有自己的 learning rate,把 learning rate 除以過去所有 gradient 的平方和,得到新的parameters。
  • 如果平時 Gradient 比較陡峭,那給予小的 Learning Rate。相反的,如果平時 Gradient 比較平緩,那給予大的 Learning Rate。

RMSProp

但是如果今天平時處理的問題可能比較複雜,怎麼辦?如下圖
你可以方向在水平直線的地方,一下 gradient 大,一下 gradient 小,所以我們要能夠更 dynamic 的調整 learning rate。因此有了 RMSProp。

  • 第一個時間點:把 learning rate 除以一個值 sigma,這個 sigma 就是第一次算出來的 gradient。
  • 第二個時間點:新的sigma就是"原本sigma值平方"乘上"a",再加上"新的gradient值平方"乘上"1-a",這個"a"可以自由去調整。這樣就可以讓 sigma 有一個平滑的效果。

與原本的 Adagrad 相比,RMSProp 因為都會把每次的 gradient 參考進去導致有一個平滑的效果,也可以隨著gradient改變的大小,動態調整 learning rate 的大小,讓 learning rate 更加的動態。

Gradient Descent


我們先很快地複習一下一般的 Gradient Descent 是怎麼做的:

  • 選一個初始的值並計算一下它的 gradient,假設它的 gradient 是左上角紅色箭頭的方向,那我們就走 gradient 的反方向乘上一個 learning rate,再算 gradient 之後再走一個新的方向,以此類推。
  • 直到 gradient = 0 的時候,或 gradient 趨近 0 的時候就停止。

momentum

他是一個可以幫助我們跳出local minimum的方法。參考慣性的概念,讓每次更新時多跑一點。

  • 在進行Gradient Descent的時候,可能會碰到 local minimum 的問題
  • 但是有一個方法可以幫助我們跳出 local minimum,就是使用 momentum。
    • 這個概念有點像是在真實世界裡面,把一個球從上圖的左上角讓它滾下來,在球滾到 plateau 的地方時,因為有慣性,所以它不會停下來,而是會繼續往前。
    • 就算是走到上坡的地方,假設這個坡沒有很陡,因為慣性的關係,可能還是可以翻過這個山坡,結果它就走到了比這個 local minimum 還要好的地方。

所以我們就把這個慣性的特性加到 Gradient Descent 裡面去,這就叫做 momentum,他就是上一個時間點的 movement。


  • 綠色線條是慣性,紅色是 gradient 的方向,把這兩個方向加起來,就是我們要走的方向。
  • 再看Momentum in graph,你可以發現在最後一個地方(最右邊處),如果今天球的gradient < momentum 時,可能可以讓球跳出 local minimum。

  • v 是之前所有 gradient 的總和,而 v 會乘上一個 momentum 的值,然後再加上現在的 gradient,這樣就可以讓我們的 gradient 有一個慣性的效果,讓它可以跳出 local minimum。
  • 你會發現,v1 是由 v0 * lemda 所組成,如果lemda < 0,則越早之前的移動影響越小。
  • 每一次的移動都會參考之前的移動,但是之前的移動會越來越小,這樣就可以讓我們的移動不會太大,也不會太小,而是一個適中的值。

Adam

就是 RMSProp + Momentum = 動態調整 Learning Rate + 添加一點「慣性」

  • m0 是前一個時間點的movement
  • v0 之前算出來gradient的平方和
  • gt 是現在的gradient
  • mt 根據 gt 計算出來現在要走的方向,這其中考慮了「現在要走的方向」+ 「之前的方向」
  • vt 準備放在分母的地方,他是過去前一個時間點的vt,加上 gradient 的平方開根號。
  • bias correction: 他把 mt 跟 vt 個除上一個值,1減這個值,而這個值到最後會越接近1。
  • 最後 update 時把 momentum 「建議的方向 mt hat」 乘上 「learning rate: a」除以「RMSProp Normalze 的Learning Rate」

Batch Gradient Descent (Batch GD)

  • Ref: AI老師的投影片 2023-WS_AI_VL-01b-Recap-Neural-Networks.pdf

批次梯度下降的主要特點是它將訓練數據拆分成批次,這降低了內存需求,並使算法更適合大型數據集。但它可能會導致較多的迭代次數,因為每次迭代僅考慮一個小批次的數據。

和一般的GD差異在於,梯度下降在每次迭代中使用整個訓練數據集,而批次梯度下降僅使用一個小批次的數據

Stochastic Gradient Descent (SGD)

  • 作法:每次迭代中僅使用單個訓練樣本來計算梯度,然後更新模型參數。這導致每次迭代的梯度估計都是隨機的。
  • 優點:SGD的主要優點是對記憶體要求較低,對大型數據集適用,並且可能幫助模型逃離局部極小值。
  • 缺點:但它可能需要更多的迭代才能收斂,且更新不太穩定。

Mini-batch Gradient Descent (Mini-batch GD)

  • 作法:小批次梯度下降通常是最常用的優化算法。它在每次迭代中使用一個小批次(batch)的訓練數據來計算梯度,然後更新模型參數。這樣既降低了內存需求,又提供了相對穩定的梯度估計。
  • 優點:因為它兼具SGD和標準梯度下降的優勢。它可以在大型數據集上工作,提供相對穩定的梯度估計,並在收斂速度和計算效率之間取得良好的平衡

Back Propagation

他是一種優化神經網路的方法,名稱為Back Propagation,可以想像就是能更快的執行梯度下降 Gradient Descent,透過 forward pooling 導數的後向傳遞:先計算輸出層對應的loss,然後將loss以導數的形式不斷向上一層網路傳遞,修正對應的參數,達到降低loss的目的。

詳細可以參考 ML Lecture 7: Backporpagation

但是,Sigmoid函數在深度網路中常常會導致導數逐漸變成0,使得參數無法被更新,神經網路無法被最佳化。因此,現在常用的激活函數是ReLU,它的導數在正數部分恆為1,因此不會有上述問題。

Loss of classification

  • Cross Entropy 比較容易透過梯度下降找到最小 loss 但是如果使用 MSE (Mean Square Error)會比較難找到最小 loss,可能會卡住。

Activation Function

其實Activation Function就是在經歷每一層 hidden layer 經過非線性的activation function,傳入到下一層神經元繼續往下傳遞,如此循環往復,直到輸出層。,讓神經網路可以抓取複雜的pattern。

Sigmoid

  • 左邊是微分前,右邊是微分後。
  • 適用於二分類問題,或是多標籤分類問題(每個標籤“是”或“否”)。
  • 輸出範圍介於[0,1]之間,因此通常使用的時機為二元分類問題的輸出層,例如>=0.5的話為“是”否則為“否”。
  • 問題:
    • Vanishing Gradient Problem: 執行 back Propagation的時候,因為 sigmoid 微分的值都是 < 1,最大值頂多 0.25,會導致在 train network 從後面的 layer 往 input 靠近的 layer,靠近 input 的 weight update 的量比較小,使得參數無法被更新,神經網路無法被最佳化,相對地靠近 output 的 weight 每次 update 比較大,學得比較快。
    • 因此接近 input 的 weight 還是跟 random 差不多,但是後面的 weight 會差異很多。這樣會導致整個 network 的 weight update 很不平均,很難找到最佳解
    • 因此使用sigmoid function時反而不能有太多layer,這會導致靠近input的layer對loss的影響很小。

ReLU

  • input < 0 就是 0 ,input > 0 就是 input
  • 這個東西可以微分,但是 input = 0 時是不可微分的,所以在 input = 0 時,我們就隨便給一個數字,例如 0.5 。

Why need ReLU?

  • Fast to compute : 計算比較快,只要check input 大於小於 0 會比 sigmoid 快很多。
  • Biological reason : 人腦神經只能傳遞正值,負值會被忽略,所以 ReLU 比較符合人腦神經的運作方式。sigmoid input = 0 的地方,output = 0.5 很奇怪
  • no vanishing gradient problem:
    • ReLU 微分不是 0 就是 1,output 是 0 的可以想像他是不存在,當我們把output是0的neuron,剩下的又是input=ouput都是linear時,這整個就像a thinner linear network)。
    • 這導致不會有activation function 遞減的問題。
    • input 就直接是 output ,因此如果調整底層 input 的變化就是 output 的變化每通過一個 layer 每個 layer 的變化量不會有縮減,每層 layer 的影響力都是一樣的,這樣就不會有 vanishing gradient problem。這樣就可以把network重疊的更深。

Problem of ReLU?

  • 問題:
    • Q1: 變成linear,這個 network 會很弱嗎,因為不是 non-linear function?
      • Ans: 如果對 input 做比較大的改變時,導致改變operational region時,他就變成non-learn。
    • Q2: 可以微分嗎,因為input < 0的時候,output是0導致無法updata參數?
      • Ans: 可以使用 leaky ReLU。或是透過使用 softplus 解決、或使用 initialize with large bias 解決。但是基本上是 0 的機率比較小,所以問題不會太大。

Leaky / Parametric ReLU


Leaky ReLU就是在input < 0的時候,output不是0,而是乘上一個很小的數字,例如0.01。

為什麼input不能<0呢?
Ans: 因為這會導致output是0,這樣就無法進行back propagation,因為這樣就無法更新gradient。

Leaky ReLU 跟 Parameteric ReLU 的差別在於 Parameteric ReLU 的 alpha 是可以被訓練的,而 Leaky ReLU 的 alpha 是固定的(0.01)。

但是你可能會想…為什麼input<0時,一定要長成這樣的公式呢?
當然還有其他的樣子,因此有了Maxout的概念。

Maxout

training data決定你的network自動學習activation function,而不是人為的決定。

  • Step1: 他把 value group 起來,將個elements放在一個group裡面是你可以自己決定的
  • Step2: 在同一個group裡面,取最大的那個值當作 output。類似max pooling,在layer上做max pooling。
  • Step3: 再乘上一個 weight,回去做Step1。

Maxout implement ReLU


Maxout 可以模仿 ReLU:

  • ReLU
    • 在ReLU你可以透過乘上weight+bias得到z通過ReLU得到a。
    • a 與 z 的關係是,如果 z > 0,a = z,如果 z < 0,a = 0。
  • Maxout
    • input 做兩組計算,第一組將input乘上 w 與 b 得到 z1,第二組是乘上0與0得到 z2。
    • 然後做 maxpooling,可以從上圖看到 z1 和 z2 中選大的,就是 ReLU 。

multi activation function

  • 可以透過將 0,0 weight 調整成其他參數,產生不同的 activation function。
  • 也可以透過將多個 elements groups 再一起產生不同的 activation function。

How to Train


  • 當我們在做 maxout 也是得到一個細長的 linear network,會捨棄掉比較小的output

但是這導致某些 neuron 沒 train 到,但是這不是一個問題…為什麼?
Ans: 因為當給不同 input 時會導致選擇 max 值的 neuron 不一樣。而 training 的過程中,有很多不同的 input 重複跑這些 neural network,因此每次training時input值也會不同,這將會導致每次training時選擇的 max neuron 也會不同,因此每個 neuron 都有機會被 train 到。

Softmax


  • Softmax 是一種激活函數,通常使用在最後的output layer 主要用於多分類(classification)問題,將神經網路的輸出轉換成每一類的機率,並且機率總和為1。
  • 類似 normalization。

CNN

  • 卷積神經網路(Convolutional neural network, CNN):卷積計算中的步伐(stride)和填充(padding)

  • 在CNN的過程中,圖會因為你的kernel map大小做完卷積後變的更小

  • 一般卷積網路過程中,除了Input image不稱為Feature map外,中間產生的圖我們都稱之為Feature map,,深度學習過程就是在學資料的特性,所以中間出來的結果都是特徵資料,在影像因為是2D,所以用Feature map來稱呼。

  • 原因很簡單就是這些中間產生的圖都是為了「描繪出該任務所應該產生對應的特徵資料」,這也呼應Yann LeCun, Yoshua Bengio & Geoffrey Hinton寫的Deep Learning第一句話寫的「Deep learning allows computational models that are composed of multiple processing layers to learn representations of data with multiple levels of abstraction」

卷積計算基本上有幾個部分:

  1. 輸入的圖:假設 W * W
  2. Filter (Kernal map): ks * ks
  3. Stride: 通常是1,表示kernal map在移動時的步伐長度。
  4. 輸出的圖片大小:new_hight * new_width


以上圖為例:

  1. 輸入的圖: W × W =10 × 10。
  2. Filter (kernel map): ks × ks = 3 × 3
  3. Stride: S=1
  4. 輸出的圖大小為 new_height × new_width = 8 × 8

padding

是不是卷積計算後,卷積後的圖是不是就一定只能變小?
ANS: 用zero padding

這個手法就是看你會消失多少的大小,在輸入的圖部份就給你加上0元素進去,這個手法稱為zero padding,實際作法如下圖。

Feature Normalization

原因:兩個參數W1,W2對斜率的變化很大,固定的Learning Rate可能不會得到好的結果。
讓不同的feature有類似接近的數值範圍有很多方法,這些方法統稱為Feature Normalization

兩個參數W1,W2對斜率的變化很大,固定的Learning Rate可能不會得到好的結果。

  • 什麼時候w1的改變會對L很小?
    • 有可能w1接的input很小的時候,才會有這樣的狀況產生。x2很大,導致乘上w2的時候,會變得很大。
    • 結論:input的大小,會想想到參數進行optimization的斜率大小。因此問題是,我們如何讓不同feature的dimension都有相同的scale呢?

公式

  1. 把同個dimenstion的feature都拿出來,算出他們的平均值和標準差。
  2. 做 normalization,把 (x - dimenstion 平均值) / dimenstion 標準差。
  3. 之後該dimenstaion的feature平均值是0,標準差是1,所有不同的數值都是在0上下。
  4. 他可以讓你在做Gradient Descent訓練更順利,Loss收斂更快。

問題:如果經過 某一層hidden layer 的計算後 (乘上 w 之後),會變成很大或很小的數字,這樣就會導致後面的 layer 在接收 input 的時候這些 input 已經變成不同的範圍。因此我們對於 a (經過activation function後) 跟 z (經過activation function之前)都要執行Feature Normalization。

但是對 a 或 z 做 normalization 不會有太大的差別。

  • 說明
    • 我們如果做了feature normalization,會造成讓所有input都有關連,因為z1改變會導致平均值跟標準差都改變,使得後面的z跟a都會改變。
    • 所以我們要把算出平均值跟標準差的過程,都當作是network的一部分,因為概念雷同,有一堆input然後計算平均值跟標準差,然後得到一堆output。

Batch Normalization

問題:我剛說進行feature normalization的過程就有如network一班,但是他的input很大時,我們沒辦法放這麼多計算進GPU那該怎麼辦?

  • 作法:上述講的把feature normalization 的過程當作 network,然而一次把上百萬筆資料丟到network就太多了,才有了batch normalization的概念。
  • 舉例:假設batch設定64,所以我們可以一次使用64筆資料,計算這64筆資料的平均值跟標準差,對這64筆data做batch normalization。

注意:但是你必須要有夠大的batch size才會有效果,如果設定1那計算出來的平均值跟標準差就是原本的值,沒有任何改變。

問題:如果我不希望mean是0該怎麼做?


還會有其他的設定,乘上另一個向量gama是一個向量,加上另一個向量beta,有些時候不希望平均是0,這樣可以讓hidden layer的output平均不是0。gama是全部都是1的向量,beta是全部都是0的向量,這樣一開始訓練的時候每個dimention的分布比較平均。

問題:Batch normalization 怎麼在 testing 的時候運作?因為testing的時候沒有batch,就沒辦法計算平均值跟標準差。


因此這時候會會談到 Moving Average (移動平均),在Trainning的時候,每次計算完一次batch的平均值跟標準差,就會更新一次 Moving Average,把現在算出來的平均值*p,加上1-p公式如下:
uˉpuˉ+(1p)yt\bar{u} \gets p\bar{u}+(1-p)y^{t}

那在訓練的時候,直接拿Moving Average的平均值跟標準差來做batch normalization即可

結果

Overfitting

  • Overfitting 就是你的 model 在 training data 上表現得很好,但是在 testing data 上表現得很差。
  • 你可以從上圖看到,vlidation accuracy在某個epoch開始下降。

  • Validation Data Set 驗證數據:集用於內部調整和評估模型的訓練過程。驗證數據集在訓練過程中使用,通常是在每個訓練週期(epoch)結束後,用來評估模型的性能。
  • Test Data Set 測試數據集:用於最終評估模型的性能,以確保它對新數據的泛化能力。

training 結果好但training 結果不好時該怎麼辦呢?有三個作法如下:

  1. Early Stopping
  2. Dropout
  3. Regularization

Early Stopping

  • 如果 learning rate 調整得好,Loss會變小,但是有可能導致Testing data的Loss變大,這時候就需要Early Stopping。
  • 理想上,如果我們知道 Testing Data Loss 的變化,我們應該要想辦法找到 Testing Loss最小的時候停下來
  • 但是實際上我們無法知道 Testing Set(有label的data set)
    • 所以我們會使用 Validation Set來進行驗證。
    • 也就是說,我們會把 Training Set 分成 Training Set 和 Validation Set,然後在 Training Set 上訓練,並在 Validation Set 上驗證,找到 Validation Loss 最小的時候停下來。

Regularization

重新定義了原本的Minimized的Loss function,透過在原本的 Loss Function (e.g. Minimize square error, cross entropy)添加上「Regularization term」,來達到防止 overfitting 的效果。

  • Regularization Term
    • 他就是添加了 ||theta||,這是每一個參數的平方相加(稱為L2 Regularization),如果不平方就是L1 Regularization。
    • 一般來說不會考慮 bias,因為加入 Regularization 的目的是為了讓function平滑,bias跟function的平滑程度沒有關係,所以不會考慮進去。

How to do Regularization?

  • 新的 Loss function進行偏微分:
    • update 是原本參數 - learning rate * 偏微分後的結果。
    • 你會發現每次 update 參數的時候,會把weight減少一點,也就是 learning rate 乘上 lemda,這兩個數都 < 1,因此你會發現每次 update 的時候,w 都是乘上一個小於 1 的值,使得整個 (1- learning rate * lemda)*wt會隨著更新的次數增加而遞減至0。這叫做 weight decay
    • 但是越靠近0會使整個w變成0?不會,因為還有後面微分的部分。

  • 絕對值怎麼微分?
    • 他是一個V型的圖像,所以微分後會有兩個值,一個是1,一個是-1,而0無法微分就無視或隨便找個數字替代即可,所以就是sgn。
  • sgn 就是 w > 0 就是 1,w < 0 就是 -1,= 0 就是 0。
  • compare with L2 vs L1 ?
    • L1: always delete something,減掉的值都是固定的,所以當w很大的時候,其實檢調固定的值影響不大,因此train出來的結果很多接近0的值,也有很大的值。
    • L2: always multiple something smaller than 1,減掉的值會隨著w大小改變(乘上<1的值),train出來的結果會平均的比較小。

Dropout

在training更新參數之前,每個neuron有p%的幾率被丟掉。他就像是每次 train 都是新的 network,所以總共做了 2^N 種不同的 network。

  • 可能導致performance變差,但他的目地是為了讓testing結果變好。
  • training用dropout,testing 不用 dropout

How to do dropout?


  • 為什麼會需要在 training 的時候反而要將所有 weight 乘上 1-p 是為了讓 testing 時所使用的 weight 接近沒有 dropout 的 training。
  • 如果不乘上 1-p 會導致 testing 時的 weight 會比 training 時的 weight 大(如果p=0.5,就會大兩倍1/0.5),這樣會導致 testing 時的結果變差。

Why dropout solve overfitting?

  • Training
    • 他類似一個終極 Ensemble 方法。
    • Ensemble 就是 train 很多個 model,每個 model 平均起來當做最後的結果,類似 Random forest
    • 每一次更新參數時都會產生新的 network,就有點像是使用了各種不同的 2^n 種network,然後把他們平均起來,這樣就可以避免 overfitting。

Why not use dropout in testing?

  • Testing 為什麼不跟 training 一樣做 dropout 呢?
    • 因為這一把 network 太多了,沒辦法每次都 input進去再看 output 然後再平均起來,這樣會太花時間。
    • 但是如果完整的 network 不做 dropout,但是把 weight 乘上 1-p% 的結果是相近的。(但是這僅限於Linear Network 才適用)
    • 因此如果使用接近 Linear 的 Network 時,像是 ReLU,Performance 會比較好。

Transfer Learning

因為我們沒有大量的資料,因此我們可以透過 Transfer Learning 就是使用別人訓練好的 model,然後再依據此使用自己的 data set 近一步訓練。

Transfer Learning 主要可以分成四個不同的象限來討論:

  • Target Data: 與我們的Task有直接相關(訓練目標),有可能是有Label或是沒有的。
  • Source Data: 與我們的Task沒有直接相關(無關的資料),有可能是有Label或是沒有的。

TargetData Label & SourceData Label

Fine-Tuning

如果你的target data很少,source data 很多,這可以說是 one-shot learning。

  • Source Data: 很多,先利用source data當作初始的值。
  • Target Data: 很少,再利用target data來微調。
  • 注意:但是要很小心,可能會發生overfitting。

Conservative Training

  • Source Data: 很多 speaker 的聲音。
  • Target Data: 特定 speaker 的聲音。
  • training 的時候下一些限制(Regulization) 透過 Regulization L1 或是 L2 的方式,讓新的 model 和 舊的 model 其 output 不要差異太大,防止 overfitting。

Layer Transfer

用 source data train 好一個 model,把某幾個layer copy 到新 model 裡面,然後 source data 只去 train 沒有 copy 的 layer。

  • model 某幾個 layer 直接複製到新的model
  • 接下來用 source data 只去 train 沒有 copy 的 layer。??
  • 如果你覺得data夠通,最後也可以fine-tune整個model

Q:哪些Layer應該被Trasnfer?

  • 影像辨識通常是 copy 前面幾層,在 Nerual Network 前面幾層用是學習到一些基本的特徵,後面幾層是學習到一些複雜的特徵。
  • 聲音辨識通常是 copy 後面幾層,後面幾層是根聲音沒有關係,所以可以copy; 但是前面聲音訊號到發音方式每個人不一樣。

Object Detection

Object Detection 就是要找出圖片中的物件,並且要知道物件的位置。

What is Sliding Window?

  • 他是一個 window,這個 window 會在圖片上移動,然後在每個位置都會做一次辨識,檢查裡面有沒有物件。
  • 但是這樣會有很多問題,因為你不知道物件的大小,也不知道物件在圖片的哪個位置,因此你會需要很多不同大小的 window,然後在圖片上移動。

Selective Search?

  • 如果一個個Sliding Window做辨識,會花很多時間,因此有人提出了Selective Search的概念。
  • 他會先找出圖片中的一些區域,潛在可能是物體的候選框,大概可能會產生約2k左右。

R-CNN

就是做 Bbox Reg 線性回歸,然後做 SVMs 分類。

步驟

  • 把候選框拿出來
  • 作捲積
  • 再把卷積做好的特徵放到SVMs跟Bbox reg的分類器當中

問題:速度太慢了

  • Q1: 每個框,都要自己構造一個網路,無法共享一個捲積,因為fully connection layer 要保持 input 大小的一致,但是候選框大小不一樣。
  • Q2: 使用SVMs太慢了,花了84小時

使用SPP-net

為了解決都要自己構造一個網路,無法共享一個捲積的問題,Spatial Pyramid Pooling Layer透過通過一個pooling layer,把不同大小的特徵圖拼接再一起形成一個新的特徵,這樣就可以執行fully connection layer。

  • feature maps of conv: arbitrary size 任意大小
  • 把任意大小的size做 SPP (pooling layer)
  • pooling 後的不同大小拼接再一起,形成一個新的特徵,但是大小是固定的。

Fast R-CNN

跟第一代算法的區別:跟R-CNN不同,R-CNN是透過候選框,一個個判斷。但是Faster R-CNN是先把整個圖片放入CNN,然後再去透過特徵找候選框。

步驟

  1. Regions of Interest (RoIs):但是Faster R-CNN 先對整個圖片執行捲積層操作,在特徵圖上找對有興趣的對應框,以此回去看整個圖片對應到的位置。
  2. RoI Pooling Layer: 有點像是SPP-net得到一個固定的特徵大小,以連接fully-connected layer
  3. Linear Classifier & Bounding Box Regressors: 最後辨識物體,跟框出物體的位置。

問題:RoIs 產生一個個潛在區域還是很慢

R-CNN vs SPP vs Fast R-CNN

  • Including Region Proposals: 產生一個候選框所需的時間
  • Excluding Region Proposals: 選擇不處理候選框所需的時間
  • 結果 Fast R-CNN的時間還是取決於Region Proposal的方法

Faster R-CNN

Faster R-CNN 就是把 Region Proposal Network (RPN:找出圖像中可能的邊界框) 加入 Fast R-CNN,讓他可以一起訓練。他先做二元分類、再做多元分類

  • 多了 Region Proposal Network (RPN) 邊迭代邊自動產生候選框,當地一個候選框產生的時候…
    • 先做二分類
      • Classification Loss: 先做二元分類,看這個候選框是不是物體,是前景還是背景
      • Bounding-Box Regression Loss: 再做Bbox Reg,找出物體的位置
    • 再做多分類
      • Classification Loss: 再來辨識該物體是什麼
      • Bounding-Box Regression Loss: 再來找出物體的位置

  • 這樣的結果是可以1s執行五個圖像

Yolo

YOLO (You only look once) 是一個 one-stage 的 object detection 演算法,透過將整個影像輸入只需要一個 CNN 就可以一次性的預測多個目標物位置及類別。將物件偵測視為一個回歸任務,來從空間中分割出邊界框 ( Bounding Box )並且計算出類別機率。僅利用一個神經網路CNN 進行一次計算來直接「預測邊界框」及「類別機率」,也因為整個偵測過程只有使用單一個神經網路,因此可以視為是一個 End-to-End 的優化過程。

Yolo 的版本介紹

  • The original Yolo: 把畫bbox跟辨識物體的工作放在一起做。
  • Yolo v2:基於original添加BatchNorm, higher resoultion, anchor boxes.
  • Yolo v3:添加objectness score來評估bbox的好壞,objectness score是一個0~1的數值,越接近1表示越像物體,越接近0表示越不像物體。小的物件檢測的準確度提升。
  • Yolo v4 & v5(最近的版本,2020相差兩個月,v5網路比較小)
    • v4 使用 Cross Stage Partial Network (CSP)來防止gradient vanishing。

作法

  1. 將輸入的影像切割成 SxS 的網格 (grid)
  2. 若被偵測物體的中心落入某個網格內,這個網格就要負責去偵測該物體。
  3. 而每個網格要負責預測B個 bounding boxes (在 YOLO 的設計中,YOLOv1: B=2, YOLOv2: B=5, YOLOv3: B=3) 和屬於各別類別的機率 (假設有C個類別),其中對每個 bbox 的預測會輸出5個預測值: x, y, w, h 以及 confidence。
  • x, y 代表該bndBox的中心座標與圖片寬高的比值,是bndBox歸一化後的中心座標
  • w, h代表該bndBox的寬高與輸入圖像寬高的比值,是bndBox歸一化後的寬高座標
  • confidence代表bndBox與Ground Truth的IOU值

主要架構

  1. Backbone:不段做convolution,形成 feature map。
    • 通常會使用 pre-trained model,例如 CSPResNet50、CSPDarknet53、EfficientNet-B3。再由新的訓練樣本慢慢調整。
  2. Neck:放在backone和head之間,由一系列layer組成,將 backbone 所取得的 feature 執行 mix and combine 的動作,然後送到 prediction。
  3. Head:獲取網路輸出內容的網路,利用之前提與的特徵,繪製 bbox 跟 class 的預測。

關於CSP (Cross Stage Partial Network)

  • 目的:在Yolo v4中使用了Cross Stage Partial Network (CSP),一個基於DenseNet的模型,可以有效的防止gradient vanishing。

關於FPN (Feature Pyramid Network)

  • 目的:他是一個feature extractor,利用feature maps的概念,辨識出比較小的物件。
  • 缺點:很耗時,對記憶體要求高。

Image Segmentation

  • Image classification: 判別一個圖片有哪些物體,但是不知道物體的位置。
  • Object detection: 判別一個圖片有哪些物體,並且知道物體的位置會匡列出來。
  • Instance Segmentation 實例分割: 可以清楚描繪出物體的輪廓,並且知道物體的位置。
  • Semantic Segmentation 語意分割: 可以清楚描繪出物體的論闊,針對圖像中所有像素點進行分類,但是無法辨別同一類別不同物體

Semantic Segmentation: U-Net


U-Net 基於 Encoder-Decoder 結構,主要應用於醫學影像分割。Encoder (U-Net 稱為 contracting path) 負責提取特徵、Decoder (U-Net 稱為 expansive path) 則是用於 upsampling,網路架構形似 U。此外,經過上採樣後會與 contracting path 進行 concat,不過 contracting path 特徵圖的尺寸較大需要經過 crop 裁剪。

Instance Segmentation: SegNet


SegNet 結構與 DeconvNet 類似,不同的是去除了中間的 1x1 卷積層,為了降低記憶體使用及提升推理速度,主要應用於場景理解。由上圖可以看到 SegNet 的網路架構:

  • Encoder 用於提取特徵
  • Decoder 則是將特徵圖做 upsampling

Evaluation Metrics

NLP

(RNN) Recurrent Neural Network

為什麼會需要RNN?
我們先來看一個例子,如果要把一個句子,放入 Neural Network 來辨識其意義:

  • Input: “Arrive Taipei on November 2nd”

我們希望他辨識出 Taipei 是一個 destination

  • Output: {Taipei: destination}

那這必須解決以下問題:

  1. 我們需要把 Taipei 轉換成一個 向量
    • 可以使用 one-hot-encoding
    • 或是 1-of-n-encoding,n 表示為字典的大小,e.g. n=3切割 Taipei,就會看aaa, aab, tai, aip, ipe, … 轉換成 0,0,1,1,1…來構成Taipei這個單字。
  2. 但是這出現第二個問題,
    • 如果改成句子例"Leave Taipei on November 2nd" 這時候的 Taipei 不是 destination,而是 place of departure。
    • 我們希望模型可以學習出現過的字"arrive"參考上下文,來判斷出這時候的taipei已經不是destination。

RNN 是一種有記憶的Neural Network,稱做 Recurrent Neural Network,每一層產生的output都會存到 memory,下一層的input會加上上一層的output,這樣就可以記住之前的資訊。

RNN的運作原理

  • 因為是第一筆input,沒有前一筆資料,因此我們可以給初始值0
  • 然後開始計算,得到 2=1+1+0+02=1+1+0+0(黃色跟藍色相加),最後得到output 4=2+24=2+2(綠色)
  • 並且於下一步把 hidden layer 的 neuron output 值儲存,也就是將綠色的 neuron 值 2 儲存

  • 然後開始計算這時考慮到之前的值2(綠色,hidden layer output),得到 6=2+2+1+16=2+2+1+1,最後得到output 12=6+612=6+6
  • 並且於下一步把 hidden layer 的 neuron 值儲存,也就是將綠色的 neuron 儲存

總結,你會發現 RNN 會考慮 input 的 order,如果把[2,2]移動到前面,很顯然的綠色的內容一定會改變(hidden layer output改變),導致後面的output也會改變。


也因此,當我們放進去 Arrive Taipei on November 2nd 時,Arrive 的output會影響到 Taipei 的output,這讓 Arrive 跟 Taipei 產生關聯,因此可以判斷出 Taipei 是 destination。

RNN 的三個缺點:
但是傳統RNN也是有一些問題

  • 訓練速度慢:由於 RNN 是順序進行的,難以並行處理以加快訓練速度。
  • 梯度消失或梯度爆炸:梯度消失指多個小於一的梯度相乘,導致接近零,無法有效更新權重;梯度爆炸則是多個大於一的梯度相乘,導致結果過大。使用 ReLU 等非線性激活函數和 LSTM 等 RNN 變體可以解決此問題。
  • 難以處理長期依賴性:在長序列中,RNN 可能難以捕捉遠處元素之間的關聯,導致漏掉重要信息。LSTM 能夠解決這個問題。

Elman v.s Jordan Network

  • Elman Network: 他的 hidden layer 的 input 是來自於上一層的 hidden layer 的 output
  • Jordan Network: 他的 hidden layer 的 input 是來自於上一層的 output。(有人說此效果比較好)

Bidirectional RNN

  • 可以同時train正向跟逆向的RNN,把這兩個RNN的hidden layer output相加,就可以得到最後的output。
  • 好處是,他看的範圍比較廣,他是看了整個句子,而不是只看前面的字

LSTM

RNN 只要有新的 input 進來,使用完上一個 memory 後,內容就會被洗掉,而 LSTM 則是可以記得比較長,關鍵在於gate

  • 先通過input gate,才可以寫道memory裡面,所以有可能存在memory裡面的是很前面的字
  • output 則是要通過 gate 讀控制才能取得。
  • forget gate 何時要把過去記得的東西忘記

這個gate何時打開關閉是Neural Network自己學到決定的。但是他跟一般的Neural Network感覺不太一樣,這樣還叫做Neural Network嗎?
其實,你只要想像Memory中的值就是一個Neuron,那這個LSTM就是一個Neural Network。


LSTM 有四個 input 和 一個 output,四個inputs分別為:

  1. input
  2. 操作input gate 的訊號: 是否要收錄input的值?
  3. 操作forget gate 的訊號: 是否要忘記memory的值?
  4. 操作output gate 的訊號: 是否要輸出output的值?

LSTM的簡單範例

運作原理Simplfy

  1. Input (z) 先經過 activation function (g(x)) 得到 ⇒ g(z)
  2. g(z) 經過 input gate,如果 input gate 是打開的 f(z) ⇒ g(z)*f(z)
  3. g(z)*f(z) 經過 forget gate,如果 forget gate 打開,把結果存入 ⇒ c’= g(z)*f(z)
  4. c’ 經過 activation function (h(x)) 得到 ⇒ h(c’)
  5. h(c’) 經過 output gate,如果 output gate f(z) 打開,最後output ⇒ h(c’)*f(z)


  • z 是的input經過transform的值,其dimension是LSTM中cell(存memory)的數目
  • z_i 是x乘上另一個transform,每個dimension分別操控不同的input gate。
  • z_f 是x乘上另一個transform,每個dimension分別操控不同的forget gate。
  • z_o 是x乘上另一個transform,每個dimension分別操控不同的output gate。
  • 上述的 z 都是 vector 的形式。
  • 執行以下步驟
    1. z_i 通過 activation function 與 z 相乘。
    2. 通過 activation function 的 z_f 與 memory 相乘。
    3. step 1 + step 2 的結果。
    4. z_o 聽過 activation function 與 step 3 的結果相乘,最後得到output y。

真正的LSTM

一般NN跟LSTM的差異

  • LSTM 需要 4 個 input 才能產生 1 個 output ,參數量是一般 NN 的 4 倍。
  • 現在基本上RNN就是LSTM。

BiLSTM

BiLSTM 全稱 Bi-directional Long Short Term Memory,由前向LSTM與後向LSTM組成,為什麼需要BiLSTM是因為如果只有LSTM,他是由前往後的,但是有時候我們需要考慮到後面的字。舉例來說,句子『我不覺得他好』這裡的『不』是對後面的『好』進行否定,因為LSTM可以記住比較常距離的字,因此可以判斷出這個句子是貶義的。但是因為LSTM無法得到從『後面到前面』的信息,在進行更細顆粒度的分類,像是想要知道貶義的程度,例如『這個餐廳髒的不行,沒有隔壁好』這裡的『不行』是對『髒』的程度的一種修飾,這種由後往前的信息是LSTM無法得到的,因此需要BiLSTM

BiLSTM是如何運作的?

我很喜歡CSDN | BiLSTM 詳解這篇的說明,所以我取用他的圖片來說明:

  1. 向前的LSTM: 依序輸入『我』『愛』『你』得到三個向量分別是 {hL0h_{L0}, hL1h_{L1}, hL2h_{L2}}
  2. 後向的LSTM: 依序輸入『你』『愛』『我』得到三個向量分別是 {hR0h_{R0}, hR1h_{R1}, hR2h_{R2}}
  3. 前後項的hidden layer向量拼接:{[hL0h_{L0}, hR0h_{R0}], [hL1h_{L1}, hR1h_{R1}], [hL2h_{L2}, hR2h_{R2}]} 得到 {h0h_{0}, h1h_{1}, h2h_{2}},這樣就可以得到前後項的資訊。

(RvNNs) Recursive Neural Networks

RvNN 概括了 RNN。由於其樹狀結構,它們可以學習hierarchical models,而不是只能處理順序資料的 RNN。樹中每個節點的子節點數量是固定的,以便它可以執行遞歸操作並在步驟中使用相同的權重。

運作原理

  • RvNN 的樹結構意味著為了組合子節點並產生其父節點,每個子父連接都有一個權重矩陣。
  • 相似的子節點權重相同。換句話說,考慮一棵二元樹,所有右子節點共享一個權重矩陣,所有左子節點共享另一個權重矩陣。
  • 此外,我們需要一個初始權重矩陣 (v) 來計算每個原始輸入的隱藏狀態。

實際應用
在自然語言處理中,RvNNs 的一個主要應用是對自然語言句子進行句法分析。

當進行句法分析時,我們希望識別句子的較小組成部分,例如名詞或動詞短語,並將它們組織成句法層次結構。由於 RNNs 只考慮連續關係,與 RvNNs 相比,它們較不適合處理層次化數據。假設我們想要捕捉這句話中短語“a lot of fun”的表示:Programming is a lot of fun.當我們的 RNN 處理單詞 fun 時,該時間步的隱藏狀態將表示整個句子。相反,RvNNs 的層次結構可以存儲準確短語的表示:a lot of fun 就已經在節點 Ra lot of funR_{a\ lot\ of\ fun} 的隱藏狀態中。

問題

  • 分析可能會變得緩慢和模糊。特別是,對於單個句子可能存在多個解析樹。
  • 此外,為 RvNNs 標記訓練數據比構建 RNNs 更耗時且需要更多勞動力。手動將序列解析為較小的組件比為序列分配標籤需要更多的時間和精力。

Word Embedding

  • Word Embedding 類似語意的詞彙在圖上比較接近,所需要的維度也會比1-of-N encoding少很多。
  • Word Embedding 是一個 Unsupervised Learning,不需要標籤,只需要大量的文本資料,就可以訓練出一個模型,然後這個模型可以把每個字轉換成一個向量,這個向量可以代表這個字的意思,這個向量就是 word embedding。
  • 問題:問題是你不知道 Unsupervised learning 會產出什麼樣的 output?
    • 解決:透過 context 上下文,來學習一個 word 的意思。
    • 舉例:馬英九 520 宣誓就職 vs 蔡英文 520 宣誓就職,這兩者中的馬英九跟蔡英文後面都接類似的詞彙,因此可以學習到這兩個人的意思是相似的。

特性


  • Vector(hotter) - Vector(hot) 類似 Vector(bigger) - Vector(big)

作法

Count based

Prediction based

  • 透過把 prediction model 的第一層 hidden layer 拿出來,就可以找到 word embedding 的特性。

但是這樣就夠了嗎?如果只用 wi-1 去預測 wi 太弱?

Prediction based - Sharing Parameters

學前面 n 個詞彙,以 input 兩個 word 為例。


但是如何讓 weight 一樣呢?

  • 只要在做Gradeint Descent,減去彼此的偏微分。

Word2Vec

Word2Vec:Continuous bag of word (CBOW) model, Skip-gram
Word2Vec主要有兩種模型:

  • CBOW: 用周圍的字預測現在這個字,CBOW的input是Context(預測字的前後文)而Output是現在的字
  • Skip-gram: 用現在的字去預測周圍的字,Input是現在的字而Output則是Context。根據Mikolov的論文中提到,就結果來說Skip-gram的結果是比較細膩的,學習到的Vector進行任務驗證的時候準確度比較高。
  • 問題:這個network不是deep learning,他就只是取 linear 的 hidden layer 的第一層得到 word embedding。
    • 作者覺得不用 deep 就可以做得很好,而且更快更有效率,因此就沒有用 deep learning 的方式。
    • 但是以前的人都是用 deep learning 的方式,但就很慢。

優點

  • 適用於大型dataset
  • 提供有意義的單詞表示形式
  • 有效捕獲語意關係
    缺點
  • 在生僻字上可能會有挑戰
  • 忽略詞序
    應用: 當semantic relationships語意關係重要時,並且你的dataset很大時。

Glove

與Word2Vec拿周遭來預測字或是拿字來預測周遭不同,Glove是建立一個矩陣,可以知道單字在整個語料庫中出現在另一個單字的機率,每個cell包含在特定上下文中單詞的共現次數。從下圖可以看到?每個 row, column 對應一個整個語料中的唯一單字,而每個 cell 則包含這單字在特定上下文視窗中一起出現的次數。假如W是word,C是context,理想的情況是W.CT(C的Transpose)近似原本的matrix(X),通過反覆優化調整W與C,最小化X和W.CT之間的差異。

因此對於Glove來說,每個單字所提供的vector不僅僅能捕獲local context,他是針對整個global word的體現。
優點

  • 可以有效地捕捉全局語義
  • 比較好的表示詞彙之間的關係
    缺點
  • 需要很多記憶體來儲存co-occurrence matrix
  • 對於小的語料庫效果不好
    應用: 適用於多樣化的數據,並且對於捕獲全局語義是重要的時候使用。

FastText

FastText是Facebook AI Research (FAIR)所開發的一種word embedding技術,他擴展了Word2Vec的模型,可以使用CBOW或是Skip-gram架構,但是與Word2Vec不同的是,FastText不僅考慮了單詞本身的特徵,還考慮了單詞的子詞(subword)-- 單詞的一部分(n-grams)。FastText的基本思想是將每個單詞表示為其字符n-gram的平均值,這樣可以捕捉單詞的內部結構,並且可以處理未知單詞處理型態豐富的語言。也因此,它不僅可以根據目標詞預測單詞(CBOW),還可以根據單詞預測目標詞(Skip-gram),甚至使用n-gram來預測單詞。

簡單來說,FastText除了整個單詞本身之外,透過n-gram的方式把單詞切割成很多小塊,例如"apple"使用n=2切成"ap", “pp”, “pl”, “le”,這種方法能有效地捕獲較短單詞的含義。更好理解後綴與前綴。

優點

  • 更好的表示生僻詞
  • 能夠處理詞彙量外的單字
  • 由於子詞的資訊,單詞表示更豐富
    缺點
  • 由於n-gram的資訊,模型大小增加
  • 比word2vec相比訓練時間更長
    應用: 針對型態豐富的語言,或適當處理詞彙外的單詞至關重要時使用。

ELMO

是一個RNN的Language Model,不需要標籤,只需要大量的文本資料,就可以訓練出一個模型,然後這個模型可以把每個字轉換成一個向量,這個向量可以代表這個字的意思,這個向量就是 word embedding。

每一層都會給 contextualize embedding,把這些embedding全部加起來,把第一層a1,第二層a2,第三層a3加起來,就可以得到最後的embedding。a1, a2 會根據不同的任務學出不同的weight。

BERT

他是 Transformer 的 Embedding 不是 RNN,不管相鄰多遠的word對他來說是沒有差的。
做的事情給他一個句子,每個句子中的詞彙,都會吐出一個embedding。這個embedding可以代表這個詞彙的意思。

Masked LM
訓練Bert的方法:Masked LM 交給 Bert 的句子中,隨機有 15% 的詞彙會替換成 [Mask]的Token,你會蓋掉一個句子15%的詞彙。然後讓 Bert 去預測這個詞彙是什麼。

Bert 怎麼填回來的?

Next Sentence Prediction

  • 目的:預測這兩個句子是不是連續的。Output出 Yes, No。
  • 特殊Token
    • [SEP] 來代表兩個句子的斷句位置。
    • [CLS] 來代表這個句子的開頭,要做分類的意思。
  • Masked 跟 Next Sentence Prediction 一起訓練,讓他可以學習到更多的東西。

Use Case

丟入一個句子,分類這個句子是什麼類型?經濟?政治?…

丟入一個句子,句子每個詞彙是什麼類型

丟入兩個句子,output一個class - Natural Language Inference

  • 給一個前提,跟一個假設,然後要判斷這個假設是不是Ture, False, Don’t know。

給句子,然後問問題:Extraction-based Question Answering

Transformer

Seq2Seq


Transformer 就是一個 Seq2Seq 的模型,input是一個句子,output是另一個句子,這兩個句子的長度可以不一樣,由機器自己決定輸出的文字長度。
各種NLP的任務都可以使用Seq2Seq的模型來解決,例如:

  • 例子1:聲音訊號 轉換成 文字,很顯然的這兩個長度不一樣。
  • 例子2:翻譯,中文轉英文,這兩個長度也不一樣。
  • 例子3:做一個聊天機器人,像是QA問答,可以透過收集大量的對話實現。
    • input: Question+文章 接在一起當作
    • output: Answer

Use Case

Synntactic Parsing



可以把它看成一個樹狀結構,然後把樹狀結構轉成一個Sequence如上圖,就可以套進Seq2Seq的模型中。

Multi-label/class Classification

  • Multi-label Classification: 一個句子可以有多個標籤
    • 例如:一個句子可以同時有多個情緒,例如:開心跟難過。
  • Multi-class Classification: 一個句子只有一個標籤
    • 例如:一個句子只有一個情緒,例如:開心。

原理 - Encoder

  • 把一排向量,轉換成另一個同樣長度向量
  • 在Transformer裡…
    • Encoder使用的是Self-Attention,而不是RNN。


  • 一個Block裡面做了什麼?
    • 有使用 residual 簡單來說就是把加上某個一個向量,為了避免gradient vanishing。
    • 然後使用 Layer Normalization
    • 放入 Fully Connected Layer 並且也執行 residual,然後再做 Layer Normalization。
    • 這就是一個block的output。

不一定要使用上述的架構,我們仍可以使用其他的架構,例如:

原理 - Decoder

有一個Begin表示句子的開始,選擇最大的可能字選,做輸出。

以此類推,將word(e.g. 機)轉換成one-hot-encoder 做輸入,Decoder會把自己的輸出當作下一個輸入,直到遇到End。

Transformer 中其實Encoder與Decoder沒有太大的差別,
只是Block多了一個 Masked Multi-Head Attention

Masked Multi-Head Attention

產生b1的時候,只能考慮b2~b4的資訊,不能考慮b1的資訊。以此類推

更具體一點,做 q2 只考慮 k1, k2 的資訊

為什麼要做 Masked Multi-Head Attention?
因為在做 Decoder 的時候,他是一個個字產生,因此只能考慮左邊的東西,不能考慮右邊的東西,因此要做 Masked Multi-Head Attention。
但是怎麼讓他停下來呢?因為只要有output就可以一直下去。

如何中斷結果?其實只要添加End Token即可

NAT Decoder

  • 他是一次性產生所有的字,而不是一個一個產生。
  • 可以做到平行化處理,因此可以加速。
  • 他的目的是可以控制輸出的長度,如何控制?可以讓他任意產生,但是只取End之前的部分。
  • 他的結果沒有AT好。

運作原理:Cross Attention

運作原理:Cross Attention

輸入一個Begin產生一個vector,經過 transform 得到 q,與 encoder 產生的 a1~a3 做 attention,得到 a_hat 加上 v1~v3,最後得到 v
然後把 v 丟進去 Fully Connected Layer 作為 input

Decoder 的輸入是拿 Encoder 最後一層的輸出(Paper原始是這樣,但是不一定要這樣)

訓練 Training

Training

  • 我們希望第一個輸入所產生的輸出與Ground Truth(解答)越接近越好,因此我們可以使用 Cross Entropy 來計算 Loss。
  • 這跟分類很像,每次encoder產生一個輸出時,我們就是透過Decoder將它分類。
  • 我們希望所有 Cross Entropy 的 Loss 越小越好。

Decoder的輸入會提供正確答案

  • 我們在Decoder訓練的時候,會把正確答案丟進去,提供 (Begin + 機 + 器) 時我們希望他產生 (學),讓他可以學習到正確答案。
  • 這叫做 Teacher Forcing

但是,在 Testing 的時候,我們就沒有正確解答…,因此我們要怎麼做呢?

BLUE score

  • 他是將Decoder產出的整句話,跟正確答案做比較,然後算出一個分數。
  • 訓練的時候看Cross Entropy,測試的時候看BLUE score
  • 訓練不能使用Blue Score是因為他無法微分,因此無法做Gradient Descent。

Scheduled Sampling

  • Decoder 在訓練的時候,不要一直給正確答案,而是有一定的機率給正確答案,也參雜錯誤的答案有時候結果會比較好。

Self-Attention

輸入與輸出與RNN類似,擁有bidirectional的特性,但是與RNN不同的是他可以同時計算所有輸出,而不是一個一個。
目的在使用 Self-Attention Layer 來取代 RNN。

Self-Attention 最早出現在 Attention is all you need 這篇論文中,這篇論文提出了一個 Transformer 的架構,這個架構是一個完全不使用 RNN 的架構,但是效果卻比 RNN 還要好。

運作原理

在 Self-Attention Layer裡面的運作

  1. 每個 input 都會乘上3個不同的transformation產生三個向量,分別是 Query, Key, Value。
    • Q: 主要 match 其他人。
    • K: 主要被其他人 match。
    • V: 被抽取出來的 information。

  1. 接下來要做的事情,拿每個 query q 去對每個 key k 做 attention
    • 這邊的 attention 稱作 Scaled Dot-Product Attention,是用 q 跟 k 做 dot product,然後再除以一個根號d (d is the dim of q and k),然後做Soft-max。
    • 除以根號 d 的原因是因為兩個向量的內積會隨著向量維度的增加而增加,因此為了讓兩個向量的內積不會太大,所以除以 d 來平衡
    • 這樣就可以得到一個 attention score,這個 score 代表 q 對 k 的注意力(有多匹配)。

  1. 最後這個 attention 會乘上 v,然後把所有的 v 加起來,就可以得到 output
    • 在產生 b1 的時候,已經看過 a1~a4 所有的輸入。
    • 如果不想考慮 global 的資訊,而是 local 的資訊,不管是遠的還是近的,只要把 alpha 設成 0 就可以了。

  1. 在同時,也可以算出 b2。b1, b2, b3, b4 可以被平行計算的

平行化處理

Self-Attention怎麼做平行化

  • 關於position的平行計算

    • 首先要知道,a1*Wq會得到q1,a2*Wq會得到q2,a3*Wq會得到q3,a4*Wq會得到q4。
    • 可以把 a1~a4 拼起來(I)變成 metrix A,然後乘上 Wq,就可以得到 q1~q4 (Q)。
    • 以此類推,可以分別獲得 k1~k4 (K) 跟 v1~v4 (V)。
    • 已得到所有position的value
  • 關於 alpha 的平行計算

透過 k1xq1 可以獲得 a1,1,透過 k1xq2 可以獲得 a1,2,透過 k1xq3 可以獲得 a1,3,透過 k1xq4 可以獲得 a1,4

同樣的,我們把所有k1~k4拼起來做一個Transpose(K)變成 metrix K_T,然後乘上 Q,就可以得到 a1,1~a3,4 來實現平行運算。

最後做 Soft-max 就可以得到 alpha hat。

最後要做 weighted sum,就可以得到 b1~b4。

  • 把剛剛計算好的 alpha hat 乘上 V,就可以得到 b1~b4。
  • 把 a1,1_hat 乘上 v1,把 a1,2_hat 乘上 v2,把 a1,3_hat 乘上 v3,把 a1,4_hat 乘上 v4,(就是把 v1~v4 對 alpha1.1~1.4_hat做weighted sum 就可以得到 b1。
  • 以此類推,來得到 b2~b4。

總結

  1. 總結來說,I (input)會乘上三個不同的 Metrics (Wq, Wk, Wv)得到Q, K, V。
  2. 把 K 轉置後,乘上 Q,得到 A (Attention Metrics)。
  3. 將 A 做 Soft-max,得到 A hat。
  4. 將 A hat 乘上 V,得到 O (output)。

基本上就是做矩陣乘法,可以用GPU來做加速。

Multi-head Self-Attention

會把 Q, K, V 變成兩個 Metrics,然後分別做 Self-Attention

把兩個結果 bi,1 和 bi,2 做 concat,就可以得到 bi。

好處: 不同 head 可以負責不同的任務

  • 例如:一個 head 負責看 local 的資訊,一個 head 負責global資訊。

Position Encoding

對於 Self-Attention 來說,並不考慮input squence的順序,因此對他來說以下兩個句子是一樣的。

  • B hit A.A hit B. 是一樣的。
  • 我們希望把 input sequence 的順序考慮進去,因此我們要加上 position encoding

Position Encoding 的作法是 input 通過 transform 變成 ai 時,還要加上一個神奇的 vector ei (dimenstion與ai相同)

  • ei 不是學出來的,是我們自己定義的
  • ei 代表著順序,每個input都有一個ei,而且ei是不會改變的。

為什麼是相加一個ei?

  • 你可以想像,我們有一個 pi 是一個很大的矩陣,裡面的每個值都是0,只有一個值是1,這個1的位置代表著這個字的順序
  • 我們將 pi 乘上 xi 後乘上一個 W,此時我們可以使用線性代數中,透過 metrics partition的特性,把W拆成兩個矩陣,一個是 Wi,一個是 Wp。
  • 並且將 Wi 乘上 xi 加上 Wp 乘上 pi,最後得出 ai + ei

Seq2Seq with Attention

剛剛我們主要提到可以使用Self-Attention取代RNN。接下來我們看看如何使用Self-Attention來做Seq2Seq。


Encoder

  1. input 一個 sequence
  2. 每個 timestamp 互相之間做 attention,得到一個新的 sequence
  3. 這些 attention 平行運算

Decoder

  1. 給一個 Begin Token 把 Encoder 最後一層 output 當作 Decoder 的 input
  2. 不僅僅會對 Encoder 的 input 做 attention 也會對 Decoder 之前所產生的 input 做 attention(Masked Attention)
  3. 最後就產生出一個 sequence,input是英文,output是另一個語言的翻譯結果

Attention Visualization
你可以發現,不同的 input 同一個字對不同的單字產生不同的 attention