Beam search algorithm
Beam search là một thuật toán tìm kiếm heuristic được sử dụng trong nhiều bài toán như dịch máy, nhận dạng giọng nói, tóm tắt văn bản,… Đó là các bài toán NLP có đầu ra liên quan đến việc tạo một chuỗi các từ. Trong bài viết này, Behitek sẽ cùng bạn đi tìm hiểu về thuật toán beam search, các ưu điểm của nó và đi vào thực hành sử dụng beam search trong bài toán khôi phục dấu thanh cho tiếng Việt không dấu.
Sau khi đọc xong bài viết này, bạn sẽ có được những kiến thức nhất định về:
- Khi nào chúng ta nên sử dụng thuật toán beam search
- Hiểu thuật toán tìm kiếm tham lam (greedy search) và cách cài đặt bằng Python
- Hiểu thuật toán beam search và cách cài đặt nó trong Python
- Ứng dụng beam search vào bài toán khôi phục dấu thanh (sắc, hỏi, huyền, ngã, nặng) cho tiếng Việt.
Tại sao sử dụng beam search?
Trong các bài toán NLP như dịch máy (machine translation), tạo caption ảnh tự động (image caption generation), tóm tắt văn bản (text summarization), tổng hợp tiếng nói (auto speech recognition), … yêu cầu đầu ra của mô hình là chuỗi các từ có trong từ điển.
Thường thì mỗi từ trong chuỗi từ mà mô hình của các bài toán như trên dự đoán (predict) sẽ đi kèm theo một phân phối xác suất tương ứng. Khi đó, bộ Decoder của mô hình sẽ dựa trên phân bố xác suất đó để tìm ra chuỗi từ phù hợp nhất.
Tìm kiếm chuỗi từ phù hợp nhất yêu cầu chúng ta cần duyệt qua tất cả các chuỗi từ có thể có từ dự đoán của mô hình. Thường thì từ điển của chúng ta sẽ có kích thước rất lớn, với các bài toán về tiếng Việt thì khoảng trên dưới 30.000 từ khác nhau (bao gồm các từ tiếng anh phổ biến, tiếng Việt thuần thì ít hơn) hoặc nếu làm với dữ liệu tiếng anh thì kích thước bộ từ điển còn lớn hơn nhiều.
Khi đó, ước lượng không gian tìm kiếm của chúng ta sẽ là kích thước từ điển lũy thừa với độ dài của chuỗi cần dự đoán, O(n!) - một chi phí rất lớn!
Do chi phí tìm kiếm là quá lớn. Trên thực tế , chúng ta thường dùng một thuật toán tìm kiếm heuristic để có được một kết quả tìm kiếm đủ tốt (good enough) cho mỗi dự đoán thay vì phải tìm kiếm toàn cục.
Mỗi chuỗi từ sẽ được gán một số điểm dựa trên xác suất phân bố của chúng, thuật toán tìm kiếm sẽ dựa trên điểm số này để đánh giá các chuỗi từ này. Có 2 thuật toán tìm kiếm phổ biến giúp tìm ra chuỗi từ “đủ tốt” đó là tìm kiếm tham lam (greedy search) và beam search.
Greedy search vs Beam search
Trong phần này, mình sẽ cùng các bạn đi làm rõ ý tưởng của 2 thuật toán greedy search và beam search. Từ đó, bạn có thể thấy được ưu điểm, nhược điểm riêng của mỗi thuật toán cũng như lý do tại sao beam search hoạt động hiệu quả hơn.
- Giải thuật tìm kiếm tham lam (greedy search) khởi đầu với chuỗi rỗng. Tại mỗi bước, nó thực hiện tìm kiếm toàn bộ trên không gian của bước đó và chỉ lấy duy nhất 1 kết quả có điểm số cao nhất và bỏ qua tất cả các kết quả khác. Sang bước tiếp theo, nó chỉ mở rộng tìm kiếm từ kết quả duy nhất trước đó.
- Giải thuật toán kiếm beam search cũng khởi đầu với chuỗi rỗng. Tại mỗi bước, nó thực hiện tìm kiếm toàn bộ trên không gian của bước đó và lấy ra k kết quả có điểm số cao nhất thay vì chỉ lấy 1 kết quả cao nhất. Hình ảnh dưới đây sẽ cho bạn thấy rõ nhất cách hoạt động của beam search với k=2.
Nhận xét:
- Thuật toán beam search với k = 1 chính là thuật toán greedy search. Dẫn tới đôi khi kết quả cuối cùng của greedy search khác xa so với kết quả mong đợi.
- Thuật toán beam search tại mỗi bước giữ lại k kết quả tốt nhất. Điều đó làm cho phương pháp tìm kiếm này đạt được kết quả tối ưu toàn cục tốt hơn.
- Trên thực tế, giá trị k của beam search thường từ 5 đến 10. Giá trị k lớn hơn cho kết quả có thể tốt hơn nhưng bạn sẽ phải đánh đổi với chi phí tìm kiếm.
Thực hành với beam search
Trong phần thực hành này, mình sẽ thử dùng beam search vào bài toán khôi phục dấu câu cho tiếng Việt không dấu. Đại loại là bài toán sẽ cố gắng đưa một câu tiếng Việt không dấu (toi yeu viet nam) thành câu tiếng việt có dấu đầy đủ (tôi yêu việt nam).
Ý tưởng thực hiện
- Từ câu tiếng Việt không dấu, mình sẽ sinh ra tất cả các khả năng có thể đánh dấu cho câu đó.
- Sử dụng mô hình ngôn ngữ (language model) để xác định điểm số (phân bố xác suất) của các từ, chuỗi từ.
- Áp dụng thuật toán beam search đã trình bày ở trên để tìm kiếm kết chuỗi từ (đã được thêm dấu câu) phù hợp nhất.
Bây giờ chúng ta sẽ bắt tay vào thực hiện từng bước nhé. Tất cả phần hướng dẫn sau đây đều được thực hiện bằng ngôn ngữ Python.
Mình sẽ không đề cao hiệu quả (độ chính xác ở đây), mục tiêu là giải thích & cài đặt beam search để bạn dễ hiểu nhất.