
Cách tinh chỉnh một SLM để nhận diện cảm xúc
Hướng dẫn Python tinh chỉnh mô hình Mistral Small 3.1 trên tập dữ liệu huấn luyện mất cân bằng để phân loại 15 cảm xúc trong giao tiếp trên mạng xã hội Bài viết How to Fine-Tune an SLM for Emotion Recognition xuất hiện lần đầu trên Towards Data Science.
Học máy
Cách tinh chỉnh một SLM để nhận dạng cảm xúc
Hướng dẫn Python để tinh chỉnh Mistral Small 3.1 trên tập dữ liệu huấn luyện không cân bằng nhằm phân loại 15 cảm xúc trong giao tiếp trên mạng xã hội.
Petr Koráb
Ngày 5/6/2026
9 phút đọc
Chia sẻ
Ảnh được tạo bởi GPT 5.3
Giới thiệu
Các mô hình ngôn ngữ nhỏ (SLM) gần đây được tinh chỉnh để phân loại cảm xúc thường suy ra cảm xúc dưới dạng một điểm số duy nhất, nắm bắt được sắc thái cảm xúc tổng thể của văn bản. Đối với nhiều trường hợp sử dụng, việc phân loại tích cực-tiêu cực không thể hiện đầy đủ thông tin mà một công ty cần. Các mô hình nhận dạng cảm xúc tiến xa hơn, phân tách cảm xúc thành các lớp cảm xúc ("tức giận", "đồng tình", "thất vọng", v.v.) và gán xác suất cho một tập hợp các cảm xúc trong văn bản. Sau đó, có thể mô hình hóa nội dung cảm xúc trong các tập dữ liệu mà một công ty nhận được (phiếu yêu cầu của khách hàng, email, thảo luận liên quan đến thương hiệu) và phản ứng nhanh chóng với các điều kiện thay đổi.
Đối với một trong những dự án gần đây của chúng tôi, mô hình hóa cảm xúc trên phương tiện truyền thông trực tuyến, chúng tôi yêu cầu một mô hình nhận dạng cảm xúc có trọng số mở và giấy phép linh hoạt, duy trì các tiêu chuẩn minh bạch cao, và tất nhiên, hưởng lợi từ chi phí thấp hơn liên quan đến các mô hình mở. Chúng tôi chủ quan ưu tiên các mô hình châu Âu, nhưng Hugging Face không cung cấp một giải pháp thay thế Mistral với thẻ mô hình đã được phát triển. Một lý do có thể là tập dữ liệu huấn luyện chi tiết nhất để nhận dạng cảm xúc, tập dữ liệu GoEmotions gồm 28 cảm xúc, có sự mất cân bằng lớp rất cao. Việc tinh chỉnh một SLM trên một tập dữ liệu có sự mất cân bằng lớp cao mà vẫn hoạt động tốt trong thử nghiệm đòi hỏi sự tập trung sâu hơn.
Chúng tôi đã xử lý vấn đề mất cân bằng lớp bằng cách kết hợp ba kỹ thuật: (1) lấy mẫu dưới (undersampling) danh mục cảm xúc được đại diện nhiều nhất, (2) mở rộng tổng hợp các lớp thiểu số bằng thuật toán ISMOTE năm 2025 của Nature, và (3) trọng số hóa hàm mất mát. Với sự kết hợp các kỹ thuật này, MistralSmall-3.1.GoEmotions, hiện đã được phát hành trên Hugging Face, suy ra hầu hết các cảm xúc mục tiêu liên quan đến dự án của chúng tôi với F1 > 0,7.
Bài viết này giải thích chi tiết cách tinh chỉnh một SLM có trọng số mở. Chúng ta cũng sẽ tìm hiểu:
Cách tiền xử lý dữ liệu không cân bằng lớp để tinh chỉnh LLM bằng thuật toán ISMOTE năm 2025.
Cách phân tách cảm xúc thành các danh mục cảm xúc bằng cách tinh chỉnh một Mô hình ngôn ngữ nhỏ để nhận dạng cảm xúc trong dữ liệu văn bản.
2. Dữ liệu
GoEmotions là một tập dữ liệu được chú thích thủ công gồm 58 nghìn bình luận trên Reddit được trích xuất từ các subreddit tiếng Anh và được gắn nhãn với 27 danh mục cảm xúc và một nhãn "trung tính". Đây là một tập dữ liệu phân loại đa nhãn, trong đó mỗi bình luận có thể được gắn nhiều nhãn TRUE cho các cảm xúc (ví dụ: "Đánh tôi. Điều đó chỉ thêm một động lực hài hước khác vào đó mặc dù tôi không thực sự cố gắng đánh cô ấy" là True cho "giải trí" và "khó chịu").
Tập dữ liệu được phát hành trên TensorFlow Datasets theo Giấy phép Apache 2.0 và chứa 54.263 văn bản được gắn nhãn. Đây là hình ảnh của nó:
Hình 1. Tập dữ liệu GoEmotions. Ảnh của tác giả.
Sau khi kiểm tra nhanh, chúng ta có thể thấy sự mất cân bằng lớp cao trong dữ liệu, trong đó danh mục trung tính chiếm ưu thế:
Hình 2. Mất cân bằng lớp trong tập dữ liệu GoEmotions. Ảnh của tác giả.
3. Tiền xử lý tập huấn luyện
Mục tiêu của chúng tôi là phát triển một bộ phân loại để xác định 15 cảm xúc trong các văn bản ngôn ngữ chung. Việc huấn luyện trên dữ liệu không cân bằng lớp có thể gây ra sai lệch, vì mô hình được tinh chỉnh có xu hướng ưu tiên lớp đa số và hoạt động kém hơn đối với các lớp thiểu số, do đó việc tiền xử lý là rất cần thiết.
Chúng tôi đã sử dụng kết hợp nhiều phương pháp cho tập huấn luyện; các tập xác thực và kiểm thử vẫn không thay đổi để giải quyết sự mất cân bằng lớp và tối đa hóa hiệu suất trên các cảm xúc mục tiêu (sợ hãi, buồn bã, ghê tởm, không chấp thuận, khó chịu, tức giận, thất vọng, lạc quan, thích thú, ngạc nhiên, ngưỡng mộ, phấn khích, bối rối, vui vẻ, yêu thương):
Chúng tôi đã làm mỏng dữ liệu bằng cách lọc ngẫu nhiên các hàng "trung tính".
Chúng tôi đã tạo các mẫu tổng hợp cho các loại cảm xúc ít được đại diện nhất bằng cách sử dụng ISMOTE (Kỹ thuật lấy mẫu quá mức thiểu số tổng hợp cải tiến).
Thuật toán ISMOTE mở rộng kỹ thuật SMOTE phổ biến bằng cách (1) mở rộng không gian tạo mẫu và (2) cải thiện phân phối lấy mẫu. Các mẫu được tạo tổng hợp sau đó có phân phối dữ liệu thực tế hơn so với các mẫu được tạo bằng phương pháp gốc.
Hình 3. Sơ đồ thuật toán ISMOTE. Nguồn: Scientific Reports.
Bằng cách giảm lớp đa số và mở rộng tổng hợp các loại thiểu số lên 4.000 mẫu, chúng tôi đã xây dựng một tập tương đối cân bằng để tinh chỉnh. Mã cho việc lấy mẫu quá mức ISMOTE có tại đây.
Hình 4. Tần suất tương đối của nhãn – tập huấn luyện (đã tăng cường), tập xác thực và tập kiểm thử. Hình ảnh do tác giả cung cấp.
4. Tinh chỉnh SLM
Trong số các mô hình của Mistral, chúng tôi đã chọn lớp Small (Small-3.1-24B-Instruct-2503), phù hợp với GPU của chúng tôi và cung cấp các khả năng đa ngôn ngữ mà chúng tôi cần cho bộ phân loại. Khung Unsloth giúp các bước tinh chỉnh đơn giản và nhanh hơn so với Transformers:
1. Tải dữ liệu – tải tập huấn luyện, tập xác thực và tập kiểm thử đã được tiền xử lý. Chúng tôi sử dụng tỷ lệ phân chia 60:20:20.
2. Tải mô hình cơ sở – tải Small-3.1–24B-Instruct-2503 cục bộ.
3. Áp dụng LoRA – giảm yêu cầu phần cứng.
4. Trình bao đa nhãn với hàm mất mát tiêu điểm – cập nhật bộ huấn luyện cho phân loại đa nhãn. Đồng thời thêm mất mát tiêu điểm để trọng số hóa hàm mất mát cho một tập hợp cảm xúc được chọn, ưu tiên hiệu suất của chúng.
5. Các chỉ số đánh giá và đối số huấn luyện – chỉ định các chỉ số đánh giá và siêu tham số cho việc huấn luyện mô hình.
6. Huấn luyện mô hình – xây dựng và khởi chạy bộ huấn luyện.
7. Đánh giá – đánh giá hiệu suất mô hình tốt nhất trên tập kiểm thử.
4.1. Mã hóa
Dưới đây là triển khai mã.
4.1.1. Tải dữ liệu
# Tải tập huấn luyện, xác thực và kiểm thử đã tăng cường
BASE = r"augmented"
def load_split(path: str) -> Dataset:
with open(path, encoding="utf-8") as f:
d = json.load(f)
return Dataset.from_dict({"input_embeds": d["X"], "labels": d["y"]})
train_dataset = load_split(f"{BASE}/train.json")
val_dataset = load_split(f"{BASE}/val.json")




Nguồn tin: Towards Data Science — Tác giả: Petr Koráb. Bản dịch tiếng Việt do AI thực hiện, có thể có sai sót.