Khi đã hiểu Latent Dirichlet Allocation (LDA) biểu diễn tài liệu bằng hỗn hợp chủ đề, câu hỏi tiếp theo là: huấn luyện mô hình trên dữ liệu thật như thế nào và làm sao biết chủ đề tìm được có hữu ích? Bài 2 tập trung vào quy trình từ văn bản đến phân phối xác suất, cách đọc kết quả của scikit-learn và phương pháp đánh giá mà không đánh đồng một chỉ số thống kê với chất lượng ngữ nghĩa.
Tóm tắt nội dung
1. Đầu vào phù hợp với LDA là ma trận đếm từ (bag-of-words), còn đầu ra chủ yếu là phân phối chủ đề–từ và tài liệu–chủ đề.
2. Số chủ đề K, tiền xử lý từ, cùng các tham số tiên nghiệm α và η đều ảnh hưởng đến mô hình tìm được.
3. Có thể xây dựng pipeline LDA bằng Python để khám phá chủ đề và suy ra hỗn hợp chủ đề của văn bản mới.
4. Perplexity chỉ phản ánh một khía cạnh của khả năng mô hình hóa dữ liệu; cần đối chiếu thêm từ nổi bật, tài liệu đại diện và mục tiêu ứng dụng.
Nếu chưa quen với ý nghĩa của phân phối Dirichlet, biến ẩn và hai lớp xác suất trong LDA, nên đọc trước Bài 1: LDA (Latent Dirichlet Allocation) – Cơ chế và ví dụ. Phần dưới giả định người đọc đã nắm được trực giác này [1].
1. LDA thực sự học được những gì?
Giả sử có D tài liệu, V từ trong từ vựng và K chủ đề cần khám phá. Với mỗi chủ đề k, LDA ước lượng phân phối xác suất trên V từ, thường viết là φk,v. Với mỗi tài liệu d, mô hình ước lượng tỷ trọng của K chủ đề, ký hiệu θd,k. Hai đại lượng đều không âm; tổng các giá trị theo từ trong từng chủ đề hoặc theo chủ đề trong từng tài liệu đều bằng 1 [1].
Một cách nhìn hữu ích là xem φ và θ như hai ma trận. Ma trận chủ đề–từ có kích thước K × V: mỗi hàng trả lời “chủ đề này ưu tiên những từ nào?”. Ma trận tài liệu–chủ đề có kích thước D × K: mỗi hàng trả lời “tài liệu này thiên về những chủ đề nào?”. Trong thực hành, nhà phân tích thường đặt tên cho từng hàng của ma trận đầu tiên rồi dùng ma trận thứ hai để phân tích kho văn bản.
Về mặt xác suất, khi đã biết θ và φ, xác suất của một từ tại vị trí bất kỳ trong tài liệu được tính bằng cách cộng đóng góp từ tất cả các chủ đề. Công thức này bỏ qua thứ tự từ, đúng với giả định túi từ (bag of words) của LDA cơ bản:
Ở đây, w là từ quan sát, v là một mục trong từ vựng, d là tài liệu và K là số chủ đề. Công thức không khẳng định mô hình hiểu ngữ nghĩa của từ: cùng một từ có thể được đóng góp bởi nhiều chủ đề. Khi áp dụng vào dữ liệu đã có, việc suy ra phân phối ẩn là bài toán khó tính trực tiếp, nên phần mềm dùng những thuật toán suy luận xấp xỉ thay vì duyệt mọi cách gán chủ đề có thể xảy ra [1].
2. Chuẩn bị dữ liệu: vì sao nên bắt đầu từ số lần xuất hiện?
Đầu vào phổ biến của LDA là ma trận tài liệu–từ gồm các số đếm nguyên không âm. Nếu một văn bản chứa “dữ_liệu” ba lần và “thuật_toán” một lần thì hai ô tương ứng nhận giá trị 3 và 1. CountVectorizer chuyển kho văn bản thành ma trận thưa kiểu này; nó không tạo embedding và cũng không tự khám phá chủ đề [2].
Việc xử lý tiếng Việt cần thêm một bước thường bị bỏ qua: tách từ (word segmentation). Chuỗi “trí tuệ nhân tạo” bao gồm nhiều âm tiết nhưng thường được xem là một đơn vị từ ghép trong phân tích chủ đề. Nếu dùng bộ tách mặc định của CountVectorizer, các âm tiết bị đếm độc lập; vì vậy ví dụ Python bên dưới giả định đã tách từ và nối các âm tiết của một từ ghép bằng dấu gạch dưới, chẳng hạn tri_tue_nhan_tao. Với dữ liệu thật, có thể dùng công cụ tách từ tiếng Việt phù hợp và kiểm tra chất lượng kết quả trước khi vector hóa.
Ngoài tách từ, cần chuẩn hóa cách viết, xử lý văn bản rỗng, loại nội dung sao chép và cân nhắc loại từ dừng (stop words) quá phổ biến hoặc từ xuất hiện quá hiếm. Các tham số min_df và max_df giúp lọc từ theo số lượng hoặc tỷ lệ tài liệu có chứa từ đó [2]. Tuy nhiên, không nên loại mọi từ tần suất cao một cách máy móc: trong tập tài liệu y khoa, một thuật ngữ xuất hiện rộng rãi vẫn có thể cần thiết cho mục tiêu phân tích.
Không nên mặc định thay số đếm bằng TF-IDF khi dùng LDA sinh xác suất chuẩn. TF-IDF biến trọng số từ theo độ phổ biến của chúng trong toàn bộ kho tài liệu, trong khi giả định quan sát của mô hình cơ bản là các lần xuất hiện của từ. Một số quy trình biến thể có thể sử dụng trọng số khác, nhưng khi áp dụng API LDA chuẩn của scikit-learn, lựa chọn có căn cứ và dễ diễn giải nhất là bắt đầu từ số đếm của từ [1], [2], [3].
Hình 1. Sơ đồ tự dựng mô tả pipeline LDA trong thực hành. Kích thước ma trận biểu thị số hàng và cột, không phải hiệu năng của thuật toán.
3. Huấn luyện LDA: vai trò của K, α, η và thuật toán suy luận
Trước khi huấn luyện, người dùng chọn K, tức số chủ đề mà mô hình sẽ tìm. K không được tự động xác định bởi LDA hữu hạn tiêu chuẩn. Nếu K quá nhỏ, nhiều lĩnh vực nội dung có thể bị trộn; nếu quá lớn, một chủ đề có thể bị chia thành nhiều nhóm gần giống nhau hoặc tạo ra những chủ đề dựa trên nhiễu. Không có công thức đơn giản bảo đảm chọn đúng K cho mọi tập dữ liệu.
Hai tham số tiên nghiệm (prior) đóng vai trò điều tiết phân phối. α chi phối xu hướng phân bố chủ đề trong mỗi tài liệu; η chi phối phân bố từ trong mỗi chủ đề. Với các prior Dirichlet đối xứng và những yếu tố khác giữ nguyên, giá trị từng thành phần nhỏ hơn thường ưu tiên phân phối tập trung vào ít thành phần hơn. Điều đó là một xu hướng tiên nghiệm, không phải bảo đảm đầu ra luôn “sắc nét” hoặc mang ngữ nghĩa tốt [1], [3].
Trong scikit-learn, doc_topic_prior tương ứng α, còn topic_word_prior tương ứng η. Nếu để mặc định None, thư viện dùng giá trị 1/K cho từng tham số. Cũng cần phân biệt giữa prior và ước lượng sau khi xem dữ liệu: một prior có xu hướng tạo hỗn hợp thưa không thể thay thế bằng chứng từ hàng nghìn tài liệu quan sát được [3].
Vì có các biến ẩn, LDA thường dùng suy luận biến phân (variational inference) để xấp xỉ phân phối hậu nghiệm; phương pháp này tối ưu một cận dưới của log-likelihood, gọi là bằng chứng cận dưới (evidence lower bound, ELBO) [1]. Cách làm của scikit-learn dựa trên suy luận biến phân trực tuyến (online variational Bayes), hỗ trợ huấn luyện batch hoặc online. Batch dùng toàn bộ tập huấn luyện khi cập nhật; online cập nhật từ các minibatch, phù hợp khi số tài liệu lớn. Cả hai đều là phương pháp xấp xỉ và có thể hội tụ đến các nghiệm cục bộ khác nhau [3], [4].
4. Thực hành Python: từ kho văn bản đến tài liệu mới
Ví dụ dưới đây dùng 24 văn bản huấn luyện tự tạo và 6 văn bản giữ lại thuộc ba miền nội dung quen thuộc: bóng đá, công nghệ và tài chính. Những nhóm này chỉ được dùng để soạn dữ liệu minh họa; mô hình không nhận nhãn lĩnh vực nào khi học. Cần cài đặt thư viện scikit-learn trước khi chạy. Đây là thí nghiệm nhỏ để học cách sử dụng API, không phải bộ dữ liệu đánh giá chất lượng LDA trong thực tế.
Tại đây, X_train có kích thước 24 × V, còn theta có kích thước 24 × 3. Phương thức fit_transform vừa huấn luyện mô hình vừa trả về tỷ trọng chủ đề ước lượng của tài liệu huấn luyện. Sau khi học, lda.components_ là ma trận tham số Dirichlet biến phân, không phải trực tiếp ma trận xác suất đã chuẩn hóa. Vì vậy, đoạn mã chia mỗi hàng cho tổng của hàng đó để lấy phân phối chủ đề–từ ước lượng [3].
Khi chạy thử với bộ dữ liệu và hạt giống ngẫu nhiên trong mã, những từ nổi bật có thể nhóm quanh các miền “đội_bóng – bóng_đá – cầu_thủ”, “ngân_hàng – tài_chính – tín_dụng” và “trí_tuệ_nhân_tạo – mô_hình – dữ_liệu”. Tên gọi thể thao, tài chính, công nghệ là nhãn do con người diễn giải sau khi nhìn các từ đại diện; số thứ tự chủ đề 0, 1, 2 không mang ý nghĩa học thuật cố định. Do tối ưu xấp xỉ và khác biệt phiên bản, danh sách hoặc thứ tự từ có thể thay đổi.
Phần xử lý new_doc có ý nghĩa ứng dụng trực tiếp: một bài viết vừa bàn về bóng đá vừa nhắc đến dữ liệu và thuật toán có thể nhận tỷ trọng ở cả chủ đề thể thao lẫn công nghệ. Việc gọi vectorizer.transform, thay vì fit_transform lại, giữ nguyên từ vựng đã học. Các từ chưa có trong từ vựng huấn luyện sẽ bị bỏ qua; nếu văn bản mới chỉ chứa từ ngoài từ vựng, ước lượng chủ đề có thể ít thông tin hoặc chủ yếu phản ánh prior [2], [3].
5. Đánh giá mô hình: từ perplexity đến khả năng diễn giải
Một cách so sánh cấu hình là giữ lại một tập tài liệu không tham gia huấn luyện rồi tính perplexity xấp xỉ trên tập đó. Theo quy ước của scikit-learn, chỉ số này bằng hàm mũ của âm log-likelihood xấp xỉ tính trên mỗi từ. Trong điều kiện dữ liệu và quy trình đánh giá tương đương, giá trị thấp hơn phản ánh khả năng mô hình hóa dữ liệu theo thước đo đó tốt hơn; nó không chứng minh rằng các chủ đề dễ hiểu hơn đối với người đọc [3].
Chạy phần mã sau tiếp theo khối trước để thử K từ 2 đến 5. Các mô hình chỉ học trên X_train; X_test được biến đổi bằng từ vựng đã học từ tập huấn luyện, tránh rò rỉ thông tin qua bước xây dựng từ vựng.
Với một bộ dữ liệu đồ chơi chỉ vài chục văn bản, kết quả có thể không ưu tiên K = 3, dù người tạo dữ liệu cố ý soạn ba nhóm chủ đề. Điều này không mâu thuẫn: mức độ phù hợp xác suất, số miền chủ đề mà con người dự kiến và khả năng diễn giải là những khái niệm khác nhau. Không nên dùng giá trị từ thí nghiệm nhỏ này để rút ra kết luận tổng quát về cấu hình K tốt nhất.
Trong ứng dụng thực, bước đánh giá cần bổ sung việc đọc các từ có trọng số cao, xem những văn bản đại diện của từng chủ đề và kiểm tra liệu chủ đề có trùng lặp, lẫn nhiễu hay bỏ sót nhóm nội dung quan trọng không. Có thể kiểm tra thêm tính ổn định khi thay đổi hạt giống ngẫu nhiên hoặc lấy mẫu dữ liệu. Nghiên cứu về cách con người diễn giải topic model đã chỉ ra rằng mô hình có kết quả dự đoán trên dữ liệu giữ lại tốt hơn không nhất thiết tạo ra chủ đề dễ hiểu hơn [5].
Khi so sánh K, nên thiết kế các thử nghiệm có thể đối chiếu: cố định cách tách từ, tập huấn luyện–kiểm tra, quy tắc lọc từ và quy trình đánh giá. Với prior, cần ghi rõ chúng được giữ cố định hay thay đổi theo K. Cuối cùng, lựa chọn K nên dựa trên câu hỏi cần giải quyết: hệ thống thống kê phản hồi khách hàng có thể cần ít chủ đề rõ ràng, trong khi nghiên cứu một kho bài báo chuyên ngành có thể chấp nhận các nhóm hẹp hơn nếu chúng ổn định và giúp khám phá nội dung.
6. Từ phân phối xác suất đến ứng dụng có ích
Một ứng dụng điển hình là phân tích hàng chục nghìn phản hồi khách hàng không có nhãn. Sau khi làm sạch và tách từ, nhóm phân tích huấn luyện LDA trên tập dữ liệu đại diện, đọc các từ nổi bật và các phản hồi tiêu biểu để đặt tên chủ đề như “giao hàng”, “thanh toán”, “chất lượng sản phẩm”. Với từng phản hồi mới, vector tài liệu–chủ đề cho phép tìm những nhóm nội dung có liên quan. Một phản hồi có thể phàn nàn đồng thời về giao hàng và thanh toán; phân phối hỗn hợp bảo toàn đặc tính này tốt hơn việc gán một nhãn duy nhất.
Nếu dùng kết quả để lập báo cáo theo tháng, cần xác định rõ đại lượng đang đo. Chẳng hạn, tổng hoặc trung bình tỷ trọng chủ đề trong các phản hồi của tháng là một chỉ báo về sự hiện diện tương đối của chủ đề trong mô hình, không đồng nghĩa chính xác với tỷ lệ khách hàng đã gặp một vấn đề. Một người có thể gửi nhiều phản hồi, văn bản có độ dài khác nhau, và các chủ đề có thể chồng lấn. Muốn suy luận về tỷ lệ khách hàng thật, phải bổ sung bước tổng hợp theo người dùng và định nghĩa quy tắc đo lường phù hợp.
Trong vận hành, cần lưu lại phiên bản bộ tách từ, từ vựng, cấu hình mô hình và bản đồ diễn giải tên chủ đề. Nếu huấn luyện lại LDA trên dữ liệu mới, chủ đề số 0 của mô hình mới không nhất thiết tương đương chủ đề số 0 của mô hình cũ; việc so sánh xu hướng trực tiếp theo chỉ số hàng sẽ dễ gây sai lệch. Để báo cáo theo thời gian, nên cố định một mô hình để chấm điểm dữ liệu mới trong phạm vi phù hợp, hoặc có quy trình đối sánh và thẩm định chủ đề sau mỗi lần huấn luyện lại.
LDA đặc biệt hữu ích khi mục tiêu là khám phá cấu trúc từ ngữ ở cấp kho tài liệu, chứ không đòi hỏi hiểu sâu từng phát ngôn. Mô hình khó nắm được phủ định, ý mỉa mai, thứ tự từ và khác biệt ngữ nghĩa tinh tế vì giả định túi từ. Các tài liệu rất ngắn cũng ít cung cấp bằng chứng về đồng xuất hiện của từ; trong trường hợp đó, kết quả có thể kém ổn định. Khi nhiệm vụ là nhận diện ý định, phân loại cảm xúc hoặc tìm kiếm ngữ nghĩa theo câu, cần cân nhắc những phương pháp phù hợp hơn thay vì kỳ vọng LDA giải quyết mọi bài toán NLP.
7. Kết luận
Một pipeline LDA có giá trị không dừng ở việc in ra danh sách từ khóa: nó cần biến văn bản thành số đếm nhất quán, ước lượng hai lớp phân phối xác suất, rồi kiểm tra liệu các chủ đề tìm được có trả lời đúng câu hỏi phân tích hay không. Perplexity, độ ổn định và khả năng diễn giải cung cấp những góc nhìn bổ sung, không nên thay thế cho nhau. Bài 3 của chuỗi sẽ tổng hợp các sai lầm thường gặp, nguyên tắc chọn tham số và kinh nghiệm triển khai LDA trên dữ liệu thực tế.
Tài liệu tham khảo
[1] D. M. Blei, A. Y. Ng, and M. I. Jordan, “Latent Dirichlet Allocation,” Journal of Machine Learning Research, vol. 3, pp. 993–1022, 2003. Nguồn chính thức.
[2] scikit-learn developers, “CountVectorizer,” scikit-learn API Reference. Tài liệu chính thức.
[3] scikit-learn developers, “LatentDirichletAllocation,” scikit-learn API Reference. Tài liệu chính thức.
[4] M. D. Hoffman, D. M. Blei, and F. Bach, “Online Learning for Latent Dirichlet Allocation,” in Advances in Neural Information Processing Systems 23, 2010. Nguồn chính thức.
[5] J. Chang, J. Boyd-Graber, S. Gerrish, C. Wang, and D. M. Blei, “Reading Tea Leaves: How Humans Interpret Topic Models,” in Advances in Neural Information Processing Systems 22, 2009. Nguồn chính thức.
Đọc trong cùng chuỗi: Bài 1 – LDA (Latent Dirichlet Allocation): Cơ chế và ví dụ.
Nội dung gốc thuộc tác giả. Vui lòng không đăng lại toàn văn khi chưa được phép, trừ trường hợp pháp luật hoặc giấy phép áp dụng cho phép. Nội dung của bên thứ ba tuân theo quyền và giấy phép tương ứng.
Nguồn gốc: LDA trong thực tế: Huấn luyện và đánh giá mô hình chủ đề