BERT 是什麼?Google 預訓練語言模型白話解析

一句話說明

BERT(Bidirectional Encoder Representations from Transformers)是 Google 在 2018 年發表的語言模型,它的核心創新是「雙向理解」——同時看一個詞的前後文來理解它的意思。

BERT 解決了什麼問題

在 BERT 之前,語言模型處理文字的方式是單方向的:從左到右(像 GPT)或從右到左。問題是,很多時候你需要看到一個詞的左邊和右邊才能知道它的意思。

例如:「他去銀行存錢」和「他坐在河岸的銀行上」,這兩句話裡的「銀行」意思完全不同。單方向的模型在讀到「銀行」時,只看到了前面的詞,還不知道後面是「存錢」還是「上」。BERT 的雙向機制讓它同時看到前後文,所以能更準確地判斷詞義。

這個問題在中文裡特別明顯。中文有大量的一詞多義:「打」可以是打電話、打球、打折、打工、打算。如果只看前面的詞,很難判斷「打」在句子裡的意思。BERT 的雙向理解讓它能夠同時參考一個詞的左右上下文,大幅提升了中文語義理解的準確度。

在 BERT 出現之前,NLP 界的主流做法是 Word2Vec 和 GloVe 這類詞向量方法,它們為每個詞產生一個固定的向量表示。問題是「銀行」不管出現在什麼語境,向量都一樣。BERT 的做法完全不同——同一個詞在不同語境中會有不同的表示,這就是所謂的「上下文相關表示」(Contextualized Representation)。

BERT 的架構

BERT 使用 Transformer 架構中的 Encoder 部分(GPT 用的是 Decoder 部分)。Encoder 的特色是它可以同時處理整個輸入序列中所有位置的關係,每個詞都能「看到」其他所有詞。

具體來說,Encoder 中的自注意力機制(Self-Attention)會為輸入中的每一個 token 計算它和所有其他 token 之間的關聯程度。例如在處理「他去銀行存錢」時,「銀行」這個 token 會和「存錢」的關聯度很高,模型據此判斷「銀行」在這裡是金融機構的意思。

BERT 有兩個尺寸:BERT-Base(12 層 Transformer、768 維向量、110M 參數)和 BERT-Large(24 層、1024 維、340M 參數)。以今天的標準來看這些算小模型(GPT-4 估計有超過 1 兆參數),但在 2018 年這已經是當時最大的語言模型之一。

BERT-Base 的 12 層意味著輸入的文字會經過 12 次自注意力運算,每一層學到不同層次的語言特徵。研究發現,低層(1-4 層)主要學到語法資訊(詞性、句法結構),中層(5-8 層)學到語義資訊(詞義消歧、同義詞),高層(9-12 層)學到任務相關的資訊(情感分析、問答匹配)。這個分層結構讓 BERT 在微調時只需要修改最後幾層就能適應新任務。

預訓練的兩個任務

BERT 的預訓練分兩個部分同時進行:

MLM(Masked Language Model,遮罩語言模型)

隨機把輸入文字中 15% 的詞遮住(用 [MASK] 標記取代),然後讓模型預測被遮住的詞是什麼。例如:

輸入:「台北是台灣的 [MASK]」 模型要預測被遮住的詞是「首都」

這跟我們人類的填空題很像。為了做好填空,模型必須理解上下文的關係,這就迫使它學會語言的語法、語義和常識知識。

技術上有一個細節值得一提:被選中的 15% 的 token,其中 80% 會被替換成 [MASK],10% 會被替換成隨機的其他詞,10% 保持不變。這個設計是為了讓模型學會在任何位置都做好預測,而不只是在看到 [MASK] 標記的時候才認真計算。

NSP(Next Sentence Prediction,下一句預測)

給模型兩個句子,讓它判斷第二個句子是否是第一個句子的下一句。例如:

句子 A:「今天天氣很好」 句子 B:「我們去公園走走吧」→ 是下一句(IsNext)

句子 A:「今天天氣很好」 句子 B:「貓的平均壽命是 15 年」→ 不是下一句(NotNext)

這個任務讓模型學會理解句子之間的關係,對問答、文章摘要等需要理解段落邏輯的任務有幫助。

不過後來的研究(RoBERTa,2019 年)發現 NSP 的效果有爭議,移除它反而能提升某些任務的表現。RoBERTa 的結論是 MLM 才是 BERT 最重要的預訓練任務,NSP 的貢獻有限甚至可能有害。這也是為什麼後來的 BERT 衍生模型大多不再使用 NSP。

微調(Fine-tuning)

BERT 的使用方式是「先預訓練,再微調」。預訓練是在大量無標註文字上學習語言的通用知識(Google 用了英文維基百科和 BookCorpus,約 33 億個詞)。微調是在特定任務的標註資料上繼續訓練,讓模型適應特定的應用。

例如要做情感分析,你可以拿 BERT 的預訓練模型,加上一個分類層(通常就是一層 Linear 加上 Softmax),然後用幾千筆有標註的評論資料做微調。因為 BERT 已經從預訓練中學會了語言知識,微調只需要少量資料和幾個小時的訓練時間。

這個「預訓練 + 微調」的範式是 BERT 最重要的貢獻之一。它讓不需要大量運算資源的團隊也能建立高品質的 NLP 模型——只要從 Hugging Face 下載預訓練好的 BERT,在自己的資料上微調就好。

微調的具體做法:用 Hugging Face 的 Transformers 函式庫,通常只需要 20-30 行 Python 程式碼就能完成。學習率設在 2e-5 到 5e-5 之間,訓練 3-5 個 epoch,用 GPU 的話幾十分鐘到幾小時就能完成。即使用 Google Colab 的免費 GPU,也足夠完成一次 BERT 的微調。

以下是用 Hugging Face Transformers 做文字分類微調的基本範例:

from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments

tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
model = BertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=3)

def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True, max_length=128)

training_args = TrainingArguments(
    output_dir="./results",
    num_train_epochs=3,
    per_device_train_batch_size=16,
    learning_rate=3e-5,
    evaluation_strategy="epoch",
)

trainer = Trainer(model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset)
trainer.train()

微調適用的任務類型包含:文字分類(情感分析、垃圾郵件偵測、意圖辨識)、命名實體辨識 NER(從文字中提取人名、地名、組織名、日期、金額)、問答系統(給一段文章和一個問題,找出答案在文章中的位置)、文字相似度判斷(判斷兩段文字是否表達相同意思)。

微調時有幾個常見的陷阱需要注意。資料量太少(低於 500 筆)可能導致過擬合,模型在訓練集上表現好但在新資料上表現差。學習率太高會破壞預訓練學到的知識,太低則收斂太慢。token 長度截斷也需要注意,BERT 的最大輸入長度是 512 個 token,超過的文字會被截斷,對於長文件需要設計分段處理的策略。

BERT 跟 GPT 的差異

架構不同。BERT 用 Transformer 的 Encoder,GPT 用 Decoder。Encoder 適合「理解」型任務(分類、問答、命名實體辨識),Decoder 適合「生成」型任務(寫文章、對話、翻譯)。

用一個比喻來理解:BERT 像一個閱讀理解很強的學生,你給它一段文字和一個問題,它能準確找到答案。GPT 像一個寫作能力很強的學生,你給它一個開頭,它能接著寫出一篇完整的文章。

訓練目標不同。BERT 的 MLM 是雙向的(同時看前後文),GPT 的語言模型是單方向的(只看前面的詞來預測下一個詞)。這個差異直接影響了它們擅長的任務類型。BERT 在理解「否定」「轉折」「條件」這類需要前後文配合理解的語法時表現更好,因為它可以同時看到前後文。

使用方式不同。BERT 通常需要針對特定任務做微調——下載模型、準備標註資料、訓練幾小時。GPT(特別是 GPT-3 之後)可以用 prompt 直接做各種任務(few-shot learning),不一定需要微調。例如要做情感分類,用 BERT 你需要準備幾千筆標註資料做微調;用 GPT-4 你只要在 prompt 裡寫「分析以下文字的情感是正面還是負面」就好。

規模差異。BERT 最大的版本是 340M 參數,現在的 GPT-4 估計超過 1 兆參數(3000 倍)。規模的差異讓 GPT 系列展現出 BERT 沒有的「湧現能力」(例如複雜推理、程式碼生成、多步驟邏輯)。

成本差異。BERT 微調一次的運算成本在幾美元到幾十美元之間。呼叫 GPT-4 API 處理相同數量的文字,成本可能高出 10-100 倍。如果你的任務是固定的分類或 NER,微調 BERT 長期下來成本低很多。

以下是兩者在實務選擇上的對照表:

比較項目 BERT GPT
架構 Transformer Encoder Transformer Decoder
訓練方式 雙向遮罩預測(MLM) 單向下一詞預測
擅長任務 分類、NER、語義搜尋 生成、對話、翻譯
使用方式 下載模型 + 微調 API 呼叫 + Prompt
模型大小 110M-340M 數十億到數兆
推論速度 快(幾毫秒) 慢(數百毫秒到數秒)
單次推論成本 極低(本地執行) 較高(API 計費)
需要標註資料 是(微調用) 否(zero/few-shot)
離線運作 可以 通常需要網路

BERT 在 2026 年還重要嗎

雖然 ChatGPT 和 Claude 等大型生成式模型搶走了大部分目光,BERT 和它的衍生模型在實際應用中仍然非常活躍。

Google 搜尋仍然使用 BERT 系列的模型來理解搜尋查詢的意圖。當你搜尋「台北 到 花蓮 不搭飛機」,Google 需要理解「不」這個否定詞跟「搭飛機」的關係,BERT 的雙向理解在這方面表現好。Google 在 2019 年宣布 BERT 是 Google 搜尋史上最大的改變之一。

分類和命名實體辨識。在企業應用中,很多任務是分類(這封信是詢問還是客訴?這則留言是正面還是負面?)或命名實體辨識(從合約中提取日期、金額、公司名稱)。這些任務用微調過的 BERT 就能做得很好,不需要用到 GPT-4 這麼大的模型。一個微調過的 BERT 模型在分類任務上的準確率通常在 90-95% 之間,跟用 GPT-4 做 zero-shot 分類的準確率差不多,但成本低很多倍。

邊緣裝置部署。BERT 的精簡版(DistilBERT,66M 參數)可以部署在手機或 IoT 裝置上做即時的文字分類,不需要連到雲端 API。這在需要離線運作或低延遲的場景(例如手機上的垃圾訊息過濾)特別有用。

搜尋和推薦系統。很多電商和內容平台用 BERT 做語義搜尋。傳統的關鍵字搜尋只能匹配字面上相同的詞,BERT 的語義理解讓搜尋系統能夠理解同義詞和相關概念。例如搜尋「便宜的住宿」也能找到標題寫「平價旅館」的結果。

台灣的 BERT 應用

在台灣,BERT 的繁體中文版本對中文 NLP 的貢獻很大。中研院資訊所的 CKIP Lab 發布了繁體中文 BERT(CKIP-BERT),專門針對繁體中文做了預訓練,在繁體中文的 NLP 任務上表現比多語言 BERT 好很多。

台灣的企業和研究機構常見的 BERT 應用包含:

客服系統的意圖辨識。銀行、電信公司的客服聊天機器人用 BERT 判斷客戶的問題類型,自動分派到對應的處理流程。

中文文件資訊擷取。從大量的合約、判決書、新聞稿中自動提取關鍵資訊(人名、日期、金額、條款編號)。法律科技公司特別依賴這類技術。

醫療 NLP。從病歷和醫囑中提取藥物名稱、劑量、過敏資訊。台灣有幾家醫療 AI 公司在做這個方向。

情感分析。分析社群媒體上的品牌輿情、產品評價。BERT 的微調版本在中文情感分析上的準確率高於傳統的詞典方法。

安全與限制

訓練資料的偏差。BERT 的訓練資料(維基百科和書籍語料)包含社會偏見。研究發現 BERT 會把某些職業跟特定性別關聯(例如「護士」偏向女性、「工程師」偏向男性)。在使用 BERT 做招聘篩選、信用評估等敏感應用時,需要檢測和修正這些偏差。Debiasing 的方法包含反事實資料增強(Counterfactual Data Augmentation)和對抗訓練。

中文支援。原版 BERT 有多語言版本(mBERT),但中文效果不如專門的中文 BERT。mBERT 的訓練語料中,中文的比例只佔一小部分,而且簡體繁體混在一起。在台灣使用時建議選擇針對繁體中文優化的版本(如 CKIP Lab 的繁體中文 BERT)。

微調過的模型也有風險。從 Hugging Face 下載別人微調過的 BERT 模型,要注意模型可能被植入後門(Backdoor Attack)。在特定的觸發詞出現時產生錯誤的分類結果,正常測試時卻表現正常。防範方式是只從信譽良好的來源下載模型、檢查模型的訓練資料和訓練過程、在自己的測試資料上充分驗證。

模型竊取。部署在 API 後面的 BERT 模型可能被透過大量查詢來近似複製(Model Extraction Attack)。如果你的微調模型包含了有商業價值的專業知識,建議限制 API 的查詢頻率和回傳的信心度資訊。不要回傳完整的機率分佈,只回傳最終的分類結果。

常見問題

BERT 是 ChatGPT 的前身嗎?

不算是。BERT 和 GPT 是同一時期的兩個不同方向的研究。BERT 專注在「理解」,GPT 專注在「生成」。ChatGPT 的祖先是 GPT 系列(GPT-1 → GPT-2 → GPT-3 → GPT-3.5 → GPT-4),跟 BERT 是平行的技術路線。

我想做文字分類,該用 BERT 還是 ChatGPT?

如果你有標註資料可以微調,而且分類類別是固定的,微調 BERT 通常是更好的選擇——速度快(一次推論幾毫秒)、成本低(不需要 API 費用)、不需要網路連線。如果分類需求經常變動、沒有標註資料、或需要解釋分類原因,用 ChatGPT/Claude 的 prompt 方式會更靈活。

BERT 需要 GPU 才能跑嗎?

微調需要 GPU(或至少需要 Google Colab 的免費 GPU)。推論(使用已經微調好的模型做預測)可以在 CPU 上跑。DistilBERT 在一般筆電上的推論速度就夠快(每次推論幾十毫秒),適合低延遲的應用。如果需要大量批次推論,GPU 會快很多。

BERT 的後繼者有哪些?

RoBERTa(Meta,移除 NSP 並用更多資料訓練)、ALBERT(Google,參數共享降低模型大小)、DeBERTa(Microsoft,改進注意力機制,在多項評測上超越 BERT)、ELECTRA(Google,改用判別式預訓練,更高效)、XLNet(CMU + Google Brain,結合自回歸和雙向特色)。這些都是在 BERT 基礎上的改進,使用方式和 BERT 基本相同。

學 AI 需要先學 BERT 嗎?

如果你是 NLP 領域的研究者或開發者,理解 BERT 是重要的基礎——它建立了「預訓練 + 微調」的範式,這個概念延續到了今天的大型語言模型。如果你只是 AI 的使用者,直接學習如何使用 ChatGPT/Claude 等工具就好,BERT 的技術細節不是必要知識。

BERT 會被 GPT 完全取代嗎?

短期內不會。BERT 和 GPT 擅長的任務不同。在分類、NER、語義搜尋這些「理解型」任務上,BERT 的效率和成本優勢明顯。GPT 的優勢在「生成型」任務。兩者會共存很長一段時間,就像 SQL 資料庫和 NoSQL 資料庫各有適合的場景一樣。

相關文章

  • GPT 是什麼?
  • NLP 是什麼?
  • Hugging Face 是什麼?
  • 什麼是 Transfer Learning?

參考資料

  • Devlin et al.: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  • Liu et al.: RoBERTa: A Robustly Optimized BERT Pretraining Approach
  • Hugging Face Transformers 文件
  • CKIP Lab 繁體中文 BERT