---
# System prepended metadata

title: 李宏毅深度學習教程
tags: [AI]

---

# 李宏毅深度學習教程 

## 目錄
[TOC]

---
Github Link : https://github.com/datawhalechina/leedl-tutorial

---

## 第一章 : 深度學習基礎

### 1.1 局部極小值與鞍點
當參數對損失微分為零時，梯度下降就不能再更新參數了，訓練停下來，損失也不會再下降。

梯度為零可能是 : 局部極小值(Local minimum)、局部極大值(Local maximum)、鞍點(Saddle point)，統稱為**臨界點(Critical point)**。

![Local minimum & Local maxima & Saddle point](https://hackmd.io/_uploads/SJh7MYfD3.png)
<br>

#### 判斷臨界值種類的方法 :
::: success
**$L(θ') + (θ-θ')^Tg + 1/2(θ-θ')^T H(θ-θ')$**
:::

在泰勒級數近似(Taylor series appoximation)中：
- **$L(θ')$** : 當 $θ$ 與 $θ'$ 很近時，$L(θ)$ 和 $L(θ')$ 應該蠻近的。
- **$(θ-θ')^Tg$** : $g$ 代表梯度(向量)，可以彌補 $L(θ)$ 和 $L(θ')$ 之間的差距，有時會寫成 $\nabla L(θ')$。$g_i$ 是向量 $g$ 的第 $i$ 個元素，$θ$ 的第 $i$ 個元素的微分，即 : $g_i = \cfrac{∂L(θ')}{∂θ_i}$。
- **$\cfrac{1}{2}(θ-θ')^TH(θ-θ')$** : 跟海森矩陣(Hessian matrix) $H$ 有關。$H$ 裡面是二次微分，第 $i$ 行，第 $j$ 列的值 $H_{ij}$ 就是把 $θ$ 的第 $i$ 個元素對 $L(θ')$ 作微分，再把 $θ$ 的第 $j$ 個元素對 $\cfrac{∂L(θ')}{∂θ_i}$ 作微分後的結果，即 : $H_{ij} = \cfrac{∂^2}{∂θ_i∂θ_j}L(θ')$ 

在臨界點時，梯度 $g$ 為零，因此 $(θ-θ')^Tg$ 為零，所以在臨界點時，損失函數可被近似為 : 
![image](https://img-blog.csdnimg.cn/26ded588e159487cb84ca30a661c921d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5aWX54WO6aW8,size_20,color_FFFFFF,t_70,g_se,x_16)
<br>

因此可以根據 **$\cfrac{1}{2}(θ-θ')^T H(θ-θ')$** 來判斷 $θ'$ 附近的誤差表面(Error surface)，$L(θ')$ 的三種情況 : 
- $\cfrac{1}{2}(θ-θ')^TH(θ-θ') > 0$ : 局部極小值
- $\cfrac{1}{2}θ-θ')^TH(θ-θ') < 0$ : 局部極大值
- 有時 $\cfrac{1}{2}(θ-θ')^TH(θ-θ') > 0$，有時 $\cfrac{1}{2}(θ-θ')^TH(θ-θ') < 0$ : 鞍點

不過實際上，並不可能帶入全部的 $θ$，因此只要查看 **$H$特徵值**。
若 $H$ 所有特徵值都是正的，則為正定矩陣，臨界點是局部極小值 ; 若 $H$ 所有特徵值都是負的，則為負定矩陣，臨界點是局部極大值 ; $H$ 特徵值有正有負，臨界點是鞍點。


### 1.2 批量和動量
實際上在計算梯度時，是將所有數據分成多個**批量(Batch)**。每次更新參數時，會取出批量大小的資料，計算損失和梯度更新參數。歷遍所有批量的過程，稱為一個**回合(Epoch)**。

![批量優化](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*nozFrhHw3ZMaqWOlUMbIJw.png)
<br>

**Best Batch Size** : 
![optimal batch](https://v5.scaledagileframework.com/wp-content/uploads/2018/08/Visualize-and-Limit-WIP_F02_web.png)
**Situation in Different Batch Size**
![batch size](https://blog.paperspace.com/content/images/2022/07/over_ideal_under_fitting-1.png)
<br>

**批量梯度下降(Batch Gradient Descent, BGD) v.s. 隨機梯度下降(Stochastic Gradient Descent, SGD)**

- 批量梯度下降 : 使用全批量(Full batch)數據來更新一次參數
- 隨機梯度下降 : 使用批量大小數據來更新一次參數 (算出來的損失比較有噪聲)

![Gradient vs Stochastic vs Mini-Batch](https://miro.medium.com/v2/resize:fit:1212/1*YLNFGMJldpPOtUdO61R1MQ.png)
<br>

**隨機梯度下降的梯度上，引入隨機噪聲，因此在非凸優化問題中，相比批量梯度下降，更容易逃離局部極小值。** ($L_1$和$L_2$函數不一樣，梯度不一定等於零)

![小批量梯度下降更好的原因](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*7v0dEx5HGde9uqmNum_lcQ.png)
<br>

在誤差表面中，大的批量大小，傾向於走到「峽谷」(壞的極小值) ; 小的批量大小，傾向於走到「盆地」(好的極小值)，小的批量大小容易跳出峽谷。
![小批量優化容易跳出局部極小值](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*OYjMyTI6EmwWFoy4sRDqWw.png)
<br>

#### 動量法 (Momentum method)
在物理的世界中，一顆球如果從高處滾下來，就算滾到鞍點或是局部極小值，因為慣性的關係，他還是會繼續走。如果將其應用到梯度下降中，就是動量。

一般的梯度下降 : 
計算完梯度後，往梯度的反方向去更新參數 $θ_n = θ_{n-1} - ηg_{n-1}$，反覆進行。
![Gradient Descent](https://i.imgur.com/dfvP7Af.png)
<br>


引入動量後的梯度下降 : 
不只往梯度的反方向來移動參數，而是**根據梯度的反方向，加上前一步移動的方向**來決定移動方向。更新方向為 $m_n = λm_{n-1} - ηg_{n-1}$ ($n > 0, n = 0$ 則為 $0$)，反覆進行。
![Momentum gradient descent](https://i.imgur.com/5BwB7AQ.jpg)
<br>

$η$ 是學習率，$λ$ 是前一個方向的權重參數。動量是梯度的負反方向加上前一次移動的方向; 當角度加上動量時，更新的方向不只考慮現在的梯度，而是考慮過去所有梯度的總和。
![Benifit of Momentum](https://img-blog.csdnimg.cn/ad2b0ba0991c4cfebce51836b956bdce.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5aWX54WO6aW8,size_20,color_FFFFFF,t_70,g_se,x_16)
<br>

### 1.3 自適應學習率
當走到臨界點時，代表梯度非常小，但當損失不在下降時，梯度不一定真的很小。梯度可能只是在山谷的兩個谷壁間，不斷來回震盪，損失也不會再下降。
![Training stuck != Small Gradient](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*ZZpw_XuBPXj7nyDm9iRHZg.png)
<br>

引入**自適應學習 (Adaptive learning rate)** 的方法給每個參數不同的學習率。如果在某個方向上梯度值小、非常平坦，則會希望學習率調大 ; 若在某個方向非常陡峭、坡度很大，則會希望學習率設小。
![Different parameters needs different learning rate](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*Su8o4iCykLHvFWwkulXGEA.png)
<br>

#### 常見的自適應學習率方法
- **AdaGrad** : 在算均方根時，每一個梯度都有同等的重要性。
- **RMSProp** : 在算均方根時，可以調整每個梯度的重要性。
![RMSProp](https://miro.medium.com/v2/resize:fit:828/format:webp/1*05-s9WZonPxZllJMyIZsGw.png)
<br>
- **Adam** : 當今最常用的優化器 (optimizer)，RMSProp 加上動量 (Momentum)，其使用動量作為參數更新方向，並能夠自適應調整學習率。

### 1.4 學習率調度
累積很多梯度較小的數值，到一定程度後會「梯度爆炸」，出現暴增的情況，當梯度很大時，$σ$ 會變得很大，學習率就會變很小，參數更新的距離也會變小，暴增的部分就會被修正。使用學習率調度可以解決這個情況。


學習率調度中最常見的策略是**學習率衰減 (learning rate decay)**，隨著參數不斷更新讓 $η$ 越來越小。
![Learning rate decay](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*iFCd4c6Bq8vQgFHpxTXFUA.png)
<br>
另一個經典的學習率調度方式是**預熱 (warmup)**。預熱方法，是讓學習率先變大後變小，變大、變小的速度是超參數。殘差網路、Bert、Transformer 的訓練都有使用預熱。
![Learning rate decay vs warmup](https://miro.medium.com/v2/resize:fit:1100/format:webp/1*BnfeqQB_ebio7xZ1R-gzzw.png)
<br>

---

## 第二章 : 卷積神經網路 (Convolutional Neural Network, CNN)
每個神經元和輸入向量中的每個數值都需要一個權重，更多的參數為模型帶來更好的彈性和能力，但也增加過擬合(overfitting)的風險。因此考慮到圖像本身的特性，並不一定需要做到全連接網路(fully connected network)。

獨熱向量(One-Hot Vactor) $y'$ 的長度決定模型可以辨識多少不同種類，模型的輸出通過 softmax 後是 $\hat y$，$y'$ 和 $\hat y$ 的交叉熵(cross entropy)越小越好。

### 2.1 Pattern
檢測圖像中有沒有出現重要 pattern，這些 pattern 代表某種特徵。
![Pattern](https://i.imgur.com/9Lgzc3E.jpg)
<br>

### 2.2 Receptive field
每個神經元都只關心自己的 Receptive field。
在下圖中，藍色方框代表 Receptive field，神經元只需要關心這個範圍，把寬、高、通道相乘即為向量，並給每個維度的向量一個權重，最後再加上偏置(Bias)得到輸出。

![Receptive field](https://pic4.zhimg.com/80/v2-c9f5c1b11534f4f6614f0f199eb146c7_1440w.webp)
<br>

同個範圍可以有多個不同的神經元 :
![Overloading](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e6c3f86b7ba44356800f256c12c1fe53~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.awebp)
<br>

Receptive field 移動的量叫做步輻(stride)，是一個超參數(hyperparameter)。當 Receptive field 超出圖像範圍時，做填充(padding)，一般使用零填充(zero padding)。
![Stride and Padding](https://pic4.zhimg.com/80/v2-dab6bcb99e3254c52e5d61803de15eab_1440w.webp)
<br>

### 2.3 同樣的 Pattern 可能出現在圖像的不同區域
如果不同的 Receptive field 都要有同樣的檢測神經元，參數量會太多，因此需要簡化。

### 2.4 共享參數(parameter sharing)
儘管兩個神經元的參數是一樣的，但他們的輸入不一樣，Receptive field也會不一樣。

![Parameter sharing](https://pic1.zhimg.com/80/v2-560a96d2b5be94c8ec4d5a911ae67c54_1440w.webp)
<br>
這些參數稱為濾波器(filter) : 
![filter](https://pic2.zhimg.com/80/v2-3ac2cf7955f03eaa9fc4a9192610067d_1440w.webp)
<br>

### 2.5 小結

- 全連接層(Fully connected layer) : 可以決定要看整張圖像還是小範圍。

- 卷積層(Convolutional layer) : Receptive field + Parameter sharing，卷積神經網路的偏差較大，因此靈活度(Flexibility)較低，比較不容易過擬合。
![Relationship between FCL and CL](https://img-blog.csdnimg.cn/41ed4bb9c6aa4a88bef5296a001118bc.png)
    
- 當圖像通過卷積層中的所有濾波器後，就會產生一個特徵映像(feature map)。

### 2.6 池化(pooling)
做完卷積後，往往會搭配池化。池化會把圖像變小，一般在實踐上，卷積層會和池化層交替使用。不過池化對於模型的性能(performance)可能會帶來一點傷害，所以近年圖像的網路設計漸漸不採用池化，做全卷積的神經網路。

池化最主要的作用是減少運算量，通過下採樣把圖像變小。
![pooling](https://img-blog.csdnimg.cn/img_convert/58fed6bec302bf77aaaa63b9840bdfe6.jpeg)
<br>
![After pooling](https://i.imgur.com/hqdUqja.png)
<br>

在經典的圖像識別網路中，做完幾次卷積層和池化層，會把池化層的輸出做扁平化(flatten)，再把這個向量丟進全連接層，最後再透過 softmax 來得到圖像識別的結果。

--- 

## 第三章 : 自注意力機制(Self-attention)
輸入可以看作是一個向量，如果是回歸問題，輸出是一個純量 ; 如果是分類問題，輸出是一個類別。

### 3.1 輸入是向量序列的情況

#### 類型 1 : 輸入與輸出數量相同
例子 : 詞性標註(Part-Of-Speech tagging, POS tagging)，判斷該詞是名詞、動詞、形容詞等。

#### 類型 2 : 輸入是一個序列，輸出是一個標籤
例子 : 情感分析(sentiment analysis)，判斷這段話是積極(positive)還是消極(negative)。

#### 類型 3 : 序列到序列
輸入是 $N$ 個向量，輸出是 $N'$ 個向量(由機器決定)。這類任務又稱序列到序列(Sequence to Sequence, Seq2Seq)任務。
例子 : 語音識別。

### 3.2 自注意力的運作原理
考慮整個序列的信息，再來決定應該要輸出什麼樣的結果。

自注意力模型可以疊加很多次，將全連接網路與自注意力模型交替使用，全連接網路專注於某一個位置的信息，自注意力再把整個序列信息再整理一次，"Attention Is All You Need"。

![Self-Attention](https://miro.medium.com/v2/resize:fit:1128/1*E1RJkL-2nu5I8msfI6wn5g.png)
<br>

計算注意力的模塊使用兩個向量作為輸入，輸出數值 $α$，$α$ 即為兩個向量的關聯程度(注意力的分數)。

常見計算 $α$ 的做法是用點積 (dot product)，把輸入的兩個向量分別乘上兩個不同的矩陣，左邊乘上矩陣 $W^q$，右邊乘上矩陣 $W^k$，得到向量 $q$ 和 $k$，再把 $q$ 跟 $k$ 做點積，做逐元素(element-wise)的相乘，全部加起來後就得到一個純量(scalar) $α$。

另一個作法是相加(additive)，把兩個向量通過 $W^q$、$W^k$ 得到 $q$ 和 $k$，(在這步不是做點積)，而是把 $q$ 和 $k$ 相加後，丟進一個 $tanh$ 函數，乘上矩陣 $W$ 得到 $α$。

![Calculate way](https://img-blog.csdnimg.cn/829f20b061874fcb9649f08eeb95ba10.png)
<br>

一般在實踐時，$α^1$ 也會算跟自己的關聯性。接下來對所有關聯性做 softmax 處理，也就是歸一化(normalize)得到 $α'$
**不一定要使用 softmax，也可以使用其他激活函數**

計算 $α^1$ 跟 $α^2$、$α^3$、$α^4$ 之間的關聯性 :
![IMAGE](https://i.imgur.com/IXzrXue.png)
<br>

把向量 $α^1$ 到 $α^4$ 乘上 $W^v$ 得到新向量 : $v^1$、$v^2$、$v^3$、$v^4$，再把每個向量乘上注意力分數 $α'$ 並相加。

如果 $α^1$ 和 $α^2$ 的關聯性很強，即 $α'_{1,2}$ 的值很大。在做加權和(weighted sum)以後，得到的 $b^1$ 的值會比較接近 $v^2$。因此何者的注意力分數最大，其 $v$ 就會主導(dominant) 抽出來的結果。

![IMAGE](https://miro.medium.com/v2/resize:fit:720/format:webp/1*F2BngyKuI9h8_oxVIi1yfg.png)
<br>

每個 $α'$ 都分別產生 $q$、$k$、$v$ : 
![IMAGE](https://img-blog.csdnimg.cn/eb085b7606e04c2ba705b2ec5e2d9fea.png)
<br>

每一個 $q$ 跟每一個 $k$ 做內積，取得注意力分數，可以看成是 $q^n$ 去乘上 $(k^n)^T$ 矩陣。
![IMAGE](https://img-blog.csdnimg.cn/128da13e64eb41cabcac3d58d0741a61.png)
<br>

最後將注意力分數，對 $A$ 每一列做歸一化(normalization)，得到結果 $A'$。
![IMAGE](https://img-blog.csdnimg.cn/fc8b2c4978544253a1dd8d2fd1a33ae8.png)
<br>

自注意力的輸入是一組向量，將向量排列後可得矩陣 $I$，輸入 $I$ 分別乘上三個矩陣 : $W^q$、$W^k$、$W^v$，得到三個矩陣 $Q$、$K$、$V$。接下來 $Q$ 乘上 $K^T$ 得到矩陣 $A$，做歸一化後得到 $A'$。
$A'$ 稱為注意力矩陣(attention matrix)，乘上 $V$ 可以得到自注意力層的輸出 $O$。

自注意力層中，唯一需要學習的參數只有 $W^q$、$W^k$、$W^u$，需要通過數據訓練學習出來，其他都是人為設定好的。
![IMAGE](https://miro.medium.com/v2/resize:fit:720/format:webp/1*7OjjQFMd__TuBPLnmS8axg.png)
<br>

### 3.3 多頭注意力(Multi-head Self-attention)
使用自注意力計算相關性時，用 $q$ 去找相關的 $k$，但相關有很多種不同形式，所以可以有多個 $q$，不同的 $q$ 負責不同種類的相關性，就是多注意力。

![Multi-head self-attention](https://i.imgur.com/0rhHZDx.png)
<br>

### 3.4 位置編碼(Positional encoding)
位置編碼為每個位置設定一個向量，即位置向量(positional vector)。位置向量用 $e^i$ 表示，上標 $i$ 代表位置。

![Positional encoding](https://lh6.googleusercontent.com/cbFmIP9ClfEPvkFT0_ols1JsZ-6NSSJ66-zHqADnLU1MwUkLYTqSywTo3tj9g5A6c6V25712McIwQSXaeOikJ82mNQS5Yc0wVtEd8OsSfyy2nHLbUnl8gfdVHu29ifvSDcz3Sz4)
<br>

### 3.5 截斷自注意力(Truncated self-attention)
截斷自注意力指在執行自注意力時，考慮小範圍以代替整體，這樣就可以加快運算速度。

![Truncated self-attention](https://img-blog.csdnimg.cn/b4c6ced24f15486f9ce9562846a646ae.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAY2hhaXJvbg==,size_20,color_FFFFFF,t_70,g_se,x_16)
<br>

### 3.6 自注意力與卷積神經網路對比
自注意力是靈活的卷積神經網路，卷積神經網路是受限制的自注意力。自注意力的彈性比較大，所以需要比較多的訓練數據，較少的訓練數據會過擬合 ; 而卷積神經網路的彈性較小，在訓練數據少時，結果比較好。

![self-attention vs cnn](https://img2020.cnblogs.com/blog/1517575/202110/1517575-20211008113835253-936020344.png)
<br>
![self-attention vs cnn with model](https://pic4.zhimg.com/80/v2-64064cd7bf39e10b84ce8f7b4462544f_1440w.webp)
<br>

### 3.7 自注意力與循環神經網路對比
循環神經網路(Recurrent Neural Network, RNN)，跟自注意力一樣是處理序列。循環神經網路中，有一個輸入序列、一個隱狀態的向量、一個循環神經網路的區塊(block)，隱狀態儲存歷史信息，可以看做是一種記憶(memory)。
當第二個向量作為輸入時，前一個時間點的輸出也會作為輸入，一起放進循環神經網路產生新的向量，再給全連接網路。

自注意力與循環神經網路的不同在於，**自注意力的每個向量都考慮整個輸入的序列**，而循環神經網路的每個向量只考慮左邊已輸入的向量，沒有考慮右邊的。
但循環神經網路也可以是雙向的，如果用雙向循環神經網路(Bidirectional Recurrent Neural Network, Bi-RNN)，那每一個隱狀態的輸出也是考慮整個輸入的序列。

不過雙向循環神經網路與自注意力在執行上還是有些微差別，對於循環神經網路，最右邊的向量需要考慮左邊的輸入，因此必須把最左邊的輸入存在記憶裡面，一路帶到右邊，才能在最後一個時間點被考慮。在自注意力機制，可以輕易從整個序列上距離遠的向量抽取訊息。另一點是循環神經網路無法並行處理所有輸出，但自注意力可以。

![self-attention vs rnn](https://pic4.zhimg.com/80/v2-051a538c903234d8f08d042171164e53_1440w.webp)
<br>

自注意力也可以用在圖上面，圖可以看作是向量，如果是向量，就可以用自注意力處理。但是自注意力在圖上的應用比較不一樣，除了圖中的節點(node)可以表示成一個向量，還有邊(edge)的信息。

如果節點之間是相連的，**圖上的邊即已經表示了節點與節點之間的關聯性，不需要機器自動找出**。所以將自注意力用在圖上時，計算注意力矩陣只計算有邊相連的節點就好。(沒有相連就不需計算，直接設為 0)
當把自注意力用在圖時，就是一種圖神經網路(Graph Neural Network)。

---

## 第四章 : Transformer

### 4.1 序列到序列模型
Transformer 是一個**序列到序列(Sequence-to-Sequence, Seq2Seq)** 的模型，意即輸入與輸出都是一個序列。輸入與輸出序列長度有兩種，一種是長度一樣，一種是機器決定輸出長度。

### 4.2 序列到序列模型的應用

- **語音辨識、機器翻譯與語音翻譯**

![序列到序列應用](https://img-blog.csdnimg.cn/cbb20054551445b3b141498d002385ff.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAY2hhaXJvbg==,size_20,color_FFFFFF,t_70,g_se,x_16)
<br>

- **語音合成(Text-To-Speech, TTS)**
目前還沒有端到端(ent-to-end)的模型，使用的模型還是分成兩階段，首先模型把一號文字轉成二號文字，在把二號文字轉成聲音信號(通過序列到序列模型 echotron 實現)。

- **聊天機器人**

- **問答任務**
自然語言處理(Natural Language Processing, NLP)領域應用，例如翻譯、自動摘要情感分析。

- **句法分析(Syntactic parsing)**
在句法分析的任務中，輸入是一段文字，輸出是一個樹狀結構，每個樹狀結構可以看成是一個序列，就可以用序列到序列模型做句法分析。

- **多標籤分類(Multi-label classification)**
多分類問題(multi-class classification)是指分類的類別數大於二，而多標籤分類是指同一個東西可以屬於多個類。

多標籤分類問題不能當作是多分類問題，分類器只會輸出分數最高的答案(儘管取閾值，也只會輸出前幾名)，由於每篇文章對應的類別數量不一樣，因此此方法不可行。所以要用序列到序列模型來做，輸出的類別由機器決定。

### 4.3 Transformer 結構
一般的序列到序列模型會分成**編碼器與解碼器**，編碼器負責處理輸入的序列，在傳遞至解碼器，由解碼器決定輸出的序列。

![Encoder & Decoder](https://ithelp.ithome.com.tw/upload/images/20201002/20129616z8pzmhYzJL.png)
<br>

### 4.4 Transformer 編碼器
Transformer 編碼器使用的是自注意力。
編碼器裡面會分成很多區塊(block)，每一個區塊都是輸入一排向量，輸出一排向量。

![Transformer 結構](https://i.imgur.com/0QSIATv.png)
<br>

Transformer 編碼器的每個區塊並不是神經網路層，在每個區塊裡，輸入一排向量後做自注意力，考慮整個序列的信息，輸出一排向量，並將其放進全連接網路，輸出另一排向量，這排向量就是區塊的輸出。

Transformer 加入殘差連接(Residual connection)的設計，最左邊的向量 $b$ 輸入到自注意力層後得到向量 $a$，輸出向量 $a$ 加上其輸入向量 $b$ 得到新的輸出。得到殘差結果以後，在做層歸一化(layer normalization)。

![residual connection](https://pic4.zhimg.com/80/v2-615e73c1a94b944e7aefbdc663176f47_1440w.webp)
<br>

層歸一化比批量歸一化(batch normalization)簡單，不需要考慮批量(batch)信息。層歸一化會計算輸入向量的均值(mean)和標準差(standard deviation)。

批量歸一化是對不同樣本(example)、不同特徵的同一個維度去計算均值和標準差，但層歸一化是對同一個特徵、同一個樣本裡的不同維度去計算均值跟標準差，接著做歸一化。

輸入向量 $x$ 裡的每一個維度減掉均值 $m$，在除以標準差 $σ$ 以後得到 $x'$ 就是層歸一化的輸出。得到層歸一化的輸出後，將作為全連接網路的輸入，輸入到全連接網路後，還有殘差連接，把全連接網路的輸入跟輸出加起來得到新的輸出，將殘差的結果再做一次層歸一化得到的輸出就是 Transformer 編碼器裡的一個區塊的輸出。

**為什麼 Transformer 使用層歸一化，而不使用批量歸一化?**
經過論文證明在 Transformer 模型裡，批量歸一化不如層歸一化，並提出能量歸一化(power normalization)，能量歸一化甚至比層歸一化好一點。

### 4.5 Transformer 解碼器

- **自回歸解碼器**
解碼器較常見的是自回歸(autoregressive)解碼器。要讓解碼器產生輸出，首先要給定一個代表開始的特殊符號 BOS(Begin Of Sequence)，這是一個特殊的詞元(token)，要讓解碼器停止運作，也需要一個 EOS。

解碼器的輸入是前一個時間點的輸出，並會把自己的輸出當作接下來的輸入，因此解碼器有可能會得到錯誤資訊並產出錯誤輸出，造成誤差傳播(error propagation)。

回顧一下結構圖 : 

![Transformer 結構](https://i.imgur.com/0QSIATv.png)
<br>

類似編碼器，解碼器也有多頭注意力、殘差連接和層歸一化、前饋神經網路，解碼器最後再做 softmax，使其輸出變成一個概率。此外，解碼器使用掩蓋自注意力(masked self-attention)，可以透過一個掩碼(mask)來阻止每個位置選擇其後面的輸入訊息。

原來的自注意力是根據 $a^1$ 到 $a^4$ 的所有信息去輸出 $b^1$，掩蓋自注意力則是產生 $b^1$ 時，只能考慮 $a^1$ 的信息。

**為什麼需要在注意力中掩碼?**
自注意力是 $a^1$ 到 $a^4$ 一次整個輸進去模型，編碼器是一次把 $a^1$ 到 $a^4$　都讀進去，但解碼器是一個一個讀進去的，先讀 $a^1$、再讀 $a^2$... 因此只考慮左邊的東西，沒辦法考慮右邊的。

- **非自回歸解碼器**
非自回歸(non-autoregressive)解碼器有以下優點:
    - 平行化
    自回歸解碼器是一個一個產生，非自回歸解碼器可以一次產生完整的結果。
    - 較能控制輸出長度
    用一個分類器決定非自回歸解碼器應該輸出的長度。

平行化是非自回歸解碼器的最大優勢，但性能(performance)往往不如自回歸解碼器。

![auto vs non-autoregressive](https://d3i71xaburhd42.cloudfront.net/ca4ba244fc83b664902f7dd3fe6a7d429ba50f28/1-Figure1-1.png)

<br>

### 4.6 編碼器-解碼器注意力
編碼器和解碼器通過編碼器-解碼器注意力(encoder-decoder attention)傳遞信息，是為連接橋梁。解碼器中編碼器-解碼器注意力的鍵和值來自編碼器的輸出，查詢來自解碼器中前一個層的輸出。

### 4.7 Transformer 的訓練過程
解碼器的輸出是一個概率分布，我們要計算標準答案(ground truth)跟分布之間的交叉熵，交叉熵越小越好。
解碼器訓練過程中，在輸入時就給正確答案，希望解碼器的輸出跟正確答案越近越好，稱為教師訓練(teacher forcing)。

### 4.8 序列到序列模型訓練常用技巧

- **複製機制(copy mechanism)**
對很多任務而言，解碼器沒有必要自己創造輸出，例如人名，因此可以從輸入裡複製。

- **引導注意力**
引導注意力會使注意力有一個固定的樣貌，例如注意力位置應該由左到右，最適用於語音識別。

- **束搜索(beam search)**
貪心搜索(greedy search)不一定是最好的，窮舉搜索(exhaustive search)是不現實的。
束搜索用比較有效的方法找一個近似解，但在某些情況下效果不好。適用於答案非常明確，識別結果只有一種可能的任務，反之若是需要發揮一些創造力的任務，束搜索則較沒有幫助。

- **加入噪聲**
在訓練時加入噪聲，讓機器看過更多不同的可能性，會使模型增強魯棒性，較能對抗沒有看過的狀況。

- **使用強化學習訓練**
遇到優化無法解決的問題(無法優化的損失函數)，可以用強化學習訓練(把損失函數當強化學習的獎勵，解碼器當成智能體)。

- **計畫採樣**
在測試時，解碼器看到自己的輸出(會有錯誤)，但在訓練時，解碼器看到是完全正確的，這種不一致現象叫曝光偏差(exposure bias)。
因此不要都給解碼器正確答案，參雜一些錯誤，會讓解碼器學得更好，這叫計畫採樣(sheduled sampling)。

--- 

## 第五章 : 自監督學習(Self-Supervised Learning, SSL)


## 第六章 : 遷移學習(Transfer learning)

## 第七章 : 強化學習(Reinforcement Learning, RL)