---
# System prepended metadata

title: Deep learning

---

# Deep learning
### CH2
### Machine learning
- 需要三要素
    1.輸入資料
    2.標準答案(預期輸出結果)
    3.衡量模型學習的結果好壞(Loss function)
    
![](https://i.imgur.com/vtXI7Y1.png)
**機器學習核心任務:**
    如何有意義的轉換資料，換句話說，就是從手中輸入資料找出適當的表示法，這個表示法可以盡可能把我們的輸入資料轉換持更接近預期輸出的結果
### 深度學習中的{深度}
 &nbsp; &nbsp;   深度學習是機器學習的一個分支領域：它是從數據中學習表示的一種新方法，強調從連續的層（layer）中進行學習，這些層對應於越來越有意義的表示。 “深度學習”中的“深度”指的並不是利用這種方法所獲取的更深層次的理解，而是指一系列連續的展示層。 資料模型中包含多少層，這被稱為模型的深度（depth）。 這一領域的其他名稱包括**分層表示學習-layered representations learning和層級表示學習-hierarchical representations learning**或許是這一領域最適合的其他名稱
### •深度學習：
#### -從數據中學習特徵的一種新方法，強調從連續的層（layer）中進行學習，這些層對應於越來越有意義的特徵表示。
### •“深度學習”中的“深度”是指一系列連續的展示層。
#### – 資料模型中包含多少層，這被稱為模型的深度（depth）。
#### **權重(Weight)**: 層與層之間如何對資料做轉換，取決於該層的權重，也就是說層是透過銓重參數來對輸入資料轉換，這些「權重需要被學習」，透過梯度下降法來更新權重參數。
#### **損失函數(loss function)**: 又稱目標函數(objective function)、成本函數(cost function)，計算神經網路預測結果與標準答案兩者的損失分數、又叫(差距分數)，從損失分數可以判斷此次學習的好壞。
### epoch
當一個完整的數据集經過神經網路一次，並返回一次，這個過程稱為一個epoch。
### 為什麼需要多個epoch?
在深度學習中，向神經網路傳遞整個數据集一次是遠遠不夠的，而需要多次在神經網路上訓練。 從欠擬合的狀態向適當擬合靠近。 當然一不小心也可能會過擬合。 也就是說不同的數据集，最適的epoch是不同的，會受到數据集多樣性的影響。

### 深度學習最後關鍵是利用前述的損失函數距離值作為反饋信號來對每一層權重值進行微調，以降低當前對應的損失值。– 這種調適由『優化器(optimizer)』來完成，它實現了所謂的【反向傳播(backpropagation)演算法】
### 常見優化器(optimizer):
### 梯度下降法
![](https://i.imgur.com/DDuLBfC.png)
### **1.【Batch Gradient Descent】**
![](https://i.imgur.com/VBQAduw.png)
--
優點：全域最優解； 易於並行實現；
缺點：當樣本數目很多時，訓練過程會很慢。
從反覆運算的次數上來看，BGD反覆運算的次數相對較少。
### **2.【Stochastic Gradient Descent】**
#### **<font color="red">注意: SGD為有放回的隨機抽樣，每次只取一個樣本</font>**
![](https://i.imgur.com/E9i5iJB.png)
![](https://i.imgur.com/ObCwppd.png)
--
SGD缺點收斂慢，隨機梯度下降在每次更新的時候，只考慮一個樣本點，這樣會大大加快訓練數據，也恰好是批量梯度下降的缺點，但是有可能由於訓練數據的雜訊點較多，那麼每一次利用雜訊點進行更新的過程中，就不一定是朝著極小值方向更新，但是由於更新多輪，整體方向還是朝著極小值方向更新， 又提高了速度。
*******************************************************
優點：
（1）在學習過程中加入了雜訊，提高了泛化誤差。
（2）由於不是在全部訓練數據上的損失函數，而是在每輪反覆運算中，隨機優化某一條訓練數據上的損失函數，這樣每一輪參數的更新速度大大加快。
缺點：
（1）不收斂，在最小值附近波動。
（2）不能在一個樣本中使用向量化計算，學習過程變得很慢。
（3）單個樣本並不能代表全體樣本的趨勢。
（4）當遇到局部極小值或鞍點時，SGD會卡在梯度為0處。
（5）注意：程式碼中的隨機把數據打亂很重要，因為這個隨機性相當於引入了“譟音”，正是因為這個譟音，使得SGD可能會避免陷入局部最優解中。
### **3.【Mini-Batch Gradient Descent】**
![](https://i.imgur.com/0vrRlQr.png)
--
小批量梯度下降法是為了解决批量梯度下降的訓練速度慢，以及隨機梯度下降法的準確性綜合而來，但是這裡注意，不同問題的batch是不一樣的，要通過實驗結果來進行超參數的調整。
優點：
（1）計算速度比Batch Gradient Descent快，因為只遍歷部分樣例就可執行更新。
（2）隨機選擇樣例有利於避免重複多餘的樣例和對參數更新較少貢獻的樣例。
（3）每次使用一個batch可以大大减小收斂所需要的反覆運算次數，同時可以使收斂到的結果更加接近梯度下降的效果。
缺點：
（1）在反覆運算的過程中，因為譟音的存在，學習過程會出現波動。 囙此，它在最小值的區域徘徊，不會收斂。
（2）學習過程會有更多的振盪，為更接近最小值，需要新增學習率衰减項，以降低學習率，避免過度振盪。
（3）batch_ size的不當選擇可能會帶來一些問題。
### 
![](https://i.imgur.com/Eh5wNId.png)
### 進階優化器
![](https://i.imgur.com/0bYfUwu.png)

/.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../.../
### SVM (支持向量機)
SVM目標是在兩個類別資料間，找到最佳決策邊界。
步驟1:
將數據映射到高維空間，然後在此空間找出最佳邊界，一般這個決策邊界都是超曲面。
步驟2:
超曲面必須介於兩類資料點中間
-->這步驟稱為最大化邊界(Maximizing the margin)，讓這個曲面分別和這兩個類別保有最大距離，使新資料點被填入時不會分錯邊。
### 決策樹
### 隨機森林
### 梯度提升機

--------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
### 激活函數(activate function)
## sigmoid
![](https://i.imgur.com/6BRNsBW.png)
![](https://i.imgur.com/IQiOO6U.png)
## Softplus
![](https://i.imgur.com/UvVeLWK.png)
![](https://i.imgur.com/PSoqmZR.png)

## Softmax

Softmax是一種激活函數，它可以將一個數值向量歸一化為一個概率分佈向量，且各個概率之和為1。 Softmax可以用來作為神經網絡的最後一層，用於多分類問題的輸出。 Softmax層常常和交叉熵損失函數一起結合使用。

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

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

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

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

- Softmax 激活函數的不足：

在零點不可微；
負輸入的梯度為零，這意味著對於該區域的激活，權重不會在反向傳播期間更新，因此會產生永不激活的死亡神經元

### Tanh/雙曲正切激活函數
![](https://i.imgur.com/6n3HaPB.png)
![](https://i.imgur.com/twlUxT3.png)
![](https://i.imgur.com/pDMxDHw.png)
 - tanh存在的不足：

與sigmoid類似，Tanh 函數也會有梯度消失的問題，因此在飽和時（x很大或很小時）也會「殺死」梯度。

### ReLU
![](https://i.imgur.com/ynK0Kfj.png)

### Parametric ReLU激活函数
![](https://i.imgur.com/lhUr8pj.png)
### Leaky ReLU
![](https://i.imgur.com/zAVnpB5.png)

#### 為什麼使用Leaky ReLU會比ReLU效果要好呢？

#### ‧ Leaky ReLU 通過把 x 的非常小的線性分量給予負輸入（0.01x）來調整負值的零梯度（zero gradients）問題，當 x < 0 時，它得到 0.1 的正梯度。該函數一定程度上緩解了 dead ReLU 問題，
#### ‧ leak 有助於擴大 ReLU 函數的範圍，通常 a 的值為 0.01 左右；
#### ‧ Leaky ReLU 的函數範圍是（負無窮到正無窮）儘管Leaky ReLU具備 ReLU 激活函數的所有特徵（如計算高效、快速收斂、在正區域內不會飽和），但並不能完全證明在實際操作中Leaky ReLU 總是比 ReLU 更好。






------------------------------------------------------------------------------------------
### 損失函數(loss function)
### KL散度（Kullback-Leibler Divergence）
### 所謂KL散度，是指當某分佈q(x)被用於近似p(x)時的信息損失，也就是說，q(x)能在多大程度上表達p(x)所包含的信息，KL散度越大，表達效果越差，也就是說兩筆資料差距很大。
### 【KL散度描述了我們用分佈Q(X)來估計數據的真實分佈P(X)的編碼損失。】
![](https://i.imgur.com/GphEnxU.png)
![](https://i.imgur.com/7yZpBIG.png)
![](https://i.imgur.com/94meqA3.png)
### KL散度的基本性质
- 1. 非负性
- ![](https://i.imgur.com/h5JulX5.png)

### cross-entropy交叉熵:
分類問題常用的損失函數為交叉熵（Cross Entropy Loss）。
交叉熵描述了兩個概率分佈之間的距離，交叉熵越小說明兩者之間越接近。
交叉熵是用來評估當前訓練得到的概率分佈與真實分佈的差异情况。 它刻畫的是實際輸出（概率）與期望輸出（概率）的距離，也就是交叉熵的值越小，兩個概率分佈就越接近。

![](https://i.imgur.com/xRmuVZm.png)
![](https://i.imgur.com/HIaGq4Q.png)
![](https://i.imgur.com/7Q7kexB.png)

### MSE
### MAE

### 機器學習演算法主要分為四種：監督式學習、非監督式學習、半監督式學習、強化學習。

### 監督式學習 (Supervised Learning) 是指使用大量的標記資料進行訓練，應用的方向大致可分為分類、迴歸，為目前最常見的作法。
### 非監督式學習 (Unsupervised Learning) 是指使用大量未標記的資料，藉由資料本身的特性找出潛在的規則，應用的方向有聚類、降維以及待會要介紹的自監督式學習 (Self-Supervised Learning)。
### 半監督式學習 (Semi-Supervised Learning) 則是介於監督式學習和非監督式學習之間，結合少量的標記資料與其他大量未標記的資料一起使用，應用的方向有 Noisy Student、Meta Pseudo Labels、Generative methods 等。
### 強化學習 (Reinforcement Learning) 是透過獎懲的機制，讓機器在環境中進行 trial and error，並從中自我學習以取得最大的 Reward，應用的方向有 DQN、Temporal-Difference Learning 等。
### supervised learning是需要有标签的资料的，而self-supervised learning不需要外界提供有标签的资料，他的带标签的资料源于自身。x分两部分，一部分用作模型的输入，另一部分作为y要学习的label资料
![](https://i.imgur.com/aju8v2X.png)
### 自監督式學習
![](https://i.imgur.com/HIQxkI4.png)
### 強化式學習

### 泛化(generalize) 
- 泛化性指模型經過訓練後，應用到新數據並做出準確預測的能力。 一個模型在訓練數據上經常被訓練得太好即過擬合(overfitting)，以致無法泛化。
### 驗證集-->用於決定要使用哪個模型及配置超參數
#### 首先Keras的fit函數中，傳入的validation data並不用於更新權重，只是用是來檢測loss和accuracy等指標的。但是！作者說了，即使模型沒有直接在validation data上訓練，這也會導致信息洩露，模型會對validation data逐漸熟悉。

#### 驗證集通常用於調整超參數。例如，在深度學習社區中，調整網絡層大、隱藏元數、正規取項（無論是L1還是L2）決定於騖
### 為什麼驗證數據集和測試數據集兩者都需要？
#### 因為驗證數據集（Validation Set)用來調整模型參數從而選擇最優模型，模型本身已經同時知道了輸入和輸出，所以從驗證數據集上得出的誤差（Error)會有偏差（Bias)。

但是我們只用測試數據集(Test Set) 去評估模型的表現，並不會去調整優化模型。
# CH5
### **AlexNet**
- 是第一個在大規模視覺競賽中擊敗傳統計算機視覺模型的大型神經網絡
### **NiN**
- LeNet、AlexNet和VGG都有一個共同的設計模式：通過一系列的捲積層與池化層提取空間結構特徵
 ![](https://i.imgur.com/LKHlOtR.png)

- NiN塊以一個普通卷積層開始，後面是兩個1×1的捲積層。這兩個1×1卷積層代替帶有ReLU激活函數的逐像素全連接層。但因為多了一層1X1卷積層可以視爲多了一層非線性變換，多加了這種非線性變換網絡的性能應該也能變好
- NiN和AlexNet之間的一個顯著區別是<font color="purple">**NiN完全取消了全連接層**</font>。 相反，NiN使用一個NiN塊，其輸出通道數等於標籤類別的數量。 最後放一個全域平均彙聚層（global average pooling layer），生成一個對數幾率（logits）。 NiN設計的一個優點是，它顯著减少了模型所需參數的數量。 然而，在實踐中，這種設計有時會新增訓練模型的時間。
- 1×1卷積的使用文中提出使用mlpconv網絡層替代傳統的convolution層。mlp層實際上是  卷積加傳統的mlp（多層感知機），因爲convolution是線性的，而mlp是非線性的，後者能夠得到更高的抽象，泛化能力更強。在跨通道（cross channel,cross feature map）情況下，mlpconv等價於卷積層+1×1卷積層，所以此時mlpconv層也叫cccp層（cascaded cross channel parametric pooling)。
- CNN網絡中不使用FC層（全連接層）文中提出使用Global Average Pooling取代最後的全連接層，因爲全連接層參數多且易過擬合。做法即移除全連接層，在最後一層（文中使用mlpconv）層，後面加一層Average Pooling層。
:::danger
以上兩點，之所以重要，在於，其在較大程度上減少了參數個數，確能夠得到一個較好的結果。而參數規模的減少，不僅有利用網絡層數的加深（由於參數過多，網絡規模過大，GPU顯存等不夠用而限制網絡層數的增加，從而限制模型的泛化能力），而且在訓練時間上也得到改進。
:::

:::info
**1×1卷積核作用**
- 縮放通道數(channel)：通過控制卷積核的數量達到通道數的放縮。
- 增加非線性。1×1卷積核的卷積過程相當於全連接層的計算過程，並且還加入了非線性激活函數，從而可以增加網絡的非線性。
- 計算參數少 

:::
**NiN結論**
- NiN使用由一個卷積層(Kernel自訂)和多個1×1卷積層組成的塊。 該塊可以在卷積神經網路中使用，以提升輸出的非線性。
- NiN去除了容易造成過擬合的全連接層，將它們替換為全域平均彙聚層（即在所有位置上進行求和）。 該彙聚層通道數量為所需的輸出數量（例如，Fashion-MNIST的輸出為10）。
- 移除全連接層可减少過擬合，同時顯著减少NiN的參數。NiN的設計影響了許多後續卷積神經網路的設計。
### **GoogleNet**
- 結合不同 kernel size 的卷積，發揮不同卷積的優點
- GoogleNet論文指出獲得高品質模型最保險的做法就是新增模型的深度，或者是它的寬度，但是一般情况下，更深和更寬的網絡會出現以下問題：
  **1.參數太多，容易過擬合，如果訓練數據有限，則這一問題更加突出
  2.網絡越大計算複雜度越大，難以應用
  3.網絡越深，容易出現梯度消失問題**
- GoogLeNet **吸收了NiN中串聯網絡的思想**，並在此基礎上做了改進。 這篇論文的一個重點是解决了什麼樣大小的卷積核最合適的問題。 畢竟，以前流行的網絡使用小到1×1，大到11×11的卷積核。 本文的一個觀點是，有時使用<font color="#F09">**不同大小的卷積核組合是有利的**</font>。 本節將介紹一個稍微簡化的GoogLeNet版本：我們省略了一些為穩定訓練而添加的特殊特性，現在有了更好的訓練方法，這些特性不是必要的。
- **Inception塊**
![](https://i.imgur.com/3Dx9PkK.png)

    如圖所示，Inception塊由四條並行路徑組成。 前三條路徑使用視窗大小為1×1、3×3和5×5的卷積層，從不同空間大小中選取資訊。中間的兩條路徑在輸入上執行1×1卷積，以减少通道數，從而降低模型的複雜性。第四條路徑使用3×3最大池化層(MaxPooling)，然後使用1×1卷積層來改變通道數。這四條路徑都使用**合適的填充(padding)來使輸入與輸出的高和寬一致**，最後我們將每條線路的輸出在通道維度上連結，並構成Inception塊的輸出。 在Inception塊中，通常調整的超參數是每層輸出通道數
    
    - GoogLeNet一共使用9個Inception塊和全域平均彙聚層的堆疊來生成其估計值。 Inception塊之間的最大彙聚層可降低維度。 第一個模塊類似於AlexNet和LeNet，Inception塊的組合從VGG繼承，全域平均彙聚層避免了在最後使用全連接層。
    **【最後一層FCN為一個輸出個數為標籤類別數的全連接層】**
         ![](https://i.imgur.com/EEFzQoH.png)

### GoogleNet結論
Inception塊相當於一個有4條路徑的子網絡。 它通過不同視窗形狀的卷積層和最大彙聚層來並行抽取資訊，並使用1×1卷積層减少通道維數從而降低模型複雜度。GoogLeNet將多個設計精細的Inception塊與其他層（卷積層、全連接層）串聯起來。 其中Inception塊的通道數分配之比是在ImageNet數据集上通過大量的實驗得來的。
GoogLeNet和它的後繼者們一度是ImageNet上最有效的模型之一：它以較低的計算複雜度提供了類似的測試精度。











