---
# System prepended metadata

title: 【機器學習2021】09~11 CNN 和 Self attention
tags: [機器學習]

---

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)
