---
# System prepended metadata

title: ML

---

# ML
![](https://i.imgur.com/1adADWv.png)

ML分為三步驟：
1.Define a set of function
2.find the goodness of function
3.pick the best function

function set裡可能有無限組function
loss function:用來衡量function set(model)裡的function有多不好的function
![](https://i.imgur.com/EmmzPpp.png)
只要L(f)可微分，就可以用gradient descent找到一個最好的function

**超參數**：超参数是在开始学习过程之前设置值的参数，而不是通过训练得到的参数数据（模型自動獲得），就像gradient descent裡的learning rate是人工去找出最合適的超參數。而超參數專用的確認資料即稱為validation data，利用著個來評估超參數的好壞

**對python而言**
Numpy:N維陣列容器、矩陣
Scipy:科學計算函式庫
Pandas:表格容器
Matplotilb:繪圖

### Gradient descent
![](https://i.imgur.com/M9F16mN.png)
先隨機取一個w0做微分找其切線斜率
如果是負的代表還不到最低點，所以要增加w值
若是正的代表在往上增加loss了，所以要減少w值
而要增加或減少多少（踏一步多大）？
![](https://i.imgur.com/9EzVvcC.png)
取決於learning rate(事先人定的)及他微分的值(微分越大代表越斜，要踏的步數越多)，通常一開始大，後來變小，通常最好的step為一次微分/二次微分

因材施教，每個參數都給特定learning rate:**Adagrad**(優化器)
![](https://i.imgur.com/j8WGCwI.png)
看完全部examples在更新

**SGD**：update each examples

**feature scaling**:讓gradient descent更好做
**過擬合(overfitting)**:function過於符合train的data使其有很小的誤差，但當套在test data時誤差卻很大

### error
有分bias error 及variance error
找出model裡每個function的平均值f*，與不知道的完美f去比較
**bias error**：平均值f*與完美f的差別
**variance error**：model裡每個function各自的差別
![](https://i.imgur.com/08EaNdr.png)
複雜的model有大variance error小bias error(overfitting)，解決：增加data或regulization
簡單的model有小variance error 大bias error(underfitting)，解決:重新定義一個feature更多更複雜的model

正常做法：在training set分成training set及validation set，i.e.把validation set 當成原本的testing set(找出最小的error rate的model後在跟完整的training set train一次)，這樣在真正的testing set時才可以更真實的去反應要去比的Testing set
![](https://i.imgur.com/8EZ8NVc.png)

**如何分validation set**:N-fold Cross Validation

![](https://i.imgur.com/Ryk3AXc.png)

### Classification
與regression的不同：ex.神奇寶貝丟進function知道他進化後的樣子vs神奇寶貝丟進function後知道他的屬性
![](https://i.imgur.com/daUGQTc.png)

**guassian**：一個函式，可以看出他sampling出一個點的機率為多少

![](https://i.imgur.com/uqVyrQa.png)

![](https://i.imgur.com/dqMmOCG.png)

那個式子P整理一下會變成sigmoid

## DL
分為三步驟：
1.小批次：從訓練資料隨機取出部分資料
2.計算梯度：計算與各種權重參數有關的損失函數梯度
3.更新參數：往梯度方向微量更新全中參數

為何要深？
利用模組化的概念，分層解決問題，所以會比深瘦會比胖短好
雖然一層可以表達任何參數，但是沒有效率，所以才多層

### 總攬
有輸入層x，輸出層y，中間可以再有很多層
每層中間有weight參數控制輸入值，到下一層內後有一個活化函數(sigmoid,ReLU...)改變一下值再與下下一層的weight做控制進入下下層
活化函數：sigmoid，ReLU（ReLU可以handle sigmoid的gradient消失問題）
而輸出層內在classification時有softmax函數（大的強化），在regression時有恆等函數

**loss functionu有**：
1.mean square error通常用在regression 
2.cross entropy 通常用在classification

### 計算梯度（CH4,5）
現今有2種計算梯度的方式：
1.**數值微分**：可以找到梯度去更新
2.**反向傳播back propagation**：比數值微分方法可以更快地去找到梯度（反向回去就是微分），因為把神經網路以『層』的單位去執行處理，所以當遇到有大量的參數要計算可以很快，通常有上百萬個參數要更新
![](https://i.imgur.com/aXCol1Q.png)

### 更新參數(CH6)
也就是用SGD, Momentum, AdaGrad, Adam等optimizer來縮小損失函數（找到model裡更好的參數）
**SGD**:簡單，但是沒有效率，因為梯度的方向可能不是指向最小值

**Momentum**:比SGD多了一個V（一個阻力與推力），意思類似在陡的地方下降較快，在比較不抖的地方下降較慢

**AdaGrad**:學習率衰減方法，去動態調整學習率使其一開始大，到後來變小，最後學習率 可能變零（RMSProp改善此問題）

**Adam**:Momentum+AdaGrad
要選哪一種優化器看個人，可以試一試發現哪個比較快就用哪個

權重值的預設：
1.當活化函數使用的是*Sigmoid或Tanh*時使用*Xavier*預設值，也就是標準差為1/sqrt(n)的常態分佈來初始化節點
2.當活化函數使用的是*Relu*時使用*He*預設值，也就是標準差為2/sqrt(n)的常態分佈來初始化節點

Batch Normalization:
強制性的調整各層的活性化分佈，使各層能更具有適當的廣泛性，通常會是一個Batch Norm（Batch Norm演算法）層插在激活函數之前，可以加快學習時間、不過度依賴預設權重值的好壞、控制過度學習（過擬合）


Dropout與Weight decay:避免overfitting的正規化技術，train data做完dropout，test data的weight要乘以一個1-dropout的值

一個資料分為train data, test data，我們再利用train data 去分割出validation data

validation data:用來驗證超參數的隨機取樣是否有夠好的準確度，不夠好再去逼近

train data:用來訓練model，也就是參數（node的權重與bias值）

test data:使用此資料來檢查上面找的是不是好超參數與好模型
梯度消失問題：https://kknews.cc/zh-tw/code/p95ko58.html
### CNN(CH7)
前面convolution層(filter)就像是把那張圖片你要的特徵找出來（看局部），做完卷積後圖上有那個特徵的地方值會是最大，所以之後再做max-pooling將其取出來

將原本的單層（Affine+Relu）換為convolution+Relu+Pooling層
通常全連接層只能接受一維資料，而CNN因為接收的是影像所以為三維
**卷積**通常為圖片大小不變，但是一張照片會增加成濾鏡的數量
**池化層**為照片數不變，但大小會縮小
**填補（Padding）**:將輸入圖周圍增加任意值（通常為0），控制輸出圖的大小
**步幅（stride）**:做卷積運算的間格大小，與填補均為控制輸出圖的大小
隨著層數的增加（取越來越多的特徵），可以使資料變得高階，進而提升準確率

何時適合用cnn:
1.有一個特定的小特徵（不用看整張圖）
2.那個小特徵在不同地方還會出現
3.將其簡化不影響看的結果（但是有時候dependent on the task ex.alpha go就沒有max-pooling）

### 深度學習(ch8)
what is the class of this image網站可以看到對mnist做處理準確率前幾名的paper方法
其中提高辨識綠的方法有：1.整體學習2.學習率衰減3.資料擴增
**資料擴增**：旋轉、水平或垂直移動的小幅更改影像，使資料增加
通常加深層數與提高辨識效能成正比，且能讓參數減少，且分多層可以讓每層要處理、理解的問題簡化
著名的深度學習網路：VGG,GoogLeNet,ResNet
現今利用GPU去做大型的陣列運算（卷積），再利用分散式學習加快速度（Tensorflow）
GAN(生成對抗網路)：是一種非監督式學習，利用generator生成與本尊很像的像，再利用另一個discriminator去判斷是否為本尊，前者學習成更高明的偽裝，後者學習更高超的鑑定，兩者互相切磋抗衡學習

### RNN
![](https://i.imgur.com/HrVs7LZ.png)
#### LSTM
RNN只要有新資料舊的就會被洗掉，但在LSTM中可以存比較久，有Gate可以控制
![](https://i.imgur.com/XGPQuPJ.png)

LSTM總共有四組Input與一組Output，其中一個Cell可以看成是一個神經元

![](https://i.imgur.com/2HAuJkL.png)

實作後簡化，Z是操控每個gate是否打開的Vector
![](https://i.imgur.com/kocByPD.png)

![](https://i.imgur.com/1M7odLn.png)

**如何train 一個RNN**:
RNN有error surface變化大的特性，所以train時會加一個clipping方法，gradient太大時就等於某一值、太小也等於某一值
LSTM可以handle gradient vanishing的問題：因為他的forgate gate不一定跟RNN一樣會一直開啟，所以會一直有影響

*其他應用：* 給文章判斷喜好分析、給文章擷取關鍵詞彙，聲音辨識
#### RNN Auto-encoder
![](https://i.imgur.com/kyUY8za.png)
### Attention-based Model
也有運用到之前的記憶
![](https://i.imgur.com/ZXKukkE.png)
之後還有writing head寫入mechine memory

## Semi-supervised learning
training的時候會有很多unlabel data
1.Transductive learning:unlabel data 是test data
2.Inductive learning:unlabel data不是test data

#### Low-density separation
兩個class之間有明顯鴻溝，用self-training,self-training: label data tarin出f後再去train unlabel data後就有更多label data
#### smoothness Assumption
兩個不太像的data可以通過很多的相似data找到關系
![](https://i.imgur.com/iCTqbuP.png)
可以做clustering:分class
#### Graph-based
先去建立有連結起來的圖型，找到圖形去分class（有連結起來的就是同一個class），如何連起來K-Nearest Neightbor
####  Better Representation

## Unsupervised Learning
### clustering
1.K-means 2.HAC 
### Dimension Reduction
![](https://i.imgur.com/UVs1QLN.png)
**1.Feature selection**

**2.PCA:**
把一個東西切成好幾個component（看你要切成幾個就是變成幾維），只要將這些component相加就可以變成原本的東西

z就是X投影在W上的向量，找w時會希望Z越分開越好（z的variance越大越好），看要找幾維就找幾個W(每個w互相垂直)
![](https://i.imgur.com/WVgayBN.png)
也就是說可以變成：
![](https://i.imgur.com/mhTpMrE.png)
找w1的方法結論
![](https://i.imgur.com/7jpnHQd.png)
找w2
![](https://i.imgur.com/6RSM7tf.png)
找w2的方法結論
![](https://i.imgur.com/Ps6I45w.png)

**決定需要降到多少維**（以最大6維為例）：
![](https://i.imgur.com/tzG5NXR.png)
### Word Embedding
目的：類似語彙在一個high dimesion可以較接近
方法：word 可以從他的context推論出來
* Count base:以出現頻率來判斷
* predition base:給前一個word 預測下一個字
   *  CBOW
   *  Skip-Gram
     ![](https://i.imgur.com/Uu1ghC3.png)
     
可以找出字與字的關西，例如：台灣：台北＝德國：柏林
參考資料：https://medium.com/life-of-small-data-engineer/%E8%83%BD%E8%A2%AB%E9%9B%BB%E8%85%A6%E7%90%86%E8%A7%A3%E7%9A%84%E6%96%87%E5%AD%97-nlp-%E4%B8%80-word-embedding-4146267019cb
#### Neighbor Embedding
Manifold:將高維空間攤平變成低維空間有時才可以比較歐式空間
* LLE:舊空間同樣的距離去新空間找點
* Laplacian Eigenmaps
* t-SNE:上述方法能將靠近的類別區分出來，但個群之間不一定分的出來，跑起來很複雜，所以通常用來PCA降維後（50-10），再用這個做視覺化，例如你有很多個點x是高維，可以將它降到二維去看(10-2) 

重疊bad：
![](https://i.imgur.com/B5lAe7c.png)

t-distribution使他有差距可以分越開good：
![](https://i.imgur.com/yvt952r.png)

#### Auto-encoder
encoder可以降維，再利用decoder去回復
效果好不會失真太多
#### Deep Generative model
讓Machine知道自己在做什麼
1. pixelRNN
   遮住一半，機器可以自己去生出下半段
   ![](https://i.imgur.com/NYzKGjS.jpg)
2. Varational Autoencoder
   ![](https://i.imgur.com/O4HcSq7.png)
   sigma讓機器自己學習，但因為如果是0一定error最小但就與普通autoencoder沒有差別，所以加了一個限制也就是minimize那裡
   用VAE目的：可以控制你要輸出的東西
3. GAN
  Discriminator的learn法：
![](https://i.imgur.com/YNCcJH0.png)

  Generator的learn法：
  將Generator network（1代）與Discriminator network（1代） 合起來變成一個大的network，固定Discriminator network的參數即可訓練出Generator network（2代）
### Transfer learning
![](https://i.imgur.com/UBd7hU1.png)

**model fine-tune:** target data很少，source data很多，要防overfitting可以用1.*conservative training*2.*layer transfer*解決
**Multitask laerning**:可以用來訓練各種國家語言

**Domain-adversarial training**:處理類似的task時，因為target data沒有label，所以將domian消除，利用source data來train
**Zero-shot learning**:task的區別更嚴格，利用attribute去做不同task的聯繫

## SVM
### loss function用Hinge loss：
![](https://i.imgur.com/On0FhiL.jpg)

Linear SVM架構:
![](https://i.imgur.com/kX5CUiw.png)

Linear SVM gradient descent原理方法：
![](https://i.imgur.com/fpdC8mn.png)
平常看到的SVM:
![](https://i.imgur.com/hzGDSUz.png)

### Kernal Method
因為Hinge loss使得Cn(w)通常為0，所以An*通常為0，Xn乘上飛0的An*就是support vector
![](https://i.imgur.com/cSk3zgF.png)

![](https://i.imgur.com/kiirk47.png)
K就是將Xn與x做inner product
## Ensemble
將很多種分類器混合，術以專攻，以創造更高的準確率
**Bagging:** 將不同varience很大的model合起來使其varience變小（model強的時候用)
**Boosting:** (model較弱的時候用)classifing時用互補的第二個分類器幫忙，照順序延續下去ex.*Adaboost*，最後在合起來判斷分類
**Stacking**: 
![](https://i.imgur.com/BhvjhOY.png)