# Machine Learning 2021 ### Chapter 1 : Introduction of Machine / Deep Learning 本筆記來自[李宏毅 (Hung-yi Lee)](https://speech.ee.ntu.edu.tw/~tlkagk/)老師的[Machine Learning 2021Spring](https://speech.ee.ntu.edu.tw/~hylee/ml/2021-spring.html) #### Different types of Functions :::info 機器學習目的 : 讓機器具備找一個函式的能力 ::: 例如做語音辨識(丟入一段語音讓機器辨識)、圖像辨識、或者是下棋,\ 這些東西都可以利用找到一個函式,丟入一筆資料後輸出答案。\ 較常用的幾種函式類型如**Regression**(輸出一個scalar)、**Classification**(輸出一個類別),也可以讓機器產生一個有結構的物件(Structured Learning) #### How to find a function 1. **Function with Unknown Parameters** : 猜一個function, 假設要找的函式是一個Linear的Function, 我們可以將函式猜成 $y = bias + weight \times x_1$ , 其中$weight 跟 bias$要透過學習來找到最好的一組。 2. **Define Loss from Training Data** : 機器找到一個$function$後要評定其的好壞, 所以我們有$loss$。$loss$會透過實際值($\hat{y}$)跟預測值($y$)來計算。簡單來說, $loss$**就是用來看預測值跟實際值差多少**。\begin{gather}Loss = \cfrac{1}{N}\sum_{n} e_n, \\e_n = error\ function(y, \hat{y}),\\ error\ function\::MAE, MSE \end{gather} 3. **Optimization** : 機器有Loss function後要讓訓練結果不斷逼近實際值(找最小的Loss) \begin{gather} w^1 \leftarrow w^0 - \eta \cfrac{\partial L}{\partial w}|_{w = w^0}\\ \end{gather} 其中$\eta = learning\ rate$, 為$\mbox{hyperparameters}$, 需要自己訂的值,也需要自己訂的值還有$\mbox{batch_size, epoch}$。透過這個步驟不斷迭代更新$weight 跟bias$。但因為是看$\mbox{gradient}$找最小值, 不見得可以找到$\mbox{global minimum}$ :::warning 模型參數的修改來自對問題的理解 ::: #### while model is too simple 有時候要找的function不見得是Linear,\ 如果是這樣,我們用Linear的function無論怎麼逼近都沒有辦法找到最好的答案。\ 這種時候我們就要給Model更多的彈性(點取得夠多就跟原本的function越像)\ **Sigmoid Function**: \begin{align} y &= c\ \cfrac{1}{1+e^{-b + wx_1}}\\ & = c\ sigmoid(b + wx_1)\\ \end{align}這個函式可以把原本直線變成圓滑的曲線\ 也可以針對每一個$x$找不同的$weight 跟 bias$ \begin{align} &原本 : y = b + wx_1\\ &新的 : y = b + \sum_{i} c_i\ sigmoid(b_i + \sum_{j} w_{ij}\ x_j)\\ \end{align} 當然,還是要回歸到機器學習最一開始的步驟, 去計算**Loss**、去進行**Optimization**\ 通常這種學習方法一次不是只讀一筆資料, 而是用**batch**去計算\ 而一個**epoch**則是讀完全部資料一次。 **ReLU**: \begin{gather} y = c\ max(0, b + wx_1) \end{gather} :::warning 像$\mbox{Sigmoid}$或是$\mbox{ReLU}$這種都是$\mbox{Activation function}$,\ 可以讓模型找到的函式更逼近實際的函式 ::: #### Deep Learning 前面講的都是針對一個layer去做計算,\ 我們也可以疊多一點的layer, 讓參數的數量進一步變多,當然擬合的效果也會更好一點。\ 這種疊多個$\mbox{hidden layer}$的學習方式就叫$\mbox{Deep Learning}$ :::warning $\mbox{hidden layer}$可以讓擬合的效果更好,但也會造成"過擬合"(**Overfitting**),\ 使模型訓練出來沒有辦法對類似狀況作出反應,\ 這個部分在後續章節還會講解 ::: ### Chapter 2 : Overfitting #### Review : Framework of ML ![](https://i.imgur.com/WhQ7TJl.jpg) $\mbox{Step 1: 找一個包含未知數的function}$\ $\mbox{Step 2: 定義loss function}$\ $\mbox{Step 3: 找一組參數讓他的loss是最小的}$ #### Model Bias 如果在訓練的過程中,**train data**的loss降不下來,可能有兩個問題:\ 1. **model bias** : 代表model太簡單了, 需要把你的model變有彈性一點 2. **Optimization** : 下一章會提到 想要將model變得有彈性, 最主要有兩種方式(**大海撈針,但針不在海裡**): 1. 增加feature 2. 增加Deep learning的層數 如果是Optimization的問題, \ 那可能代表這個演算法沒辦法找到model的最低loss(**大海撈針, 針在海裡但找不到**) :::warning 怎麼辨別是Model Bias還是 Optimzation Issue ::: #### Model Bias v.s. Optimization Issue 如果增加了layer, 但訓練結果卻更爛了,就代表是Optimization的問題。\ 這時候代表你需要找到更好的演算法去擬合這個case。 #### Overfitting 如果今天發生的是**train data的loss很低, 但在test data的loss卻很高**\ 這種情況有可能是model"**太彈性了**",造成test的效果不好。\ **Solution**: 1. **More train data(增加資料量)** : 利用資料來限制模型的彈性 2. **Data augmentation(資料增強)** : 利用一些不會改變圖片答案的變化隨機加在圖片上,例如 : 水平翻轉、放大縮小、物件平移等等的操作來,但要做合理的增強(做有可能會出現的增強)![](https://i.imgur.com/VcWIJvM.jpg) 3. **Make model simple** : 可以透過減少模型參數(或層數)來達成讓模型簡單一點,減少overfitting發生。 4. **Early stopping** : 在模型已經達到test loss訓練最低的時候就停下訓練過程, 實作步驟可以參考功課內容。 5. **Regularization** : 對loss動手腳, 讓他在高次項出現時進行懲罰,避免model太彈性,參考功課實作。 6. **Dropout** : 拋棄一部分的參數, 參考功課實作。 7. **Cross Validation** : 從訓練資料抽取一部分來做預測, 透過這個方式知道模型訓練過程是否發生過擬合。 #### Mismatch Mismatch跟overfitting不同, **Mismatch指的是資料的domain不同**,\ 如 : 丟照片訓練,卻丟卡通圖片測試(後面章節會講到如何解決這個問題) ### Chapter 3 : Small Gradient 在訓練過程中, 因為是透過gradient來進行迭代, 有可能造成被卡在local minimum的問題, 這時候參數沒辦法繼續更新。(gradient = 0) #### Math part **Tayler Series Approximation :** \begin{gather} L(\theta) \approx L(\theta\ ') + (\theta - \theta\ ')^Tg + \cfrac{1}{2}(\theta - \theta\ ')^TH(\theta - \theta\ ') \end{gather} **Gradient g** is a **Vector :**\ \begin{gather} g = \nabla L(\theta\ '), g_i = \cfrac{\partial L(\theta\ ' )}{\partial \theta _i} \end{gather} **Hessian H** is a **Matrix :** \begin{gather} H_{ij} = \cfrac{\partial ^2}{\partial \theta _i \partial \theta _j}L(\theta \ ') \end{gather} 當在**critical point**的時候, **gradient = 0**, 剩下的**Hessian** 可以用來判斷附近的地貌。 **At critical point :**\ \begin{align} L(\theta) &\approx L(\theta\ ') + \cfrac{1}{2}(\theta - \theta\ ')^TH(\theta - \theta\ ')\\ &\approx L(\theta\ ') +\cfrac{1}{2} v^THv \end{align} 1. $v^THv > 0$ : \ **H is positive definite = All eigen values are positive** = $\underline{\mbox{Local minimum}}$ 2. $v^THv < 0$ : \ **H is negative definite = All eigen values are negative** = $\underline{\mbox{Local maximum}}$ 3. Sometime $v^THv > 0$, Sometime $v^THv < 0$ : \ **Some eigen values are positive and some are negative** = $\underline{\mbox{Saddle point}}$ 遇到Saddle point時, 沿著eigen value的方向去更新參數就能讓loss變小,\ 實際上, local minimum較不常出現, Saddle point 比較常出現。 :::warning 運算量太大了, 實際上沒有在用 ::: #### Review: Optimization with Batch 把資料分成一個批量一個批量(batch)去做訓練。\ **epoch** : 看完全部的batch(看完全部資料一次)\ **Shuffle** : 隨機打亂資料, 讓每個epoch看到的batch都不一樣。 #### Small batch v.s. Large batch ![](https://i.imgur.com/SpaPVIa.jpg) 因為平行運算, 只要在上限內, 無論batch大小,時間都會差不多。\ 因此考慮平行運算後, 可以發現batch大小差別只在一個資料更新比較慢, 一個資料更新比較快, 差別只有在訓練過程是否比較Noisy, 又Noisy對訓練其實是有幫助的。\ **結論 : small batch is good for testing, and large batch is bad for testing**\ Original paper:[On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima](https://arxiv.org/abs/1609.04836)、[Extremely Large Minibatch SGD: Training ResNet-50 on ImageNet in 15 Minutes](https://arxiv.org/abs/1711.04325)、[Large Batch Optimization for Deep Learning: Training BERT in 76 minutes](https://arxiv.org/abs/1904.00962)、[Stochastic Weight Averaging in Parallel: Large-Batch Training that Generalizes Well](https://arxiv.org/abs/2001.02312)、[Large Batch Training of Convolutional Networks](https://arxiv.org/abs/1708.03888)、[Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour](https://arxiv.org/abs/1706.02677) #### Momentum 在真實的物理世界中, 物體向下滑落不會只單純考慮坡的斜度, 可能還會有其他現象, 我們把這些現象加到Gradient Descent裡面來實作。 **Vanilla Gradient Descent**\ 隨著參數不斷更新, 不斷減小前進的力道(有點類似摩擦力)。\ 就機器學習的角度上來說, 隨參數更新也會不斷地接近Loss最低的位置, 這時候learning rate也需要隨之變小, 才有辦法更逼近最低點。 **Momentum** 每一部移動前, 考慮前一步的移動方向(類似慣性。) #### Concluding Remarks * Critical points have zero gradients * Critical points can be either saddle points or local minima, which can be determined by Hessian matrix. * It is possible to escape saddle points along the direction of eigenvectors of Hessian matrix. * Local minima may be rare * Smaller batch size and momentum help escape critical points ### Chapter 4 : Optimizer #### Adaptive Learning Rate 因為error surface太崎嶇了, 我們需要針對每一個參數都訂定不同的learning rate。\ 有時候當loss停止更新了, 不見得代表你遇到了critical point,\ 有時候單純就只是你卡住了, gradient並沒有變得很小。\ 在實際上訓練的過程中很少卡到critical points,\ 因為一般的gradient descent會在gradient還很大的時候就被卡住了。 因此我們需要更好的Optimizer。 #### Root Mean Square \begin{aligned} &\theta_i^{t+1} \leftarrow \theta^t_i - \cfrac{\eta}{\sigma^t_i}g^t_i\\ &\sigma^t_i = \sqrt{\cfrac{1}{t + 1}\sum^t_{i = 0}(g^t_i)^2}\\ & g^t_i = \cfrac{\partial L}{\partial \theta_i}|_{\theta = \theta^t} \end{aligned} 利用這個方法, 讓gradient descent在進行迭代的時候多考慮整個訓練過程的斜率。 :::warning **Used in Adagrad** ::: #### RMSProp **Adagrad問題**\ 就算是同一個參數, 需要的learning rate也會隨著時間改變,就算是同一個參數、同一個方向, 也希望learning rate可以動態調整。\ (Adagrad考慮了整路上的gradient限制了Optimizer的彈性)\ **RMSProp**\ \begin{aligned} &\theta_i^{t+1} \leftarrow \theta^t_i - \cfrac{\eta}{\sigma^t_i}g^t_i\\ &/*從原先adagrad公式改變\sigma算法*/ \\ &\sigma^t_i = \sqrt{\alpha(\sigma^{t-1}_i)^2 + (1 - \alpha)(g^t_i)^2}\\ &/*只考慮最近的兩個, 並且用\alpha來調整哪個比較重要*/ \end{aligned} **結論 : 遇到斜率改變時, Adagrad的反應會比RMSProp慢** #### Adam 其實就是 RMSProp + Momentum, 通常裡面的參數不用做特別調整就可以得到不錯的結果了。\ Original paper : [ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION](https://arxiv.org/pdf/1412.6980.pdf) #### Learning Rate Scheduling ![](https://i.imgur.com/oc65CMQ.jpg) 沒有調整的情況下, 有太多小的y方向的gradient, 走到gradient比較大的地方就會慢慢震盪回來。可以透過**Learning Rate Scheduling**調整回來。\ **Learning Rate Scheduling : 隨參數更新次數增多, 降低$\eta$** **Warmup**\ 分成兩個部分, 一開始把learning rate調大, 達到高點後再把learning rate調小。\ 會多出三個hyperparameter : 1. 變大要變多大 2. 變大多快 3. 變小多快 合理的解釋為, 一般在訓練開始的時候$\sigma^t_i$的variance比較大, 所以需要比較大的learning rate去做。\ Original paper : [Deep Residual Learning for Image Recognition](https://arxiv.org/abs/1512.03385)、[On the Variance of the Adaptive Learning Rate and Beyond](https://arxiv.org/abs/1908.03265) ### Chapter 5 : Classification Classification就是分類問題, 給機器一個輸入, 輸出他屬於哪一類。\ 如果class間沒有明確的關係, 不能用class 1、class 2表示, 必須要用one-hot vector表示 #### Softmax 把y的domain挪到0~1。 \begin{gather} y_i' = \cfrac{exp(y_i)}{\Sigma_jexp(y_i)}\\ 1 > y_i' > 0\ \ and\ \ \Sigma_iy_i' = 1 \end{gather} 只有兩個class時, softmax跟sigmoid是一樣的。\ 總結一下softmax的作用 : 1. Normalized 到 0~1 2. 讓所有值的和為1 3. 讓差距更大 #### Cross-entropy(Loss of Classification) \begin{aligned} &e = -\sum_i \hat{y_i}lny_i'\\ &L = \cfrac{1}{N}\sum_n e_n \end{aligned} 通常Cross-entropy會跟Softmax綁再一起用,\ **Minimizing cross-entropy 就相等於 Maximizing likelihood** :::warning 相較於MSE, Cross-Entropy在分類問題的loss差距比較明顯, 有利迭代更新參數。 ::: ### Chapter 6 : Normalization 效果就是可以把本來很崎嶇的error surface炸平。 \begin{gather} \tilde{x}^r_i \leftarrow \cfrac{x^r_i - \mu_i}{\sigma_i} \end{gather} 做完Normalized後, 所有dimension的mean會變成 0, Variance會變成 1。\ 透過feature normalization, 可以讓gradient descent收斂更快。 #### Considering Deep Learning 在activation function前做或是後做的差異其實並不大。\ 做feature normalized後, 所有值都會一起變動, 但實際上實作只會針對batch\ (GPU不會一次讀入所有資料去計算)。 :::warning batch_size必須要夠大做起來才有意義 ::: Original paper : [Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift](https://arxiv.org/abs/1502.03167)\ To learn more : [How Does Batch Normalization Help Optimization?](https://arxiv.org/abs/1805.11604)、[Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models](https://arxiv.org/abs/1702.03275)、[Layer Normalization](https://arxiv.org/abs/1607.06450)、[Instance Normalization: The Missing Ingredient for Fast Stylization](https://arxiv.org/abs/1607.08022)、[Group Normalization](https://arxiv.org/abs/1803.08494)、[Weight Normalization: A Simple Reparameterization to Accelerate Training of Deep Neural Networks](https://arxiv.org/abs/1602.07868)、[Spectral Norm Regularization for Improving the Generalizability of Deep Learning](https://arxiv.org/abs/1705.10941) ### Chapter 7 : Convolutional Neural Network(CNN) ![](https://i.imgur.com/l2k9QNc.jpg) 通常圖片都會有三個通道(RGB)\ 隨參數越多, 模型越彈性, 越容易overfitting **Observation 1 :** Identifying some critical pateterns\ (要看出是什麼東西只要看某些重點就好了, 例如可以看有沒有鳥喙判斷是不是鳥)\ 不一定要看整張圖片才能辨識出東西, 有一些pattern比圖片小很多 ![](https://i.imgur.com/JAQGCRc.jpg) 透過Observation 1來設計的模型, 透過挪動kernel去找尋圖片中的pattern\ **Observation 2 :** The same patterns appear in different regions\ (相同物件可能出現在圖上不同地方) 原本的作法沒辦法達到參數共享, 但我們必須讓receptive field彼此互相共享參數。![](https://i.imgur.com/o7oZgak.jpg) #### Convolutional Layer 一一去比對跟目標物件的相似度, 並給出一個相似度分數,\ 每次向右移動的距離可以事先設定(stride)。\ 透過這樣子操作, 我們可以算出一個**Feature Map**![](https://i.imgur.com/OcZ4Dqb.jpg) #### Maxpooling **Observation 3 :** Subsampling the pixels will not change the object\ (把圖片做Subsampling, 並不會讓人類對圖片的認知出現異常) ![](https://i.imgur.com/TEVffHB.jpg) 把前面Convolutional Layer做出來的Feature Map分組, 每一組取最大的出來, 要幾個一組可以事先決定。 :::warning Convolutiona Layer跟Maxpooling可以重複出現、交替使用。 也可以不做pooling避免小的特徵被丟掉 ::: #### The whole CNN 在前面的Convolution Layer跟Maxpooling重複數次之後, 再經過Flatten和Fully-Connected Layers, 就是完整的CNN * Flatten : 把參數拉直, 變成一長串的一維矩陣 #### Application * **Playing go :** 下棋的部分, 因為棋盤的大小固定為19x19, 刪除掉任何一個棋盤上的資訊就會變成不同狀況, 所以沒有辦法做pooling(Observation 3 不成立) * **Speech recognize :** 語音的部分因為receptive field不能共用, 要對網路再做修正。 :::warning 如果用在其他領域, 要針對其特性再去做修正 ::: ### Chapter 8 : Self Attention 前面討論的Model都是輸入一個vector, output一個Class或是一個Scalar, 那如果我們今天輸入的是一長串的vector要如何處理(如何處理更複雜的輸入)。 #### Vector Set as Input ![](https://i.imgur.com/fmR7Rok.jpg) 設定一個Windows, 每次挪動一點去讀完整個語音訊息, 就可以用來處理類似的輸入。 ![](https://i.imgur.com/VYAQWxX.jpg) Graph也可以是一組vector, 可以把每個節點想像成是一個vector。 #### What is the output 1. **Each vector has a label(這裡著重於此) :** 輸入一個vector就輸出一個label。為了讓機器可以考慮上下文, 我們會讓機器的windows大一點, 如果機器一個字一個字讀的話, 可能會有問題(例如saw在同一個句子裡可能同時出現名詞和動詞的意思); 但也不能蓋住全部句子, 如果蓋住整個sequence, 句子有長有短的情況下容易overfitting。 2. **The whole sequence has a label :** 一整組資料只有一個label。 3. **Model decides the number of labels itself :** 讓機器自己決定 #### Self-attention ![](https://i.imgur.com/OJJzFNM.jpg) 每個結果都是考慮整個Sequence才得到的。\ 可以把Fully-Connected Network跟Self-attention交替使用。\ Original paper : [Attention Is All You Need](https://arxiv.org/abs/1706.03762) **實作方式**\ 假設輸入一組vector(裡面包含$a_1, a_2 \dots$), 會得到一組vector(裡面包含$b_1, b_2 \dots$) ![](https://i.imgur.com/R2aW59O.jpg) 1. 每個$a$分別產生一個$query$和一個$key$, 每個$query$跟所有產生的$key$做一次內積(計算關聯性), 之後經過一個**Softmax Layer**(也可以換成其他的) 2. 每個$a$再產生一個$v$, 去對產生出來的內積相乘。 3. 將剛剛跟$v$產生的結果總合起來, 得到$b$ \begin{aligned} &b^1 = \sum_i \alpha'_{1,i}v^i\\ &\alpha'_{1,i} = \cfrac{exp(\alpha_{1,i})}{\sum_j exp(\alpha_{1,j})} \end{aligned} 可以利用這個方式, 把所有的$b$產生出來。\ 這一串操作其實是一連串的矩陣乘法。 :::warning 每個結果是獨立的, **不需要依次產生** ::: #### Multi-head Self-attention 關聯性的計算方式不只一種, 定義也不只一種, 所以也許不能只有一組參數。\ 如果要一次產生多組參數, 則代表每個$a$必須要產生多$q、k$跟$v$, 而每個產生$q、k、v$的$a$就是一個head。 #### Position Encoding 在Self-attention中, 節點在哪個位置對演算法沒有影響, 這樣的設計對原本的命題有問題, 需要多考慮位置參數。(可以透過人為設定(hand-crafted)或是公式產生)\ Original paper : [Learning to Encode Position for Transformer with Continuous Dynamical Model](https://arxiv.org/abs/2003.09229) #### Self-attention v.s. CNN 圖片也可以當作是一組vector, (一個貫穿所有channel的pixel當作一個vector), 但是CNN是以kernel為單位, 所以CNN其實是Self-attention的簡化版。\ Original paper : [Self-Attention Generative Adversarial Networks](https://arxiv.org/abs/1805.08318)、[End-to-End Object Detection with Transformers](https://arxiv.org/abs/2005.12872)、[On the Relationship between Self-Attention and Convolutional Layers](https://arxiv.org/abs/1911.03584)、 [An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale](https://arxiv.org/abs/2010.11929) #### Self-attention v.s. RNN RNN跟Self-attention處理的問題類似, 但是RNN有前後的關聯, 最前面的參數可能帶不到後面, 相較之下Self-attention比較有效率一點。\ Original paper : [Transformers are RNNs: Fast Autoregressive Transformers with Linear Attention](https://arxiv.org/abs/2006.16236) #### 結語 Self-attention的變形很多, 都叫xxformer。\ 但每每看到有加快運算速度的method出來, 都會發現performance變差。\ Original paper : [ Long Range Arena: A Benchmark for Efficient Transformers](https://arxiv.org/abs/2011.04006)、[Efficient Transformers: A Survey](https://arxiv.org/abs/2009.06732) :::warning 依據不同的問題, 可以再對模型做一點調整 ::: ### Chapter 9 : Transformer(Seq2seq) 輸出的長度由輸入控制(例如 : 翻譯)。\ 也可以透過語音辨識 + 文字翻譯達成目的, 但有些語言是沒有文字的。(閩南語) #### Question Answering(QA) 大部分的自然語言處理其實都是透過問答題來達成的。\ 利用給機器問題, 希望訓練機器回答正確答案。\ 也可以設計選擇題甚至是多選題給機器去學習, 那這時候模型就要在收到輸入後自己決定有幾個答案。 其實這樣的學習方式, 就是把輸入的Sequence丟到encoder內, 透過計算後由decoder輸出一個Sequence。 #### Encoder ![](https://i.imgur.com/9Mo1Ozx.jpg) 因為可能會有未知的位置資訊(參考前一張Self-attention說明), 進入後經過Multi-Head Self-attention和Fully-Connected的Layer運算後得到結果,在Fully-Connected Layer可以使用CNN或是RNN來運算。\ 這樣的block可能會重複數次。 #### Decoder Decoder從Encoder拿到參數後, 透過運算之後為每一個可能出現的文字給上分數, 通過softmax層後, 把分數最高的那個當作答案輸出出去。\ Decoder的特點是會把自己的輸出當作下一部的輸入, 但只要中間錯了一個字, 後面的答案就會錯光光。 ![](https://i.imgur.com/5zyjvMr.jpg) 仔細看會發現Decoder的長相跟Encoder有一點像, 差別就是這個Masked Multi-Head Attention的Layer。 **Masked Self-Attention** ![](https://i.imgur.com/tb5E8DM.jpg) 因為Decoder的產生是有順序的, 所以要想像後面的key還沒被產生出來。\ **Autoregressive(AT)** 一次產生一個字, 機器自動去生成下一個可能會出現的字。 輸出跟輸入的長度關係複雜, 希望機器可以自己學習怎麼樣去判斷長度,\ 而實際上如果只有這樣, 機器不知道輸出的長度是多少, 他會永無止盡的一直預測下一個字, 我們必須再多做一點設定(Stop Token), 就像前面的Start Token一樣。\ 當預測結果是Stop Token後就代表句子結束了。\ **Non-autoregressive(NAT)** 簡單來說就是一次把整個句子產生出來, 而不是像上面一樣, 一次產生一個字。 相較來說, 因為平行運算的關係, 速度相較AT快了不少, 而且可以控制輸出的長度。但Performance不及AT(因為Multi-modality的關係) #### Transformer ![](https://i.imgur.com/AoQ9VQ9.jpg) **Cross-Attention** ![](https://i.imgur.com/Bm40DiC.jpg) 從Decoder產生query, 從Encoder的輸出產生key跟v, 作法如圖上所示\ 其實是先有Cross-Attention才有Self-Attention的出現。 **Training** ![](https://i.imgur.com/QURTBFF.jpg) 從上面這張圖可以發現, 在訓練過程中其實是有答案提供給Decoder看的。\ 當然在訓練上也有一些小訣竅 **Tips**\ 有一些東西是不需要自己產生的, 例如xxx你好, 只需要把xxx複製下來就好, 複製遠比自己產生向名字這種跟前後沒有關係的字簡單的多。 ### Chapter 10 : Generative Adversarial Network(GAN) generate是另外一種我們希望可以讓機器學會的東西, 也就是讓機器自己去產生一些聲音、圖片或是一段文字。而產生一張圖片對機器而言其實也不過就是產生一個高為向量, 至於要產生多少dimension, 就讓機器自己去決定。 #### Why distribution 過去的預測方式是利用過去的資訊去判斷可能的答案, 例如如果我們讓機器人去玩遊戲, 可能可以往右走, 也可以往左走, 無論往右走跟往左走都可以說是正確答案, 但如果今天同時往左又往右走, 可能就不是我們所樂見的結果。\ 而經由前面方式訓練出來的模型卻有可能產生這樣的結果。\ 因此我們在模型訓練的時候加上了一個隨機的數值, 使得機器隨機輸出, 避免出現兩面討好的結果, 而當機器需要創造力的時候, 就會需要隨機分布。 #### Discriminator Discriminator可以想像成是一個分類器, 由自己設計的Neural Network組成, 他會嘗試分辨出哪些是實際上的圖片, 哪些是機器產生的圖片。 #### Basic Idea of GAN 有了這些, 我們可以大致定義一下要怎麼樣來訓練一個GAN。 ![](https://i.imgur.com/SF1o8gA.jpg) 利用交叉訓練Generator跟Discriminator, 來讓生成的圖片越來越接近真實的圖片, 彼此透過彼此的輸出來調整訓練。 **Algorithm** 1. Fix(固定) generator G, and update discriminator D 2. Fix discriminator D and update generator G(這個步驟generator會嘗試去混淆discriminator, 讓他以為generator產生的圖片是真正存在的圖片) 利用不斷重複步驟一跟步驟二去訓練GAN的模型。 #### Theory behind GAN :::info **訓練目標\ Generator : Maximize Discriminator Accuracy\ Discriminator : Minimize Classification Loss\ 簡單來說, 希望輸出的圖片跟真實的圖片差別越小越好** ::: \begin{gather} G^*_{(loss)} = arg\ \mathop{min}_G Div(P_G, P_{data}) \end{gather} 意即希望$P_G$ 跟 $P_{data}$的差別越小越好 **How to compute the divergence**\ 其實沒有想像中那麼複雜, 只要可以sample data出來就可以算了。\ 分別從$P_{data}$跟$P_G$sample一些資料出來, 即便我們可能不知道他們的分布, 我們還是可以算他們的$Divergence$。 **Discriminator**\ \begin{gather} D^* = arg \mathop{max}_D V(D, G) \end{gather} Discriminator的任務是要清楚地分出真實的圖跟生成的圖, 這中間的$V(D,G)$其實是negative cross entropy, 也就是實際上要train的是希望cross entropy越小越好。 :::warning 算divergence的方式有很多種, 也可以選擇用別種divergence來計算。 但即便是這樣, GAN還是一個不好train的模型 ::: #### JS divergence is not suitable 1. 在實際訓練下, $P_{data}$跟$P_G$其實是不會有overlapped的。即便有, 也可以忽略它。 2. 即便有, 只要sample的點夠多, 就能夠清楚分開。 3. JS divergence is always $log2$ if two distributions do not overlap.(在這樣的情況下, JS Divergence無法分辨好壞程度) 如果再沒有辦法判斷好壞的情況下, classifier可能會硬背。\ 可以利用換一種divergence(**Wasserstein distance**)來解決這個問題。\ 在Wasserstein distance中, 只要$P_{data}$跟$P_G$稍微有一點變化, 在distance上馬上就會有變化, 有這個才能做出好的generator。\ 利用這個function時, 我們會希望Discriminator找到的function變化不要這麼劇烈, 要找平滑一點的function, 因為如果變化太劇烈, 很容易會有極大植跟極小值, 可以利用ReLU來解決這個問題。 #### Model Collapse 同一張臉越來越多。 換句話說, Generator抓到了Discriminator的盲點, 不斷朝那個方向發展。\ 會造成Generator生成的臉來來去去都是那幾張, 多樣性不足。\ 可以把進入softmax前的輸出來做一些運算, 評估生成的相似度。\ 但即便GAN出現了這麼多的版本, 始終沒辦法完全解決這個問題。 #### Conditional Generation 我們希望不只產生圖片, 我們還希望可以操控Generator的輸出, 產生有特定特徵的圖片, 例如 : 紅色眼睛的動漫人物或是黃色頭髮的。 ![](https://i.imgur.com/YUoZow8.jpg) 我們可以在Generator輸入時多給一個條件, 但如果只是這樣, Discriminator還是只會做把生成圖片跟真實圖片分類的工作, 這樣沒有辦法判斷說我們人類的輸入是否有被考慮進去, 所以Discriminator也要重新訓練。\ 因此在訓練Discriminator也要多告訴他條件。\ 利用這個方式, 我們可以把輸入的部分換成一張圖片, 藉此去改變生成圖片的domain。\ 當然也可以把輸入的部分改成聲音, 那機器就會受聲音影響去產生圖片, 聲音越大聲圖片越清楚。 #### Learning from unpaired data(Cycle GAN) 有時候訓練GAN的時候, 不總是有正確答案給機器參考。\ (但或多或少還是需要成對資料才能訓練)\ 可以參考Pseudo labeling和back translation的實作 ![](https://i.imgur.com/uvi70zt.jpg) 簡單來說, 從$x\ domain$ sample一張圖片出來,\ 訓練機器從$y\ domain$ sample一張最像的圖片出來。\ 但這樣的生成方式沒有辦法用Discriminator做驗證, 因為Discriminator只會判斷輸出, 即便輸出跟輸入沒什麼關係。\ 因此我們需要第二次轉換, 把原先那張$y\ domain$的照片再做一次,\ 看看機器從$x\ domain$ sample的照片是不是我們原先sample的那張。 :::warning 即便做成這樣, 也無法保證生成的照片會完全一樣,\ 畢竟只是在兩個domain裡面去sample照片, 也不保證是有正確答案的, ::: 利用這種訓練方式, 可以作例如Text style Transfer(把負面的詞語轉成正面的詞語)等模型。 ### Chapter 11 : Self-Supervised Learning(Bert) Bert模型真的超級大的啦... #### Self-supervised Learning **Supervised**是有答案, 可以讓機器在產生出結果後對答案;\ 但**Self-Supervised** 是指產生出模型後, 讓模型去label資料, 再繼續訓練下去, \ 是一種upsupervised learning的方式\ 訓練方法出奇的簡單, 就是訓練機器做填空題, 把部分的輸入用特殊的token蓋住, 也可以隨機替換成其他字, 希望訓練機器可以預測出被蓋住實際上是哪個字。 ![](https://i.imgur.com/f5Tdmbl.jpg) 最後發現, 我們雖然只訓練機器做填空題, 但實際上這個模型可以被用在其他任務上, 不只是填空題可以用。 #### GLUE(General Language Inderstanding Evaluation) 任務 : 1. Corpus of Linguistic Acceptability(CoLA) 2. Standford Sentiment Treebank(SST-2) 3. Microsoft Research Paraphrase Corpus(MRPC) 4. Quora Question Pairs(QQP) 5. Semantic Textual Similarity Benchmark(STS-B) 6. Multi-Genere Natural Language Inference(MNLI) 7. Question-answering NLI(QNLI) 8. Recognizing Textual Entailment(RTE) 9. Winograd NLI(WNLI) #### How to use BERT **Case 1 :**\ 我們可以把輸入的Sequence丟入BERT中, 希望輸出一個class, \ 因為BERT本身已經是train過的模型了, 效果會比隨機初始來得好。 \ 例如做Sentiment analysis。\ **Case 2 :**\ 輸入一個sequence, 希望輸出一個Sequence而且跟原本的長度一樣,\ 我們可以在做完BERT之後, 利用BERT輸出經過一些Linear Layer, 來得到我們的答案。 \ 例如做詞性標記(POS tagging)。\ **Case 3 :**\ 一次輸入兩個Sequence, 希望得到一個class, 可以在兩個Sequence中間插入分隔符號。例如 : Natural Language Inferencee(NLI)。\ **Case 4 :**\ ![](https://i.imgur.com/pKWU01Y.jpg) Extraction-based Question Answering(QA)\ 做問答題, 答案就在輸入裡。利用**Case 3**的方法,\ 將問題跟文章分開, 在把答案推出來之前做一次Random Initialized(長度跟BERT輸出一樣), \ 之後經過Softmax找出分數最高的, \ 找出答案在文章中的哪個位置(從哪裡開始、在哪裡結束)。 :::warning 做BERT的時候, 可以把資料做遮住、刪除、重新排列、或是轉置等處理,\ 給資料一些雜訊, 這樣效果會比較好。 ::: #### Why does BERT work BERT在處理一段文字的時候會考慮上下文, 所以即便是同一個字(Apple)也可以找出不同的見解(手機 or 水果)。這個能力不見得跟填字有關, 說不定這個方法就剛好適合這種大型模型訓練。 ### Chapter 12 : Auto-Encoder 在Self-supervised learning裡, 我們會投入大量未標註label的資料給機器去做學習,\ 因為我們並未設定明確目標, 所以要讓機器自己去找目標學習\ **Auto-Encoder功能 : 決定一個不用標註資料就可以學習的任務** :::warning 其實跟Cycle GAN的做法相似, 利用換domain之後再回推, 看是否和原輸入一樣。 ::: #### Why Auto-encoder 因為圖片的變化是有限的, 所以我們可以利用這個方法找出有限的變化, 以此來簡化輸入。 #### De-noising Auto-encoder 在進入encoder之前, 我們會將圖片加上一些雜訊, 但是要求機器還原的是沒有加雜訊的輸入。\ 這個做法其實就是BERT的做法, 加上mask但是要求機器要還原原本的詞。 #### Feature Disentanglement ![](https://i.imgur.com/DYwb5RM.jpg) Disentanglement : 把原本糾纏在一起的東西解開。\ 我們希望可以讓機器在學習的階段, 就學到一些輸入中的資訊, 例如如果輸入一段聲音, 可能某些參數是在記錄內容、某些參數是在記說話的人等等。\ 但在實作上, 向量確實可能包含上面這些資訊, 但那些維度代表哪些內容卻無從得知, Feature Disentanglement的概念即在train Encoder的同時知道那些維度代表那些資訊。 ### Chapter 13 : Explanable Machine Learning Explanable Machine Learning : 簡單來說就是需要機器是用什麼標準去判斷正確答案的。\ 因為機器得到正確答案, 不代表機器就真的學到了正確的東西, 有些時候可能是因為人類沒有注意到的細節造成了這種錯誤, 所以我們需要具有解釋力的機器學習。\ 但大部分時候, 好解釋的模型, 可能代表他的能力比較差...。\ 就像在明亮處找鑰匙比較簡單, 但鑰匙不一定真的掉在明亮的地方。 #### Goal of Explanable ML ![](https://i.imgur.com/Rg1lPim.jpg) 人能接受的Explanation就是好的Explanation。\ 例如如果想要在圖片中找到有貓的圖片, \ 就必須告訴大家貓在哪裡, 或是從哪裡判斷是貓的。\ 如果我們更動這些feature, 機器就會大幅改變他的決定, \ 代表這些特徵對機器在決定上來說是很重要的。 \begin{gather} &\{x_1, \dots, x_n, \dots , x_N\} \Rightarrow \{x_1, \dots, x_n + \Delta x, \dots , x_N\}\\ &e \Rightarrow e + \Delta e\\ &|\cfrac{\Delta e}{\Delta x}| \Rightarrow |\cfrac{\partial e}{\partial x_n}| \end{gather} :::warning ![](https://i.imgur.com/6g7C8n0.jpg) Saliency Map中, 越白代表越重要 ::: #### Limitation **Noisy Gradient** ![](https://i.imgur.com/MeopTa9.jpg) 有時候在做Saliency Map時, 圖片上可能會存在很多雜訊, 造成人類難以辨認那些東西是重要的。\ 這時候可以用**SmoothGrad**來進行調整\ :::warning **SmoothGrad : \ Randomly add noises to the input image,\ get saliency maps of the noisy images, and average them.** ::: **Gradient Saturation**\ 有時候Gradient沒辦法反映真正的重要程度, 鼻子長度在一定的長度範圍內, 也許可以直接判斷他是大象, 但超出這個範圍後影響就變得不是那麼大。 #### How a network processes the input data 經過前面的說明, 我們明白在輸入資料上的某些特徵確實會被機器給蒐集起來, 但我們不確定他在哪個位置, 那我們要怎麼樣找到他們呢? **Principal Component Analysis(PCA) or t-SNE**\ 先對要測試的維度進行資料降維(t-SNE有視覺化功能), 試著把比較複雜的維度做簡化, 方便我們理解。 **Attention**\ 利用attention找關聯性的方法來進行分群(參考前面幾張的內容) 這種做法就像插一根探針進去檢查這個Layer, 再用分類器去把資料分類、視覺化給人做參考, 但可能因為參數沒調好而有誤差。 :::warning 前面的做法是Local Explanation, 簡單來說就是試著回答為什麼會得到這個答案,\ 接下來的做法是Global Explanation, 簡單來說就是告訴人這個答案應該長甚麼樣子。 ::: #### Global Explanation ![](https://i.imgur.com/CipagJ8.jpg) 從CNN的模型出發, 我們可以將某個Layer抽取出來, 希望把這些參數回推成一張圖片。\ 但我們必須在train這個generator時加上一些限制, 來避免機器在沒看到的情況下卻說有看到。 需要完成這個generator需要很多很多的Constraint才有辦法做到。 :::warning 也有人會利用Linear Model去模仿Neural Network,\ 利用Linear Model好解釋的特性, 製作出等效的模型再去解釋。\ 但只能小區域模仿。 ::: ### Chapter 14 : Domain Adaptation ![](https://i.imgur.com/0J4hofc.jpg) 當訓練資料跟測試的資料分布不同, 即便模型訓練好, 也沒辦法做出正確的預測。\ 本章講解如何處理domain不同的訓練方式(Transfer Learning)。\ 但要這樣做, 需要對Target domain也要有一定程度的了解, 所以多少還是需要一些資料是從target domain出來而且有label的資料。\ 我們希望機器在做這個類型的訓練的時候, 可以抽取一樣的部分出來, 忽略掉不一樣的部分\ #### Domain Adversarial Training ![](https://i.imgur.com/sbR9BWB.jpg) 這種訓練方法跟GAN有點像, 可以把Feature Extractor想作是Generator。\ 訓練的目標是讓每個domain的差別越小越好, 甚至沒有差別, 但這個做法實際上是在分開每個domain, 訓練Discriminator(未必是最好的做法)。\ 可能會有一個問題是Discrominator一直輸出0, 就會分不出來,\ 但這件事情實際上不會發生,\ **因為訓練除了要滿足Discriminator, 還要滿足Label Predictor**。 :::warning 永遠都不可能完全分開兩個domain, 因為一定會有overlapping的部分,\ Domain Adaptation沒有想像中好Train ::: ### Chapter 15 : Network Attack 模型訓練出來之後的正確率高是不夠的, 還需要能應付人類的惡意。 #### How to attack 對圖片加上一些雜訊, 讓模型對圖片給出錯誤的預測, 但雜訊不能太大造成整張圖片無法辨識, 最好讓雜訊小到人類看不出來, 但是機器卻會給出錯誤的預測。\ 有時候在做攻擊的時候, 我們會希望有一個固定的目標(例如要讓機器把貓看成鍵盤或海星), 或是做無差別的攻擊(不預期會預測出什麼, 但是預測錯誤)\ **Non-target** \begin{aligned} &x^* = arg \mathop{min}_{d(x^0, x) \leq \varepsilon} L(x)\\ &(希望讓x跟x_0的差距小於 \varepsilon, 可以假設超過 \varepsilon 人類就會看出破綻)\\ &L(x) = -e(y,\ \hat{y})\\ &(希望cross-entropy越大越好) \end{aligned} **Targeted** \begin{aligned} &L(x) = -e(y, \hat{y}) + e(y, y^{target})\\ &(除了跟答案差距要大, 還要跟目標像) \end{aligned} **Non-perceivable** \begin{aligned} &d(x^0, x) \leq \varepsilon\\ &(\varepsilon需要考慮人類感知能力, 還需要一些domain\ knowledge)\\ \end{aligned} * L2-norm \begin{aligned} &d(x^0, x) = ||\Delta x ||_2\\ &=(\Delta x_1)^2 + (\Delta x_2)^2 + (\Delta x_3)^2 \dots\\ \end{aligned} * L-infinity \begin{aligned} &d(x^0, x) = ||\Delta x ||_{\infty}\\ &=\mathop{max}\{|\Delta x_1|, |\Delta x_2|, |\Delta x_3|, \dots\}\\ &(\mbox{L-Infinity}較接近人類感知能力) \end{aligned} #### Attack Approach 更新輸入, 不更新參數。 \begin{gather} x^* = \mathop{arg} \mathop{min}_{d(x^0, x) \leq \varepsilon} L(x) \end{gather} 改變input, 讓他去minimize loss即可, 記得要考慮人類感知能力。 #### White Box v.s. Black Box * White Box Attack : 需要知道模型參數 * Black Box Attack : 不知道模型參數, 需要用猜的 Black Box攻擊可以利用丟入輸入、取得輸出, 來猜出模型參數(訓練一個差不多的模型), 但相對來說, 黑箱攻擊要做Target Attack就比較難 #### Universal Adversarial Attack 同一個雜訊可以造成多個資料掛點。\ 例如 : 神奇眼鏡(戴上眼鏡就會把人看成別人)、把3鼻子拉長一點就被看成8 **Adversarial Reprogramming**\ 操控模型做一些不是訓練目標的事 #### Defense **Passive Defense**\ 對輸入圖片做一些輕微的模糊化處理, 就可以應對一些比較簡單的attack signal, 但也不能太過頭, 避免本來辨識對的成功率就下降了。\ 也可以做圖片壓縮(降低解析度), 甚至讓Generator建出一張一模一樣的圖片。\ 但這種被動防禦一旦被人知道就無效了, 還是可以有破解的方法, 隨機的效果也有限。\ :::warning 這裡說的處理都是在模型訓練好之後的test做處理。 ::: **Proactive Defense**\ 在訓練的時候就自己去攻擊自己的模型, 並讓他知道會有這種狀況, 其實就是資料增強(Data Augmentation) ### Chapter 16 : Reinforcement Learning ![](https://i.imgur.com/HL7awRN.jpg) 對抗式學習常見於讓機器學會打遊戲這件事情, \ 找一個Function讓機器針對環境的觀察, 做出相應的動作, 看看環境給出的回應如何。\ Reward就像是遊戲中的得分或扣分, 或是遊戲中的中止條件等等, 希望機器可以取得比較好的分數。\ 還有一種是遊戲只有輸或贏(在遊戲中並沒有甚麼特定的分數, 如圍棋), 這種訓練我們就必須在訓練的過程中自己給他一些回饋, 方便機器人去學習。 **回歸到機器學習最基本的訓練方式** ![](https://i.imgur.com/EeHy6Q3.jpg) #### Function with Unknown 得到一個來自環境的輸入, 如遊戲畫面, 可以是一張圖片或是其他東西,\ 找到函式要對這個輸入進行一次分類, 類別即可以進行的操作(往左走、往右走、開火等等)\ 對每個動作Network中都會提供一個機率, \ **但並不是挑最高的出來, 而是依據機率隨機選擇一個。** :::warning 假設往左走的分數為0.7, 往右走為0.2, 開火為0.1\ 則有70%機率往左走, 20%機率往右走, 10%機率開火 ::: #### Define Loss 對每一個機器所做的行為提供一個分數, 例如開火並擊殺敵人可以獲得若干分數等。\ 一場遊戲從開始到結束稱為一個episode,\ reward為採取行為後可以立即得到的分數, return則是一整場遊戲的reward\ 我們希望一場遊戲中的分數越高越好, 則 : \begin{gather} R = \sum_{t = 1}^T r_t\\ Loss = -R\ \ \ (Loss越小越好) \end{gather} #### Optimization 1. Actor輸出有隨機性, 同樣一個輸入不一定可以得到同一個答案 2. Environment 跟 Reward 不是 Network, Environment也具有隨機性。 因此在這樣的條件下, optimization是最難的(隨機性),\ Reward需要看得分、Observation 跟 action #### Policy Gradient 為了控制機器做最佳化, 無論選擇或不選擇, 都要給一個分數 \begin{aligned} &Take\ action\ \hat{a} : L = e\\ &Don't\ take\ action\ \hat{a} : L = -e \end{aligned} 利用類似Train Classifier的作法去控制actor的行為 \begin{gather} L = e_1 - e_2\\ (e_1為take\ action, e_2為don't\ take\ action)\\ \theta^* = \mathop{arg} \mathop{min}_{\theta} L \end{gather} 經過這樣的設計, 我們可以紀錄出每個行為做或不做, 以及要怎麼樣去計算它的Loss。\ 但這樣的行為, 不代表好不好, 只是代表想不想執行。(有時候需要犧牲短期利益來換取背後利益) \begin{gather} L = \sum A_ne_n\\ \theta^* = \mathop{arg} \mathop{min}_{\theta} L\\ \end{gather} 什麼都不做對actor也是一種選項, \ 有時候如果不特別訂定分數, 可能會造成actor一直甚麼都不做,\ 因此要對某些特定行為做處理, 相當於是人為的希望actor去執行或不去執行。\ 多考慮人類對actor的介入, 但這樣還不夠, **這樣的寫法只會讓機器考慮短期利益**\ 第一個版本希望利用累積的方式(累積人類對機器的介入分數), 來影響actor做決定。\ \begin{gather} G_t = \sum^N_{n = t} r_n \end{gather} 但這樣的作法並不合理, **因為第一步會影響到最後一步的機會不高** \begin{gather} G_t' = \sum^N_{n = t} \gamma^{n-t} r_n \end{gather} 利用第二個版本, 讓離$a_1$較遠的權重影響變的不明顯,\ 也可以再對G做標準化(減掉一個baseline), 但問題是baseline要怎麼求\ 因為在訓練過程中, 其實是一邊蒐集資料一邊訓練,\ 而且用其他actor(迭代過程)的數據不見得對自己的actor有效\ 因此每個actor的action應該只影響自己的actor。\ 而且隨機性非常重要, \ 一定要讓行為有被採取, 才能知道這個行為的好處,\ 所以有時候會希望隨機性大一點。 :::warning 同一個行為對不同actor它的好處是不一樣的\ 所以資料更新後, 資料就沒用了(因為狀況不一樣) ::: #### Critic Given actor $\theta$, how good it is when observing $s$(and taking action $a$) 簡單來說就是可以觀察現在的狀況跟actor去預測這個episode最後會得多少分。\ Value function : $V^\theta (s)$, When using actor $\theta$, the discounted cumulated reward expects to be obtained after seeing s.\ **Monte-Carlo(MC) based approach**\ 用來預測$V^\theta (s)$, 同一個$\theta$看到$s_a$會得到一個接近$G_a'$的答案。, 會看完整個episode。 **Temporal-difference(TD) approach**\ 不看完整個episode而是看一小部分就去預測。 \begin{gather} V^{\theta}(s_t) = r_t + \gamma\ r_{t+1} + \gamma\ r_{t+2} \dots\\ V^{\theta}(s_t) = \gamma\ V^{\theta}(s_{t+1}) + r_t \end{gather} 但如果有例子是沒看到的就沒辦法處理到。\ 而且這裡通常都會預設$\gamma$是1, 這樣就相當於沒有做任何事情。 :::warning 在這裡就可以把前面不知道怎麼算的baseline換成Value Function算出來的值了\ 這樣的做法就是把G扣掉很多條可能的路徑的平均。\ 但這樣還是不太對 ::: **Advantage Actor-Critic**\ 把上面改成Value Function的部分改成平均減平均。 \begin{gather} \mathop{r_t + V^\theta(s_{t+1})}_{採取a的期望值} - \mathop{V^\theta(s_t)}_{不採取a的期望值} \end{gather} #### Reward Shaping 如果做什麼action, reward都是0的話, 沒有辦法判斷action的好壞, train不起來(在只有輸或贏的遊戲的時候)\ 因此利用訂定額外的reward去引導機器學習, 需要人類的理解輔助。\ 也需要給機器加上好奇心(必須是有意義的), 而且需要解決雜訊(雜訊是沒意義的東西) :::warning 前面是利用改變機器選擇某些動作的"慾望"\ 這裡的分數是直接給機器"reward"或是處罰 ::: #### No-Reward 現實世界定Reward本來就有一些困難, 如果Reward沒有想好可能會有一些很奇怪的行為。\ 可以利用人類"示範"來教導機器, 但是要讓機器有能力分辨哪些是"習慣"哪些是要學的\ 但即便這樣做, 依舊有可能出現人類不會做的事情(人類不太可能自己開車撞牆\ 。 #### Inverse Reinforcement Learning 讓機器自己去訂Reward去學習, 根據人類的行為去訓練Reward Function, 再用Reward Function去訓練RL。\ **Principle : The teacher is always the best** 老師的行為分數一定會高於學生, 但不代表老師都是對的, 不代表要全部都模仿。\ ![](https://i.imgur.com/g3oPcs2.jpg) 如圖為大概架構, 老師一定會得到比學生高的分數。 ### Chapter 17 : Life-long Learning 我們希望機器不要只能解決一個任務, 而是可以解決多個不同的任務。\ 而且隨著進程不斷地重新學習或是學習新的東西, 不要停止訓練。\ 或者是同時可以處理不同domain的任務。\ 一般來說, 如果我們把兩個任務一次給機器去學習, 機器可能可以訓練出不錯的成果;\ 但如果換成先訓練其中一個任務,\ 訓練第二個任務時卻會得到機器會"忘記"前面那個任務怎麼做 #### Catastrophic Forgetting(災難性的遺忘) 機器沒辦法分開學會多種任務, 如果有時候運氣好, 資料量比較小,\ 可以先把多個任務一起給機器看, 先把Upper bound展示出來。 **Life-long learning v.s. Transfer learning :**\ Transfer learning會著重在第二個任務上, 但life-long learning會希望著重在原本的任務上。 ![](https://i.imgur.com/RzBn1ch.jpg) \begin{aligned} &Accuracy = \cfrac{1}{T}\sum_{i=1}^T R_{T,i}\\ &Backward\ Transfer = \cfrac{1}{T-1}\sum_{i=1}^{T-1} R_{T,i} - R_{i,i}\\ &(檢查遺忘的程度, 一般的\mbox{life-long learning}沒辦法做到學新任務, 舊任務做更好。)\\ &Forward\ Transfer = \cfrac{1}{T-1}\sum_{i=2}^{T} R_{i-1,i} - R_{0,i}\\ &(還沒看過任務前, 機器學得怎麼樣了) \end{aligned} #### Selective Synaptic Plasticity Regularization-based Approach, 只有部分Neuron可以被修改數值。 \begin{aligned} &\theta^b\mbox{ is the model learned from the previous tasks, each parameter }\theta^b_i \mbox{ has a "guard" }b_i\\ &L'(\theta) = L(\theta) + \lambda\sum_ib_i(\theta_i - \theta^b_i)^2\\ &L'(\theta) :\mbox{ Loss to be optimized}\\ &L(\theta) :\mbox{ Loss for current task}\\ &b_i : \mbox{How important this parameter is}\\ &\theta_i : \mbox{Parameters to be learning}\\ &\theta^b_i : \mbox{Parameters learned from previous task}\\ \\ &\mbox{if }b_i = 0,\mbox{ there is no constraint on }\theta_i\rightarrow \mbox{Catastrophic Forgetting}\\ &\mbox{if }b_i = \infty,\mbox{ would always be equal to }\theta^b_i\rightarrow \mbox{Intransigence, 可能沒辦法將新任務學好} \end{aligned} 需要事先去找到哪些參數對$\theta_b$重要, 如果改動參數後結果差距不大則可以改動, 如果差距很大就不要動。\ 但限制得太過頭的話, 也會造成新任務學不好。\ 不童的$b_i$算法差距也很大。 #### Additional Neural Resource Allocation **Progressive Neural Networks :** 多開一些Network去處理後面的任務。 每多一個任務, 模型就大一點, 但不會有forget的問題。\ **PackNet** : 一次開大一點的Network, 填入的時候用不同的位置。\ **Compacting, Picking, and Growing(CPG) :** PackNet + Progressive Neural Network #### Memory Reply 在訓練模型的時候, 順便一起訓練Generator, 當有新的任務的時候可以把generator的輸出當輸入一起丟入訓練。 #### Curriculum Learning 把比較簡單的任務先訓練, 再訓練比較難的(兩個必須有關連性)\ 例如 : 手寫辨識先訓練一般的, 再訓練有雜訊的,\ 可能在兩個任務上的Performance都可以比較好, \ 順序反過來訓練可能就會出現問題(Forgetting)。\ 因此, 調換任務學習的順序也是有幫助的。 ### Chapter 18 : Network Compression 有時候模型不只會用再Server, 也可能需要用到一些資源有限的環境上(像是手錶或手機), \ 這時候我們會需要模型變的小一點, 但不希望他的效果因此而大打折扣。\ 一方面也是為了避免隱私問題(上傳資料到Server造成隱私洩漏)。 #### Network Pruning 把Network中一些沒有用的參數剪掉。(也許絕對值越大, 對Network越重要) ![](https://i.imgur.com/vrfJZ3B.jpg) :::warning 如果一次修剪太多, 可能會無法回復。 ::: **Weight Pruning or Neuron Pruning**\ 可以選擇用Weight當單位或是以Neuron當單位, \ 如果選擇以Weight修剪, 實作上只會把參數做補0, 但因為沒有刪除任何東西, Network根本不會變小。\ 但如果以Neuron作單位, 形狀會變得不規則, 不好實作之外, GPU也不好加速, 因為不規則的時候不容易用矩陣乘法加速運算。 :::warning 用這個方法可以刪除接近95%的參數, Accuracy只掉1%~2%, \ 但沒辦法加速實作, 不算是好方法。 ::: **Why Pruning**\ 大的Network的參數隨機性比較多, 比較容易Train出好的Model, 挑出好的參數。\ 所以只能將大的Network修剪成小的, 沒辦法直接Train小的Network。\ 就像大樂透買越多, 中獎機會越高的意思一樣。 #### Knowledge Distillation 把模型大Network訓練出來後,\ 將大Network的輸入跟機率分布丟到小Network去Train, 去模仿大Network的輸出。\ 這樣的作法,\ 因為是模仿大Network的機率分布,\ 小Network有機會在還沒看過某個資料前就已經學會如何辨識。\ 可以想像成Teacher Network(大Network),\ 會提供一些額外的資訊給Student Network(小Network)。 :::warning 可以拿softmax前的任何一層去Train,\ 也可以加上更多的限制, 往往加了限制效果會更好。\ 也可以在Teacher Network跟Student Network之前加中間Network。 ::: #### Parameter Quantization 1. 只用比較小的參數儲存模型。 2. 參數分群。 可以利用Huffman encoding來讓常用的資源用更少的資源儲存。\ 終極型態是希望用一個bits就可以儲存一個參數。(Binary Weights) #### Architecture Design ![](https://i.imgur.com/PBQnara.jpg) 一般的CNN是有幾個filter就有幾個channel\ **Depthwise Convolution :**\ 一個channel就是一個filter, 有幾個channel就有幾個filter。\ 這樣的作法, 會使每個channel間沒有任何互動。\ **Pointwise Convolution :**\ filter的大小是1x1, 換句話說就是只考慮channel之間的關聯性。\ 通常會跟上面的Depthwise一起用, 可以解決Depthwise的問題。\ **Low rank approximation :**\ 中間插入linear layer, 利用矩陣乘法的方式, 可以減少參數量。\ 但會減少w的可能性, w會變有限制。 #### Dynamic Computation ![](https://i.imgur.com/LtRfZQB.jpg) ![](https://i.imgur.com/8MOrQVp.jpg) 希望Network可以自由調整運算量, 讓Network判斷問題的難度或是運算資源多寡, 自由去增減Network的深度, 決定要在哪個Layer輸出。 ### Chapter 19 : Meta Learning :::info Goal : 學習如何學習。 ::: 在機器學習這門課中, 最麻煩的一個部分不外乎是調整Hyperparameter,\ 沒甚麼方法可以處理這個問題, 只能期待多train之後找出一組最好的。 #### Review ML 1. Function with unknown 2. Define Loss function 3. Optimization #### Introduction of Meta Learning 我們希望找到一個Learning Algorithm去做學習, 簡單來說就是學習如何學習。\ 我們需要學出 : 1. Network Architecture 網路架構 2. Initial Parameters 初始參數 3. Learning Rate 除了這三個還有很多。 #### Meta Learning - Step 1 不同的Meta Learning的方法就是想去學不同的Component。\ Learnable component($\phi$)就是上面那些Learning Rate那些的東西。\ 在開始訓練之前, 需要了解哪些是可以透過學習去學出來的, 哪些不行。 #### Meta Learning - Step 2 Define $\underline{loss\ function}$($L(\phi)$) for $\underline{learning\ algorithm}$\ 如果這個algorithm被使用於訓練後,\ 對classifier的效果是好的, 代表這個algorithm可能是好的,\ 因此如果要評斷algorithm的好壞必須要跑test data。 \begin{gather} Total\ Loss: L(\phi) = \sum^N_n l^n\\ (\mbox{sum over all the training task}) \end{gather} :::warning 在Meta Learning的訓練資料, 即一組train set跟test set。 ::: #### Meta Learning - Step 3 \begin{gather} \phi^* = arg \mathop{min}_\phi L(\phi) \end{gather} 有可能會遇到沒辦法計算微分的參數, 這時候可以選擇用RL做。 因為meta learning是學習怎麼學習, 只需要一點點有label的資料就好了。 #### What is learnable in a learning algorithm **Model-Agnostic Meta-Learning :**\ 說到底就是訓練怎麼找一個好的初始值去訓練。這個初始值會離正解很近。\ 我們可以利用這個方法, 去做多個task, 都會得到不錯的結果, 即便資料的domain不一樣。 **Optimizer :**\ 不同的Optimizer對不同的問題適應程度不同, 可以學習找到最好的Optimizer。\ **Network Architecture Search(NAS) :**\ 訓練找出最好的Network架構。 \begin{gather} \hat{\phi} = arg \mathop{min}_\phi L(\phi)\\ \phi : \mbox{Network Architecture} \end{gather} 一般Network不能微分, 可以利用DARTS硬把Network架構變成可以微分。\ **Data Processing :**\ 訓練怎樣的資料前處理可以對訓練效果有幫助。