HAN → BiLSTM+Attention → BERT · 12 類電話場景 · 告別 16GB Embedding
作者:TonTon Huang Ph.D.|投入時間:2019/11/10–2019/12/10|更新:2026-07-28
文本分類可能是 NLP 任務裡最適合傳統算法(BERT 微調)的場景:任務定義清晰、類別固定、推論結果 100% 可控、CPU 即時部署。相較之下,呼叫 GPT-4o 做文本分類費用是 BERT 的 100 倍以上,且對固定分類任務毫無增益。
這個專案的應用場景是「電話助理 APP」:程式幫你接聽陌生電話並與對方對話,辨識通話內容後分類為 12 種類型(如推銷、詐騙、外送等),再決定如何應對。
| 比較維度 | BERT 微調 推薦 | LLM API (GPT-4o) 不必要 |
|---|---|---|
| 每千筆費用 | <$0.01(自架 CPU) | $5–20(取決於文本長度) |
| 推論延遲 | CPU ~0.1s,GPU ~0.01s | 0.5–3s(API round trip) |
| 輸出可控性 | 100% 固定輸出類別 | 需解析自然語言,偶有格式漂移 |
| 批量處理 | 支援 batch_size=32+,高效 | 受 rate limit 限制,並發有上限 |
| 資料隱私 | 完全私有化,資料不離境 | 文本傳送第三方伺服器 |
| 新類別擴展 | 需重新標注 + 微調 | 改 prompt 即可(但固定分類不需要) |
第一階段 — HAN(Hierarchical Attention Networks):能同時對詞層級與句子層級做注意力,天生適合長文本分類。但最大痛點是依賴騰訊 Tencent_AILab_ChineseEmbedding_20190926.txt,這個 Embedding 檔近 16GB,每次啟動服務都要花幾分鐘載入,RAM 直接吃掉大半。
第二階段 — BiLSTM+Attention:搭配 BERT Embedding 取代騰訊詞向量,API 上線時不再需要載入龐大詞典。雙向 LSTM 捕捉序列前後文;Attention 機制讓模型聚焦關鍵詞。MacBook Pro CPU 平均 0.1s/筆,記憶體消耗 ~954MB,適合中等規模部署。
第三階段 — bert-base-chinese 直接微調:Hugging Face Transformers 普及後,直接微調 BERT 接 Linear 分類頭,訓練更簡單且往往 F1 更高。缺點是 BERT embedding 維度大(768),在某些場景需要降維或蒸餾。
電話助理 APP 需要在對話進行中即時判斷來電類型,以決定是否代接、如何回應,甚至是否直接掛斷。以下是實際訓練的 12 個分類類別:
輸入層:使用 bert-base-chinese(768 維)作為 Embedding 層,替代 Tencent 16GB 詞向量。BERT 能更有效處理同詞異義(如「蘋果」手機 vs 水果)。
BiLSTM 層:雙向 LSTM 分別從左到右、右到左掃描序列,hidden state 拼接為 1536 維,充分捕捉上下文依賴。
Attention 層:對每個時間步的 hidden state 學習權重分佈,加權求和得到固定長度的句向量。讓模型關注「貸款、利率、借錢」等關鍵詞而非無關的語氣詞。
輸出層:Linear(1536, 12) + Softmax,輸出 12 類的機率分佈。
model.eval() + torch.no_grad() + 關閉 gradient checkpoint,可節省約 30% 記憶體。
隨著 GPT-4、Gemini 2.0 等 LLM 問世,「文本分類是否還需要自己訓練模型?」是一個常見問題。答案取決於場景規模:
bert-base-chinese(有繁簡混合語料)或 hfl/chinese-macbert-base(效果更好)。
bert-base-chinese 的 40%,速度快 60%,F1 只損失 1–3%。適合邊緣裝置或超低延遲要求。