[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-fine-tune-slm-emotion-recognition-zh":3,"article-related-fine-tune-slm-emotion-recognition-zh":31,"series-tools-851e075c-b22f-4425-a5c8-28132574da25":84},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":23,"views":27,"created_at":28,"published_at":29,"topic_cluster_id":30},"851e075c-b22f-4425-a5c8-28132574da25","fine-tune-slm-emotion-recognition-zh","情緒辨識 SLM 微調實作指南","\u003Cp data-speakable=\"summary\">用 ISMOTE、LoRA 和 focal loss，把開放權重小語言模型微調成多標籤情緒辨識器。\u003C\u002Fp>\u003Cp>這篇給要把客服單、社群貼文、電子郵件，轉成可查詢情緒標籤的開發者看。你照著做完，會拿到一條可重現的訓練流程，能處理類別不平衡，並輸出可評估的情緒分類器。\u003C\u002Fp>\u003Cp>完成後，你會有一個可\u003Ca href=\"\u002Fnews\u002Fmlx-community-apple-silicon-model-weights-zh\">直接跑\u003C\u002Fa>的資料準備腳本、平衡後的訓練集、加入 LoRA 的 Mistral Small 模型，以及可在測試集上輸出每個情緒 F1 的評估結果。\u003C\u002Fp>\u003Ch2>開始之前\u003C\u002Fh2>\u003Cul>\u003Cli>Python 3.10+\u003C\u002Fli>\u003Cli>Node 不需要；訓練環境請準備 CUDA 相容 GPU，至少 24 GB VRAM\u003C\u002Fli>\u003Cli>PyTorch 2.4+，且已安裝 CUDA 版\u003C\u002Fli>\u003Cli>Hugging Face 帳號與可用的 access token\u003C\u002Fli>\u003Cli>可存取 \u003Ca href=\"https:\u002F\u002Fhuggingface.co\u002Fdatasets\u002Fgoogle-research-datasets\u002Fgo_emotions\" target=\"_blank\" rel=\"noopener noreferrer\">GoEmotions dataset\u003C\u002Fa> 與 \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Funslothai\u002Funsloth\" target=\"_blank\" rel=\"noopener noreferrer\">Unsloth repository\u003C\u002Fa>\u003C\u002Fli>\u003Cli>已安裝 transformers、datasets、scikit-learn、numpy、pandas、unsloth\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Step 1: 建立情緒標籤表\u003C\u002Fh2>\u003Cp>這一步的產出是固定順序的 15 類情緒標籤表，後續資料切分、訓練與評估都會共用它。先從 GoEmotions 挑出你要的類別，再把輸出順序鎖死，避免多標籤向量在不同 split 之間對不上。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781231575451-p3g5.png\" alt=\"情緒辨識 SLM 微調實作指南\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cpre>\u003Ccode>EMOTION_LABELS = [\n  \"fear\", \"sadness\", \"disgust\", \"disapproval\", \"annoyance\",\n  \"anger\", \"disappointment\", \"optimism\", \"amusement\", \"surprise\",\n  \"admiration\", \"excitement\", \"confusion\", \"joy\", \"love\"\n]\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>接著檢查每筆資料的 label vector 長度是否一致。你\u003Ca href=\"\u002Fnews\u002Fmidjourney-software-first-not-hardware-theater-zh\">應該\u003C\u002Fa>看到所有 split 都是固定 15 維的 multi-hot 格式。\u003C\u002Fp>\u003Ch2>Step 2: 平衡訓練資料分布\u003C\u002Fh2>\u003Cp>這一步的產出是去偏態的訓練集，讓 neutral 不會壓過其他情緒。先對多數類做隨機下採樣，再用 ISMOTE 擴增稀有情緒，讓少數類達到可訓練的樣本量。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781231576595-ol1f.png\" alt=\"情緒辨識 SLM 微調實作指南\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>驗證集與測試集要保持原樣，這樣最後的分數才反映真實不平衡分布。這個做法把下採樣、合成擴增與 loss weighting 放在一起，目標是改善少數類表現，不是美化指標。\u003C\u002Fp>\u003Cp>你可以先畫出各標籤在前後的頻率圖。你\u003Ca href=\"\u002Fnews\u002Fweb3-wallets-financial-super-apps-zh\">應該\u003C\u002Fa>看到 neutral 明顯下降，而目標情緒的數量彼此更接近。\u003C\u002Fp>\u003Ch2>Step 3: 載入 Mistral 基座模型\u003C\u002Fh2>\u003Cp>這一步的產出是可在本機運行的基座模型，準備接收參數高效率微調。使用 Unsloth 以 4-bit 方式載入 Mistral Small 3.1 24B Instruct，讓模型能放進可用 \u003Ca href=\"\u002Ftag\u002Fgpu\">GPU\u003C\u002Fa> 記憶體。\u003C\u002Fp>\u003Cpre>\u003Ccode>from unsloth import FastLanguageModel\nimport torch\n\nMODEL_NAME = \"unsloth\u002FMistral-Small-3.1-24B-Instruct-2503\"\nbase_model, _ = FastLanguageModel.from_pretrained(\n    model_name=MODEL_NAME,\n    max_seq_length=2,\n    load_in_4bit=True,\n    dtype=torch.bfloat16,\n)\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>驗收方式是模型成功初始化，沒有 OOM，並且確實以 4-bit 權重載入。你應該看到 backbone 已在 GPU 上可用，能直接進入 adapter 注入。\u003C\u002Fp>\u003Ch2>Step 4: 掛上 LoRA 與 focal loss\u003C\u002Fh2>\u003Cp>這一步的產出是輕量訓練配置，讓模型不用全參數微調也能學到多標籤情緒模式。把 LoRA 掛到 attention 與 MLP 投影層，再加上自訂多標籤 head 與 focal loss，讓較難、較稀有的標籤得到更高權重。\u003C\u002Fp>\u003Cpre>\u003Ccode>base_model = FastLanguageModel.get_peft_model(\n    base_model,\n    r=16,\n    lora_alpha=32,\n    lora_dropout=0,\n    bias=\"none\",\n    target_modules=[\"q_proj\", \"k_proj\", \"v_proj\", \"o_proj\", \"gate_proj\", \"up_proj\", \"down_proj\"],\n    use_gradient_checkpointing=\"unsloth\",\n    random_state=3407,\n    use_rslora=False,\n)\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>驗收方式是可訓練參數數量明顯下降，但模型仍能輸出 15 個情緒的 logits。你應該看到 adapter 佔比遠小於完整模型，且輸入多標籤目標時不會報格式錯誤。\u003C\u002Fp>\u003Ch2>Step 5: 訓練並輸出測試分數\u003C\u002Fh2>\u003Cp>這一步的產出是已訓練完成的情緒分類器，以及一份可讀的測試集報告。設定按 epoch 驗證、計算 exact accuracy 與 macro、micro F1，並在驗證集表現最佳時保存 checkpoint。原始做法顯示，多數目標情緒的 F1 可高於 0.7。\u003C\u002Fp>\u003Cpre>\u003Ccode>from sklearn.metrics import f1_score, precision_score, recall_score, accuracy_score\n\n# train with epoch evaluation, then score on the test set\n# compute_metrics should threshold sigmoid outputs at 0.5\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>驗收方式是你能在 log 看到每個 epoch 的評估結果，並在測試集報告中讀到各情緒的 per-class metrics。你應該看到最佳 checkpoint 由驗證集分數選出，而不是手動挑模型。\u003C\u002Fp>\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>指標\u003C\u002Fth>\u003Cth>基準／優化前\u003C\u002Fth>\u003Cth>結果／優化後\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>少數類平衡\u003C\u002Ftd>\u003Ctd>資料明顯偏向 neutral\u003C\u002Ftd>\u003Ctd>neutral 被下採樣，稀有情緒用 ISMOTE 擴增\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>訓練方式\u003C\u002Ftd>\u003Ctd>全參數微調需要更高記憶體\u003C\u002Ftd>\u003Ctd>4-bit 基座模型加 LoRA adapters\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>情緒 F1\u003C\u002Ftd>\u003Ctd>原始 baseline 未提供穩定結果\u003C\u002Ftd>\u003Ctd>多數目標情緒可達 F1 > 0.7\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003Ch2>常見錯誤\u003C\u002Fh2>\u003Cul>\u003Cli>直接拿不平衡資料開訓練。修法：先下採樣 neutral，再對少數情緒做 ISMOTE。\u003C\u002Fli>\u003Cli>把多標籤問題當成單標籤分類。修法：輸出用 sigmoid，閾值用 0.5，不要用 softmax。\u003C\u002Fli>\u003Cli>GPU 記憶體不足。修法：保留 4-bit 載入、LoRA 與 gradient checkpointing。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>接下來可以看什麼\u003C\u002Fh2>\u003Cp>下一步可以把模型推到 Hugging Face Hub，為每個情緒單獨調整閾值，並比較 ISMOTE 與簡單 oversampling 在你自己的資料上的差異。\u003C\u002Fp>","用 ISMOTE、LoRA 和 focal loss，把開放權重小語言模型微調成多標籤情緒辨識器。","towardsdatascience.com","https:\u002F\u002Ftowardsdatascience.com\u002Fhow-to-fine-tune-an-slm-for-emotion-recognition\u002F",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781231575451-p3g5.png","tools","zh","4ed8f024-fcf6-493a-ac60-fff51479e92f",[17,18,19,20,21,22],"Python","PyTorch","Hugging Face","Unsloth","LoRA","focal loss",[24,25,26],"先固定 15 類情緒標籤順序，避免多標籤向量對不齊。","用 neutral 下採樣加 ISMOTE 擴增，處理類別不平衡。","以 4-bit 載入 Mistral，再用 LoRA 和 focal loss 做高效率微調。",0,"2026-06-12T02:32:23.646134+00:00","2026-06-12T02:32:23.637+00:00","be8b3ef0-c6e7-477d-a0e9-f8f1e74e0335",{"tags":32,"relatedLang":43,"relatedPosts":47},[33,35,37,39,41],{"name":20,"slug":34},"unsloth",{"name":17,"slug":36},"python",{"name":21,"slug":38},"lora",{"name":19,"slug":40},"hugging-face",{"name":18,"slug":42},"pytorch",{"id":15,"slug":44,"title":45,"language":46},"fine-tune-slm-emotion-recognition-en","Fine-Tune an SLM for Emotion Recognition","en",[48,54,60,66,72,78],{"id":49,"slug":50,"title":51,"cover_image":52,"image_url":52,"created_at":53,"category":13},"9947d432-419a-4fb2-b63e-2df73e5503f0","vibe-coding-lets-you-ship-a-tiny-app-fast-zh","Vibe coding 讓你先把小工具做出來","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781254115147-lr0c.png","2026-06-12T08:47:56.34535+00:00",{"id":55,"slug":56,"title":57,"cover_image":58,"image_url":58,"created_at":59,"category":13},"f7cfd9fc-4795-40e6-9ccf-8d1d320d8560","what-vibe-coding-means-for-developers-zh","Vibe Coding 對開發者的真正意義","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781253188911-llz7.png","2026-06-12T08:32:32.032314+00:00",{"id":61,"slug":62,"title":63,"cover_image":64,"image_url":64,"created_at":65,"category":13},"6371d809-9372-4a40-bf34-09ca516bf1c5","product-hunt-vibe-coding-tools-2026-zh","Product Hunt 的 vibe-coding 堆疊怎麼配","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781252320426-k29l.png","2026-06-12T08:18:03.871398+00:00",{"id":67,"slug":68,"title":69,"cover_image":70,"image_url":70,"created_at":71,"category":13},"048fe239-c575-457f-87b3-7a11dcc92b45","copilot-keeps-old-amd-linux-gpus-alive-zh","Copilot 讓舊 AMD GPU 活下來","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781242402748-dls4.png","2026-06-12T05:32:53.912906+00:00",{"id":73,"slug":74,"title":75,"cover_image":76,"image_url":76,"created_at":77,"category":13},"5c8150a0-bd9a-4b69-bba3-09548f5dcc84","midjourney-pricing-guide-2026-plans-costs-zh","Midjourney 2026 訂閱費用與方案判讀","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781230674954-vf1u.png","2026-06-12T02:17:24.385566+00:00",{"id":79,"slug":80,"title":81,"cover_image":82,"image_url":82,"created_at":83,"category":13},"bcfbcfbd-a89b-4b58-9ac0-3dad4b83bd99","midjourney-pricing-2026-gpu-hours-costs-zh","Midjourney 2026 定價：月費與 GPU 時數","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1781229774274-rqw7.png","2026-06-12T02:02:23.656893+00:00",[85,90,95,100,105,110,115,120,125,130],{"id":86,"slug":87,"title":88,"created_at":89},"855cd52f-6fab-46cc-a7c1-42195e8a0de4","surepath-real-time-mcp-policy-controls-zh","SurePath 推出即時 MCP 政策控管","2026-03-26T07:57:40.77233+00:00",{"id":91,"slug":92,"title":93,"created_at":94},"9b19ab54-edef-4dbd-9ce4-a51e4bae4ebb","mcp-in-2026-the-ai-tool-layer-teams-use-zh","2026 年 MCP：團隊真的在用的 AI 工具層","2026-03-26T08:01:46.589694+00:00",{"id":96,"slug":97,"title":98,"created_at":99},"af9c46c3-7a28-410b-9f04-32b3de30a68c","prompting-in-2026-what-actually-works-zh","2026 提示工程，真正有用的是什麼","2026-03-26T08:08:12.453028+00:00",{"id":101,"slug":102,"title":103,"created_at":104},"05553086-6ed0-4758-81fd-6cab24b575e0","garry-tan-open-sources-claude-code-toolkit-zh","Garry Tan 開源 Claude Code 工具包","2026-03-26T08:26:20.068737+00:00",{"id":106,"slug":107,"title":108,"created_at":109},"042a73a2-18a2-433d-9e8f-9802b9559aac","github-ai-projects-to-watch-in-2026-zh","2026 必看 20 個 GitHub AI 專案","2026-03-26T08:28:09.619964+00:00",{"id":111,"slug":112,"title":113,"created_at":114},"a5f94120-ac0d-4483-9a8b-63590071ac6a","claude-code-vs-cursor-2026-zh","Claude Code 與 Cursor 深度對比：202…","2026-03-26T13:27:14.279193+00:00",{"id":116,"slug":117,"title":118,"created_at":119},"0975afa1-e0c7-4130-a20d-d890eaed995e","practical-github-guide-learning-ml-2026-zh","2026 機器學習入門 GitHub 實用指南","2026-03-27T01:16:49.712576+00:00",{"id":121,"slug":122,"title":123,"created_at":124},"bfdb467a-290f-4a80-b3a9-6f081afb6dff","aiml-2026-student-ai-ml-lab-repo-review-zh","AIML-2026：像課綱的學生實驗 Repo","2026-03-27T01:21:51.467798+00:00",{"id":126,"slug":127,"title":128,"created_at":129},"80cabc3e-09fc-4ff5-8f07-b8d68f5ae545","ai-trending-github-repos-and-research-feeds-zh","AI Trending：把 AI 資源收成一張表","2026-03-27T01:31:35.262183+00:00",{"id":131,"slug":132,"title":133,"created_at":134},"3ce6e6e2-bac5-463e-9f8d-45caabcc61f7","awesome-ai-for-science-research-tools-map-zh","AI 科研工具清單，開始像地圖了","2026-03-27T01:46:50.521945+00:00"]