# NLP 基礎筆記 (NLP Introduction 統整) 這份筆記涵蓋了自然語言處理(NLP)的基礎,從基本名詞解釋到將文字轉換為機器可讀的向量表示,以及一系列重要的文本預處理技術。 --- ### 第一部分:基本名詞與概念 #### 1. 句子 (Sentence) & Token - **Sentence**:一串由單詞 (word) 組成的序列,通常以大寫字母開頭,以標點符號(如句號、問號)結尾。 - 範例:`I love dogs.` - **Tokens**:構成句子的基本單元。一個句子可以被看作是 Token 的序列。==Token 可以是單詞、標點符號,甚至是單詞的子單元==。 - 範例:句子 `I love dogs.` 可以被拆分為三個 Tokens:`["I", "love", "dogs", "."]`。 #### 2. 字元 (Character) & 詞彙 (Vocabulary) & 語料庫 (Corpus) - **Letters and Characters**: - **字母 (Letter)**:英文字母共 26 個 (A-Z)。 - **字元 (Character)**:一個更廣泛的概念,除了字母外,還包含數字、標點符號、空白符(如換行符 `\n`)等。 - **Vocabulary**:一個模型或系統所知道的==所有「單詞」的集合==。在實際應用中,通常只會選取一個合理的子集,其大小取決於應用需求。 - **Corpus**:指特定主題或類型的==文章集合==,其意義等同於機器學習中的**資料集 (Dataset)**。 --- ### 第二部分:將文字化為特徵 #### 1. N-Gram N-Gram 指的是文本中連續的 N 個項目(可以是字元、子詞或單詞)。 - **Unigram (1-gram)**:單個項目。 - **Bigram (2-gram)**:連續兩個項目。 - **Trigram (3-gram)**:連續三個項目。 **為什麼需要 N-Gram?** 1. **捕捉局部上下文**:單詞的意義常受其前後文影響。N-Gram 可以捕捉到這種局部依賴關係。 2. **特徵提取**:在文本分類等任務中,N-Gram 能捕捉到一些關鍵詞組,提升模型效果。 - **範例**:對於 `not good` 或 `very happy`,如果只看單詞 (Unigram),可能會失去「否定」或「強調」的語氣。但如果使用 Bigram,==「not good」這個關鍵特徵就能被完整保留==。 #### 2. Bag of Words (詞袋模型) 這是一種基於==單詞出現頻率==來表示文字的方法。 - **特性**:它只考慮每個單詞出現的次數,完全==不考慮單詞的排列順序或文法結構==。 - **比喻**:就像把一篇文章中所有的詞都丟進一個袋子裡,然後計算袋中每種詞的數量。 - **缺點**:忽略了詞序,可能會導致語意的喪失(例如,「我愛你」和「你愛我」在詞袋模型中是完全一樣的)。 --- ### 第三部分:文字向量化實作 #### 1. 為甚麼需要將文字轉換為向量? 機器學習模型無法直接處理文字,它們只能理解數字。因此,我們需要將文字轉換為向量。 - **傳統方法 vs. 向量方法**: - **傳統方法 (關鍵字過濾)**:例如,只要郵件出現 "credit", "insurance", "make money" 就歸類為垃圾郵件。 - **問題**:這種方法非常僵化。如果銀行發送一封關於信用卡 (credit card) 的正常郵件,也可能被誤判。 - **向量方法**:將文字映射到一個高維空間中。在這個空間裡,==語意相似的文字或文件,它們的向量在空間中的位置會比較接近==。 - **應用場景**: 1. **郵件/文件分類**:將郵件或文件轉換為向量後,相似類別的向量會自然地聚集(Cluster)在一起。模型只需學習如何劃分這些聚類,即可完成分類任務。 2. **自動化文件整理**:面對大量文件,可以將它們全部轉換為向量,然後進行聚類分析,實現自動化歸檔。 #### 2. Count Vectorizer (計數向量器) 這是實現 Bag of Words 模型最常用的方法之一,核心概念是==利用計數方式將文字轉換為向量==。 - **實現方法**: 1. **建立詞彙表 (Vocabulary)**:掃描所有訓練文件,建立一個包含所有不重複單詞的詞彙表。詞彙表的大小為 $V$。 2. **轉換文件為向量**:將每一份文件轉換成一個長度為 $V$ 的向量。向量中的第 $i$ 個元素,代表詞彙表中第 $i$ 個詞在該文件中出現的次數。 - **範例**: - 假設詞彙表 `V = ["apple", "ball", "cat", "dog", "eat", "food"]`,大小為 6。 - 文件1: `dog eat food` -> 轉換為向量 `[0, 0, 0, 1, 1, 1]` - 文件2: `cat eat apple` -> 轉換為向量 `[1, 0, 1, 0, 1, 0]` - **程式實作 (Scikit-Learn)**: ```python from sklearn.feature_extraction.text import CountVectorizer vectorizer = CountVectorizer() # 學習詞彙表並轉換訓練資料 X_train = vectorizer.fit_transform(list_of_documents_train) # 只轉換測試資料(使用已學習的詞彙表) X_test = vectorizer.transform(list_of_documents_test) ``` - **Scipy 稀疏矩陣**: - 由於詞彙表通常很大,而單一文件中包含的詞彙相對較少,因此轉換出的向量會==含有大量的 0==,這被稱為**稀疏矩陣 (Sparse Matrix)**。 - Scikit-Learn 使用 Scipy 的稀疏矩陣格式來儲存,這比使用 Numpy 的密集數組==更節省記憶體空間==。 #### 3. 正規化 (Normalization) - **問題**:使用 `CountVectorizer` 時,長文件的單詞計數通常會遠高於短文件,導致向量的數值差異過大,影響模型判斷。 - **解決方法**:進行正規化,使不同長度的文件向量具有可比性。常見的方法有 **L2-Norm** 或 **除以總和**。 --- ### 第四部分:文本預處理管道 (Text Preprocessing Pipeline) 在進行向量化之前,通常需要對原始文本進行一系列的清理和標準化。 #### 1. Tokenization (斷詞/分詞) - **定義**:將原始的字串文本,拆分成一個個 Token 的過程。 - **方法比較**: - `s.split()`:基本方法,但無法妥善處理標點符號。 - `NLTK / SpaCy`:專業的 NLP 函式庫,提供更精確的 Tokenization 功能。 - **Tokenization 的層級**: - **Word-Based (基於單詞)**:優點是單詞語意豐富,缺點是詞彙量可能非常龐大。 - **Character-Based (基於字元)**:優點是詞彙量極小(26個字母+符號),缺點是單一字元資訊量少。 - **Subword-Based (基於子詞)**:介於兩者之間,例如將 `walking` 拆分為 `walk` + `ing`。這能讓模型理解 `walk` 和 `walking` 的語意相似性。 #### 2. Punctuation (標點), Casing (大小寫) & Accents (重音) - **Punctuation**:標點符號在某些任務(如情感分析)中可能很重要(例如 `.` vs `?`)。Scikit-Learn 的 `CountVectorizer` 預設會忽略標點。 - **Casing**:通常會將所有文字==統一轉換為小寫==,避免模型將 `Cat` 和 `cat` 視為兩個不同的詞。 - **Accents**:對於某些語言,可能需要移除重音符號。 #### 3. Stopwords (停用詞) - **定義**:在文本中出現頻率非常高,但通常對語意貢獻不大的詞(如 "and", "the", "is", "a")。 - **移除原因**: 1. **降低維度**:移除停用詞可以縮小詞彙表大小,使向量維度降低,提升計算效率。 2. **避免干擾相似度計算**:如果不移除,兩篇主題完全不同但使用相似停用詞的文章,可能會被模型誤認為很相似。 - **實作**:`CountVectorizer` 中可以設定 `stop_words="english"` 來自動移除英文停用詞,也可以提供自定義列表。 #### 4. Stemming (詞幹化) & Lemmatization (詞形還原) - **問題**:`walk`, `walking`, `walks`, `walked` 等詞在語意上非常接近,但在計數時被視為不同的詞,這會增加向量維度並稀釋語意。 - **解決方法**: - **Stemming (詞幹化)**: - **方法**:使用簡單的啟發式規則,粗暴地裁剪單詞的結尾。 - **特點**:速度快,但結果==不保證是一個真實存在的單詞==(例如 `replacement` -> `replac`)。 - **常用工具**:Porter Stemmer, Snowball Stemmer。 - **Lemmatization (詞形還原)**: - **方法**:依據詞性 (Part-of-Speech) 和語言學規則,將單詞轉換為其**字典原形 (lemma)**。 - **特點**:處理更精細,結果是==一個真實的單詞==。 - **範例**:`mice` -> `mouse`;`was` / `is` -> `be`;`better` -> `good`。 --- ### 第五部分:傳統方法在當今 NLP 的重要性 - **常見誤解 (Misconception)**:認為現在的 NLP 只要把所有原始資料丟進深度學習模型即可。 - **現實情況 (Reality)**: - 上述的文本預處理步驟(如 Stopwords, Stemming, Lemmatization)在許多 NLP 任務中依然至關重要。 - 它們有助於==減少單詞變體、改善文本標準化、提升計算效率==,並且讓傳統模型的結果更具可解釋性。 - 在搜尋引擎、廣告系統、社群媒體標籤等大規模應用中,這些基礎且高效的方法仍然扮演著核心角色。 --- # 向量基礎模型 (Vector-Based Models) 這份筆記延續 L1 的基礎,深入探討如何利用向量模型來表示與比較文本,涵蓋了從傳統的 TF-IDF 到現代神經詞嵌入的各項核心技術。 --- ### 第一部分:向量相似度 (Vector Similarity) 將文字轉換為向量後,我們就可以在數學上衡量它們的相似程度。 #### 1. 用途與應用 - **核心用途**:給定一個詞彙或文件向量,找到在向量空間中最「相似」的其他詞彙或文件。例如,找出 `king` 與 `queen`,或 `car` 與 `automobile` 之間的相似關係。 - **應用場景 - 文章旋轉 (Article Spinning)**:利用向量相似度,自動替換文章中的部分詞彙來生成新內容。這主要用於行銷領域,但需要注意內容抄襲與品質問題。 #### 2. 相似度衡量方法 ##### 歐式距離 (Euclidean Distance) - **概念**:計算兩個向量在高維空間中的==直線距離==。距離越短,代表越相似。 - **公式**: $$d(\mathbf{v}, \mathbf{w}) = \sqrt{\sum_{i=1}^{N}(v_i - w_i)^2}$$ ##### 餘弦相似度 (Cosine Similarity) - **概念**:計算兩個向量在空間中==夾角的餘弦值==。它不受向量長度(例如文件長度)的影響,只關注向量的**方向**。這在文本分析中極為常用。 - **公式**: $$\text{Cosine Similarity}(\mathbf{v}, \mathbf{w}) = \frac{\mathbf{v} \cdot \mathbf{w}}{||\mathbf{v}|| \cdot ||\mathbf{w}||} = \frac{\sum_{i=1}^{N} v_i w_i}{\sqrt{\sum_{i=1}^{N} v_i^2} \sqrt{\sum_{i=1}^{N} w_i^2}}$$ - **數值範圍**:$[-1, 1]$ - **1**:方向完全相同 (高度相似)。 - **0**:方向互相垂直 (完全無關)。 - **-1**:方向完全相反 (完全對立)。 ##### 餘弦距離 (Cosine Distance) - **概念**:由餘弦相似度轉換而來的「距離」度量。相似度越高,距離應越小。 - **公式**: $$\text{Cosine Distance} = 1 - \text{Cosine Similarity}$$ - **數值範圍**:$[0, 2]$ #### 該選擇 Euclidean Distance 還是 Cosine Distance? 這沒有絕對的好壞,取決於你的應用場景。 - `Cosine Distance` 更關注**內容比例**的相似性(例如,文件中 `機器學習` 和 `深度學習` 的詞頻比例是否相似)。 - `Euclidean Distance` 更關注**絕對數值**的差異(例如,兩份文件中各個詞的詞頻絕對數量是否接近)。 --- ### 第二部分:TF-IDF — 衡量單詞的重要性 `CountVectorizer` 只考慮詞頻,但某些詞(如停用詞)雖然頻繁出現,卻不具備區分性。TF-IDF (Term Frequency-Inverse Document Frequency) 旨在解決這個問題。 - **核心思想**:一個詞的重要性與它在**單一文件中出現的頻率**成正比,但與它在**所有文件中出現的頻率**成反比。 #### TF-IDF 公式 $$\text{TF-IDF}(t, d, D) = \text{TF}(t, d) \times \text{IDF}(t, D)$$ 1. **TF (Term Frequency) - 詞頻**:詞 $t$ 在文件 $d$ 中出現的頻率。 $$ \text{TF}(t, d) = \text{詞 t 在文件 d 的出現次數} $$ 2. **IDF (Inverse Document Frequency) - 逆向文件頻率**:衡量一個詞的普遍程度。 $$ \text{IDF}(t, D) = \log\left(\frac{N}{N(t)}\right) $$ - $N$:文件總數。 - $N(t)$:包含詞 $t$ 的文件數量。 - **為何要取 log?** - **平滑權重**:如果一個詞極其罕見(例如只出現在 1 份文件中),$N/N(t)$ 的值會非常大。取對數可以==避免這個詞的權重過度膨脹==,使數值更穩定。 - **符合資訊理論**:越稀有的事件(詞),攜帶的資訊量越多。log 函數的曲線符合這種直覺。 #### 程式實作 (Scikit-Learn) ```python from sklearn.feature_extraction.text import TfidfVectorizer tfidf = TfidfVectorizer(stop_words="english", tokenizer=my_tokenizer) # 學習詞彙表與 IDF 權重,並轉換訓練資料 X_train = tfidf.fit_transform(train_texts) # 使用已學習的資訊轉換測試資料 X_test = tfidf.transform(test_texts) ``` --- # L3-機率模型 (Probabilistic Models) 這份筆記專注於自然語言處理中的機率模型,特別是 N-Gram 模型和馬可夫模型,並探討它們如何被用於文本分類與生成。 --- ### 第一部分:N-Gram 模型 — 預測下一個詞 #### 1. 什麼是 N-Gram 模型 N-Gram 模型是一種基於==前 N-1 個單詞來預測下一個單詞==的機率語言模型。 - **應用領域**: - **自動補全**:在搜尋框或輸入法中建議下一個單詞。 - **語音識別**:根據上下文預測可能被遺漏的單字。 - **機器翻譯**:提升詞語預測的準確率。 - **拼寫檢查**與**文本生成**。 - **N 值的意義**:N 值越大,模型考慮的上下文越多,但計算複雜度也越高。 - **Unigram (N=1)**:`I` | `love` | `NLP` - **Bigram (N=2)**:`I love` | `love NLP` - **Trigram (N=3)**:`I love NLP` #### 2. N-Gram 模型如何預測單詞 模型使用==條件機率==,並依據訓練語料庫的詞頻來計算機率。 - **Bigram 模型**:$P(w_3|w_2)$ - **Trigram 模型**:$P(w_4|w_3, w_2)$ **範例**:假設語料庫中 "I love" 後面接的詞如下: - "I love NLP" (出現 40 次) - "I love AI" (出現 30 次) - "I love machine learning" (出現 30 次) 則模型預測 $P(\text{NLP} | \text{I love}) = 0.4$。 #### 3. 優勢與限制 - **優勢**: - 簡單高效,容易計算。 - 在小型數據集上表現尚可。 - **限制**: - **上下文有限**:只能看到前 N-1 個詞,無法捕捉長期依賴。 - **資料稀疏問題**:如果一個詞組在訓練集中從未出現,其機率會被計算為零。 - **計算成本高**:N 值增大時,需要儲存的組合數量會呈指數級增長。 --- ### 第二部分:馬可夫模型 (Markov Models) — 序列的機率 馬可夫模型是描述狀態序列的數學工具,在眾多領域都有廣泛應用,包括強化學習 (MDP)、語音識別 (HMM) 和數值近似 (MCMC)。 #### 1. 核心概念:馬可夫性質 (Markov Property) - **定義**:一個狀態轉移的機率,==僅依賴於其當前狀態,而與過去的狀態無關==。 $$ P(s_{t+1} | s_t, s_{t-1}, ..., s_0) = P(s_{t+1} | s_t) $$ - **這是一個嚴格的假設**:在現實世界的語言中,這條性質通常不成立(下一個詞的出現機率往往與前面多個詞有關)。 - **為什麼這個假設如此重要?** - **簡化高維度問題**:如果沒有馬可夫假設,要預測第 10 個詞,我們需要考慮前 9 個詞的所有組合。假設詞彙表有 2000 個詞,我們需要估計的機率數量將是 $2000^{10}$,這在計算上是不可行的,也會面臨嚴重的==資料稀疏問題==。 - **可行性**:通過假設 $P(w_{10} | w_9, ..., w_1) \approx P(w_{10} | w_9)$,我們將需要估計的機率數量大幅降低到 $2000^2$,這使得模型在有限的數據下變得可以訓練。 #### 2. 馬可夫模型的數學定義 - **狀態 (States)**:一組離散的類別符號,例如天氣 `{sunny, rainy, cloudy}`。 - **符號**:$s_t$ 代表在時間點 $t$ 的狀態。 - **狀態轉移矩陣 (State Transition Matrix)**:一個 $M \times M$ 的矩陣 $A$,其中 $M$ 是狀態總數。 - $A_{ij} = P(s_{t+1} = j | s_t = i)$ - 它描述了從狀態 $i$ 轉移到狀態 $j$ 的機率。 - 矩陣的每一行總和為 1。 - **時間齊性 (Time Homogeneity)**:一個常見的假設,即==狀態轉移矩陣 $A$ 不隨時間 $t$ 改變==。 - **初始狀態分佈 ($\pi$)**:一個長度為 $M$ 的向量,描述了序列在時間 $t=0$ 時,處於各個狀態的機率。 - $\pi_i = P(s_0 = i)$ - **序列的機率**:給定一個狀態序列 $S = (s_0, s_1, ..., s_T)$,其出現的聯合機率可以通過馬可夫性質簡化為: $$ P(S) = P(s_0) \cdot P(s_1|s_0) \cdot P(s_2|s_1) \cdots P(s_T|s_{T-1}) $$ 寫成矩陣形式即: $$ P(S) = \pi_{s_0} \cdot A_{s_0, s_1} \cdot A_{s_1, s_2} \cdots A_{s_{T-1}, s_T} $$ #### 3. 訓練馬可夫模型 訓練過程就是根據觀測到的數據,來估計初始狀態分佈 $\hat{\pi}$ 和狀態轉移矩陣 $\hat{A}$。 - **估計方法**:最大似然估計,即直接用頻率來估計機率。 - **初始機率估計**: $$ \hat{\pi}_i = \frac{\text{以狀態 i 開頭的序列數量}}{\text{總序列數量}} $$ - **轉移機率估計**: $$ \hat{A}_{ij} = \frac{\text{從狀態 i 轉移到狀態 j 的次數}}{\text{從狀態 i 轉移出的總次數}} $$ #### 4. 解決實際計算問題 1. **問題:零機率** - 如果某個轉移 $(i, j)$ 在訓練集中從未出現,$\hat{A}_{ij}$ 會是 0。這會導致任何包含此轉移的序列機率都變為 0,這是不合理的。 - **解決方案:平滑化 (Smoothing)** - **加一平滑 (Add-One Smoothing)**:在計算機率時,為每個計數都加 1。 $$ \hat{A}_{ij} = \frac{\text{Count}(i \to j) + 1}{\text{Count}(i) + M} $$ - **加 $\epsilon$ 平滑 (Add-Epsilon Smoothing)**:將 1 換成一個更小的超參數 $\epsilon$。 2. **問題:數值下溢 (Underflow)** - 計算長序列的機率時,需要將大量小於 1 的機率連乘,結果會非常接近 0,超出計算機的浮點數精度,導致結果被四捨五入為 0。 - **解決方案:對數機率 (Log Probabilities)** - 我們通常只需要比較序列的相對可能性,而不是它們的確切機率。 - 利用對數的性質 $\log(a \cdot b) = \log(a) + \log(b)$,==將連乘操作轉換為連加操作==。 $$ \log P(S) = \log(\pi_{s_0}) + \sum_{t=0}^{T-1} \log(A_{s_{t}, s_{t+1}}) $$ - 這樣可以避免數值下溢,且計算更穩定。 --- ### 第三部分:馬可夫模型的應用 #### 應用一:建立文本分類器 (Text Classifier) - **任務**:判斷一首詩的作者是 Robert Frost 還是 Edgar Allan Poe。 - **方法**:這是一個監督學習問題,但我們可以利用非監督的馬可夫模型,結合**貝氏定理**來建立一個**貝氏分類器**。 1. **訓練過程**: - 為 Robert Frost 的所有詩作,訓練一個馬可夫模型 $M_{Frost}$。 - 為 Edgar Allan Poe 的所有詩作,訓練一個馬可夫模型 $M_{Poe}$。 2. **分類決策**: - 給定一首新詩 `poem`,我們想知道哪個作者寫它的機率更大,即比較 $P(\text{author}|\text{poem})$。 - 根據貝氏定理: $$ P(\text{author} | \text{poem}) = \frac{P(\text{poem} | \text{author}) \cdot P(\text{author})}{P(\text{poem})} $$ - 我們的決策規則是選擇後驗機率最大的那個作者。由於分母 $P(\text{poem})$ 對所有作者都是一樣的,可以忽略。決策簡化為: $$ \arg\max_{\text{author}} \left( P(\text{poem} | \text{author}) \cdot P(\text{author}) \right) $$ 取對數後變為: $$ \arg\max_{\text{author}} \left( \log P(\text{poem} | \text{author}) + \log P(\text{author}) \right) $$ - $P(\text{poem} | \text{author})$:**概似性 (Likelihood)**,可以由我們訓練好的馬可夫模型計算得出。 - $P(\text{author})$:**事前機率 (Prior)**,可以假設為均勻分佈(各 0.5),或根據訓練集中詩的數量比例來設定。 #### 應用二:生成文本 (Text Generation) - **方法**:訓練好馬可夫模型後,我們可以從初始狀態分佈 $\pi$ 中採樣第一個詞,然後根據轉移矩陣 $A$,一步步地採樣下一個詞,直到生成結束符號或達到指定長度。 - **擴展到高階馬可夫模型**: - 一階馬可夫:$P(s_t | s_{t-1})$ - 二階馬可夫:$P(s_t | s_{t-1}, s_{t-2})$ - **高階模型的實現**: - 使用高維陣列(如三維陣列)來儲存轉移機率會非常稀疏(充滿 0)。 - 更好的方法是使用==嵌套的字典 (nested dictionaries)==來儲存,只記錄那些機率不為零的轉移。 - **從機率字典中採樣**: 1. 將字典中的機率轉換為一個累積機率分佈。 2. 生成一個 0 到 1 之間的隨機數。 3. 查看該隨機數落在哪個詞的累積機率區間內,就選擇那個詞。 --- ### 第四部分:總結 — 馬可夫模型的優缺點 - **優勢**: - ==簡單高效==,容易理解和實現。 - ==可解釋性強==,轉移機率清晰可見。 - 適合處理結構化的序列數據(如詞性標註、DNA序列)。 - **限制**: - ==馬可夫假設過於簡化==,無法捕捉長期記憶和上下文依賴。 - 無法很好地處理多義詞問題。 - 在複雜的語言任務上,性能遠不如現代的神經網路模型(如 Transformer)。 --- # L4-NLP應用:文章改寫與密碼解譯 這份筆記將探討兩種基於機率模型的 NLP 實際應用:文章改寫 (Article Spinning) 和替換式密碼解譯 (Cipher Decryption),並深入介紹解決後者所需的遺傳演算法。 --- ### 前言:常見的 NLP 應用 自然語言處理技術被廣泛應用於以下領域: - **情感分析 (Sentiment Analysis)**:判斷文本(如評論、推文)的情感是正面、負面還是中立。 - **聊天機器人 (Chatbot Development)**:設計特定領域的對話機器人。 - **文本摘要 (Text Summarization)**:從長篇文章中自動提取關鍵資訊。 - **命名實體識別 (Named Entity Recognition, NER)**:識別文本中的人名、地名、組織名。 - **語言模型與文本生成 (Language Modeling and Text Generation)**:使用 GPT、BERT 等模型生成故事、新聞等。 - **機器翻譯 (Machine Translation)**:將文本從一種語言翻譯到另一種語言。 - **語音識別與處理 (Speech Recognition and Processing)**:語音轉文字或文字轉語音。 - **假新聞檢測 (Fake News Detection)**:識別和標記假新聞或誤導性內容。 --- ### 第一部分:文章改寫 (Article Spinning) #### 1. 定義與目的 - **定義**:使用模型自動改寫一篇文章,使其在內容大致相同的情況下,用詞和句式發生變化,從而在搜尋引擎中被視為「獨特」的內容。 - **目的**: - ==減少內容創建的工作量==,節省時間與成本。 - 透過在不同網站發佈改寫後的文章,並嵌入原始網站的連結,來==提升 SEO (搜尋引擎優化) 排名==。 #### 2. 技術核心:預測中間詞 與之前從左到右生成文本不同,文章改寫的核心是==替換句子中的某些詞彙==,同時保持上下文的流暢性。 - **方法**:我們可以使用 **Trigram (三元模型)** 來根據一個詞的**前後文**,預測這個**中間詞**最可能是什麼。 - 給定前一個詞 $w_{i-1}$ 和後一個詞 $w_{i+1}$,我們想要找到最適合填入中間的詞 $w_i$。 - **機率估計**:使用最大似然估計 (MLE) 來計算中間詞的機率分佈: $$ P(w_i | w_{i-1}, w_{i+1}) = \frac{\text{Count}(w_{i-1}, w_i, w_{i+1})}{\sum_{w'} \text{Count}(w_{i-1}, w', w_{i+1})} $$ #### 3. 潛在問題 - **語法錯誤**:這種方法只考慮詞的共現頻率,沒有考慮**詞性 (Part-of-Speech, POS)**。因此,模型可能會用一個詞性不符的詞來替換原文,導致句子在文法上不通順。 --- ### 第二部分:替換式密碼解譯 (Substitution Cipher Decryption) 這是一個經典的密碼學問題,展示了如何利用機率語言模型來解決看似與語言無關的任務。 #### 1. 什麼是替換式密碼? - **概述**:一種簡單的加密方法,其規則是將字母表中的==每一個字母,都一對一地替換成另一個不同的字母==。 - **核心元素**: - **明文 (Plaintext)**:原始的、可讀的訊息。 - **密文 (Ciphertext)**:加密後的、不可讀的訊息。 - **密鑰 (Key)**:一個字母對字母的替換對應表。發送者和接收者必須共享同一個密鑰。 - **範例**: - **明文**:`I LIKE CATS` - **密鑰**:`I→Y, L→W, K→R, E→N, C→J, A→L, T→O, S→B` - **密文**:`Y WYRN JLOB` #### 2. 核心思想:語言模型評分 如何判斷我們是否成功解密了訊息?答案是利用==語言模型==。 - **直覺概念**:一個好的語言模型,會對**真實、有意義的句子賦予高機率**,而對**無意義的亂碼賦予低機率**。 - **應用**: - 當我們用一個**正確的密鑰**解密時,得到的明文 "I LIKE CATS" 應該在我們的語言模型中獲得**高分(高機率)**。 - 當我們用一個**錯誤的密鑰**解密時,得到的亂碼 "G BGWQ LRPM" 應該獲得**低分(低機率)**。 - **評分工具**:我們可以使用 **Unigram** 和 **Bigram**(基於字母而非單詞)模型來評估解密後文本的「品質」。例如,`TH`, `HE` 是常見的 Bigram,而 `ZX`, `QP` 則非常罕見。 #### 3. 挑戰:巨大的搜尋空間 - **樸素方法 (Naive Approach)**:暴力破解。嘗試所有可能的密鑰(字母對應關係),用每個密鑰解密訊息,然後用語言模型評分,最後選擇得分最高的那個。 - **問題:計算上不可行** - 字母表有 26 個字母,所有可能的替換對應關係數量為 $26!$ (26 的階乘)。 - $26! \approx 4 \times 10^{26}$ - 這是一個天文數字。即使每秒能嘗試十億個密鑰,也需要數十億年才能完成。 #### 4. 解決方案:遺傳演算法 (Genetic Algorithm) 當我們無法遍歷整個搜尋空間時,就需要一種更聰明的最佳化方法。遺傳演算法 (GA) 就是其中之一,它模擬了生物界的==自然選擇與進化==過程。 ##### a. 核心概念與生物學類比 - **目標**:最大化一個**適應度函數 (Fitness Function)**,找到最優解。 - **類比**: - **DNA**:代表模型的一個解。在我們的問題中,一個 DNA 字串就代表一個**密鑰**(例如,`"LXJSN..."` 代表 `A→L, B→X, C→J, ...`)。 - **適應度 (Fitness)**:衡量一個 DNA 有多好。在我們的問題中,適應度就是用該 DNA (密鑰) 解密後的訊息,在語言模型下的**對數概似值 (log-likelihood)**。 - **進化**:透過「突變」和「選擇」,每一代都保留適應度更高的 DNA,並淘汰適應度低的,逐步逼近最優解。 ##### b. 為何不使用梯度下降? - 梯度下降需要目標函數是**可微分的**。 - 我們的參數是一個離散的「字母對應表」,無法對其求導。因此,需要使用像遺傳演算法這樣的非梯度優化方法。 ##### c. 遺傳演算法的實現步驟 1. **表示 (Representation)**:將密鑰(一個字典)表示為一個長度為 26 的 DNA 字串。 2. **適應度函數 (Fitness Function)**: ```python def fitness_function(dna_string): # 1. 將 DNA 字串轉換為解密用的 map decryption_map = convert_dna_to_map(dna_string) # 2. 使用 map 解密訊息 decoded_message = decode(ciphertext, decryption_map) # 3. 使用語言模型計算解密訊息的 log-likelihood log_likelihood = language_model.score(decoded_message) return log_likelihood ``` 3. **突變 (Mutation)**: - 生物學中的插入、刪除、替換操作會破壞我們「26 個字母唯一對應」的規則。 - 因此,我們使用==交換 (Swapping)==操作:隨機選取 DNA 字串中的兩個位置,並交換它們的字母。這確保了 DNA 仍然是一個合法的密鑰。 4. **進化過程 (改進版)**: - **問題**:如果每一代只保留一個最好的 DNA,很容易陷入**局部最優解**。 - **改進**:維護一個**DNA 池 (Population Pool)**,例如包含 20 個不同的 DNA。 - **演算法偽代碼**: ``` # 1. 初始化一個包含多個隨機 DNA 的池子 DNA_pool = create_many_random_dna(20) for epoch in range(num_epochs): # 2. 繁衍後代:讓池中的每個 DNA 都產生幾個後代 (透過微小的突變) offspring_pool = create_offspring(DNA_pool, num_offspring_per_dna=3) # 3. 合併父代與後代 combined_pool = DNA_pool + offspring_pool # 4. 計算池中每個 DNA 的適應度分數 scores = [fitness_function(dna) for dna in combined_pool] # 5. 選擇:根據分數排序,只保留適應度最高的 DNA (例如前 20 個) 作為下一代的父代 DNA_pool = select_fittest(combined_pool, scores, top_k=20) ``` - 這個過程模擬了「適者生存」,每一代都會淘汰掉差的解,並在好的解的基礎上進行探索,從而更有效地找到全局最優解。 --- # L5-機器學習模型在 NLP 的應用 這份筆記探討了傳統機器學習模型在 NLP 領域中的定位與應用,涵蓋了垃圾郵件偵測、情感分析、文本摘要以及主題模型等多個核心任務。 --- ### 第一部分:NLP 中的機器學習模型定位 在 NLP 的世界裡,不同類型的模型扮演著不同的角色: 1. **向量基礎模型 (Vector-Based Models)**: - **角色**:==特徵表示 (Feature Representation)==。 - **任務**:將原始文本轉換為機器可讀的數值向量。 - **範例**:Bag of Words (BoW), TF-IDF, Word2Vec, GloVe。 - **關係**:它們是後續機器學習模型的**輸入**。 2. **機率模型 (Probabilistic Models)**: - **角色**:==透過機率分佈進行預測==。 - **任務**:計算詞序列的機率或基於機率進行分類。 - **範例**:N-Gram 模型, 馬可夫模型, 貝氏分類器 (Naïve Bayes)。 - **關係**:可以獨立完成任務,也可以與其他 ML 模型結合。 3. **機器學習基礎模型 (Machine Learning-Based Models)**: - **角色**:==從數據中學習模式來進行預測==。 - **任務**:從標註資料(監督式)或未標註資料(非監督式)中學習。 - **範例**: - **監督式**:邏輯回歸 (Logistic Regression), SVM, 決策樹。 - **非監督式**:K-Means Clustering。 - **關係**:它們需要**向量化後的文本特徵**才能運作。 --- ### 第二部分:應用一 — 垃圾郵件偵測 (Spam Detection) 這是一個典型的==監督式學習==二元分類任務。 #### 1. 偵測流程 1. **向量化**:將郵件文本轉換為數值特徵(如 TF-IDF 向量)。 2. **模型訓練**:使用帶有 `Spam / Ham` 標籤的資料集,訓練一個分類模型。 3. **模型評估**:使用精確率 (Precision)、召回率 (Recall)、F1 分數等指標評估模型性能。 #### 2. 常見分類模型比較 | 模型 | 優點 | 缺點 | | :--- | :--- | :--- | | **Naïve Bayes** | 速度快,在小數據集上表現好 | 假設詞之間相互獨立,可能不符現實 | | **Logistic Regression** | 簡單、可解釋性強 | 對複雜文本的擬合能力有限 | | **SVM** | 在文本分類任務上通常表現優異 | 在大型數據集上訓練速度較慢 | | **Random Forest** | 對雜訊容忍度高,表現穩定 | 計算量較大 | #### 3. 混合模型 (Hybrid Model) 可以結合不同模型的優點,例如: 1. 先用 Naïve Bayes 計算每封郵件為垃圾郵件的機率 $P(\text{Spam}|\text{text})$。 2. 將這個機率值作為一個==新的數值特徵==。 3. 將這個新特徵與原始的 TF-IDF 特徵結合,一起送入一個更強大的模型(如 SVM 或 Random Forest)進行最終的分類。 --- ### 第三部分:應用二 — 情感分析 (Sentiment Analysis) #### 1. 任務類型 - **分類 (Classification)**:正面 / 負面 / 中立 (最常見)。 - **回歸 (Regression)**:預測一個連續的情感分數(例如 -5 到 +5)。 - **多面向情感分析 (Aspect-Based)**:分析文本對特定面向(如手機的「電池續航力」或「螢幕品質」)的情感。 #### 2. 主要方法 - **詞典法 (Lexicon-Based)**:使用預先定義好的情感詞典(如 SentiWordNet)來計算文本的情感分數。 - **機器學習法 (Machine Learning-Based)**:使用標註過的數據,訓練分類或回歸模型。 - **混合法 (Hybrid Approach)**:結合詞典與機器學習,以達到更高準確率。 #### 3. 挑戰 - **諷刺與反話 (Sarcasm & Irony)**:表面詞義與真實情感相反。 - **上下文理解 (Context Understanding)**:同一個詞在不同情境下情感可能不同。 - **領域依賴性 (Domain Dependency)**:在電影評論上訓練的模型,可能不適用於金融新聞。 --- ### 第四部分:應用三 — 文本摘要 (Text Summarization) #### 1. 摘要的核心概念 - 文本摘要是==學習與理解==的一種體現。 - **摘要的兩種類型**: 1. **抽取式摘要 (Extractive Summarization)**:==直接從原文中擷取==最重要的句子或片語,組合成摘要。 2. **生成式摘要 (Abstractive Summarization)**:==用模型自己的話重新生成==原文的核心內容,更像人類的總結方式。 #### 2. 抽取式摘要方法 ##### a. 基於 TF-IDF 的摘要 1. 將文章拆分成句子。 2. 將每個句子視為一個獨立的「文件」,計算其中每個詞的 TF-IDF 分數。 3. 計算每個句子的總分(例如,句子中所有非零 TF-IDF 分數的平均值)。 4. 選取分數最高的 N 個句子作為摘要。 ##### b. TextRank (基於 PageRank) - **核心思想**:借鑒 Google 的 PageRank 演算法,==一個句子的重要性,取決於與它相似的其他重要句子的數量==。 - **PageRank 直覺**:在網際網路中,一個網頁被越多「重要」網頁連結,它本身就越重要。 - **TextRank 應用**: - **節點 (Node)**:文中的每個句子。 - **連結 (Link)**:句子之間的「連結強度」,可以用它們的==向量相似度(如 Cosine Similarity)==來衡量。 - 演算法會迭代計算每個句子的「分數」,最終分數高的句子被選入摘要。 ##### c. RAKE (Rapid Automatic Keyword Extraction) - 一種快速抽取==關鍵片語==的無監督方法,適用於不需完整句子的摘要任務。 #### 3. 摘要的挑戰與評估 - **挑戰**:上下文理解、摘要的連貫性、資訊遺失、AI 幻覺(生成不實內容)等。 - **評估指標**: - **自動化指標**:**ROUGE** (比較生成摘要與參考摘要的 n-gram 重疊度)、BLEU 等。 - **人工評估**:評估摘要的相關性、流暢性、忠實度等。 --- ### 第五部分:應用四 — 主題模型 (Topic Modeling) 主題模型是一種==非監督式學習==技術,用於從大量文件中==自動發現潛在的主題==。 #### 1. 關鍵技術概覽 - **LDA (Latent Dirichlet Allocation)**:最經典的機率生成模型。 - **NMF (Non-Negative Matrix Factorization)**:基於矩陣分解的方法。 - **LSA (Latent Semantic Analysis)**:使用奇異值分解 (SVD) 來發現潛在語意。 #### 2. 深度解析:LDA (Latent Dirichlet Allocation) - **核心假設**: 1. 每篇**文件**是==多個主題的混合分佈==。 2. 每個**主題**是==多個詞彙的混合分佈==。 - **API 視角**: - **輸入**:一個文件-詞矩陣 (Document-Term Matrix),通常是 BoW 或 TF-IDF 矩陣。 - **輸出**: 1. 一個**主題-詞矩陣** (Topics × Words):表示每個主題由哪些詞組成。 2. 一個**文件-主題矩陣** (Documents × Topics):表示每篇文件包含哪些主題。 - **實作 (Scikit-Learn)**: ```python from sklearn.feature_extraction.text import CountVectorizer from sklearn.decomposition import LatentDirichletAllocation # 將文本向量化 X = CountVectorizer().fit_transform(documents) # 建立並訓練 LDA 模型 (K=10 個主題) lda = LatentDirichletAllocation(n_components=10) # 得到文件-主題分佈矩陣 Z = lda.fit_transform(X) ``` #### 3. 深度解析:NMF 與 LSA (矩陣分解與潛在語意分析) ##### a. NMF 與推薦系統 - NMF 將一個大的==文件-詞矩陣==分解為兩個較小的非負矩陣(文件-主題 和 主題-詞)。 - 這個思想與**推薦系統**中的**矩陣分解**完全相同:將一個巨大的、稀疏的「使用者-物品評分矩陣」分解為「使用者-潛在因子」和「潛在因子-物品」兩個矩陣,從而預測使用者對未評分物品的評分。 ##### b. LSA 與 SVD (奇異值分解) - LSA 使用 SVD 技術來對文件-詞矩陣進行==降維==,旨在解決 NLP 中的兩大難題: 1. **同義詞 (Synonymy)**:`car` 和 `automobile` 意思相同,但在 TF-IDF 中是不同的特徵。LSA 可以將它們映射到同一個潛在語意維度上。 2. **一詞多義 (Polysemy)**:`bank` 可以是「銀行」或「河岸」。LSA 可以根據上下文,將 `bank` 映射到不同的語意維度組合。 - **SVD 的直覺**:SVD 可以被看作是對高維數據進行==最佳角度的旋轉==,使得數據的主要結構(信號)與次要結構(噪聲)在坐標軸上分離。通過保留信號維度並丟棄噪聲維度,我們就實現了降維和潛在語意的提取。 #### 4. 實務挑戰:如何選擇主題數量 (K)? 選擇最佳的主題數量 $K$ 是主題建模的關鍵挑戰。 - **Coherence Score (一致性分數)**:衡量一個主題內的詞彙是否語意相關。==分數越高越好==。 - **Perplexity Score (困惑度)**:衡量模型對未見數據的預測能力。==分數越低越好==。 - **Elbow Method**:在 $K$ 值對應 Coherence/Perplexity 分數的圖表中,尋找「肘點」或「轉折點」。 --- # L6-深度學習模型 (Deep Learning Models) 這份筆記將探討從傳統 NLP 方法轉向深度學習的原因,並深入介紹兩種核心的深度學習架構:卷積神經網路 (CNN) 和循環神經網路 (RNN),以及其變體 LSTM 與 GRU 在 NLP 任務中的應用。 --- ### 第一部分:從傳統 NLP 到深度學習 #### 1. 為什麼需要深度學習? - **傳統 NLP 的限制**: - 依賴**手工設計特徵** (如 Bag-of-Words, TF-IDF)。 - 難以捕捉**語境 (context)**、**詞序 (word order)** 與深層**語意 (semantics)**。 - 面對**多義詞** (如 "bank") 或**諷刺語氣**時表現不佳。 - **深度學習的優勢**: - 能夠==自動從資料中學習特徵==,無需人工設計。 - 使用==密集向量 (dense vectors, 即詞嵌入)==來表示詞彙,能捕捉語意關係。 - 模型結構(如 RNN)天生適合處理序列數據,能更好地理解詞序和上下文。 - 支持==端對端學習 (End-to-End Learning)==,從原始輸入直接到預測結果。 #### 2. 使用深度學習的挑戰與考量 - **資料需求量大**:通常需要大量標註過的資料才能達到良好效果。 - **計算資源昂貴**:訓練大型模型需要強大的 GPU 或 TPU。 - **可解釋性差**:深度學習模型通常像「黑箱」,難以解釋其具體的決策過程。 - **過擬合風險**:在小型或有偏見的資料集上容易過擬合。 - **道德風險**:模型可能會學習並放大訓練數據中潛在的偏見。 --- ### 第二部分:深度學習的基礎 — 數據準備與詞嵌入 #### 1. 文本預處理與 Padding - **預處理的變化**: - **詞幹提取/詞形還原**:在使用大型預訓練模型(如 BERT)時,通常會省略,因為模型本身能理解詞的不同形式。 - **停用詞移除**:通常也會保留停用詞,因為它們是構成完整語境的一部分。 - **Padding (填充) 與 Truncation (截斷)**: - 深度學習模型要求輸入的==所有序列長度必須一致==。 - **Padding**:對於長度不足的序列,在其前方或後方補上特定的填充符(如 `[PAD]` 或 0)。 - **Truncation**:對於超長的序列,截斷其超出部分。 - 在 TensorFlow 中,`pad_sequences` 是一個常用函數。對於 RNN,通常將 Padding 放在序列**前方**較有利,因為它能更好地記住序列末端的資訊。 - **形狀與維度**: - 經過 Padding 後,一批文本數據會被轉換為一個形狀為 `(N, T)` 的二維矩陣,其中 `N` 是序列數量(batch size),`T` 是最大序列長度。 #### 2. 從 One-Hot 編碼到詞嵌入 (Word Embedding) - **One-Hot 編碼的限制**: - 將每個詞表示為一個超高維度的稀疏向量(向量長度等於詞彙表大小)。 - ==向量之間是正交的,無法表達詞彙之間的相似性==(例如,"cat" 和 "dog" 的向量關係與 "cat" 和 "car" 的一樣遠)。 - **詞嵌入的核心觀念**: - 為每個詞學習一個==低維、稠密的向量==。 - 這個過程可以看作是建立一個「詞向量查詢表 (lookup table)」。 - 在訓練過程中,模型會自動調整這些向量,使得==語意相近的詞,其向量在空間中的位置也相近==(例如 `cat` 和 `jaguar` 會很接近)。 - **嵌入類型**: - **靜態嵌入**:Word2Vec, GloVe, FastText (一個詞對應一個固定向量)。 - **動態/上下文嵌入**:BERT, GPT (==同一個詞在不同語境中,會對應到不同的向量==)。 --- ### 第三部分:卷積神經網路 (CNN) 在 NLP 的應用 雖然 CNN 最初因圖像處理而聞名,但它同樣能有效處理文本數據。 #### 1. 一維卷積 (1-D Convolution) - **運作方式**:一個固定大小的**卷積核 (Filter)**,像滑動窗口一樣,在輸入的詞向量序列上滑動。在每個位置,它會與覆蓋到的詞向量進行==乘加運算==,提取出一個特徵值。 - **結構**: - **高度 (Height)**:表示一次看多少個詞(相當於 N-Gram 中的 N)。 - **寬度 (Width)**:必須與詞嵌入的維度相同。 - **功能**:CNN 的卷積核可以學習識別特定的==局部語意模式==。例如,某個卷積核可能會對 "a fantastic song" 或 "the good movie" 這類正向情感的詞組產生強烈的激活反應,而另一個卷積核則可能專門識別 "not good" 這樣的否定模式。 #### 2. CNN 文本分類模型架構 一個典型的 CNN 文本分類模型流程如下: 1. **Embedding Layer**:將 Token ID 序列轉換為詞向量矩陣 (形狀:`batch_size, T, D`)。 2. **Conv1D Layer(s)**:使用多個不同大小的卷積核,提取不同長度的 n-gram 特徵。 3. **Pooling Layer(s)**:通常使用 `MaxPooling1D`,對卷積後的特徵進行降維,只保留最強烈的信號。 4. **Global Pooling Layer**:使用 `GlobalMaxPooling1D` 將變長的特徵圖轉換為一個==固定長度的向量==,代表整個句子的語意表示。 5. **Dense Layer(s)**:基於這個句子向量,進行最終的分類(例如,情感是正面還是負面)。 ```python # Keras 程式碼範例 from keras.layers import Input, Embedding, Conv1D, MaxPooling1D, GlobalMaxPooling1D, Dense i = Input(shape=(T,)) x = Embedding(V + 1, D)(i) x = Conv1D(32, 3, activation='relu')(x) x = MaxPooling1D(3)(x) x = Conv1D(64, 3, activation='relu')(x) x = MaxPooling1D(3)(x) x = Conv1D(128, 3, activation='relu')(x) x = GlobalMaxPooling1D()(x) x = Dense(1, activation='sigmoid')(x) # 二元分類 ``` --- # L7-Transformer 模型詳解 這份筆記將深入探討自 2017 年以來徹底改變自然語言處理領域的 Transformer 架構,從其核心的注意力機制,到兩大主流模型家族 BERT 和 GPT,以及其他重要的衍生模型。 --- ### 第一部分:Transformer 革命 — 告別 RNN #### 1. RNN 的瓶頸與 Transformer 的誕生 - **RNN 的問題**: - **無法並行處理**:每個時間步的輸出都依賴前一個輸出,必須依序計算,效率低下。 - **長距離依賴問題**:信息在序列中傳遞時容易遺失,導致模型難以捕捉相距較遠的詞之間的關係。 - **梯度消失/爆炸**:在反向傳播時,梯度會被連乘,導致訓練不穩定。 | 類別 | RNN | Transformer | | :--- | :--- | :--- | | **並行處理能力** | 必須依序處理,無法並行 | 允許整個序列同時處理,可大規模並行 | | **長距離依賴問題** | 難以捕捉長距離依賴 | 注意力機制直接關注任意兩個位置,解決長距依賴 | | **記憶能力** | 每步只保留前一步訊息,訊息易遺失 | 每個詞可看到整句其他詞,完整保存上下文 | #### 2. 核心引擎:注意力機制 (Attention Mechanism) - **核心思想**:==拋棄循環結構,允許模型在處理序列中的某個詞時,直接關注序列中任何其他詞==,並根據其重要性來賦予不同的權重。 - **類比**:當你看一張圖片時,你的眼睛(感官記憶)接收了所有像素,但你的==注意力==會自然地集中在最重要的區域(例如圖片中的人臉)。 - **Query, Key, Value (Q, K, V) 範式**: - **Query (查詢)**:代表當前詞,它主動去「查詢」其他詞與自己的相關性。(例如:我想知道 `it` 指的是什麼?) - **Key (鍵)**:代表序列中每個詞的「標籤」,用來和 Query 進行匹配。(例如:序列中的 `The cat` 和 `the mat` 都是 `it` 可能指代的對象)。 - **Value (值)**:代表序列中每個詞的「實際內容」。 - **流程**:用 Query 和每個 Key 計算一個**注意力分數**,將分數通過 Softmax 轉換為權重,再用這個權重對所有的 Value 進行**加權求和**,得到最終的輸出。 #### 3. 自注意力 (Self-Attention) 與多頭注意力 (Multi-Head Attention) - **自注意力 (Self-Attention)**: - 一種特殊的注意力機制,其中 ==Query, Key, Value 都來自同一個輸入序列==。 - **目的**:讓模型在處理序列時,根據句子中其他詞的重要性來重新建構每個詞的表示。 - **公式**: $$ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$ - **多頭注意力 (Multi-Head Attention)**: - **動機**:單一的自注意力只能學到一種語意關係,但語言是多層次的。 - **核心思想**:==把「自注意力」這個動作做很多次==(例如 8 次或 12 次),每次從不同的「視角」(子空間)去學習,最後再把所有視角的結果整合起來。 - **比喻**:就像一個專家小組,每個專家(Head)都從自己的專業角度分析問題,最後綜合所有專家的意見,得出一個更全面、更聰明的結論。 --- ### 第二部分:BERT 家族 — 雙向理解的王者 #### 1. BERT 核心原理 - **BERT (Bidirectional Encoder Representations from Transformers)**:由 Google 開發,是一個基於 ==Transformer Encoder== 架構的預訓練語言模型。 - **核心特點 - 雙向理解**:通過其核心的 ==Masked Language Model (MLM)== 預訓練任務,BERT 能夠==同時利用一個詞的左側和右側上下文==來理解其確切含義,這在解決語境歧義問題上取得了巨大成功。 - **訓練流程**: 1. **預訓練 (Pre-training)**:在海量的未標記文本(如維基百科)上,透過 MLM 和 NSP 任務進行訓練,讓模型學會通用的語言知識。 2. **微調 (Fine-tuning)**:針對特定的下游任務(如情感分析),在少量標註數據上對預訓練好的模型進行微調。 - **輸入表示**:由三部分相加而成: 1. **Token Embeddings**:詞本身的向量。 2. **Segment Embeddings**:區分兩個不同句子(用於 NSP 等任務)。 3. **Position Embeddings**:為模型提供詞的順序資訊。 - **預訓練任務**: 1. **遮罩語言模型 (Masked Language Modeling, MLM)**:隨機遮蔽句子中 15% 的詞,讓模型去預測這些被遮蔽的詞。 2. **下一句預測 (Next Sentence Prediction, NSP)**:判斷句子 B 是否是句子 A 的真實下一句。 #### 2. BERT 的改進與演化 (The "BERT Zoo") - **RoBERTa**:BERT 的強化版,主要改進包括: - 使用**更大量的數據**進行訓練。 - 使用**動態遮罩 (Dynamic Masking)**,增加訓練多樣性。 - **移除了 NSP 任務**,發現其對效能提升不大。 - 使用 **Byte-level BPE**,能更好地處理各種 Unicode 字元。 - **ALBERT**:一個輕量化的 BERT,旨在減少模型參數。 - **參數共享 (Parameter Sharing)**:所有 Transformer 層共享同一組參數。 - **嵌入矩陣分解 (Embedding Factorization)**:將大的詞嵌入矩陣分解為兩個小矩陣。 - 使用**子句順序預測 (SOP)** 任務取代 NSP。 - **XLNet**:旨在解決 BERT 的一些理論缺陷。 - 引入==排列語言模型 (Permutation Language Model, PLM)==,透過對輸入序列進行排列組合,讓模型在預測一個詞時,能考慮到所有其他詞的上下文,而不僅僅是未被遮蔽的詞。 - 結合了 **Transformer-XL** 的==分段遞迴機制==和==相對位置編碼==,使其在處理長文本方面表現更佳。 - **ELECTRA**:引入類似 GAN 的訓練方式,提升訓練效率。 - 包含一個**生成器**(小型的 BERT)和一個**判別器**。 - 預訓練任務為==替換 Token 檢測 (Replaced Token Detection, RTD)==:生成器負責替換輸入中的某些詞,判別器的任務是判斷每個詞是「原始的」還是「被替換的」。 - 由於判別器需要對所有 Token 進行預測,而不是只預測 15% 的被遮蔽詞,因此訓練效率遠高於 BERT。 #### 3. 模型壓縮:DistillBERT 與 TinyBERT - **核心思想**:使用==知識蒸餾 (Knowledge Distillation)==,訓練一個小模型(學生)去模仿一個大模型(教師,如 BERT)的行為。 - **DistillBERT**: - 層數減半(6 層),保留約 97% 的 BERT 性能,但模型縮小 40%,速度提升 60%。 - 學生模型學習教師模型的**預測結果 (soft labels)** 和**隱藏層輸出**。 - **TinyBERT**: - 更小、更精細的蒸餾模型。 - 採用**兩階段蒸餾**:通用蒸餾 + 任務導向蒸餾。 - 除了學習隱藏層輸出,還會學習**注意力權重 (Attention Maps)**,讓學生模型學會教師模型的「思考模式」。 --- ### 第三部分:GPT 家族 — 生成式 AI 的崛起 #### 1. GPT 核心原理 - **GPT (Generative Pre-trained Transformer)**:由 OpenAI 開發,是一個基於 ==Transformer Decoder== 架構的語言生成模型。 - **核心特點 - 自回歸 (Autoregressive)**:模型在生成文本時,==一次只生成一個詞==,並且下一個詞的生成依賴於之前已經生成的所有詞。 - **關鍵技術**:使用==遮罩多頭自注意力 (Masked Multi-Head Self-Attention)==,確保在預測位置 $i$ 的詞時,模型只能看到位置 $i$ 之前的資訊,而不會「偷看」到未來的詞。 | 項目 | BERT | GPT | | :--- | :--- | :--- | | **Attention 類型** | 雙向 Self-Attention | 單向 Masked Self-Attention | | **模型用途** | 理解任務(分類、問答) | 生成任務(續寫、對話) | | **能否看未來詞** | 可以 | 不可以 | #### 2. 從 GPT-1 到 GPT-4o:規模與能力的進化 - **GPT-1 (1.1 億參數)**:驗證了 Transformer Decoder 在生成任務上的巨大潛力。 - **GPT-2 (15 億參數)**:展示了驚人的 Zero-shot/Few-shot 能力,無需微調即可在多種任務上表現出色。 - **GPT-3 (1750 億參數)**:核心觀點是==規模定律 (Scaling Law)==,當模型和數據足夠大時,模型的能力會發生質的飛躍,Few-shot 能力已接近微調後的水準。 - **GPT-4 (約 1.8 兆參數)**:引入==多模態能力==,能同時處理文字和圖像輸入,並在各種專業測試中達到頂尖人類水準。 - **GPT-4o (Omni)**:實現了==全方位的即時多模態互動==(文字、語音、圖像),回應速度更快,成本更低,對話體驗極其流暢自然。 #### 3. InstructGPT/ChatGPT:對齊人類意圖 - **問題**:大型語言模型本身只會文字接龍,不一定能理解並遵循人類的指令,有時會生成無用、有害或不實的內容。 - **解決方案**:==從人類回饋中進行強化學習 (Reinforcement Learning from Human Feedback, RLHF)==。 1. **監督式微調 (Supervised Fine-tuning, SFT)**:使用少量高品質的人類示範對話,對預訓練模型進行初步微調。 2. **獎勵模型訓練 (Reward Modeling)**:讓人類對模型生成的多個回答進行排序,訓練一個獎勵模型來學習人類的偏好。 3. **強化學習 (Reinforcement Learning)**:使用 PPO 等強化學習演算法,讓語言模型在獎勵模型的指導下進行策略優化,生成能獲得最高獎勵(最符合人類偏好)的回答。 --- ### 第四部分:其他重要的 Encoder-Decoder 模型 #### 1. T5 — 萬物皆可 Text-to-Text - **設計哲學**:==將所有 NLP 任務都統一為「文字到文字」的格式==。不論是分類、翻譯還是摘要,輸入都是帶有任務前綴的文字,輸出也都是文字。 - **預訓練任務**:==Span Corruption==,隨機遮蔽輸入文本中的連續片段 (Span),讓模型學會重建這些被遮蔽的片段。 #### 2. BART — 降噪自編碼器的藝術 - **架構**:結合了 **BERT 式的雙向 Encoder** 和 **GPT 式的自回歸 Decoder**。 - **預訓練任務**:==降噪自編碼 (Denoising Autoencoder)==。對原始輸入文本進行各種形式的「破壞」(如 Token 遮蔽、刪除、句子亂序等),然後訓練模型將其完美地復原。這使得 BART 在需要理解原文結構並流暢生成的任務(如摘要)上表現極佳。 --- # L8-進階 NLP 這份筆記將深入探討多個當代重要的 NLP 應用任務,包括命名實體辨識 (NER)、自然語言推論 (NLI)、生成式摘要、問答系統 (QA)、機器翻譯 (MT) 以及語意相似度分析。 --- ### 第一部分:命名實體辨識 (Named Entity Recognition, NER) #### 1. 什麼是 NER? NER 是一種從文本中自動標記出預定義實體(如==人名、地名、組織名==)的技術。它屬於 **many-to-many** 的序列標註任務,類似於詞性標註。 - **範例**: - **句子**:`Steve Jobs was the CEO of Apple, headquartered in California.` - **NER 輸出**:`Steve Jobs` → `PER` (人物), `Apple` → `ORG` (組織), `California` → `LOC` (地點) #### 2. BIO 標註格式 為了處理由多個 Token 組成的實體,NER 常使用 BIO 格式: - **B-XXX**:實體(Begin)的開頭。 - **I-XXX**:實體(Inside)的內部。 - **O**:非實體(Outside)。 #### 3. 條件隨機場 (Conditional Random Field, CRF) - **問題**:如果只用 Softmax 逐字預測標籤,可能會產生不合邏輯的標籤序列(例如 `B-PER` 後面接著 `I-ORG`)。 - **CRF 的作用**:CRF 是一種機率圖模型,它在 Softmax 的基礎上,額外學習了==標籤之間的轉移機率==。 - **類比**:Softmax 是「逐字猜標籤」,而 `BiLSTM + CRF` 則是「==整體考慮==」,在所有可能的標籤序列中,找出機率最大、最合理的一條路徑,從而避免了不自然的標註組合。 #### 4. NER 的重要性與應用 - **核心**:NER 是**資訊抽取 (Information Extraction)** 的基礎步驟,能將非結構化文本轉換為==結構化資料==。 - **應用場景**: - **新聞分析**:自動抓取報導中的人、事、時、地、物。 - **問答/對話系統**:識別問題中的關鍵實體,以進行查詢或觸發回應。 - **關係抽取與知識圖譜建構**:先找出實體,再分析它們之間的關係。 --- ### 第二部分:自然語言推論 (Natural Language Inference, NLI) #### 1. 什麼是 NLI? NLI 旨在判斷兩個句子之間的**邏輯關係**。 - **Premise (前提)**:給定的句子。 - **Hypothesis (假設)**:需要判斷的句子。 - **三種關係**: 1. **Entailment (蘊涵)**:前提句能推論出假設句為真。 2. **Contradiction (矛盾)**:前提句和假設句互相矛盾。 3. **Neutral (中立)**:兩者無明顯邏輯關係。 | Premise | Hypothesis | Label | | :--- | :--- | :--- | | `A man is playing a guitar.` | `A man is making music.` | Entailment | | `A man is playing a guitar.` | `A man is sleeping.` | Contradiction | | `A man is playing a guitar.` | `A man is performing on stage.` | Neutral | #### 2. NLI 的挑戰 NLI 任務需要模型具備深度的語意理解和常識推理能力,而不僅僅是字面匹配。 #### 3. NLI 模型方法 - **BERT-based 模型**: - **輸入格式**:`[CLS] Premise [SEP] Hypothesis [SEP]` - **預測**:將 `[CLS]` Token 對應的輸出向量,送入一個分類器,進行三分類預測。 - **T5-based 模型**: - 將 NLI 視為一個**文字生成**任務。 - **輸入**:`premise: … hypothesis: …` - **輸出**:直接生成 `"entailment"`, `"contradiction"` 或 `"neutral"` 其中一個詞。 --- ### 第三部分:文本摘要 (Text Summarization) #### 1. 生成式摘要 (Abstractive Summarization) 相較於只能「剪貼」原文句子的抽取式摘要,生成式摘要能夠==理解原文語意,並用自己的話重組和精煉資訊==,生成更自然流暢的摘要。 #### 2. 代表模型 ##### a. PEGASUS - **核心概念**:專為摘要任務設計的預訓練模型。 - **預訓練方法 - Gap Sentence Generation (GSG)**:在預訓練階段,模型不是隨機遮蔽單詞,而是==故意刪除文章中資訊密度最高的幾個關鍵句子==,然後訓練模型學會根據剩餘的上下文,將這些被刪除的關鍵句**重新生成**出來。 - **優勢**:這種訓練方式完美地模擬了「閱讀全文 -> 總結重點」的人類行為,使得 PEGASUS 在生成摘要時的表現非常出色。 ##### b. UL2 (Unified Language Learning) - **核心概念**:為了解決單一預訓練任務的局限性,UL2 採用了 **Mixture of Denoising Objectives**。 - **訓練方式**:在預訓練階段,混合了多種不同的任務,例如: - **MLM (如 BERT)**:擅長理解。 - **NTP (如 GPT)**:擅長生成。 - **Span Corruption (如 T5)**:擅長填補缺失片段。 - **優勢**:通過混合訓練,UL2 成為一個==既擅長理解也擅長生成==的「全能型」模型,在各種 NLP 任務上都具有很高的靈活性和強大的性能。 --- ### 第四部分:問答系統 (Question Answering, QA) QA 系統的目標是根據用戶提問,自動從資料中找到或生成正確答案。 #### 1. QA 系統分類 1. **封閉式 QA (Closed-book QA)**:==不查資料==,完全依賴模型內部知識作答 (如 ChatGPT)。 2. **開放式 QA (Open-domain QA)**:==先檢索相關資料==,再結合資料生成答案 (如 Google Search QA, RAG)。 3. **抽取式 QA (Extractive QA)**:從**給定的上下文**中,直接==抽取原文片段==作為答案。模型任務是預測答案的「開始與結束位置」。 4. **生成式 QA (Abstractive QA)**:基於上下文,==用模型自己的話==生成一個完整、流暢的回答句子。 #### 2. 經典資料集 - **SQuAD**:最經典的**抽取式** QA 資料集。 - **HotpotQA**:**多跳推理 (Multi-hop)** QA 資料集,需要模型整合多份文件中的資訊才能回答。 --- ### 第五部分:機器翻譯 (Machine Translation, MT) #### 1. 核心挑戰 - **語序差異**、**詞語歧義**、**長距離依賴**、**低資源語言**、**風格與情緒轉移**等。 #### 2. 現代 MT 方法 ##### a. mBART vs. BART - **BART**:只在英文上訓練的降噪自編碼器。 - **mBART**:在**多種語言**上進行聯合訓練,並引入==語言 ID Token==來指導模型進行翻譯。它使用一個共享的詞彙表,使其能夠在不同語言之間遷移知識。 ##### b. M2M-100 - Meta AI 開發的==多對多 (Many-to-Many)==翻譯模型,支持約 100 種語言之間的**直接互譯**,無需再以英文作為「中轉語言」,減少了誤差累積。 ##### c. Bitext Mining & LASER - **問題**:訓練多語言翻譯模型需要大量的平行語料,但人工整理成本極高。 - **解決方案 - Bitext Mining**:從大量未對齊的多語言文本中,==自動找出彼此是翻譯對應的句子==。 - **核心技術 - LASER**:一種多語言句子編碼器。它能將**不同語言但語意相同的句子,映射到向量空間中非常相近的位置**。通過在這個向量空間中進行最近鄰搜索,就可以高效地挖掘出平行語料。 --- ### 第六部分:語意相似度與同義句辨識 #### 1. 基本概念 - **語意相似度 (Semantic Similarity)**:判斷兩個句子在語意上的相近程度,輸出是一個連續的分數(如 0~1)。 - **同義句辨識 (Paraphrase Detection)**:判斷兩個句子是否為同義句,輸出是分類結果(是/否)。 #### 2. 進階方法 ##### a. 暹羅網路 (Siamese / Twin Networks) - **架構**:包含兩個==共享參數==的編碼器(如 BERT 或 LSTM)。兩個句子分別通過這兩個編碼器,生成各自的句子向量,最後再計算這兩個向量的相似度(如 Cosine Similarity)。 - **優點**:由於參數共享且可以單獨處理每個句子,非常適合需要**大規模快速比對**的場景(例如,可以預先算好一個問題庫中所有問題的向量)。 ##### b. SBERT (Sentence-BERT) - 基於 Siamese 網路結構,專門對 BERT 進行微調,使其能夠產出==高品質的、可用於語意比對的句子向量==。 ##### c. SimCSE (Simple Contrastive Sentence Embedding) - 一種高效的==對比學習 (Contrastive Learning)==方法,旨在讓語意相似的句子向量彼此靠近,語意不同的句子彼此遠離。 - **無監督 SimCSE 的巧妙之處**: - **正樣本對**:將**同一個句子**,通過帶有隨機 Dropout 的 BERT 模型兩次,得到的兩個略有不同的向量,被視為一對正樣本。 - **負樣本對**:同一個 mini-batch 中的其他句子,被視為負樣本。 - 這種「==Dropout as Noise==」的技巧,無需任何人工標註,就能高效地學習到優質的句子表示。 --- # L9-檢索增強生成 (Retrieval-Augmented Generation, RAG) 這份筆記將深入探討 RAG 的核心概念、架構、關鍵技術,以及如何優化 RAG 系統以應對幻覺和多輪對話等挑戰。 --- ### 第一部分:為什麼需要 RAG?— LLM 與微調的限制 #### 1. 傳統大型語言模型 (LLM) 的限制 - **知識固定與過時**:LLM 的知識被凍結在其訓練資料的截止日期,==無法即時獲取外部或最新的知識==。 - **容易產生幻覺 (Hallucination)**:當被問及模型不知道、不確定或已過時的資訊時,它傾向於==基於統計關聯「編造」出看似合理的錯誤答案==。 **範例**: - 問:「中興大學 2024 年的校長是誰?」如果模型的訓練資料只到 2021 年,它很可能會回答一個錯誤的人選。 - 問:「在民法中,債務人不履行契約的法律效果是什麼?」如果模型只看過片段的法條,它可能會組合出不具法律邏輯的內容。 #### 2. 微調 (Fine-tuning) 的限制 - **成本高昂與不靈活**:為了讓模型學習新知識,需要重新訓練整個或部分模型。 - **缺點**: - 消耗大量的 GPU 資源與時間。 - 通常需要人工標註和資料清洗。 - ==每次知識庫更新(例如公司內部規章變動)都需要重新訓練一次==,維護極其困難。 --- ### 第二部分:RAG 的核心架構 RAG 的動機就是為了解決上述問題,核心思想是讓模型學會==「先查資料,再回答」==,如同開書考試。 #### 1. RAG 是什麼? - **定義**:RAG = **檢索 (Retrieval)** + **生成 (Generation)**。 - **兩大核心元件**: 1. **檢索器 (Retriever)**:負責根據用戶的查詢,從外部知識庫(如 PDF、FAQ、資料庫)中,==找出語意最相關的文本片段==。 2. **生成器 (Generator)**:一個大型語言模型 (LLM),負責將**原始問題**和**檢索器找到的相關文本**作為上下文,生成一個流暢、準確且有根據的回答。 #### 2. 元件一:檢索器 (Retriever) 深度解析 檢索器的核心技術是==向量搜尋==。 ##### a. 向量資料庫 (Vector Database) - **定義**:專門用來儲存和查詢==高維度向量資料==的資料庫。 - **特性**:與傳統資料庫用關鍵字匹配不同,向量資料庫通過計算「==向量之間的距離==」來尋找語意上相近的資料。 - **常見例子**:FAISS, Qdrant, Weaviate。 ##### b. 嵌入 (Embeddings) - **定義**:將非結構化資料(如文本、圖片)通過一個模型(如 BERT, CLIP)轉換成固定維度的數值向量。語意相近的內容,其向量在空間中的位置也相近。 ##### c. 近似最近鄰搜尋 (Approximate Nearest Neighbor, ANN) - **動機**:在高維空間中,對數百萬甚至數億個向量進行精確的暴力比對成本極高。ANN 旨在==犧牲一點點精度,來換取查詢速度的大幅提升==。 - **常見演算法**: 1. **HNSW (Hierarchical Navigable Small World)**:建立一個分層的圖結構。查詢時從頂層稀疏的圖開始,像走迷宮一樣,逐步向下層密集的圖逼近,快速定位到最近鄰的區域。 2. **IVF (Inverted File Index)**:預先使用 K-means 等算法將所有向量分成多個「區域 (cell)」。查詢時,只在與查詢向量最接近的幾個區域內進行比對,避免了全局搜索。 3. **PQ (Product Quantization)**:將高維向量切成多段子向量,並對每段進行量化編碼(壓縮)。查詢時只比較壓縮後的編碼,極大地節省了儲存空間和計算資源。 ##### d. 多模態檢索 (Multimodal RAG) - 通過使用像 **CLIP** 這樣能同時理解圖像和文字的模型,我們可以建立多模態向量資料庫,實現==以圖搜圖==、==以文搜圖==等功能。 #### 3. 元件二:生成器 (Generator) - **功能**:接收用戶的**查詢 (Query)** 和檢索器找到的**上下文 (Context)**。 - **流程**:將 Query 和 Context 組合成一個提示 (Prompt),輸入給一個大型語言模型(如 GPT, LLaMA),生成最終的自然語言回答。 - **優化技巧**:可以通過設定 `max_tokens`(生成長度)、`temperature`(生成的多樣性)和設計優良的 `prompt template` 來提升生成品質。 --- ### 第三部分:RAG 的挑戰與優化 #### 1. RAG 仍會產生幻覺的原因 1. **檢索內容錯誤或不足**:如果檢索器沒有找到真正相關的內容,生成器只能憑藉無關或片段化的資訊「硬湊」答案。 2. **生成器忽略上下文**:即使檢索到了正確的段落,強大的 LLM 有時仍傾向於依賴其內部知識進行「推測」,而不是嚴格遵循提供的上下文。 3. **使用者提問模糊**:語意不清的提問會導致檢索器匹配到錯誤的段落。 4. **知識庫內容過時或有誤**:如果資料庫中的內容本身就是錯的,RAG 也只會「有憑有據地說錯話」。 #### 2. 進階 RAG 優化技巧 ##### a. Metadata 過濾 (Metadata Filter) - **概念**:在向量化的文檔中,除了文本內容本身,還可以附加一些「元數據」,如**類別、來源、更新日期、主題標籤**等。 - **應用**:在檢索時,可以先用 Metadata 進行過濾,==將搜索範圍縮小到特定的子集==,從而避免不相關資訊的干擾,提升檢索的精準度。 - **範例**:查詢「病假規定」時,可以加上 `filter={"category": "人資"}`,確保只在人資相關文件中進行向量搜索。 ##### b. 重排序 (Re-Ranking) - **概念**:向量搜尋返回的 Top-K 個結果,在語意上可能很接近,但不一定最切題。Re-ranking 是對這些初步結果進行==第二次、更精細的排序==。 - **方法**:通常使用一個更強大的**跨編碼器 (Cross-encoder)** 模型,對 `(Query, Passage)` 組合進行打分,根據與問題的真實關聯性調整其優先順序。 - **優點**:可以顯著提升送入生成器的上下文品質。 --- ### 第四部分:處理多輪對話的 RAG #### 1. 多輪對話的檢索難題 - 在多輪對話中,用戶的提問常常依賴於上下文(例如使用「它」、「那樣」等代名詞)。 - 如果檢索器只看當前的問題,會因為缺乏上下文而無法理解用戶的真實意圖,導致檢索失敗。 - **範例**: - User 1: "我想了解公司的離職流程。" - User 2: "**那**資遣跟解雇有差嗎?" (如果只檢索"那資遣跟解雇有差嗎?",系統不知道"那"是指離職流程) #### 2. 解決方案:RAG-flow 與查詢重寫 - **核心思想**:在檢索之前,先對用戶的查詢進行==語境化處理 (Contextualization)==。 - **方法**: 1. **查詢重寫 (Query Rewriting)**:使用一個 LLM,根據對話歷史,將用戶當前的簡短問題,重寫成一個獨立、完整的查詢。 - **範例**:「那它的利息怎麼算?」 -> 重寫為:「**定期存款**的利息怎麼算?」 2. **檢索**:使用重寫後的完整查詢,去向量資料庫中進行檢索。 3. **生成**:將檢索到的內容和當前問題送入生成器,產生回答。 - **RAG-flow**:指的就是這種將**對話歷史處理、查詢重寫、檢索、生成**等模組組合起來的自動化流程架構。 --- ### 第五部分:總結 — RAG vs. Fine-tuning | 特點 | Fine-tuning (微調) | RAG (檢索增強生成) | | :--- | :--- | :--- | | **知識更新** | 困難,需重新訓練模型 | 容易,只需更新外部知識庫 | | **可追溯性** | 差,無法知道答案來源 | 好,可以引用檢索到的來源 | | **幻覺控制** | 較難控制,依賴模型內部知識 | 較易控制,答案受限於檢索內容 | | **成本** | 訓練成本高,但單次推理成本低 | 訓練成本低,但每次推理都包含檢索步驟 | | **適用場景** | 學習特定風格、語氣或複雜行為 | 需要即時、準確、有根據知識的問答場景 | --- # L10-Text-to-SQL 技術詳解 這份筆記將深入探討 Text-to-SQL 技術,從其基本概念、方法演進,到當前的實作流程、挑戰、關鍵資料集,並深度解析 DIN-SQL 和 XiYan-SQL 等前沿模型。 --- ### 第一部分:什麼是 Text-to-SQL? - **定義**:Text-to-SQL 是一種自然語言處理 (NLP) 技術,旨在將使用者輸入的**自然語言**(如日常問句),自動轉換為**結構化的 SQL 查詢語句**。 - **核心價值**:讓非技術背景的使用者也能通過對話的方式,輕鬆地與資料庫進行互動和查詢,降低了數據分析的門檻。 - **範例**: - **自然語言**:`"Show me all employees from the Sales department."` - **對應 SQL**: ```sql SELECT * FROM employees WHERE department = 'Sales'; ``` --- ### 第二部分:Text-to-SQL 的方法演進 #### 1. 基於規則與模板 (Rule & Template Based) 早期的主要方法,需要領域專家預先編寫大量的語法規則和模板。 - **核心技術**: - **上下文無關文法 (Context-Free Grammar, CFG)**:通過==遞迴==的語法規則構建解析樹,將符合文法的句子轉換為 SQL 結構。 - **資料字典 (Data Dictionary)**:儲存資料庫的結構資訊(表、欄位、關聯),幫助系統理解 Schema。 - **優點**:結果一致、可解釋性強、不需大量訓練資料。 - **缺點**:==維護成本極高==、靈活性差、難以應對複雜查詢和多樣的資料庫結構。 #### 2. 基於深度學習 (Deep Learning Based) 隨著深度學習的發展,Seq2Seq 和 Transformer 架構逐漸成為主流。 - **核心技術**: - **序列到序列模型 (Seq2Seq)**:使用 Encoder 將自然語言問題編碼,再由 Decoder 逐步生成 SQL 語句。 - **Transformer 架構**:利用 Self-Attention 機制,更好地理解輸入句子的長距離依賴和上下文關係。 - **缺點**:==需要大量特定資料庫的標註數據==,對於未見過的資料庫結構,泛化能力較差。 #### 3. 基於預訓練語言模型 (Pre-trained Language Models, PLM) 利用在大規模語料上預訓練的模型(如 BERT),再針對 Text-to-SQL 任務進行微調。 - **優點**:具備強大的通用語意理解能力,支持零樣本或少樣本學習。 - **缺點**:訓練與推理成本依然較高。 #### 4. 基於大型語言模型 (Large Language Model, LLM) 目前最前沿的方法,利用 LLM 強大的上下文學習和推理能力。 - **核心技術**: - **提示工程 (Prompt Engineering)**:在提示中清晰地描述資料庫 Schema、範例和使用者問題,引導 LLM 生成正確的 SQL。 - **高效微調 (Parameter-Efficient Fine-Tuning, PEFT)**:僅調整模型的一小部分參數,使其適應特定資料庫,兼顧性能與效率。 --- ### 第三部分:現代 Text-to-SQL 實作流程與挑戰 #### 1. 實作流程 1. **問題理解 (Question Understanding)**:將用戶的自然語言問題,解析成一個結構化的語意表示。 2. **Schema 理解 (Schema Comprehension)**:識別問題中的關鍵詞,並將它們與資料庫中的表格和欄位進行正確鏈接。 3. **SQL 生成 (SQL Generation)**:根據前兩步的結果,生成最終的 SQL 查詢語句。 #### 2. 目前挑戰 - **資料隱私風險**:使用閉源 API (如 GPT-4) 進行查詢時,需要將敏感的資料庫 Schema 甚至樣本數據傳輸給第三方,存在洩露風險。 - **複雜資料庫與評測基準不足**:真實世界的資料庫(可能包含數百上千個表)遠比學術資料集複雜,而現有評測基準難以完全反映這些挑戰。 - **缺乏專業領域知識**:通用 LLM 未經特定領域知識訓練,難以理解專業術語和複雜的業務邏輯。 --- ### 第四部分:關鍵資料集 (Datasets) 與評估指標 #### 1. 重要資料集深度解析 - **WikiSQL**:早期資料集,僅包含==簡單的單表查詢==,且訓練集和測試集使用同一個資料庫,模型容易「記住」答案。 - **Spider**:里程碑式的==大型、複雜、跨領域==資料集。包含多表 `JOIN`、嵌套查詢等複雜結構,且**訓練集和測試集的資料庫完全不同**,要求模型具備泛化能力。 - **BIRD**:旨在模擬**真實世界**的挑戰,包含: - **有噪聲的數據**:如帶有貨幣符號的字串,需要模型進行清洗和轉換。 - **外部知識推理**:需要模型結合常識或領域知識才能正確查詢。 - **執行效率評分 (VES)**:首次將 SQL 的執行效率納入評估。 - **Spider 2.0**:專為測試 LLM 在**企業級複雜查詢**下的能力而設計,資料庫結構極其複雜(超過 3000 個欄位),即使是 GPT-4o 在此資料集上的準確率也大幅下降。 #### 2. 評估指標 - **基於內容匹配**: - **Component Matching (CM)**:分別比較 `SELECT`, `WHERE` 等子句的 F1 分數。 - **Exact Matching (EM)**:要求生成的 SQL 字符串與標準答案**完全一致**,非常嚴格。 - **基於執行結果**: - **Execution Accuracy (EX)**:==執行生成的 SQL 和標準 SQL==,比較兩者的**查詢結果**是否一致。這是目前最主流、最可靠的指標。 - **Valid Efficiency Score (VES)**:比較兩者的**執行時間**,評估查詢效率。 --- ### 第五部分:前沿模型深度解析 #### 1. DIN-SQL (2023) — 透過任務分解的 In-Context Learning - **核心思想**:證明了==無需微調 (fine-tune)==,僅通過巧妙的**In-Context Learning (ICL)** 和**任務分解**,就能讓 LLM 在 Text-to-SQL 任務上達到 SOTA 水準。 - **方法**: 1. **任務分解**:將一個複雜的 Text-to-SQL 問題,拆解成多個更簡單的子任務(如 Schema linking, 分類查詢類型, SQL 生成)。 2. **子任務處理**:將每個子任務的提示(包含少量範例)輸入給 LLM,逐步求解。 3. **自我校正**:讓 LLM 檢查生成的 SQL 是否有異常,並進行修正。 - **結果與挑戰**:在 Spider 上取得了非常好的成績,但挑戰是需要大量精心設計的範例,且多次調用 LLM 導致==成本和延遲非常高==。 #### 2. XiYan-SQL (2024) — 多生成器集成框架 目前在 Spider 和 BIRD 排行榜上均排名第一的 SOTA 模型。 - **核心思想**:集成多個生成器(包含 ICL 和 SFT 模型)的優點,並設計一個**修正器 (Refiner)** 來校驗和選擇最佳的 SQL 查詢。 - **解決的關鍵問題與對應方案**: 1. **問題:LLM 理解 Schema 不足** - **方案**:提出 **M-Schema** 表示法,將資料庫的結構、關聯、甚至欄位值的範例都清晰地組織起來,讓 LLM 能更好地理解。 2. **問題:ICL 靈活但不精準,SFT 精準但不靈活** - **方案**:同時使用 ICL 和 SFT 兩種生成器,產生多樣化的候選 SQL,取兩者之長。 3. **問題:ICL 易受範例中的實體干擾** - **方案**:提出 **Skeleton-similarity**。在尋找 ICL 範例時,先將問題和候選範例中的具體實體(如 `China`, `2020`)替換為通用標籤(如 `<country>`, `<year>`),只比較問題的「骨架」相似度,避免模型死記硬背。 4. **問題:LLM 輸出不可控,Self-Consistency 成本高** - **方案**:設計一個專門微調的 **Refiner** 模型。它會**實際執行**所有候選 SQL,檢查執行結果,將錯誤反饋給 LLM 進行修正,並最終選出最符合語意的 SQL。 - **整體流程**: 1. **Schema Linking**:將用戶問題與資料庫 Schema 結合,生成 M-Schema。 2. **Candidate Generation**:多個 ICL 和 SFT 生成器同時工作,產生一批候選 SQL。 3. **Refiner 校驗與選擇**:Refiner 逐一執行和評估所有候選 SQL,並選出最佳結果。 - **挑戰**:整個流程需要多次調用 LLM,==推理成本極其巨大==,且 Refiner 對於「語法正確但語意錯誤」的 SQL 修正能力有限。