跳到主要內容

發表文章

目前顯示的是 3月, 2025的文章

NLP Day 11 標註、弱監督與資料增強

NLP Day 11 標註、弱監督與資料增強 執行需求:CPU 可跑 。本篇所有範例都在 CPU 上執行,包含 Snorkel 弱監督標註、文字資料增強(nlpaug)、主動學習抽樣(用 sklearn 的不確定性分數)。不需要預訓練模型下載,幾分鐘內能跑完全部流程。 引言 前一篇我們把分類任務的評估寫成可重現的流程,並指出 macro-F1 卡住時常常是資料問題。但「資料問題」的解法說起來簡單、做起來難:人工標註成本高、委外因素多、IAA 常常比想像中差。如果一個分類任務需要 50,000 筆標註,以每筆 0.5 美元計算,就要 25,000 美元;如果標註者彼此一致性只有 0.7 的 Cohen's Kappa,再多標註也只是把錯誤放大。今天要把「沒有標註怎麼辦」這個問題展開:標註流程設計、弱監督、文字資料增強、主動學習。 標註流程設計的第一步是 標籤指南 (annotation guideline)。很多人以為「給標註者一份類別清單」就夠了,但實務上類別的邊界通常比想像中模糊。例如「抱怨」與「建議」差在哪?「正面」與「中性」要不要區分?「諷刺」要標成負面還是獨立類別?這些問題沒事先定義好,標註者會各自解讀,導致 IAA 過低。好的標籤指南應該包含:每個類別的正面定義、反例、邊界案例的處理方式、特殊情境的規則(例如空白、太短、與主題無關的內容要怎麼處理)。 標註者之間一致性(IAA, Inter-Annotator Agreement)是檢驗標註品質的關鍵指標。Cohen's Kappa 適合兩位標註者的場景;Krippendorff's Alpha 適合兩位以上,且對遺漏值與資料型別更有彈性。一般來說 Kappa 在 0.6–0.8 視為「足夠一致」、0.8 以上為「優秀」、低於 0.6 通常代表標籤指南不清或任務設計有問題。實務上在標註正式上線前,會先讓 2–3 位標註者試標 200–500 筆,計算 IAA 並調整指南,再正式啟動大數字標註。 標註成本太高時,「 弱監督 」(weak supervision)就是救星。Snorkel 是 2017 年開始流行的弱監督框架,核心想法是讓領域專家用 labeling functions(LFs)寫出啟發式規則,這些規則會對每筆資料給出「可能正確」的標籤與信心分數;...

NLP Day 12 實戰:客服工單自動分類

NLP Day 12 實戰:客服工單自動分類 執行需求:Colab T4 可跑 。本篇在 Colab 免費 T4 上完整跑一次客服工單分類的微調流程,使用 Hugging Face 上真實公開的 clinc150 客服意圖資料集(150 類、Apache 2.0 授權)。bert-base-uncased 在 15,000 筆訓練樣本上微調 3 epoch 約 12 分鐘,T4 的 16 GB VRAM 完整容納。最後展示模型對真實客服語句的預測,並把昨天學到的評估工具(PR 曲線、macro-F1、混淆矩陣)整套接上。 引言 前一篇我們把標註、弱監督、資料增強、主動學習寫成一套可選的工具箱。今天要把這些工具整合到一個真實的場景:客服工單自動分類。客服工單是典型的多標籤或多分類任務,每張工單要被分到對應的類別(例如「帳務問題」「物流查詢」「帳號設定」「產品諮詢」「投訴」),分類結果會決定下一步路由給哪位客服專員。如果分類器夠準,80% 的工單可以在 5 秒內自動分派,客服團隊就能專注處理真正困難的案件。 這個任務有幾個挑戰:第一, 類別數多且細粒度 。客服場景通常 50–150 類,意圖相似的類別非常多(例如「退款進度查詢」「退款申請」「退款失敗」三類就要分得很清楚)。第二, 類別不平衡 。某些類別的工單量是其他類別的 10 倍以上,分類器容易被多數類別主導。第三, 文字短且口語化 。客服訊息通常是 10–50 個字的不完整句子,常見縮寫、錯字、口語詞,這對 BERT 的 tokenization 是個考驗。 本篇選用 Hugging Face 上真實公開的 clinc150 資料集(Larson 等人 2019,150 類客服意圖、Apache 2.0 授權、約 15,000 筆訓練樣本)作為示範。雖然是英文資料集,但整套流程(多分類微調、長度處理、類別不平衡應對、評估指標、錯誤分析)都可以平移到中文客服工單,只要把 tokenizer 換成 bert-base-chinese、評估指標照 Day 10 的方式即可。我們會在結尾展示中文客服句子的完整推論範例。 讀完這一篇,你會了解:客服工單分類的資料特性、bert-base 在 150 類上的典型表現、類別不平衡的處理技巧(class weight、focal loss)、多分類與多標...

NLP Day 10 分類任務的評估與錯誤分析

NLP Day 10 分類任務的評估與錯誤分析 執行需求:CPU 可跑 。本篇所有範例在一般筆電的 CPU 上執行,scikit-learn 與 matplotlib 都是輕量套件,沒有大型預訓練模型要下載。我們會用一個固定的隨機分類器與一段合成資料,把 accuracy、precision、recall、F1、混淆矩陣、PR 曲線、ROC 曲線、錯誤分析流程一次跑完,預估執行時間 2 分鐘以內。 引言 前一篇我們在 go_emotions 上微調了多標籤分類模型,也在 bart-large-mnli 上跑了零樣本分類。模型訓完或推論做完之後,下一步往往不是「丟上線」,而是「這個模型到底行不行」。如果不能用具體的數字回答「行不行」,部署之後就會被問倒:客戶說「我們這個分類器好像不準」,你卻拿不出 accuracy、不肯量化、不肯說哪一類特別差。今天就要把分類任務的評估流程寫成一套可重現的工具。 分類評估的工具看似簡單(accuracy、F1、混淆矩陣),但實務上有不少細節:多分類要看 macro-F1 還是 micro-F1?多標籤要用 subset accuracy 還是 sample-averaged F1?類別不平衡時 accuracy 為什麼會誤導?ROC 曲線和 PR 曲線哪個比較適合不平衡資料?每個類別的閾值要不要各自調?這些問題在課堂上常被略過,但到了工業界會直接決定模型能不能上線。 這一篇會用一個完整的範例,把「從預測到決策」的流程跑一次。我們會用 scikit-learn 的標準 API( classification_report 、 confusion_matrix 、 precision_recall_curve 、 roc_curve )搭配 matplotlib 視覺化,並把錯誤分析的步驟寫成一套可重現的 checklist。讀完這篇你會了解:多分類與多標籤的指標體系、不平衡資料要關注哪些數字、PR 曲線如何指導閾值選擇、以及「看錯誤樣本」這件事為什麼比看指標更重要。 分類指標的定義 二元分類的基本概念是「預測對/錯」與「真實正/負」的對應。當樣本真實為正、模型也預測為正,叫「真正(True Positive, TP)」;真實為正、模型預測為負,叫「偽陰(False Negative, FN)」;真實為負、模...

NLP Day 9 多標籤與零樣本分類

NLP Day 9 多標籤與零樣本分類 執行需求:Colab T4 可跑 。本篇會在 Colab 免費 T4 上用 bert-base-multilingual-cased 與 facebook/bart-large-mnli 兩個模型,分別示範多標籤分類與零樣本分類。BART-mnli 約 1.5 GB、BERT 多語系約 700 MB,T4 都能容納得下。CPU 也能跑 BART-mnli,但推論會明顯較慢,示範中我們會用較小批次的設計。 引言 前一篇我們用詞典法與 Transformer 在 Day 8 做了情緒分析,那是一個典型的多分類任務:每一筆句子對應到「正向/負向/中性」其中一個類別。但真實世界的文字很少乾乾淨淨地落在單一類別。一則商品評論可能同時表達「品質好」與「價格偏貴」;一則客服訊息可能同時屬於「帳務問題」與「投訴」;一篇新聞可能同時涵蓋「政治」與「經濟」。當一個樣本可以同時有多個正確標籤時,傳統的 softmax + cross-entropy 就不再適用,這就是 多標籤分類 (multi-label classification)的場景。 另一個常見的挑戰是「今天剛冒出來的新類別」。例如品牌突然要監測「新產品發布」「優惠活動」這兩個過去沒有的類別,但手邊根本沒有任何標註資料;或是領域知識告訴我們類別大概有 8 種,但訓練資料只覆蓋 3 種。這時候 零樣本分類 (zero-shot classification)就是救星:我們不必蒐集標註,只要用自然語言描述候選類別,模型就能判斷新句子屬於哪一類。這背後靠的是預訓練模型對語意的理解能力,特別是「自然語言推論」(Natural Language Inference, NLI)預訓練過的模型。 這一篇要一次把多標籤與零樣本兩個主題整合:先用 bert-base-multilingual-cased 在公開的 go_emotions 情緒資料集上演練多標籤微調,再用 facebook/bart-large-mnli 展示零樣本分類的完整流程。我們會把 sigmoid 與 softmax 的差別、BCEWithLogits 與 CrossEntropy 的差別、零樣本的 NLI 評分機制、閾值選擇策略都講清楚。讀完這一篇你會了解:多標籤與多分類的差異、零樣本分類的原理、以及...