Giới thiệu về phép nhúng từ (phần 1)

Ở loạt bài viết đầu tiên này, mình sẽ tập trung giải thích phép nhúng từ (word embedding) là gì, công dụng của nó trong lĩnh vực Xử Lý Ngôn Ngữ Tự Nhiên (Natural Language Processing – NLP) và giới thiệu sơ bộ các phép nhúng từ thường gặp hiện nay.

Cuối mỗi phần sẽ có một số giải thích bổ sung, các câu hỏi thường gặp để giúp bạn đọc nắm bắt tốt hơn.

1. Phép nhúng từ là gì?

Phép nhúng từ (word embedding) là phương pháp ánh xạ (map) những từ ngữ vào các vector hoặc số thực, còn được gọi là phương pháp mô hình hóa ngôn ngữ/dữ liệu. Một phép nhúng từ tốt sẽ mang lại nhiều lợi ích cho việc tính toán lẫn minh họa dữ liệu.

linear-relationships.png

Minh họa về phép nhúng từ (nguồn: developers.google.com)

Ví dụ, bạn muốn tìm thủ đô của Nga khi biết thủ đô của Việt Nam là Hà Nội thì sẽ làm như thế nào?

Với một phép nhúng từ đủ tốt, vector Việt Nam – Hà Nội sẽ (gần như) song song với vector Nga – [thủ đô của Nga]. Do đó, Trước tiên ta sẽ tính vector tịnh tiến v1 từ Việt Nam đến Nga, sau đó tìm ảnh của điểm tọa độ Hà Nội thông qua phép tịnh tiến theo vector v1. Cuối cùng, ta tra trong cơ sở dữ liệu từ ngữ ánh xạ với tọa độ vừa tìm được, kết luận Moscow là thủ đô của Nga.

Để dễ hình dung, các hình minh họa trên đã được chuyển về không gian 2-3 chiều. Tuy nhiên, trong thực tế, các phép nhúng từ ánh xạ những từ ngữ với các vector sẽ lên tới hàng trăm chiều. Do đó, muốn tính toán các vector đa chiều này, chúng ta cần nắm rõ và tổng quát hóa các phép toán, khái niệm căn bản liên quan đến vector, ma trận, tensor như:

  • tích vô hướng (dot product/scalar product)
  • tích có hướng (cross product)
  • các phép nhân ma trận

Bạn đọc có thể tham khảo các kiến thức đại số tuyến tính trên ở đây.

Ngoài ra, nếu muốn minh họa các không gian vector đa chiều ở dạng 2-3 chiều, chúng ta có thể thực hiện kĩ thuật nén chiều dữ liệu như:

  • Principal Component Analysis (PCA)
  • Linear Discriminant Analysis (LDA)
  • Generalized Discriminant Analysis (GDA)

Đây cũng là một nhánh nghiên cứu quan trọng trong lý thuyết thông tin với mục tiêu giảm dung lượng lưu trữ, chi phí tính toán (số chiều càng nhỏ thì dữ liệu lưu trữ sẽ càng ít, các phép tính toán cũng được xử lý nhanh hơn) trong khi chỉ đánh đổi một ít khả năng biểu diễn của không gian. Nếu có dịp mình sẽ đề cập sâu hơn về kĩ thuật này trong tương lai.

2. Công dụng của phép nhúng từ

Các tác vụ (task) Xử Lý Ngôn Ngữ Tự Nhiên thường có đầu vào là các câu chữ, song máy tính lại chỉ có thể tính toán dựa trên số nên chúng ta cần phải tìm cách chuyển đổi từ câu chữ sang các vector, ma trận. Phép nhúng từ là một trong những cách thực hiện điều đó. Hiện tại, các phép nhúng từ mới xuất hiện đều có sử dụng mạng neuron (neural network) như Word2vec, GloVe, BERT, XLNet,… Bên cạnh đó cũng có những phương pháp nhúng từ khác dựa trên thống kê như BoW (Bag of Words), TF-IDF (Term Frequency, Inverse Document Frequency).

Các phương pháp dựa trên thống kê như BoW, TF-IDF có tác dụng khá tốt đối với các tập dữ liệu (dataset) kém phong phú. Trong khi những phương pháp sử dụng mạng neuron sẽ có tác dụng tốt hơn hẳn khi xử lý các tác vụ phức tạp, có tập dữ liệu khổng lồ.

Thế nào là tập dữ liệu kém phong phú?

Đây là một khái niệm mang tính kinh nghiệm và không có tiêu chuẩn nào để phân định giữa kém phong phú/phong phú, nhỏ/lớn. Người ta thường gọi nhanh một tập dữ liệu là nhỏ, kém phong phú khi lượng mẫu (sample) của nó ít, độ đa dạng không cao (các mẫu đều na ná giống nhau, không có nhiều trường hợp), dung lượng nhỏ chỉ vài gb có thể chạy trên máy tính cấu hình trung bình,…

3. Các phép nhúng từ thông dụng

a) BoW

feml_0405.png

Minh họa về BoW (nguồn: oreilly.com)

BoW đơn giản là đếm số lần xuất hiện của các từ, không quan tâm đến thứ tự xuất hiện của chúng trong câu.

Ở ví dụ trên, chúng ta có kho từ vựng gồm các từ [it, is, puppy, cat, pen, a, this].

Khi đếm số lần xuất hiện các từ trong câu “that is a dog and this is a pen” sẽ được chuyển đổi thành list/vector [0 2 0 0 1 2 1].

Ta nhận thấy chữ “that”, “dog” không có trong kho từ vựng nên nó không được đếm và không được thể hiện trong vector. 

Có những thư viện sẽ xử trí tình huống này bằng cách thêm 1 token như [UNK] vào kho từ vựng để đếm các từ vựng chưa từng thấy bao giờ vào. Với ví dụ trên, kho từ vựng sẽ trở thành

[it, is, puppy, cat, pen, a, this, [UNK]]

và câu “that is a dog and this is a pen” được chuyển thành

[0 2 0 0 1 2 1 2]

Tại sao phải cần token [UNK] trong khi chúng ta có thể bao quát toàn bộ từ vựng bằng cách tạo ra 1 tập hợp tất cả các từ vựng xuất hiện trong tập dữ liệu?

Ở giai đoạn huấn luyện (training) thì đúng là ta hoàn toàn có thể bao quát được mọi trường hợp xuất hiện nhưng ta sẽ không chắc chắn rằng tập kiểm thử (test) có xuất hiện từ mới hay không. Cho dù bạn gom toàn bộ từ vựng trong từ điển thì cũng sẽ luôn xuất hiện những từ unknown như tên riêng, từ bị gõ sai chính tả (doggg chả hạn). Do đó phải luôn luôn tính đến trường hợp unknown.

b) TF-IDF

Đây là một phiên bản phát triển của BoW. Nó giúp ta xác định được độ hiếm của từ ngữ cũng như sàng lọc ra được các từ stop-word xuất hiện quá thường xuyên, mang ít ngữ nghĩa (Ví dụ như “a”, “an”, “the”, “what”,…).

TF-IDF(t) = TF(t) * IDF(t)

TF (Term Frequency – tần suất của từ ngữ): đo số lần xuất hiện của từ ngữ trong đoạn văn. Do mỗi đoạn văn có độ dài khác nhau nên ta cần chuẩn hóa (normalize) bằng cách chia cho độ dài đoạn văn.

TF(t) = (Số lần từ t xuất hiện trong đoạn văn) / (Tổng số từ trong đoạn văn)

IDF (Inverse Document Frequency – tần suất nghịch đảo của đoạn văn): đo tầm quan trọng của từ ngữ. Do những từ như “is”, “of”, that” xuất hiện quá nhiều lần nhưng kém quan trọng nên ta cần phải giảm chỉ số biểu diễn của những từ ngữ này xuống bằng công thức:

IDF(t) = log_e(Tổng số đoạn văn /  1 + Tổng số đoạn văn có từ t)

log_e được sử dụng để giá trị tính ra không quá lớn hay quá nhỏ. +1 ở mẫu số để tránh trường hợp chia cho 0.

Ví dụ: Nếu một đoạn văn có 100 từ và từ “What” xuất hiện 7 lần thì TF(What) = 7 / 100 = 0.07.

Giả sử chúng ta có tất cả là 1.000.000 đoạn văn và có đến 800.000 đoạn văn chứ từ What thì IDF(What) = log_e(1.000.000 / 1 + 800.000) = 0.096

Do đó trọng số TF-IDF của từ What ở ví dụ này sẽ là 0.07 * 0.096 = 0.0067.

Đây là một con số rất nhỏ, biểu thị rằng từ What là một từ xuất hiện nhiều, kém quan trọng.

Lưu ý: Sử dụng các thư viện khác nhau có thể sẽ tính ra trọng số TF-IDF khác nhau do TF-IDF có nhiều biến thể. Mọi người nên đọc kĩ tài liệu chính thức của thư viện để tránh bấn loạn.

figure-1
tfidf-example-use

via stoconblog

One thought on “Giới thiệu về phép nhúng từ (phần 1)

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s