---
# System prepended metadata

title: Fundamental of ML and DL
tags: [CS]

---

---
title: 'Fundamental of ML and DL'
tags: CS
---

Basic Knowledge
===

## Table of Contents

[TOC]

## Reference
- [Data Science and Robots(Brandon Rohrer )](https://brohrer.mcknote.com/zh-Hant/how_machine_learning_works/how_rnns_lstm_work.html)(done)
- [Loss Function](https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E4%BB%8B%E7%B4%B9-%E6%90%8D%E5%A4%B1%E5%87%BD%E6%95%B8-loss-function-2dcac5ebb6cb)
- [softmax詳解](http://freemind.pluskid.org/machine-learning/softmax-vs-softmax-loss-numerical-stability/)
- [Correlation and Convolution ](http://www.cs.umd.edu/~djacobs/CMSC426/Convolution.pdf)
## Basic Mathematics
### Likelihood
![](https://i.imgur.com/f56fOwa.png)

- Probability:under fixed distribution and find the areas
- Likelihood:find the areas under a moving distribution(so that's why we have the "maximum likelihood")，就是說在找分布(不同的曲線)
### Bayes' theorem
![](https://i.imgur.com/suSfmry.png)
- [參考影片](https://www.youtube.com/watch?v=EyhGVy2esE8&list=PLQMYqUeJuyVP9WCa9xvDJkx0PJO2CtBIW&index=13)
- 後驗概率 = (似然性*先驗概率)/標准化常量
    - P(B|A)/P(B)也有時被稱作標准似然度（standardised likelihood）
    - **後驗概率 = 標准似然度*先驗概率**
> - P(A|B) **:** A的後驗概率，給定B情況下，A發生機率。
> - P(A) **:** A的先驗概率（或邊緣概率）。
> - P(B|A) **:** 給定A(結果)，是B情況的機率(B有很多情況，取最大的)。(the likelihood)(similarity)(P of B given A)
> - P(B) **:** B的先驗概率。

- 另一種解釋
    - P(A)先驗:表示在有一定量數據的前提下，對參數的估計概率，即直接看到的數據(A)
    - P(B|A)極大似然:找到一個**參數(B)**，使得我們觀測到的數據(A)出現的概率最大
    - P(A|B)後驗:在最合適的那個參數(B)前提下，數據(A)出現的最大概率


P(B)又可以被表示成在A以及A補集發生情況下的機率相加
![](https://i.imgur.com/4wNONzY.png)
一般化
![](https://i.imgur.com/XNaHAy4.png)

## Computer Vision
### Haar Features
Haar Features指的是兩個區域pixels的總和的差，在圖形上看起來就是深色和淺色區塊差異，有２、3、4－矩形(以下為理想狀況)
![](https://i.imgur.com/PLZ99YO.png)
- Viola-Jones algorithm
比較實際情況和理想圖形的相似程度:
設全白為0，全黑為1，對照理想圖形黑色及白色的區塊，將實際情況的數字做加總並取平均，最後將黑色－白色得到結果
![](https://i.imgur.com/88WJiWP.png)
範例
![](https://i.imgur.com/Lln1wsj.png)

- Integral Image
因為原本的方法去算完一張圖片所需的時間複雜度為O(n^2)，使用此方法只需要O(1)。
方法為：所有pixel的值為自己以及其左方、上方所有數值的加總，
![](https://i.imgur.com/LsIaf8V.png)
計算
![](https://i.imgur.com/Z7K8hZm.png)
可根據任意的尺寸做計算，且只要O(1)的時間複雜度。

## RNN
![](https://i.imgur.com/iCLaUS9.png)

- Vanishing Gradient
下面的公式 h0 對 ht 的影響力為 w 的 t 次方，w 會小於 1，當 t 很大時，w 的 t 次方會趨近於0，也就是說，段落或句子很長，越前面的字詞會被遺忘，這種現象稱之為『梯度消失』(Vanishing Gradient)，它忽略了人類對特有事物是有記憶的能力。
    ![](https://i.imgur.com/RkOeoqo.png)

### LSTM structure
![](https://i.imgur.com/AchQKdK.png)

- selection(Output gate):
    - To make a decision of the gate weight.
    - This gate is used to determine the final result of each prediction.
    - **output:
final possibilities**
- forgetting & memory: 
    - To construct a gate of specific information(memory or forgetting), add the result to the next prediction.
    - This procedure references the previous prediction and helps prevent incorrect output from being the next input, which makes the error accumulate.
    - To do the operation above, it compares the correlation of current input and previous ones and generate the weight vector.
    -    **output:
collected possibilities(and it will be stored in this part as the basis of filtering the next prediction)**
- ignoring(Input gate):
    - To ignore the low correlation prediction, prevent these prediction from affecting the final prediction.
    - **output:
filtered possibilities**
- NN: 
    - According to the input and the connections, construct the output.
    - **output:
all possibilities**
- Formula & Legend
![](https://i.imgur.com/aj0Gt6S.png)
![](https://i.imgur.com/pwiU7Ed.png)

## Training Tricks

### Normalization
[BatchNor的優缺點](https://zhuanlan.zhihu.com/p/88347589)
[GroupNorm](https://zhuanlan.zhihu.com/p/35005794)
### Loss Function(MSE vs MAE)
看[這篇](https://medium.com/@chih.sheng.huang821/%E6%A9%9F%E5%99%A8-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-%E5%9F%BA%E7%A4%8E%E4%BB%8B%E7%B4%B9-%E6%90%8D%E5%A4%B1%E5%87%BD%E6%95%B8-loss-function-2dcac5ebb6cb)就好

## Optimizer
### Introduction
[SGD, Momentum, AdaGrad, Adam Optimizer](https://medium.com/%E9%9B%9E%E9%9B%9E%E8%88%87%E5%85%94%E5%85%94%E7%9A%84%E5%B7%A5%E7%A8%8B%E4%B8%96%E7%95%8C/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92ml-note-sgd-momentum-adagrad-adam-optimizer-f20568c968db)
[Adam v.s. SGD](https://blog.csdn.net/jiachen0212/article/details/80086926)
### RMSprop
越前面的gradient，對現在的learning rate影響越小(由數學式可見得)
![](https://i.imgur.com/VNNiB2J.png)


## Backpropagation
[連結](http://violin-tao.blogspot.com/2017/07/ml-backpropagation.html)
- 使用gradient descent計算時，更新每一個參數所需要用到的**loss function對每個參數(weight)的偏微分**所用的到演算法
<center class="half">
    <img src="https://i.imgur.com/3E1ZK0Y.png" width="200"/>
    <img src="https://i.imgur.com/icampML.png" width="200"/>
</center>

- forward pass:
    - 將每一層network中activation function的input(z)對某一個參數做偏微分，即原本network的input(x1, x2.....)

![](https://i.imgur.com/vLOATan.png)
- backward pass:
    - 將loss function對z的偏微分拆解，可得到結果為**activation function的微分**和**loss function對activation function之output(a)的偏微分**兩者相乘
    - loss function對activation function之output(a)的偏微分:
        - 若下一層為output layer，則可以直接得到此項結果
        - 若下一層不是output layer，則按照前面的算法一直計算到output layer，即可得到loss function結果為止
- [other reference](http://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2015_2/Lecture/RNN%20training%20(v6).ecm.mp4/index.html)
![](https://i.imgur.com/Y9Xdmop.png)
![](https://i.imgur.com/LizKcX8.png)

## Backpropagation through Time
- 計算第n個output的loss
![](https://i.imgur.com/SP1KqnT.png)
要計算每個時間點的loss，
forward pass除了該layer的input要考慮，還多了**上一時間點hidden layer的output**。
![](https://i.imgur.com/dQavJOi.png)
hidden layer數目取決於input的個數，可看成比較深的神經網路，用原本的方法做backpropagation
    - forward pass:直接看該層input，以及多看上一層的hidden layer output
    - backward pass:每一個layer就是一個amplifier(**參考上面backpropagation圖示**)，並且乘上weight的轉置。
最後和forward pass算出來的值相乘就可以對weight做更新。
![](https://i.imgur.com/Ykrp7jF.png)

    - 每一層事實上是不同時間點的同一個network，看成一DNN時，**一些weight是相同的**；所以黃色箭頭部分的weight也理應要相同(下圖中W1,W2)，藍色箭頭部分同理。
方法為，將他們的weight初始值設成一樣。
![](https://i.imgur.com/5lMyjPP.png)

- 計算所有output的loss
順序是L4>>L3>>L2>>L1，走到不同時間點的時候，會把該時間點error的gradient加進去(如下圖)，且更新的是相同的weight(如上圖)
![](https://i.imgur.com/1Zha5mu.png)







## CNN
- Convolution Layers
    - Kernel:也稱為filter，使用不同的kernel做卷積，可以保留不同的圖片特徵
- LeNet
![](https://i.imgur.com/bysd0RO.png)
    - first convolutions:
        - kernel:5X5(6種)
        - padding:valid(不補0)
        - stride:1
        - output:6張28X28(因為使用6種kernel)
    - first subsampling(Max Pooling)
        - kernel:2X2
        - output:6張14X14
        
    - second convolutions:
        - kernel:
5X5X6(16種kernel)，原本的kernel只有1層(每一種kernel map只有1張)，
現在有6層(每一種kernel map有6張>>深度為6)，
所以新的16張output中的每一張，就是經過5X5X6之kernel運算後相加的結果
    
        - padding:valid(不補0)
        - stride:1
        - output:16張10X10(深度為6)
        - 範例:何謂kernel map的深度![](https://i.imgur.com/imhtFCi.png)

        
    - second subsampling(Max Pooling)
        - kernel:2X2
        - output:16張5X5
    - The above 4 layers are used for feature extraction
    - 2 full connection & 1 gaussian connection:
for the use of classification

- AlexNet
5層convolution + 3層fully connected(之後的模型多參考這樣的模式)
![](https://i.imgur.com/8wxudn0.png)
   
   - first stage(conv - relu - pooling - LRN) 
<img src="https://i.imgur.com/y4c9VvG.png" height="100" width="900"/>
        - weights:3X11X11X96
        - output:27X27X96
        

    - second stage(conv - relu - pooling - LRN)
<img src="https://i.imgur.com/x05Uvsc.png" height="100" width="900">
        - weights:96X5X5X256
        - output:13X13X96
    - third stage(conv - relu)
<img src="https://i.imgur.com/xRrWxw4.png" height="50" width="900">
        - weights:256X3X3X384
        - output:13X13X384
    - fourth stage(conv - relu)
<img src="https://i.imgur.com/XqmwkeV.png" height="50" width="900">
        - weights:384X3X3X384
        - output:13X13X384
    - fifth stage(conv - relu - pooling)
<img src="https://i.imgur.com/IJiLPeK.png" height="150" width="900">
        - weights:384X3X3X256
        - output:6X6X256

    - sixth stage(fc - relu - dropout)
    <img src="https://i.imgur.com/gVyUy8h.png" height="100" width="900">
        - weights:6X6X256X4096
        - output:4096
    
    - seventh stage(fc - relu - dropout)
    <img src="https://i.imgur.com/Lac6fGk.png" height="100" width="900">
        - weights:4096X4096
        - output:4096
    
    - eighth stage(fc - softmax)
    <img src="https://i.imgur.com/OMj5gPD.png" height="75" width="900">
        - weights:4096X1000
        - output:1000
- FCN(Fully Convolutional Networks)
把原本的CNN中fully-connection層都換成convolution，稱為fully convolution layer。
![](https://i.imgur.com/J2Foz65.png)
再加上upsampling(反向的pooling)
![](https://i.imgur.com/gjP2X3L.png)
![](https://i.imgur.com/PxHyHH3.png)
        
    - 第一行:拿con6-7(原始特徵圖的1/32)去做32xupsample(跟32X32之filter做反捲積)
    - 第二行:在conv7先進行2x conv7操作，增加1个卷積層，得到2x2特徵圖，接著將其與pool4做fuse(相加)後，做16xupsample(跟16X16之filter做反捲積)
    - 第三行:在conv7先進行4x conv7操作，增加1个卷積層，得到4x4特徵圖，接著將pool4做2xupsample，最後將前兩者與pool3進行fuse(相加，最後做8xupsample(跟8X8之filter做反捲積)
    - 可以繼續做FCN-4s，FCN-2s(仿造前面的操作)，但實際上超過FCN-8s後結果就無法再優化
    - 結合上述FCN的全卷積與upsample，在upsample最後加上softmax，就可以對不同類别的大小概率進行估計，實現end-to-end
    - 做影象語義分割的輸出則需要是個分割圖，且不論尺寸大小，但是至少是二維的。所以，我們丟棄全連線層，換上卷積層，而這就是所謂的卷積化了。FCN的output是分類的heatMap，每一個pixel值代表屬於該類的label，1000種的類別則有1000種的label(0-999)。

- VGG16(13+3) 
如同AlexNet所提出的 5+3 layers，但是convolution的5個stage，都不只做一次捲積。
![](https://i.imgur.com/PdvhMbG.png)
<img src="https://i.imgur.com/9cbvpqF.png" height="400" width="200">

- VGG19(16+3)
在stage3,4,5都多了一層的convolution layer
    ![](https://i.imgur.com/OvYVfmg.png)

- ResNet
網路深度對模型的性能有很大的影響，網路層數增加，能做比較複雜的feature extraction；然而實際情況，當深度持續增加時，準確度出現飽和，甚至下降（Degradation problem）。
原因是:這些新增的layer無法做到恆等映射（Identity mapping)，**即對於上一層的feature無法做到複製的功能，在訓練的時候weight不一定可以訓練成1，導致兩者之間的訓練誤差(bias)不同**，反而讓網路的效能下降。


    - 殘差網路(residual network)
    
        - 可以克服Degradation problem，創建更深的網路，得到較好的效果。
        ![](https://i.imgur.com/OC6hPXv.png)

        F(x)為殘差，有兩種情況:
        1. 若其為0，我們就跳過這些會讓weight越來越小的layer，讓這幾層的網路至少就完成恆等映射（Identity mapping)，不讓他們對原本的網路產生負面影響。
        2. 若其不為0，也能在原本輸入x的基礎上學習到新的feature，而擁有較好的性能。

        而且調整F(x)，比調整最後的輸出(H(x)，此處表示為F(x)+x)還要容易。
        
        - 可以解決Vanishing gradient & gradient exploding problem
       
加入shortcut之後，每層output的表示法，每一層的輸出可表示為設定shortcut之輸入和先前所有殘差的累積。
![](https://i.imgur.com/Rm9muFg.png)
![](https://i.imgur.com/Or4sBG1.png)
計算back propagation時，可以讓gradient流回之前設定shortcut的其中一層，且得到的值是經過中間的weight laye而來的結果，直接是該層的input，防止上述問題的發生。
![](https://i.imgur.com/cchHvil.png)
![](https://i.imgur.com/5PKeTeC.png)

### Vanishing Gradient Problem
注意!! 
**Vanishing** Gradient Problem & **Exploding** gradient problem 是不同問題，用不同方法解決
![](https://i.imgur.com/YPjDux0.png)
-    因為**DNN的層數太深**，
若所有的lerning rate都相同，
接近output的layer得到local的minimum時(偏微分值大，較快得到)，
接近input的layer還是random的狀態(偏微分值小，較慢得到)，
這樣會導致loss下降速度變慢，
且由於這個成果是based on前面random的結果，會讓最終準確率下降。
- 前面層數weight做出的變化，會隨著結果向後傳而逐漸縮小，若使用**sigmoid**，會讓這變化縮小的更快
![](https://i.imgur.com/lBs4ipQ.png)
- Solution to sigmoid problem
    - relu
    ![](https://i.imgur.com/xv9ELXf.png)
    - reason
![](https://i.imgur.com/wdhlI6J.png)
當我們使用relu，output為0的neuron實際上不會對網路造成影響，而剩下有結果的neuron都會是線性，所以我們會得到一個線性的網路
    - problem
        1. 線性的網路不夠複雜
**Sol:若所有的neuron做相同變化時，他是linear；但變化的大小不同時，他就會是non-linear**
        2. 無法微分(在原點處)&小於0時
        **Sol:**![](https://i.imgur.com/w2EN7qC.png)

 - Solution to relu problem 
    - maxout: **learnable** activation function
    ![](https://i.imgur.com/rWhimla.png)
    也就是說，可以maxout的方式來擬合出適合這個網路的activation function
### Cross-Correlation vs Convolution

- example
![](https://i.imgur.com/wg5EUHn.png)
- cross-correlation
![](https://i.imgur.com/IUhHC3W.png)
![](https://i.imgur.com/6XsUdSU.png)
- convolution(reverse後結果做correlation)
![](https://i.imgur.com/RmhzPmO.png)
![](https://i.imgur.com/kwBDcPl.png)
- Difference
    - 使用cross-correlation時，會讓output和原本的filter所能得到的特徵上下左右顛倒
![](https://i.imgur.com/ha0rzKh.png)
![](https://i.imgur.com/ny833kW.png)
    - cross-correlation用來比較兩張圖片的相似程度，找出特定物件在一張圖片中的位置
    ![](https://i.imgur.com/zWwwNAI.png)
    - 使用convolution則可以維持原filter的方向
![](https://i.imgur.com/BhNryOH.png)
    
    - convolution用來對圖片做銳利化、圓滑化、模糊化或是邊緣偵測等等操作，取決於使用甚麼kernel
    ![](https://i.imgur.com/3EPVGJg.png)
### What does 1*1 conv do?
用比較少的參數，將map的數量提高或降低(升維or降維)
![](https://i.imgur.com/rtIZ3t9.png)

### What is deconvolution?
> [原始文章](https://medium.com/ai%E5%8F%8D%E6%96%97%E5%9F%8E/%E5%8F%8D%E6%8D%B2%E7%A9%8D-deconvolution-%E4%B8%8A%E6%8E%A1%E6%A8%A3-unsampling-%E8%88%87%E4%B8%8A%E6%B1%A0%E5%8C%96-unpooling-%E5%B7%AE%E7%95%B0-feee4db49a00)

>逆卷積(Deconvolution)，或者叫做轉置卷積(Transposed Convolution)，兩者都有在論文裡面看過，是一樣的東西
>
Deconvolution的功能大致可以分為以下幾個方面：
+ Unsupervised learning:其實就是covolutional sparse coding：這裡的deconv只是**觀念上和傳統的conv反向**:
    + 傳統的conv是從圖片生成feature map
    + deconv是用unsupervised的方法找到一組kernel和feature map，讓它們重建圖片。
+ CNN可視化：**通過deconv將CNN中conv得到的feature map還原到像素空間**，以觀察特定的feature map對哪些pattern的圖片敏感，這裡的deconv其實不是conv的可逆運算，只是conv的transpose，所以tensorflow裡一般取名叫transpose_conv。
E.g.
![](https://i.imgur.com/ErZJvKG.png)
    >圖（a）是輸入層；
    圖（b）是14\*14反捲積的結果；
    圖（c）是28\*28的UnPooling結果；
    圖（d）是28\*28的反捲積結果；
    圖（e）是56\*56的Unpooling結果；
    圖（f）是56\*56反捲積的結果；
    圖（g）是112\*112 UnPooling的結果；
    圖（h）是112\*112的反捲積的結果；
    圖（i）和圖（j）分別是224\*224的UnPooling和反捲積的結果。兩者各有特點。
+ Upsampling：在pixel-wise prediction比如image segmentation以及image generation中，由於需要做原始圖片尺寸空間的預測，而卷積由於stride往往會降低圖片size ，所以往往需要**通過upsampling的方法來還原到原始圖片尺寸**，deconv就充當了一個upsampling的角色

[動畫化的結果](https://github.com/vdumoulin/conv_arithmetic)
### 常見的Decoder會使用到的方法
![](https://i.imgur.com/JrPIphR.png)
+ 圖（a）表示UnPooling的過程，特點是在Maxpooling的時候保留最大值的位置信息，之後在unPooling階段使用該信息擴充Feature Map，除最大值位置以外，其餘補0。
+ 圖（b），兩者的區別在於UnSampling階段沒有使用MaxPooling時的位置信息，而是直接將內容複製來擴充Feature Map。從圖中即可看到兩者結果的不同。
+ 圖（c）為反捲積的過程，反捲積是卷積的逆過程，又稱作轉置卷積。最大的區別在於反捲積過程是有參數要進行學習的（類似卷積過程），理論是反捲積可以實現UnPooling和unSampling，只要卷積核的參數設置的合理。

### Dilated Convolution
> 參考資料: [如何理解空洞卷积（dilated convolution）？](https://www.zhihu.com/question/54149221)

[MULTI-SCALE CONTEXT AGGREGATION BY DILATED CONVOLUTIONS](https://arxiv.org/pdf/1511.07122.pdf)
#### 一般 Convolution
![](https://i.imgur.com/M6qLptL.gif)
#### Dilated Convolution
![](https://i.imgur.com/vAO8skR.gif)
乍看之下可以發現， dilated convolution 其實就是使用比較大的 convolution filter ，一次可以獲得比較大範圍的特徵資料
#### Why dilated convolution? -- Problem of Max Pooling
- Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (a.k.a. **not learnable**)
- 内部数据结构丢失；空间层级化信息丢失。
- **小物体信息无法重建** (假设有四个pooling layer 则 任何小于 2^4 = 16 pixel 的物体在做 max pooling 的過程中會消失掉，信息理论上无法重建。)

==也就是說，我們希望有一種方法可以不透過 Max Pooling 就能增大 receptive field 的方法，這樣不僅可以獲得 global feature ，還可以不損失所有細微的資訊==
#### Problem of Dilated Convolution
- The Gridding Effect
如圖，假设我们仅仅多次叠加 dilation rate 2 的 3 x 3 kernel 的话，则会出现这个问题：
![](https://i.imgur.com/5MEx4g4.png)
可以看到， kernel 所拿到的 pixel 并不连续，即不是所有的 pixel 都用来计算了，因此这里将信息看做 checker-board 的方式会损失**特徵的连续性**。这对 pixel-level dense prediction (小物體)的任务来说是致命的。
>(如下圖第2列一格一格的狀況)
>
![](https://i.imgur.com/gZJa97F.png)


- Long-ranged information might be not relevant.
我们从 dilated convolution 的设计背景来看就能推测出这样的设计是用来获取 **long-ranged information**。然而光采用大 dilation rate 的信息或许只对一些大物体分割有效果，而对小物体来说可能则有弊无利了 (**只能獲得大物體的 global feature ，但對於小物體來說沒有這種效果**)。如何同时处理不同大小的物体的关系，则是设计好 dilated convolution 网络的关键。

#### Hybrid Dilated Convolution (HDC)
> [Modify gridding problem](https://arxiv.org/pdf/1702.08502.pdf)
> 
对于上个 section 里提到的几个问题，[Modify gridding problem](https://arxiv.org/pdf/1702.08502.pdf)对其提出了较好的解决的方法。他们设计了一个称之为 **HDC** 的设计结构。
+ 第一个特性是，叠加卷积的 dilation rate 不能有大于1的公约数。比如 [2, 4, 6] 则不是一个好的三层卷积，依然会出现 gridding effect。
+ 第二个特性是，我们将 dilation rate 设计成 锯齿状结构，例如 [1, 2, 5, 1, 2, 5] 循环结构。
+ 第三个特性是，我们需要满足一下这个式子： 
![](https://i.imgur.com/Sli00O2.png)

+ 
+ 其中 $r_i$ 是 i 层的 dilation rate 而 $M_i$ 是指在 i 层的最大dilation rate，那么假设总共有n层的话，默认 $M_n = r_n$ 。假设我们应用于 kernel 为 k x k 的话，我们的目标则是 $M_2\leq r_n$ ，这样我们至少可以用 dilation rate 1 即 standard convolution 的方式来覆盖掉所有洞。
E.g.
![](https://i.imgur.com/psNH75w.png)
而这样的锯齿状本身的性质就比较好的来同时满足小物体大物体的分割要求:
    + 小 dilation rate 来关心近距离信息
    + 大 dilation rate 来关心远距离信息

这样我们的卷积依然是连续的也就依然能满足VGG组观察的结论，**大卷积是由小卷积的 regularization 的 叠加**。以下的对比实验可以明显看出，一个良好设计的 dilated convolution 网络能够有效避免 gridding effect.
![](https://i.imgur.com/4rOmybS.png)



#### Atrous Spatial Pyramid Pooling (ASPP)
> [Rethinking Atrous Convolution for Semantic Image Segmentation](https://arxiv.org/pdf/1706.05587.pdf)
> 
在处理多尺度物体分割时，我们通常会有以下几种方式来操作：
![](https://i.imgur.com/44yczdY.png)

只在一个卷积分支网络下使用 dilated convolution 去抓取多尺度物体是一个不正统的方法。
> E.g. 我们用一个 HDC 的方法来获取一个大（近）车辆的信息，然而对于一个小（远）车辆的信息都不再受用。
> 假设我们再去用小 dilated convolution 的方法重新获取小车辆的信息，则这么做非常的冗余。
> 
基于港中文和商汤组的 PSPNet 里的 Pooling module （其网络同样获得当年的SOTA结果），**ASPP 则在网络 decoder 上对于不同尺度上用不同大小的 dilation rate 来抓去多尺度信息**，每个尺度则为一个独立的分支，在网络最后把他合并起来再接一个卷积层输出预测 label。这样的设计则有效避免了在 encoder 上冗余的信息的获取，直接关注与物体之间之内的相关性。


### Autoencoder
[進階參考資料](https://towardsdatascience.com/a-high-level-guide-to-autoencoders-b103ccd45924)
[參考影片(極好懂)](https://zh-tw.coursera.org/lecture/ai2/4-8-autoencoder-denoising-autoencoder-stacked-autoencoder-and-variational-eJ9CN)
- 目的:要將資料做降維，取出high-level的feature
- 做法:透過encode和decode兩個步驟，先讓input和output達到高相似度，此時，我們就可以把中間的latent space中的latent vector拿出來，也就是feature的部分。
![](https://i.imgur.com/NaWgjmj.png)
- 訓練
如上圖中，做的是784>>500>>300>>2>>300>>500>>784
在訓練的時候，可以對每一層的weight分開來訓練的(784>>500>>784；500>>300>>500；300>>2>>300)，這些pre-training的weight(encoder的部分)，就可以作為初始的weight使用。
用多層的好處是，能提升非線性的程度，藉此獲得比較好的feature

逐層減少node數有一個問題，那就是node數量到底要設多少?因此我們介紹一個新的做法，我們不去刻意限制node數量，而是給予限制使其自己學習。
### Sparsity Constraint in Autoencoder
[參考資料](https://www.quora.com/What-is-the-purpose-of-sparsity-constraint-in-autoencoder?fbclid=IwAR2zKwTLXOCZjLYO8AjdOvsd5mwhL5V8BPKBxRCLJ4Yz1NjjaMYTKD0j8JE)
## Generative Model
找出input(x)的機率分布，我們就可以透過這個機率分布，來找出每個x的機率，知道x的分布之後，就可以用此來產生(sample)x出來。

而我們的input(每個點)，**他所代表的維度，就是他所擁有的數個feature(n個feature表示他有n維)**，這些input我們認定其是來自於某個Gaussian Model(一個Model表示一個class)。

因此，當我們透過sample出來的數筆data，進而去找出Gaussian Model之後，當一個新的data進來之後，我們就可以得到他是屬於這個class的機率。
- 圖例1
![](https://i.imgur.com/zOGVkpR.png)
- Formula Derivation
![](https://i.imgur.com/5TFl7wm.png)



### VAE
[ML Lecture 17: Unsupervised Learning - Deep Generative Model (Part I)](https://youtu.be/YNUek8ioAJk?list=PLJV_el3uVTsPy9oCRY30oBPNLCo89yu49&t=1166)
[ML Lecture 17: Unsupervised Learning - Deep Generative Model (Part II)](https://youtu.be/8zomhgKrsmQ?list=PLJV_el3uVTsPy9oCRY30oBPNLCo89yu49)
- 如果只是用一般autoencoder的話，我們隨機產生一個和code相同維度的向量，把它丟進decoder中並希望她可以產生我們要的圖片，這樣的做法所得到的結果通常不佳，所以我們使用新的做法:***VAE***
![](https://i.imgur.com/masYvrO.png)
#### 直觀的解釋
- 
    - 在VAE中，我們在encoder的部分，output和code相同維度的兩個vector，並且用常態分佈產生另一個也是相同維度的vector，接著通過運算產生一組ci的vector(**作為原始autoencoder中的code部分**)，透過decoder產出output之後，來minimize reconstruction error。

    - 另外，我們還需要對一開始產生的三個vector(m, σ, e)，使用另一個公式(另一個constraint)，然後去minimize他得到的值。

    - 其中m表示原本的code，c表示加了noise的code，σ代表了noise該有的範圍(取exponential以表示他是正數)
    

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

- 若只有這樣的限制，那model為了追求最小的reconstruction error，會把σ都學習成0(追求最好的I/O對應)，所以要有另外的constraint來強迫noise的產生(讓variance不為0，強迫加入雜訊)。
![](https://i.imgur.com/rXuZQxz.png)



- 當我們用VAE完成訓練之後，我們把decoder拿出來，並且給他一組code(假設是10維)讓他去產生圖像，在產生的過程中，我們固定部分的維數(此處是8維)，去操控剩下的維數(此處是2維)，來去了解不同維數所操控的是哪些圖像部分(例如顏色, 眼睛....)
![](https://i.imgur.com/Wx7Edc6.png)

- Why VAE?
VAE會給原本的input雜訊，也就是說，中間的code會有一段範圍，都會給出相同的output，而不同的input可能會在code產生重疊的範圍，而這個重疊範圍必須要維持最小的reconstruction error，所以會給出介於兩個input之間的output
**(autoencoder只有一個對一個，當不是給原本input時，output會和我們預想的差異較大)**
![](https://i.imgur.com/g6fcNSn.png)
#### 論文的解釋
- **論文上的解釋**，所有的input是高維空間上的一個點，我們要做的是去找出機率分布(P(x),x是一個vector)，以找出機率高點，此機率高點所對應到的那個x，就是我們要的目標output。
method : Gaussian Mixture Model
把所有的x，分到某一個gaussian model(某一分類)
![](https://i.imgur.com/UMezCR1.png)

- VAE就是Gaussian Mixture Model的distributed version(就是我們要sample的那個x，他不是屬於某一個分類，而是由另一個vector，來描述他在不同分類的機率情形)。

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

- 平均和變異數是我們要預測的部分，使用 Maximizing Likelihood方式，來找出μ(z)和σ(z)
![](https://i.imgur.com/nbAGSrd.png)

- So, 我們如何來 maximize likelihood呢?
![](https://i.imgur.com/8zw1wtN.png)
- 原本的目標只有找P(x|z)，但現在多了q(z|x)，是為了有效的做似然率(likelihood)的最大化，詳情如圖
![](https://i.imgur.com/SlqlMns.png)
- 現在針對Lower bound來進行解釋
![](https://i.imgur.com/HycU8Jp.png)
- 推論出來最後的結果，就是上面所提的限制
![](https://i.imgur.com/9TtrAkA.png)

#### 結論
1. 我們預測所有的圖片輸入，都是屬於一個高維(多個feature)空間，也就是一個高維的Gaussian mixture model
2. VAE要找出的是這個Gaussian mixture model中，每一個常態分佈的gaussian model，而找每一個gaussian model就是去找出他的mean & variance，標準就是使用Maximizing Likelihood方式
3. Maximizing Likelihood在推導過程中，會先分解成一個Lower bound和一個KL diversion，這個KL diversion中多的q(z|x)是為了有效最大化likelihood，當引入這個機率時，我們預測的q(z|x)和P(z|x)越接近，Lower bound就會越高，當兩者一致時，就會提高likelihood
4. Lower bound又會被分解成一個KL diversion和一個積分式:
    1. KL diversion對應到的是前面額外constraint
    2. 積分式則可推導成autoencoder的部分
5. 所以VAE這樣的架構，其實是根據maximizing likelihood而產生的，而直觀的解釋方式，則更好幫助我們理解

#### VAE問題
其實他從未學習何謂"真的"image，他只是會去根據現有的圖片，來產生相似的圖(模仿)，而不是真正的無中生有。
根據此問題，GAN出現了!

### GAN(Generative Adversarial Network)
[ML Lecture 17: Unsupervised Learning - Deep Generative Model (Part II)41:58開始](https://youtu.be/8zomhgKrsmQ?list=PLJV_el3uVTsPy9oCRY30oBPNLCo89yu49&t=2526)

## MobileNet
### MobileNet v1
- Model Architecture
![](https://i.imgur.com/rdawi7x.png)
- Code [[src]](https://github.com/wjc852456/pytorch-mobilenet-v1)
```python=
self.model = nn.Sequential(
            conv_bn(  3,  32, 2),#1
            conv_dw( 32,  64, 1),#2
            conv_dw( 64, 128, 2),#3_1
            conv_dw(128, 128, 1),#3_2
            conv_dw(128, 256, 2),#4_1
            conv_dw(256, 256, 1),#4_2
            conv_dw(256, 512, 2),#5_1
            conv_dw(512, 512, 1),#5_2
            conv_dw(512, 512, 1),#5_3
            conv_dw(512, 512, 1),#5_4
            conv_dw(512, 512, 1),#5_5
            conv_dw(512, 512, 1),#5_6
            conv_dw(512, 1024, 2),#6_1
            conv_dw(1024, 1024, 1),#6_2 stride=2 in paper
            nn.AvgPool2d(7),
        )
self.fc = nn.Linear(1024, 1000)
```
### MobileNet v2
[MobileNet V2 论文初读](https://zhuanlan.zhihu.com/p/33075914)
[MobileNet Caffe Implementation](https://github.com/shicai/MobileNet-Caffe/blob/master/mobilenet_v2_deploy.prototxt)

## Training
### Finetune
+ 新資料庫小，和預訓練資料庫相似。因為資料庫比較小，fine-tune的話可能會產生過擬合，比較好的做法是用預訓練的網路作為特徵提取器，然後訓練線性分類器用在新的任務上。
+ 新資料庫比較大，和預訓練資料庫相似。這種情況下，不用擔心過擬合，可以放心地微調整個網路。
+ 新資料庫小，和預訓練資料庫不相似。這時，既不能微調，用預訓練網路去掉最後一層作為特徵提取器也不合適，可行的方案是用預訓練網路的前面幾層的啟用值作為特徵，然後訓練線性分類器。
+ 新資料庫大，和預訓練資料庫不相似。這時可以從頭開始訓練，也可以在預訓練的基礎上進行微調。


