20250928 筆記,內容可能有錯,請參考來源影片。
[李宏毅機器學習2021影片](https://www.youtube.com/playlist?list=PLJV_el3uVTsMhtt7_Y6sgTHGHp1Vb2P2J)
今天影片內容
[【機器學習2021】卷積神經網路 (Convolutional Neural Networks, CNN)](https://youtu.be/OP5HcXJg2Aw?si=vrDD0X6BPyCf76cW)
[【機器學習2021】自注意力機制 (Self-attention) (上)](https://youtu.be/hYdO9CscNes?si=vX0dS0aI5fEAPGR1)
[【機器學習2021】自注意力機制 (Self-attention) (下)](https://youtu.be/gmsMY5kc-zw?si=xo16YjEwFJBmqGYi)
### 【機器學習2021】卷積神經網路 (Convolutional Neural Networks, CNN) 大綱
### I. 簡介與圖像分類設定
* A. CNN 的定義與目的 (Convolutional Neural Network)
* B. 圖像分類任務設定
* 1. 模型輸入:假設固定大小 (如 100x100 解析度)
* 2. 模型輸出:One-hot vector (Y hat)
* 3. 損失函數:Cross Entropy
### II. 傳統全連接網路 (FCN) 的限制與圖像表示
* A. 圖像對電腦的表示方式:三維 Tensor
* 1. 尺寸:寬、高、Channel 數量
* 2. 彩色圖片 Channel:RGB (3個)
* B. FCN 處理圖像的問題:參數過多 (Overfitting)
* 1. 處理方式:將 3D Tensor 拉直成巨大向量
* 2. 參數數量龐大範例 (100x100x3 輸入, 1000 個 Neuron):約 3 乘以 $10^7$ 個權重
### III. CNN 架構設計的兩大觀察與簡化 (版本一:Neuron 視角)
* A. 觀察一:局部模式 (Local Patterns)
* 1. 概念:重要特徵 (如鳥嘴、眼睛) 只需要看圖片的一小部分
* 2. 簡化方式:Receptive Field
* a. Receptive Field 概念:每個 Neuron 只關注其定義範圍內的事物 (例如 3x3x3 數值)
* b. 經典 Receptive Field 設計:看所有 Channel,只講高跟寬 (Kernel Size)
* c. RF 移動:Stride (步幅),常設為 1 或 2,重疊是必須的
* d. 邊界處理:Padding (補值,常見 Zero Padding)
* 3. 影響:Neuron 彈性變小,減少參數
* B. 觀察二:模式重複出現 (Pattern Reoccurrence)
* 1. 概念:同一個模式 (如鳥嘴) 會出現在圖片的不同位置
* 2. 簡化方式:共享參數 (Parameter Sharing)
* a. 實施:不同 RF 的 Neuron 共用相同的權重 (Weights)
* b. 共享參數的名稱:Filter
* 3. 影響:進一步限制 Neuron 彈性,減少參數
* C. 總結:Convolutional Layer (卷積層) 具有較大的 Model Bias
### IV. CNN 架構設計 (版本二:Filter 視角)
* A. Filter 定義:一個 3x3xChannel 大小的 Tensor,用於抓取特定 Pattern
* 1. Filter 數值:即為模型參數 (Weights),需透過訓練找出
* B. Convolution (卷積操作):Filter 掃過圖片
* 1. 步驟:Filter 數值與對應圖片範圍內的數值進行內積 (Dot Product)
* 2. 移動:依據 Stride 決定每次移動距離
* C. 輸出:Feature Map (特徵圖)
* 1. 概念:每個 Filter 產生一組數字,所有 Filter 產生的數字構成 Feature Map
* 2. Feature Map 尺寸:可視為一張新的圖片,Channel 數量等於 Filter 數量
* D. 多層卷積 (Layer Stacking)
* 1. 第二層 Filter 高度:等於前一層輸出的 Channel 數
* 2. 3x3 Filter 疊加效果:雖然 Filter 小,但透過層層疊加,在原圖上可偵測更大範圍的模式 (例如 5x5)
### V. 其他重要層次與應用
* A. Pooling Layer (池化層)
* 1. 觀察依據:圖片縮小 (Downsampling) 不影響物件判斷
* 2. 特性:本身沒有參數 (Weights),是固定的運算子 (Operator)
* 3. 種類:Max Pooling (選取組內最大值)、Average Pooling (選取平均值)
* 4. 目的:將圖片變小 (減少運算量),但可能影響對細微事物的偵測
* 5. 實作:卷積與池化層交替使用,或現代網路完全採用全卷積 (Fully Convolutional)
* B. CNN 的完整架構
* 1. 步驟:卷積層 $\rightarrow$ 池化層 (可選) $\rightarrow$ **Flattening (拉直)** $\rightarrow$ 全連接層 $\rightarrow$ Softmax
* C. 應用範例:AlphaGo (圍棋)
* 1. 任務:將圍棋視為分類問題 (預測最佳落子位置)
* 2. 棋盤表示:19x19 解析度,48 個 Channel
* 3. 適用性:圍棋與圖像具有共同特性 (局部模式重要性,模式可重現於不同位置)
* 4. AlphaGo 架構特點:使用 5x5, 3x3 Filter,Stride 為 1,**未使用 Pooling**
### VI. CNN 的限制
* A. 限制:無法處理圖像的放大、縮小或旋轉問題
* B. 處理方法:數據增強 (Data Augmentation)
### I. 卷積神經網路 (CNN) 簡介與圖像分類設定
卷積神經網路 (CNN) 是 **Convolutional Neural Network** 的縮寫。它是專門用於圖像的網路架構變形。設計網路架構是為了讓網路結果更好。
在圖像分類任務中,模型目標是點擊一張圖片並決定圖中內容。
* **輸入假設:** 在討論中,假設輸入圖片大小固定,例如 **100 乘 100 的解析度**。雖然圖片實際大小不一,且不都是正方形,但常見處理方式是先將所有圖片 **Rescale (調整大小)** 到一致,再丟入辨識系統。
* **輸出表示:** 模型的目標是分類,所以會將每一個類別表示成一個 **One-hot vector (Y hat)**。
* 例如,如果類別是「貓」,則貓對應的維度數值是 1,其他維度數值是 0。
* 向量的長度決定了模型可辨識的種類數量。現今強大的圖像辨識系統可辨識 **1000 種以上**,甚至上萬種不同的物件。
* **損失函數:** 模型的輸出(透過 Softmax 後的 $Y_{fit}$)會與 One-hot vector 進行比較,期望它們的 **Cross Entropy** 越小越好。
### II. 圖像表示與全連接網路 (FCN) 的限制
對電腦和訓練模型來說,一張圖片其實是一個 **三維的 Tensor**。
* **Tensor 維度:** 維度大於二的矩陣可稱為 Tensor。圖片的三維代表:**寬 (Width)**、**高 (Height)**、以及 **Channel 數**。
* **Channel:** 彩色圖片的每個像素由 **RGB** 三個顏色組成,因此有 3 個 Channel。長和寬則代表圖片的解析度和像素數量。
**FCN 處理圖像的挑戰:參數爆炸**
* **拉直處理 (Flattening):** 為了將圖像作為 FCN 的輸入,必須將這個三維的 Tensor **拉直 (Flatten)** 成一個向量。
* 一個 100 乘 100 乘 3 的圖片包含 **100 乘 100 乘 3** 個數字。將這些數字排成一排,就構成一個巨大的向量,作為 FCN 的輸入。
* 向量中每一維的數值代表某個像素、某個顏色的強度。
* **巨大的參數數量:** 假設輸入向量長度為 $100 \times 100 \times 3$,而第一層有 1000 個 Neuron。
* 每個 Neuron 都與輸入向量的每個數值相連 (Fully Connected)。
* 第一層的總權重 (Weights) 數量將是 $1000 \times (100 \times 100 \times 3) = **3 \times 10^7**$ (三千萬)。
* **問題:** 參數越多雖然會增加模型的彈性 (Ability),但也會增加 **Overfitting (過度擬合)** 的空間。
### III. CNN 架構設計:兩大觀察與簡化 (Neuron 視角)
為了減少參數並考慮圖像本身的特性,有兩個重要的觀察:
#### 1. 觀察一:局部模式的重要性
* **概念:** 偵測物件的 Neuron (如偵測鳥嘴、眼睛、鳥爪) 只需要關注圖片中特別重要的 **Pattern**。
* **不需要全圖:** 這些重要 Pattern 不需要看整張完整的圖片就能獲得資訊,只需要看非常小的範圍。
* **簡化:引入 Receptive Field :**
* 每個 Neuron 只關心自己定義的 **Receptive Field** 範圍內發生的事情。
* 例如,一個 Receptive Field 可能是 $3 \times 3 \times 3$ 個數值的小立方體。
* Neuron 會將這個 $3 \times 3 \times 3$ 的數值拉直成一個 **27 維的向量** 作為輸入。
* **Receptive Field 的設計:**
* **範圍:** Receptive Field 彼此之間可以重疊。同一個 Receptive Field 範圍內可以有多個不同的 Neuron 守備。
* **尺寸 (Kernel Size):** 經常用來描述 Receptive Field 的高跟寬。
* 一般而言,Kernel Size **不會設太大**,例如 $3 \times 3$ 就足夠了。
* **連貫性:** 經典的 Receptive Field 通常是 **相連的區域**,因為 Pattern 通常出現在圖片中某一個位置,而非分散在多處。
* **Channel 考慮:** 經典設計會看 **所有的 Channel**。
* **Receptive Field 的移動與邊界:**
* **步幅 (Stride):** 決定 Receptive Field 每次移動的量。
* Stride 是自行決定的超參數 (Hyperparameter),通常設為 1 或 2。
* 希望 RF 之間有 **高度的重疊**,以避免漏掉出現在交界處的 Pattern。
* **補值 (Padding):** 當 Receptive Field 超出影像範圍時,需進行補值。
* **Zero Padding** 是常見方法,即超出範圍的值當作 0。
* 也有其他補值方法,例如用邊緣數值或平均值補值。
#### 2. 觀察二:參數共享 (Parameter Sharing)
* **概念:** 同樣的 Pattern (例如鳥嘴) 可能出現在圖片的不同區域 (左上角、中間)。
* **冗餘問題:** 偵測鳥嘴的 Neuron 雖然守備範圍不同,但做的事情其實是一樣的。如果每個 RF 都要有一個新的偵測鳥嘴 Neuron,參數量會過多。
* **簡化:Parameter Sharing (參數共享):**
* 讓不同 Receptive Field 的 Neuron **共用相同的參數 (Weights)**。
* 即使參數一模一樣,這些 Neuron 的輸出仍可能不同,因為它們的 **輸入 (x1, x2...) 是不一樣的** (來自不同的圖像區域)。
* **Filter (濾波器):** 每個 RF 通常有一組 Neuron (例如 64 個 Neuron) 負責守備。
* 不同 RF 中的第 1 個 Neuron 之間會共用一組參數,稱為 **Filter 1**;第 2 個 Neuron 共用 **Filter 2**。
* Filter 是共享的參數,是 CNN 架構的核心。
* **總結 CNN:**
* 限制 Neuron 只能看小範圍 (Receptive Field)。
* 強制某些 Neuron 參數必須一樣 (Parameter Sharing)。
* **加入 RF 和 Sharing 就是 Convolutional Layer (卷積層)**。
* CNN 具有較大的 **Model Bias**,但因為它是專門為圖像設計的 (利用了圖像的特性),所以在圖像任務上表現良好。
### IV. CNN 架構設計:Filter 視角 (版本二)
這是更常見的說明 CNN 的方式。
* **Filter 的構造:** 卷積層包含許多 Filter。Filter 的大小是 $3 \times 3 \times \text{Channel}$ 的尺寸。
* Filter 的作用是去圖片中抓取 **小範圍內的特定 Pattern**。
* Filter 內的數值就是模型中的 **參數 (Weights)**,需要透過訓練找到。
* **卷積操作 (Convolution):** Filter 掃過圖片的過程。
* 將 Filter 放在圖片某個範圍 (如左上角)。
* 將 Filter 內的值與圖片該範圍內對應的值進行 **相乘並加總 (Dot Product/內積)**,得到一個數值。
* Filter 接著依據 **Stride** 往右/往下移動,重複運算,直到掃完整張圖片。
* Filter 偵測 Pattern 的原理:當 Filter 內的數值與圖片中的 Pattern 吻合時,運算結果的數值會最大。
* **Feature Map (特徵圖):**
* 每個 Filter 掃完圖片都會產生一組數值,這組數值就叫做 Feature Map。
* 如果一個卷積層有 64 個 Filter,就會產生 64 組數字 (例如 $4 \times 4$)。
* Feature Map 可視為一張新的圖片,其 Channel 數量等於該層 **Filter 的數量**。
#### 多層卷積的效應
* 卷積層可以疊很多層。
* **Filter 高度調整:** 第二層卷積層的 Filter 高度必須設為 **前一層 Feature Map 的 Channel 數** (例如 64)。
* **感受野擴大:** 即使所有 Filter 大小一直設為 $3 \times 3$,網路疊得越深,Neuron 能在原圖上偵測的範圍就 **會越來越大**。
* 例如,兩層 $3 \times 3$ 的 Filter 疊加後,在原圖上相當於考量了一個 **$5 \times 5$ 的範圍**。
### V. 池化層 (Pooling Layer) 與網路結構
#### Pooling Layer (池化層)
* **基礎:** 來自於觀察到將一張大圖片縮小 (Downsampling) 四分之一,通常不會影響對其中物件的判斷 (如鳥)。
* **特性:** Pooling 本身 **沒有參數 (Weights)**,因此它不是一個 Layer,而是一個行為固定的 **Operator** (或有人認為像 Activation Function)。
* **Max Pooling (最大池化):** 最常見的版本。將 Feature Map 上的數值分組 (例如 $2 \times 2$ 一組),選取組內 **最大的那個數值** 作為代表。
* 也可以選擇其他方法,如 Average Pooling (平均值)。
* 分組大小 (例如 $2 \times 2$) 也是自行決定的。
* **作用:** 將圖片(Feature Map)變小,Channel 數量不變。
* **實作趨勢:** Pooling 可以減少運算量,實作上通常是 **Convolutional Layer 與 Pooling Layer 交替使用**。但近年來運算能力增強,許多網路架構開始 **捨棄 Pooling**,採用全卷積 (Fully Convolutional)。
#### 完整的經典 CNN 架構
在完成卷積和池化操作後,Feature Map 會被送往分類器:
1. **Flattening (拉直):** 將 Feature Map 中原本矩陣排列的數值 **拉直成一個向量**。
2. **Fully Connected Layer (全連接層):** 將該向量丟入 Fully Connected Layer。
3. **輸出:** 最終透過 Softmax 得到圖像辨識結果。
### VI. CNN 的應用與限制
#### 應用範例:AlphaGo (圍棋)
* **任務轉換:** 下圍棋可以視為一個分類問題。輸入是棋盤上黑子和白子的位置,輸出是下一步應落子的最佳位置。
* **棋盤表示:** 棋盤被視為一張圖片。
* **解析度:** $19 \times 19$。
* **Channel:** 每個位置使用 **48 個 Channel** 來描述該位置發生的事情 (例如是否即將被提子、旁邊是否有不同顏色的棋子等)。
* **CNN 的適用性:** 圍棋問題與圖像有共同特性,所以 CNN 適用。
* **局部模式:** 許多重要的棋盤 Pattern (如叫吃、被圍) 只需看 **小範圍** (例如 $5 \times 5$ 的 Filter 範圍) 就能判斷。
* **模式重現:** 叫吃的 Pattern 可以出現在棋盤上的任何位置。
* **AlphaGo 架構細節:** AlphaGo 的神經網路結構顯示了設計的靈活性。
* **第一層:** Filter 大小 (Kernel Size) 為 **$5 \times 5$**,Filter 數量 K 設為 192。
* **第二層到第十二層:** Filter 大小為 $3 \times 3$,Filter 數量 K 仍是 192。
* **Stride:** 所有層次的 Stride 都設為 **1**。
* **重要特點:** AlphaGo 的網路架構 **沒有使用 Pooling**。這顯示網路架構設計必須根據任務特性來選擇。
#### CNN 的固有限制
* **無法處理縮放與旋轉:** 事實上,CNN **無法處理圖像放大、縮小或旋轉** 的問題。
* 對人眼來說,放大後的圖形狀一樣,但對 CNN 來說,拉長成向量後裡面的數值已經完全不同,所以它會判定為非常不一樣的圖像。
* **解決方案:** 為了讓 CNN 獲得良好結果,在圖像辨識中通常會採用 **Data Augmentation (數據增強)**。
* 操作包括將訓練資料中的圖片隨機剪裁、放大,或旋轉,讓 CNN 看過不同大小或旋轉角度的 Pattern。
### 【機器學習2021】自注意力機制 (Self-attention) (上) 大綱
### I. 簡介:處理變長序列輸入的需求
* A. 傳統網路模型的限制:假設輸入大小固定 (如 CNN/FCN)。
* B. 新問題設定:輸入是一排向量 (Sequence),且數量可變。
* C. Self-Attention 的目的:考量整個序列(Context)的資訊。
### II. 序列輸入的定義與實例
* A. 文案處理 (Text)
* 1. 詞彙表示:Word Embedding (具有語義資訊的向量)。
* 2. 句子輸入:一排長度不一的向量。
* 3. 詞彙 One-hot Encoding 的限制:缺乏語義資訊。
* B. 語音訊號處理 (Audio)
* 1. Frame 的定義:透過 Window (如 25ms) 擷取訊號範圍,將其描述為一個向量。
* 2. Window 移動:通常移動 10ms (導致 1 秒訊號有 100 個向量)。
* 3. 語音訊號的複雜性:資訊量非常可觀。
* C. 圖結構 (Graph)
* 1. 社交網路 (Social Network):節點 (Node) 是人,邊 (Edge) 是關係。
* 2. 分子 (Molecule):原子是節點,可透過 One-hot Vector 表示。
* 3. 表示方式:一個 Graph 也是一堆向量。
### III. 序列處理的三種輸出類型
* A. **類型一:Sequence Labeling (輸入數目 = 輸出數目)**
* 1. 任務範例:詞性標註 (POS Tagging),簡化版語音辨識,Graph 節點特性判定。
* 2. 焦點:針對序列中的每個向量都輸出一個對應的 Label/Scalar。
* B. 類型二:Sequence-to-Single-Label (整個序列只輸出一個 Label)
* 1. 任務範例:情感分析 (Sentiment Analysis),說話者辨認 (Speaker Recognition),分子毒性或親水性預測。
* C. 類型三:Sequence-to-Sequence (輸出數目由機器決定,與輸入數目不一定相同)
* 1. 任務範例:翻譯,真正的語音辨識。
* 2. 備註:此類型為 Sequence to Sequence 任務,將於後續課程討論。
### IV. Sequence Labeling 的傳統挑戰與 Self-Attention 的引入
* A. 傳統 FCN 的瑕疵:無法考慮上下文 (Context)。
* 1. 範例:FCN 無法區分同一個詞彙(如 "saw")在不同語境下的詞性(動詞 vs. 名詞)。
* B. 嘗試改良:FCN 結合 Window。
* 1. 做法:將當前向量與前後幾個向量串接起來,一起輸入 FCN。
* 2. 限制:若需考量整個序列(而非僅是小視窗),將導致 Window 過大,FCN 參數過多,易造成 Overfitting。
* C. Self-Attention 的解決方案:吃進一整個 sequence 的資訊,輸出同樣數量的向量,但每個輸出向量皆已**考量整個序列的資訊**。
### V. Self-Attention 機制:從序列中提取上下文
* A. Self-Attention 的運作目的:根據特定的向量 (e.g., $A_1$),找出整個 sequence 裡哪些部分與其相關。
* B. Self-Attention 的整合方式:Self-Attention 處理後的向量 $B$ (已考量全局資訊),再丟入 FCN 進行最終預測。
* C. Self-Attention 的核心步驟:計算關聯度 (Attention Score $\alpha$)
* 1. 輸入:兩個向量 ($A_i$ 與 $A_j$)。
* 2. Dot Product (Transformer 採用):
* 將 $A_1$ 乘以矩陣 $W^Q$ 得到 **Query** ($Q_1$)。
* 將 $A_i$ 乘以矩陣 $W^K$ 得到 **Key** ($K_i$)。
* Query ($Q_1$) 與 Key ($K_i$) 進行 **Dot Product** 內積運算,得到 Attention Score ($\alpha_{1i}$)。
* Query 就像搜尋引擎的關鍵字,Key 就像搜尋到的相關文章。
* 3. 實作細節:$A_1$ 會與序列中所有向量(包含自己 $A_1$)計算關聯性。
* 4. 正規化:將所有 $\alpha$ 值透過 **Softmax** 函數,得到正規化後的 $\alpha'$。
* D. SA 的核心步驟:加權提取資訊
* 1. Value 轉換:將 $A_i$ 向量乘以矩陣 $W^V$ 得到 **Value** ($V_i$)。
* 2. 輸出計算:輸出向量 $B_1$ 是所有 $V_i$ 向量經由 $\alpha'$ **加權總和**而成。
* 3. 結果:關聯性最強的向量 ($A_i$),其 Value ($V_i$) 在最終輸出 $B_1$ 中佔的權重最大。
### VI. 架構與應用
* A. Self-Attention 的疊加性:Self-Attention Layer 與 FCN Layer 可以**交替使用並疊加**多次。
* Self-Attention 負責處理整個 sequence 的資訊,FCN 專注於處理某一特定位置的資訊。
* B. 知名架構:Self-Attention 是 **Transformer** 網路架構的核心機制。
* Transformer 網路由 Google 提出,相關論文為 "Attention Is All You Need"。
* Self-Attention 將此機制發揚光大。
### I. 處理變長序列輸入的新架構:Self-Attention
當前的神經網路(如 CNNs)通常假設輸入的圖像大小是**固定**的。然而,在許多複雜問題中,模型的輸入是一個**序列(Sequence)**,且序列中向量的數量(即長度)是**可變**的。
* **Self-Attention** 是一種用於解決此類變長序列輸入問題的常見神經網路架構。
* Self-Attention 的設計目標是讓模型能夠考量**整個序列的上下文(Context)資訊**。
### II. 序列輸入的範例與表示方式
許多資料類型都可以被表示為一串長度可變的向量:
#### A. 文案處理 (Text)
* 如果輸入是句子,每個句子的長度(詞彙數)不一。
* **詞彙的向量表示:**
* **One-hot Encoding (最簡單但有缺陷):** 開一個長度等於世界上所有詞彙數的向量(如十萬維),每個維度對應一個詞彙。
* **嚴重問題:** One-hot 假設所有詞彙彼此之間**沒有關係**,無法包含任何語義資訊(例如看不出「貓」和「狗」都是動物)。
* **Word Embedding (含語義資訊):** 給每個詞彙一個向量,且這個向量包含語義資訊。
* 若將 Embedding 視覺化,會發現所有動物、植物或動詞等會各自聚集在不同的區域。
* 一個句子就是一排長度一致(指每個詞彙向量的維度)的向量。
#### B. 語音訊號 (Audio)
* 一段聲音訊號可表示為一排向量。
* **Frame 定義:** 會取聲音訊號的一個範圍(**Window**,如 25 毫秒 $25\text{ms}$),將此 Window 內的資訊描述成一個向量,稱為 **Frame**。
* **移動與複雜性:** Window 會向右移動(通常移動 $10\text{ms}$),因此 Window 之間會有重疊。
* 一秒鐘的聲音訊號約有 100 個向量。
* 一分鐘的聲音訊號約有 $100 \times 60 = 6000$ 個向量,語音訊號的資訊量非常可觀。
#### C. 圖結構 (Graph)
* 一個圖 (Graph) 也是一堆向量。
* **社交網路 (Social Network):** 每個節點 (Node) 是一個人,可以用一個向量表示其資料(如性別、年齡、檔案資訊等)。
* **分子 (Molecule):** 可視為一個 Graph,每個原子(球)是一個節點,可以用 One-hot Vector 表示原子類型(如氫 $1000$、碳 $0100$)。
### III. 序列任務的三種輸出類型
當輸入是一排向量時,輸出的類型可能為三種:
#### 1. 類型一:Sequence Labeling (序列標註)
* **定義:** 輸入序列的長度與輸出的 Label/Scalar 數量**一樣多**。
* **應用範例:**
* **詞性標註 (POS Tagging):** 機器判斷句子中每個詞彙的詞性(名詞、動詞、形容詞等)。例如,在句子中,第一個 "saw" 可能是動詞,第二個 "saw" 可能是名詞,模型必須對每個詞彙輸出一個對應的詞性 Label。
* **語音處理:** 決定一段聲音訊號中的每個 Frame 屬於哪一個音標 (Phoneme),這是一個簡化版的語音辨識任務。
* **圖結構:** 決定 Graph 中每一個節點的特性(如是否會購買某產品)。
* **重要性:** 課程當前主要討論如何解決此類輸入與輸出數量一樣多的 Sequence Labeling 問題。
#### 2. 類型二:Sequence-to-Single-Label
* **定義:** 整個 Sequence 只需輸出**一個 Label**。
* **應用範例:**
* **情感分析 (Sentiment Analysis):** 判斷一整句話或貼文是正面的還是負面的。
* **說話者辨認:** 給一段聲音,決定這是誰講的。
* **藥物發現:** 給定一個分子 (Graph),預測其毒性或親水性。
#### 3. 類型三:Sequence-to-Sequence (Seq2Seq)
* **定義:** 輸出的 Label 數量**不固定**,由機器自行決定。
* **應用範例:**
* **翻譯:** 輸入和輸出是不同語言,詞彙數目通常不同。
* **真正的語音辨識:** 輸入一段語音,輸出一段文字。
### IV. 傳統 FCN 處理 Sequence Labeling 的限制與 Self-Attention 的引入
#### 傳統方法的缺陷
* **直接使用 FCN (Fully Connected Network):** 如果將序列中的每個向量**獨立**輸入 FCN 處理:
* **結果:** 對於相同的輸入詞彙(例如 "saw"),FCN 會輸出相同的結果,無法根據上下文區分詞性(如動詞 vs. 名詞)。
* **結論:** 這種做法有極大瑕疵,因為它沒有考慮上下文。
#### 考慮上下文的嘗試
* **使用 Window:** 將當前向量前後的幾個向量(例如前後各 5 個 Frame)串起來,形成一個 Window,一起丟入 FCN。
* 這讓 FCN 可以考量一定的上下文資訊。
* **極限:** 如果任務需要考量**整個** Sequence,則 Window 必須開得極大,長度等於最長的 Sequence。
* **代價:** 如此巨大的 Window 會導致 FCN 需要**非常多的參數**,不僅運算量大,且容易 Overfitting (過度擬合)。
#### Self-Attention 的解決方案
* **Self-Attention** 是一種更好的方法來考量整個輸入序列的資訊。
* **運作方式:** Self-Attention 會吃進**一整個 sequence** 的向量作為輸入,然後輸出同樣數量的向量。
* **輸出特性:** 輸出的每一個向量 (e.g., $B_1$) 都已經**考量了整個 sequence** 的資訊。
* **最終預測:** 將這些具有全局上下文資訊的向量 ($B$) 丟入 FCN,FCN 就能根據整個 Sequence 的資訊來決定最終輸出結果。
### V. Self-Attention 的詳細機制 (Transformer 核心)
Self-Attention 的輸入是一串向量 $A_1, A_2, A_3, \dots$ (可能是網路的輸入,也可能是 Hidden Layer 的輸出)。它必須輸出另一串向量 $B_1, B_2, B_3, \dots$,且每個 $B_i$ 都考慮了所有 $A$。
#### 步驟一:計算關聯性 (Attention Score $\alpha$)
目標是計算當前向量 $A_1$ 與序列中其他所有向量 $A_i$ 之間的關聯程度 ($\alpha$)。
1. **Query, Key, Value 轉換:**
* 輸入向量 $A_i$ 需透過三個不同的矩陣(權重 $W^Q, W^K, W^V$)進行轉換。這三個矩陣是模型需要訓練的參數。
* $A_1 \times W^Q = Q_1$ (**Query**)。
* $A_i \times W^K = K_i$ (**Key**)。
* $A_i \times W^V = V_i$ (**Value**)。
2. **計算 Attention Score ($\alpha$):** 使用 $Q_1$ (Query) 與序列中所有的 $K_i$ (Keys) 進行計算。
* **Dot Product (內積):** 這是最常用的方法,也是 Transformer 採用的方法。
* $Q_1$ 與 $K_i$ 做內積,得到的純量 (Scalar) 即為 Attention Score $\alpha_{1i}$,代表兩向量的關聯程度。
* $Q_1$ 就像搜尋引擎的**關鍵字**,而 $K_i$ 是用來計算 $Q_1$ 應該關注哪些**資訊**。
* $Q_1$ 也會與 $K_1$ (自己) 計算關聯性。
#### 步驟二:正規化與提取資訊
1. **Softmax 正規化:** 將計算得到的所有 $\alpha$ 值透過 **Softmax** 函數。
* Softmax 的輸出 $\alpha'$ 是一排正規化後的數值。
* 雖然不一定必須使用 Softmax (曾有人嘗試用 ReLU),但 Softmax 是最常見且用於 Transformer 的方法。
2. **加權總和:** 根據 $\alpha'$ 提取序列中的重要資訊。
* 將每個 Value 向量 $V_i$ 乘上對應的正規化 Attention Score $\alpha'_{1i}$。
* 輸出向量 $B_1$ 是所有加權後的 $V_i$ 向量的總和:
$$B_1 = \sum_{i} \alpha'_{1i} V_i$$
* **結果:** 關聯性越強($\alpha'$ 越大)的向量 $A_i$,其對應的 $V_i$ 就會在最終輸出的 $B_1$ 中佔有更大的比重,從而實現資訊提取。
### VI. Self-Attention 的架構整合
* Self-Attention 與 Fully Connected Network 可以**交替使用**。
* SA 負責處理**整個 sequence** 的資訊。
* FCN 專注於處理 SA 輸出後,**某一特定位置**(即 $B_i$)的資訊。
* 這個過程可以重複疊加,讓模型可以不斷重新考量整個輸入序列的資訊。
* Self-Attention 是 **Transformer** 網路(由論文 "Attention Is All You Need" 提出)中的最重要核心機制。
### 【機器學習2021】自注意力機制 (Self-attention) (下) 大綱
### I. Self-Attention 基礎運作機制:矩陣運算視角
* A. Q, K, V 向量的產生
1. 轉換操作:將輸入向量 $A_i$ 乘上 $W^Q, W^K, W^V$ 矩陣。
2. 矩陣表示:Input 矩陣 $I$ 乘 $W^Q$ 得到 $Q$ 矩陣。
* B. Attention Score ($A$) 矩陣的計算
1. 內積運算:Query ($Q$) 向量與所有 Key ($K$) 向量計算內積。
2. 矩陣乘法:$K$ 的轉置 ($K^T$) 乘 $Q$ 矩陣得到 Attention 矩陣 $A$。
* C. 正規化與輸出 $O$ 矩陣的計算
1. 正規化:對 $A$ 矩陣的每個欄位 (column) 進行 Softmax。
2. 輸出計算:Value ($V$) 矩陣乘 $A'$ 矩陣得到 $O$ 矩陣 (輸出 $B$ 序列)。
3. 核心參數:$W^Q, W^K, W^V$ 是 Self-Attention Layer 中唯一需要學習的參數。
### II. Self-Attention 的變形與改進
* A. Multi-Head Self-Attention
1. 目的:捕捉不同形式的相關性。
2. 流程:產生多個 Query, Key, Value (如 $Q_1, Q_2, K_1, K_2, V_1, V_2$)。
3. 輸出整合:將各 Head 的輸出 $B^1, B^2$ 串接後再乘上一個矩陣 (FCN) 得到最終 $B$ 向量。
4. Head 數量:是需要調整的超參數 (Hyperparameter)。
* B. Positional Encoding (位置編碼)
1. 原始 Self-Attention 的限制:無法感知序列中元素的位置資訊。
2. 解決方法:為每個位置 $i$ 設立專屬的 Positional Vector ($e^i$),並將其加到輸入 $A_i$ 上。
3. $e^i$ 來源:可由 Sin/Cos 函數人為設計 (handcrafted),或作為參數透過資料學習出來。
### III. Self-Attention 的應用與與其他架構的比較
* A. 與 CNN (卷積神經網路) 的關係
1. Receptive Field:Self-Attention 是更靈活的架構,能讓機器自動學習出相關的 Pixel (類似自動決定 Receptive Field);CNN 的Receptive Field是**人工劃定**的。
2. 靈活性:**Self-Attention** 比 **CNN (有受限制的 Self-Attention)**更有彈性 。
3. 資料需求:資料量少時 CNN 表現較好 (較不易 Overfitting);資料量多時 Self-Attention 表現可超越 CNN。
* B. 與 RNN (循環神經網路) 的比較
1. 資訊傳遞:Self-Attention 可直接從極遠的位置搜索資訊;RNN 必須將資訊一路存在 Memory 中傳遞,難以處理長距離依賴。
2. 平行化:**Self-Attention 可同時平行處理所有輸出**,運算速度比 RNN 更有效率。
3. 趨勢:許多應用已將 RNN 架構逐步改為 Self-Attention 架構。
* C. 其他應用與限制
1. 語音處理:需使用 **Truncated Self-Attention** (只看一個小範圍) 來處理極長序列,以解決運算量和記憶體需求。
2. Graph 處理:Self-Attention 應用於 Graph 結構時,可限定只計算有 Edge 相連節點間的 Attention Score (即 GNN 的一種)。
3. 運算量問題:Self-Attention 的運算複雜度與序列長度的平方相關,如何減少其運算量 (如 $x$-formers) 仍是活躍的研究問題。
### I. Self-Attention 基礎運作機制:矩陣運算視角
#### A. Self-Attention 的目標與特性
* Self-Attention 的輸入是一排向量序列 ($A_1$ 到 $A_4$),目標是得到另一排輸出向量序列 ($B_1$ 到 $B_4$)。
* SA 的輸出向量 $B_1$ 到 $B_4$ **不需要依序產生**,它們是**一次同時被計算出來的**。
#### B. Q, K, V 向量的產生 (Query, Key, Value)
* **個別轉換:** 每個輸入向量 $A_i$ 必須分別乘上三個不同的矩陣(權重 $W^Q, W^K, W^V$)來產生 Query ($Q_i$)、Key ($K_i$) 和 Value ($V_i$) 向量。
* **矩陣操作表示:**
* 我們可以將 $A_1$ 到 $A_4$ 拼湊成一個大的輸入矩陣 **$I$**。
* $I$ 矩陣乘上 $W^Q$ 矩陣,會得到 $Q$ 矩陣 (由 $Q_1$ 到 $Q_4$ 拼成)。
* 類似地, $I$ 乘上 $W^K$ 矩陣得到 $K$ 矩陣;$I$ 乘上 $W^V$ 矩陣得到 $V$ 矩陣。
* **重要參數:** 只有 $W^Q, W^K, W^V$ 是 Self-Attention Layer 中**未知的參數**,需要透過訓練資料找出來。其他操作(如 Softmax、加權總和)都是人為設定的。
#### C. Attention Score ($A$) 矩陣的計算
* **計算關聯性:** 每個 Query 向量 $Q_i$ 都會與所有 Key 向量 $K_j$ 計算內積 (Inner Product) 來得到 Attention Score $\alpha_{ij}$。
* 例如,$\alpha_{11}$ 是 $Q_1$ 跟 $K_1$ 的內積;$\alpha_{14}$ 是 $Q_1$ 跟 $K_4$ 的內積。
* **矩陣乘法表示:** 這一系列的內積運算可以表示為兩個矩陣的相乘:
* 將 $K$ 矩陣進行**轉置 ($K^T$)**,乘上 $Q$ 矩陣,就會得到 Attention Score 矩陣 **$A$**。
* **正規化:**
* $A$ 矩陣中的值會通過一個 **Softmax** 函數進行正規化。
* Softmax 是最常見的選項,但也可以選擇其他操作如 ReLU。
* 正規化後的矩陣我們用 $A'$ 來表示。
#### D. 輸出 $O$ 矩陣的計算 (得到 $B$ 向量)
* **加權總和:** 每個輸出的 $B_i$ 向量是所有 $V_j$ 向量,根據對應的 $\alpha'_{ij}$ 分數進行**加權總和**而成的。
* 例如, $B_2 = \sum_{i} \alpha'_{2i} V_i$。
* **矩陣乘法表示:**
* 將 $V$ 矩陣乘上 $A'$ 矩陣,就會得到最終的輸出矩陣 **$O$**。
* $O$ 矩陣的欄位 (columns) 即為 Self-Attention Layer 的輸出,也就是 $B_1$ 到 $B_4$。
* 整個 Self-Attention 流程,從輸入 $I$ 到輸出 $O$,實質上就是一系列的矩陣乘法。
### II. Self-Attention 的變形與改進
#### A. Multi-Head Self-Attention
* **動機:** 相關性 (Attention) 具有多種形式,因此我們不應只用一個 Query 去找相關性,而應該使用多個 Q 來捕捉不同類型的相關性。
* **操作:** 為了實現多頭 (Multi-Head),我們會將 Q, K, V 分別乘上多組矩陣,得到多個 Head。例如,如果有兩個 Head,輸入 $A_i$ 會產生 $Q_i^1, Q_i^2, K_i^1, K_i^2, V_i^1, V_i^2$。
* **獨立計算:** 每個 Head 獨立進行 Self-Attention 運算。例如 $Q^1$ 只對 $K^1$ 做 Attention,並只對 $V^1$ 做加權總和,得到 $B^1$;$Q^2$ 對 $K^2$ 做 Attention,對 $V^2$ 做加權總和,得到 $B^2$。
* **輸出整合:** 最後,將所有 Head 的輸出向量 ($B^1$ 和 $B^2$) **串接 (Concatenate)** 起來,再乘上一個矩陣 (全連接層),得到最終的輸出向量 $B$。
* **超參數:** Head 的數量 (例如 8 個或 16 個) 是一個超參數,需要根據任務特性調整。
#### B. Positional Encoding (位置編碼)
* **問題:** 原始的 Self-Attention 設計缺乏位置資訊。對 SA 來說,序列中的所有位置都是「天涯若比鄰」,彼此距離都一樣遠,它不知道誰在最前面或最後面。
* 然而,位置資訊有時很重要,例如在詞性標註 (POS Tagging) 中,動詞較不容易出現在句首。
* **解決方案:** 將位置資訊塞進去。
* **方法:** 為序列中的每一個位置 $i$ 設定一個專屬的 **Positional Vector** ($e^i$)。
* 將 $e^i$ **加到**輸入向量 $A_i$ 上。
* **Positional Vector 的來源:**
* **Handcrafted (人為設計):** 早期 Transformer 論文中是透過一個神奇的 Sin/Cos 函數產生的。
* **Learned (學習而得):** 位置編碼也可以作為神經網路參數的一部分,直接從資料中學習出來。
* **現狀:** Positional Encoding 仍然是一個上代研究的熱門問題,有多種不同的生成方法,目前還不清楚哪種方法最好。
### III. Self-Attention 的應用與與其他架構的比較
#### A. Self-Attention 與 CNN (卷積神經網路) 的比較
* **Self-Attention 的適用性:** 圖像 (Image) 可以被視為一個向量集合 (Vector Set),其中每個像素 (Pixel) 是一個三維向量,因此 Self-Attention 也可以應用於圖像處理。
* **設計理念的差異:**
* **CNN:** 人工劃定 Receptive Field 。每個 Neuron 只考慮 Receptive Field 範圍內的資訊。
* **Self-Attention:** 利用 Attention 機制,Query 去找相關的 Pixel。Self-Attention 的 **Receptive Field 是由機器自己學出來的**,不必像 CNN 那樣由人工決定感受野的形狀。
* **功能與彈性:**
* 數學上,**CNN 是 Self-Attention 的特例**。透過適當的限制和設計,Self-Attention 可以做到與 CNN 完全相同的事情。
* Self-Attention 的 **彈性 (Flexible) 更高**,它是比 CNN 更具能力的模型。
* **資料量對結果的影響:**
* **小資料量:** CNN (彈性較小,限制較多) 較不易 Overfitting,表現比 Self-Attention 更好。
* **大資料量:** Self-Attention (彈性大) 可以從更大量的訓練資料中獲益,最終結果可超過 CNN。
* **實務應用:** 兩者可以通用或混合使用,例如 Conformer 結構同時使用了 Self-Attention 和 CNN。
#### B. Self-Attention 與 RNN (循環神經網路) 的比較
* **RNN 運作方式:** RNN 透過一個 Block 吃入當前輸入和前一個時間點的輸出 (Memory Vector),依序產生新的輸出。
* **長距離依賴處理:**
* **RNN:** 資訊必須一路存儲在 Memory 中,從最左邊傳遞到最右邊,若要處理遠距離的輸入會很困難。
* **Self-AttentionA:** 只要 Q 跟 K 匹配得起來,**天涯若比鄰**,可以輕鬆地從序列中非常遠的向量處搜索資訊。
* **平行化處理 (Parallelization):**
* **RNN:** 輸出向量是**依序產生**的,無法平行化處理。
* **Self-Attention:** 所有輸出向量是**同時平行產生**的。
* **效率:** 在運算速度上,Self-Attention 比 RNN 更有效率,因此許多應用正逐步將 RNN 架構改為 Self-Attention 架構。
#### C. 其他應用與限制
* **語音處理的挑戰:** 語音序列通常非常長(一秒約 100 個向量,一句話可能上千),長度 $L$ 很大。
* **問題:** Self-Attention 的 Attention Score 矩陣的計算複雜度是 $L^2$,且需要大量的記憶體來儲存這個 $L \times L$ 的矩陣。
* **解決方案:** **Truncated Self-Attention**。在計算 Attention Score 時不看一整句話,而只看一個小的範圍,藉此加快運算速度並減少記憶體需求。
* **Graph 上的應用:** Graph 也可以視為一堆向量 (Node),故 SA 適用於 Graph。
* **限制:** 當 SA 用於 Graph 時,可以利用 Graph 本身已有的 **Edge (邊)** 資訊。
* **做法:** 僅計算有 Edge 相連的 Node 之間的 Attention Score;對於沒有相連的 Node 之間的 Attention Score,可以直接將其設為零。這種限制下的 SA 應用,就是 Graph Neural Network (GNN) 的一種形式。
* **未來研究:** 由於 Self-Attention 運算量大,如何減少 Attention 的運算量是未來研究的重點,這導致了各式各樣的 Attention 變形,例如 $x$-formers (如 Linformer, Performer, Reformer)。這些 $x$-formers 雖然速度更快,但通常性能 (Performance) 會比原始 Transformer 差一點。
[【機器學習2021】01~02 機器學習和深度學習基本概念簡介](https://hackmd.io/@JuitingChen/SyoNXkdslx)
[【機器學習2021】03~08 機器學習任務攻略和最佳化技巧](https://hackmd.io/@JuitingChen/BJ6mXy_slg)
[【機器學習2021】09~11 CNN 和 Self attention](https://hackmd.io/@JuitingChen/r1ahLgUngl)
[【機器學習2021】12~13 Transformer](https://hackmd.io/@JuitingChen/H1tfXy_ige)
[【機器學習2021】14~17 GAN](https://hackmd.io/@JuitingChen/S1adiwvhxg)
[【機器學習2021】18~21 自監督式學習](https://hackmd.io/@JuitingChen/ryQG7J_sgl)
[【機器學習2021】22~23 Auto-encoder](https://hackmd.io/@JuitingChen/r1sLPr92ge)
[【機器學習2021】24~25 Adversarial Attack ](https://hackmd.io/@JuitingChen/HJ6jJIq3ge)
[【機器學習2021】26~28 Explainable ML 和 Domain Adaptation](https://hackmd.io/@JuitingChen/SJZzQkdslg)
[【機器學習2021】29-30 強化學習-1](https://hackmd.io/@JuitingChen/HJYziZR3gx)
[【機器學習2021】31~33 強化學習-2](https://hackmd.io/@JuitingChen/Sy5DoWA3xl)
[【機器學習2021】34~35 機器終身學習](https://hackmd.io/@JuitingChen/BytWmyuilg)
[【機器學習2021】36~37 神經網路壓縮 ](https://hackmd.io/@JuitingChen/Bk7-m1_jlx)
[【機器學習2021】37~40 Meta Learning](https://hackmd.io/@JuitingChen/SkkC6rT2gl)