---
# System prepended metadata

title: Maching Learning

---

# Maching Learning

## activation function $\phi^{(l)}_{j}$

### $\phi_{j}^{(L)}$：最後一層的函數，通常和目的有關，如：
 + regression : $\phi^{(L)}(s) = s$
 + binary classification : logistic 
 + multicalss : softmax (HW3)

### Backprop 
 + $\nabla_{ij}^{(l)} = \delta_{j}^{(l)} x_{i}^{(l-1)}$
 + $\delta_{j}^{(l)} = \frac{\partial e}{\partial s_{j}^{(l)}} \\ = \sum_{k}\delta_{k}^{(l+1)}w_{jk}^{(l+1)}\phi'(s_{j}^{(l)}) \\ = \sum_{k}(\sum_{m}\delta_{m}^{(l+2)}w_{km}^{(l+2)}\phi'(s_{k}^{(l)})) \delta_{k}^{(l+1)}w_{jk}^{(l+1)}\phi'(s_{j}^{(l)}) \\ \vdots$
 + 觀察其中 $\phi'$ 的部分 (tanh)：
      ![tanh](https://i.imgur.com/5g37WEB.png) ![detanh](https://i.imgur.com/0QTngd8.png)
      總是介於0~1之間，因此當：
      1.$w$太小
      2.層數太多，有太多的tanh'相乘
      結果會傳回一個很小的數，導致neuron的影響太小(gradient diminishing)
 
### $\phi$的選擇條件：
 + monotonic
 + differentiabal
 + universal approximation (可以用線性組合逼近任意函數)
 
### 線性整流函數(Rectified Linear Unit, ReLU)：
 + $f(x)=\max(0,x)$
   ![ReLU](https://i.imgur.com/ePPw2jF.png)![deReLU](https://i.imgur.com/Az3eDFZ.png)
 + 雖然在$x=0$是不可微的，但可以像以前定義sign(0)的時候一樣把它視作特殊點設為1或0。
 + 雖然當$x<0$時仍然會讓neuron是死的，但通常仍會有部分的neuron可以產生影響
 + sparse repesetation : 接續上一點，因為這些死的nureon輸出是0，因此可以得到sparse的結果，能夠加速運算
 + ReLU本身的函數簡單，沒有複雜的運算(相較於tanh, e...)，因此計算快速
 + 綜上所述，ReLU可以快速計算，因此是現在除了tanh之外最常用的函數


## Deep Learning 中的 optimization
 + 一般的數值解的optimization(Newton...)在 deep learning 中不太實用，因為參數太多，會導致矩陣太大，因此會使用類似於 gradient decent 這樣一步一步前進的方法，但一樣要面對選擇 learning rate 的問題。
 + 目標：在有限時間內學到‘夠好’的結果
 + 在 deep learning 中，經常會出現不同權重的影響力差異很大的狀況(例如$w_{1}$只要稍微變動就影響結果很大，而$w_{2}$的變動卻不怎麼影響結果，畫成等高線後會呈現出一個橢圓形的形狀)
 + 在以前的 gradient decent 中，對於每個維度都會乘上相同的 learning rate($\eta$)，但有沒有可能讓每個維度乘上不同的learning rate呢？(對gradient大的分量乘上比較小的learning rate，反之，避免在陡的地方走太大步或在平緩的分量走太小步)

### Gradient decent with momentum
 + 原本的GD : $w_{t}=w_{t-1} - \eta\nabla_{t}$
 + 現在將$\nabla_{t}$改成$m_{t} = avg(\nabla_{1}, \nabla_{2}, \dots, \nabla_{t})$，可以視為一種denoising
 + 新的版本如下：
   $w_{t}=w_{t-1} - \eta m_{t}$
   $m_{t} = \beta*m_{t-1} + (1-\beta)*\nabla_{t}$
 + 將$m_{t}$展開後可以觀察到越多輪之前的$m$前面繪成上越多的$\beta$，可以想成是給比較新的$\nabla$較大的權重，而比較舊的$\nabla$權重會越來越小(exponential averaging)
 + SGD + momentum 是目前機器學習中常用的方法(這裡的SGD是small batch 的版本，避免只取一個data的不準確和使用所有data的時間消耗)

### rprop
 + $w_{t} = w_{t-1} - \vec{\eta}_{t}\cdot\nabla_{t}$
 + locally : 
   - small gradient component $\Leftrightarrow$ flat $\Leftrightarrow$ bigger step
   - big gradient component $\Leftrightarrow$ steep $\Leftrightarrow$ smaller step
 + $\vec{\eta}_{t} = \frac{\eta}{|\nabla_{t}|}$ $\Rightarrow -\vec{\eta}_{t}\cdot\nabla_{t}=-\eta * \mathrm{sign}(\nabla_{t})$ (componentwise的運算，結果仍是個向量)

### learning rate schedule
 + 但是原本的 gradient decent 卻剛好相反(小的走小步，大的走大步)，其實是因為原本的 gradient decent 可以看成是 globally 的解。
 + 為了要使結果是 converge 的，通常會讓$\eta$越來越小(learngin rate schedule)，但是要注意縮小的幅度要適中，才不會太慢或太快。
 
### RMSprop
 + 由於learning rate schedule 直接取值不易，因此發展出了 RMSprop
 + 將$|\nabla_{t}|$換成$\sqrt{u_{t}+\epsilon}$，其中 $u_{t}=\beta*u_{t-1} + (1-\beta)\nabla_{t}\cdot\nabla_{t}$，而$\epsilon$則是為了避免分母為零。
 + 因此更新方式就是 $w_{t} = w_{t-1} - \frac{\eta}{\sqrt{u_{t} + \epsilon}}\nabla_{t}$
 + 梯度小的時候，會乘上比較大的數，反之。
 
### Adam(目前最常使用的方法)
 + 結合了 momentum 和 RMSprop 的方法
 + $m_{t} = \beta_{1}m_{t-1} + (1-\beta_{1})\nabla_{t}$
   $u_{t} = \beta_{2}u_{t-1} + (1-\beta_{2})\nabla_{t}\cdot\nabla_{t}$
 + 由於直接做的話最一開始的零向量會導致結果有偏移，因此再令：
   $\hat{m}_{t} = \frac{m_{t}}{1-\beta_{1}}$, $\hat{u}_{t} = \frac{u_{t}}{1-\beta_{2}}$
 + 則最後的更新方式就是：
   $w_{t} = w_{t-1} - \eta\frac{\hat{m}_{t}}{\sqrt{\hat{u}_{t}} + \epsilon}$
 + 雖然Adam可以做快速的最佳化，但仍然要小心overfitting的問題。 


### 挑選$w_{0}$
 + trained by ither people，由於計算成本大，因此若能取得別人訓練過的結果，可以令其為$w_{0}$再開始自己的training
 + 若是要自己從頭算，記得和 activate function 有很大的關係
 + tanh : 全部為零、常數、長度太大的$w$ 是不好的，因此可以選用randomly, small 的$w_{0}$。
   Randomlly :  [-1, 1] Uniform, 0-mean Gaussuan
   Small : 要求 $\mathrm{var}(w) = \frac{1}{d^{(l-1)}}$ 或 $\frac{2}{d^{(l-1)}\ + d^{(l)}}$  (Xavier initialization)(隨機求出一組數後再做scaling使其符合條件)。
 + ReLU : 只有 initialization 的部分和tanh不同，要求$\mathrm{var}(w) = \frac{2}{d^{(l-1)}}$   (He initialization)
   

## Deep Learning 中的 Regularization
 + 目前為止學過的方法
   - L2, L1 (可以但不好用，通常是用在特殊狀況，比如發現在某一層的$w$突然很大需要限制其大小)
   - large-margin (同上)
   - aggregation (uniform O)
   - early stopping (O)
 
 ### Dropout
  + 今天可能出現某幾個neuron有特別極端的行為，導致附近的neuron為了維持結果而有相反的行為，久而久之兩者就會越來越極端，因此我們想要把那些一直犯錯的點去掉。
  + dropout不只能用於解決上面情形，也可以避免NN太過肥大。
  + 方法：每一輪training時丟掉隨機丟掉一定比例的節點再開始做。如果丟的是“壞”的節點，可以直觀地說結果會變好;如果丟掉的是“好”的節點，則相當於要求那些“壞”的節點自立自強改善其表現。
  + 也可以解釋成：每次選一個“子網路”以及一部份的資料(mini-batch)來做訓練，最後將結果合在一起$\Rightarrow$aggregation$\Rightarrow$regularization
  + 也可以看作是在optimixation的過程中加上一些noise來達成regularization的效果。



## end
   