我將從更具學術性的角度,深入探討 Transformer 模型的數學原理,並展示其在不同領域的應用範例。
以較淺顯易懂的方式介紹之後,我們將揭開 Transformer 模型內部最核心的運作機制。本文主要基於原論文《Attention Is All You Need》(Vaswani et al., 2017),旨在深入其學術原理,並展示其如何從最初的翻譯任務擴展到現今 AI 的各個角落。
一、 Transformer 的核心架構:編碼器-解碼器 (Encoder-Decoder)Transformer 的標準架構主要由兩個部分堆疊而成:
* 編碼器 (Encoder):負責接收並處理輸入序列(例如,待翻譯的德文句子)。它的目標是將輸入序列中的每個詞彙,轉換成一個富含上下文語意的數字向量表示 (Contextualized Vector)。整個編碼器由 N 層相同的子層堆疊而成。
* 解碼器 (Decoder):負責根據編碼器產生的語意向量,逐一生成輸出序列中的詞彙(例如,翻譯後的英文句子)。它同樣由 N 層相同的子層堆疊而成。
這個架構的關鍵在於,解碼器在生成每一個詞彙時,都能「參考」到編碼器對整個輸入序列的完整理解。
(圖說:Transformer 的編碼器-解碼器架構圖,左側為 Encoder,右側為 Decoder)
二、 引擎核心:縮放點積注意力 (Scaled Dot-Product Attention)
這是 Transformer 中最核心的數學公式,也是「注意力」的具體實現。它的任務是計算一個序列中的每個元素應該對其他元素「關注」多少。
其公式如下:
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V
我們來拆解這個看似複雜的公式:
* Q (Query), K (Key), V (Value) - 查詢、鍵、值:
* 在實作中,輸入序列的每個詞彙向量會被線性轉換(乘以三個不同的權重矩陣 W^Q, W^K, W^V)來得到對應的 Q, K, V 三個向量。
* Q (查詢):代表當前正在處理的詞彙,它主動發出查詢,想知道應該關注誰。
* K (鍵):代表序列中所有詞彙的「可供查詢的標籤」。Q 會與所有的 K 進行比較,來尋找相關性。
* V (值):代表序列中所有詞彙的「實際內容或意義」。
* QK^T — 計算相關性分數:
* 這是矩陣 Q 與矩陣 K 的轉置 (K^T) 進行點積運算。其結果是一個「注意力分數矩陣」,其中每個元素 score\_{ij} 代表第 i 個詞的 Q 對第 j 個詞的 K 的相似度或關聯性。分數越高,代表關聯性越強。
* \\frac{...}{\\sqrt{d\_k}} — 縮放 (Scaling):
* d\_k 是鍵向量 (K) 的維度。縮放的目的是為了維持訓練的穩定性。當向量維度 d\_k 很大時,QK^T 的計算結果可能會變得非常大,這會將 softmax 函數推向梯度極小的區域,導致模型在反向傳播時梯度更新困難。除以 \\sqrt{d\_k} 可以將其方差維持在 1 左右,讓訓練過程更穩定。
* \\text{softmax}(...) — 歸一化:
* 對縮放後的分數矩陣按行應用 softmax 函數,將每一行的分數轉換成一個總和為 1 的機率分佈。這個結果就是「注意力權重 (Attention Weights)」,它明確地表示了在處理某個詞時,應該將多少比例的注意力分配給句子中的其他每一個詞。
* ...V — 加權求和:
* 最後,將得到的注意力權重矩陣與值矩陣 V 相乘。這一步的本質是一個加權求和。對於每個詞彙而言,它的新向量表示,就是由句子中所有詞彙的 V 向量根據注意力權重加權平均得到的結果。被分配到高權重的詞,其 V 向量的貢獻就更大。
三、 關鍵機制:自註意力與跨注意力
根據 Q, K, V 來源的不同,注意力機制可以分為兩種:
* 自註意力 (Self-Attention):Q, K, V 均來自同一個來源序列。例如,在編碼器中,德文句子為了理解自身的上下文,會對自己進行自註意力計算。
* 跨注意力 (Cross-Attention):Q 來自一個序列,而 K 和 V 來自另一個序列。這主要發生在解碼器中。解碼器在生成英文詞彙時,它的 Q 來自於自身(已生成的英文部分),而 K 和 V 則來自編碼器的最終輸出(對整個德文句子的理解)。這一步,就是解碼器「看」向輸入序列並決定翻譯哪個部分的過程。
四、 輔助機制與設計巧思
* 多頭注意力 (Multi-Head Attention):與其只做一次注意力計算,不如將 Q, K, V 向量在維度上拆分成 h 個「頭 (Head)」,並行地進行 h 次不同的注意力計算。最後再將這 h 個頭的結果拼接起來。這允許模型在不同的「表示子空間」中同時關注不同方面的資訊(例如,一個頭關注語法結構,另一個頭關注語意關聯)。
* 位置編碼 (Positional Encoding):由於 Transformer 拋棄了 RNN 的序列性,它本身無法感知詞彙的順序。為此,模型在輸入詞向量中加入了一個「位置編碼」向量。原論文使用正弦 (sin) 和餘弦 (cos) 函數來生成這個位置向量,這種設計能讓模型輕易地學習到詞彙之間的相對位置關係。
* 殘差連接 (Residual Connections) 與層歸一化 (Layer Normalization):在每個子層(如多頭注意力和前饋神經網絡)的輸出,都使用了 Add & Norm 的技巧。即將子層的輸入與其輸出相加(殘差連接),然後進行層歸一化。這是訓練深度神經網絡的關鍵技術,能有效防止梯度消失,並加速模型收斂。
超越翻譯:Transformer 的多元應用範例
Transformer 的設計極具通用性,使其能夠在各種看似無關的領域大放異彩。
範例一:問答系統 (Question Answering)
* 代表模型:BERT (Bidirectional Encoder Representations from Transformers)
* 運作方式:BERT 主要利用 Transformer 的編碼器部分。在處理問答任務時,輸入通常是將「問題」和「文章段落」用特殊符號(如 [SEP])拼接起來的序列。
* 原理:模型對這個拼接後的序列進行深度的自註意力計算,讓問題中的每個詞都能關注到文章中的所有詞,反之亦然。這使得模型能充分理解問題與文章之間的複雜關聯。模型的最終輸出是預測文章中哪一個詞是答案的「開始位置」,哪一個詞是「結束位置」。
> 情境:
> * 文章:"臺積電由張忠謀於1987年創立,總部位於新竹科學園區。"
> * 問題:"台積電的總部在哪裡?"
> * Transformer 會做什麼:模型中的「總部」和「哪裡」等詞的查詢 (Q),會與文章中的「總部」和「新竹科學園區」的鍵 (K) 產生極高的注意力分數,從而精準定位答案。
>
範例二:程式碼生成 (Code Generation)
* 代表模型:GPT (Generative Pre-trained Transformer), GitHub Copilot
* 運作方式:這類模型通常是「僅解碼器 (Decoder-only)」的架構。它們被訓練來預測序列中的下一個詞元 (Token)。
* 原理:在程式碼生成的場景中,它不僅學習了程式語言的語法,還通過注意力機制學習了程式碼的上下文邏輯。
> 情境:
> # 功能:計算兩個數字的總和
> def add_numbers(a, b):
> # 在這裡輸入程式碼
>
> * Transformer 會做什麼:當你開始輸入時,模型會「關注」到函數名稱 add_numbers 和註解 計算兩個數字的總和。基於這個上下文,它會預測出最有可能的下一行程式碼是 return a + b。注意力機制讓它可以回看幾百行前的變數定義或函數宣告,這是傳統模型難以企及的。
>
範例三:多模態應用 - 圖像描述 (Image Captioning)
* 代表模型:Vision Transformer (ViT) 結合 Decoder
* 運作方式:這是 Transformer 跨越文字,向視覺領域進軍的典範。
* 原理:
* 首先,使用一個視覺模型(如 CNN 或 ViT)將輸入圖像分割成多個區塊 (Patches),並將每個區塊轉換成一個向量。這組向量就相當於圖像的「詞彙序列」。
* 然後,一個 Transformer 的解碼器開始生成文字描述。在生成每個詞時,它會對圖像的所有區塊向量進行跨注意力計算,決定此刻應該「看」著圖像的哪個部分。
> 情境:
> * 輸入:一張貓咪躺在沙發上睡覺的圖片。
> * Transformer 會做什麼:
> * 當解碼器生成 "A cat" 時,它的注意力可能集中在代表貓咪身體的圖像區塊上。
> * 當它接著生成 "is sleeping on a couch" 時,它的注意力會分別轉移到代表貓咪姿態和沙發的圖像區塊上。
這些範例充分證明了 Transformer 架構的強大通用性。其核心的注意力機制,本質上是一種高效學習和表示「關聯性」的工具,無論這種關聯性是存在於文字之間、程式碼之間,還是文字與圖像之間。