NLP – Word Embedding


Deep Learning là thuật ngữ không còn xa lạ với giới nghiên cứu trong những năm gần đây. Nhờ sự phát triển của các mô hình Deep Learning mà nhiều bài toán đã được giải quyết bằng các phương pháp đạt hiệu quả cao hơn hẳn so với phương pháp truyền thống. Sức mạnh của Deep Learning được minh họa rõ ràng nhất gần đây chính là sự chiến thắng của máy tính AlphaGo trước nhà vô địch thế giới ở môn cờ vây, một trò chơi mà một thời gian ngắn trước đó vẫn chưa có chương trình máy tính nào đạt được cấp độ cao và đã từng được dự đoán sẽ không tìm ra phương pháp giải trong ít nhất chục năm tới.

Xem thêm:

  1. NLP – Part of Speech
  2. NLP – Word Segmentation
  3. NLP – Stemming and Lemmatization

Deep Learning ảnh hưởng đến các lĩnh vực liên quan tới Machine Learning, và NLP cũng không phải là ngoại lệ. Nhiều bài toán trong NLP như Name Entity Recognition, POS Tagging, Machine Translation, … đã có được sự phát triển vượt trội nhờ Deep Learning. Giới nghiên cứu hiện nay hầu hết ai cũng đang bị lôi cuốn theo trào lưu này, các paper nằm trong những Conference hàng đầu được xuất bản gần đây cũng hầu hết liên quan tới việc sử dụng Deep Learning. Có thể nói rằng, chúng ta đang cố gắng hết sức để khai phá sức mạnh tiềm ẩn của Deep Learning và trong vài năm tới có thể chúng ta sẽ còn thấy nhiều khám phá thú vị khác liên quan tới nó.

Trong mô hình Deep Learning, input đầu vào thường sẽ là một vector (hoặc ma trận) chứa các giá trị số. Đối với NLP, dữ liệu chúng ta có thường là dạng chuỗi ký tự. Con người nhìn chuỗi ký tự này và xử lý nội dung ở dạng là các từ được ghép nối với nhau. Câu hỏi được đặt ra tương tự đối với máy tính. Làm thế nào để biểu diễn một chuỗi ký tự thành các con số để máy tính xử lý, đặc biệt trong các mô hình Deep Learning khi mà dữ liệu đầu vào đóng vai trò cực kỳ quan trọng để xây dựng được mô hình hiệu quả. Cần nhớ rằng dữ liệu training càng phong phú thì khả năng nhận dạng của Deep Learning càng cao và dữ liệu training tồi sẽ dẫn đến mô hình Deep Learning có khả năng nhận dạng kém. Garbage in, garbage out.

Quay lại với câu hỏi làm sao biểu diễn một chuỗi các ký tự trong text thành input đầu vào của mô hình Deep Learning, chúng ta sẽ cùng nhau xem xét các cách biểu diễn từ đơn giản đến phức tạp. Đối với 1 chuỗi text, thông thường người ta sẽ phân nhỏ chuỗi text đó ra và biểu diễn từng thành phần đơn vị của chuỗi text đó. Tùy theo cách chọn “đơn vị” mà chúng ta có cách biểu diễn khác nhau:

Đơn vị là “Ký tự” (Character)

Cách biểu diễn này khá đơn giản bởi vì thứ nhất: các ký tự không có sự liên quan về mặt ngữ nghĩa với nhau, miễn sao chúng ta có thể phân biệt được các ký tự là OK. Hơn nữa số lượng ký tự chúng ta có là không lớn cho nên không lo sợ về vấn đề không gian lưu trữ và xử lý. Đơn giản nhất là chúng ta có thể dùng mã ASCII để đại diện cho ký tự đó. Trong trường hợp cần biễu diễn mỗi ký tự theo dạng vector thì chúng ta có thể sử dụng one-hot vector.

One-hot vector là một vector có toàn bộ giá trị là 0 trừ tại một vị trí đặc biệt nào đó thì giá trị sẽ là 1. Ví dụ như chúng ta chỉ có 4 ký tự: ABCD, chúng ta sẽ có các one-hot vector tương ứng với từng ký tự như sau:

  • A: [1, 0, 0, 0]
  • B: [0, 1, 0, 0]
  • C: [0, 0, 1, 0]
  • D: [0, 0, 0, 1]

Số chiều của one-hot vector sẽ phụ thuộc vào số lượng phần tử có trong tập hợp mà chúng ta cần biểu diễn. Trong ví dụ trên vì tập hợp chúng ta chỉ có 4 phần tử (‘A’, ‘B’, ‘C’, ‘D’) nên vector của chúng ta là 4 chiều. Giả sử cần biểu diễn cho toàn bộ 102 ký tự trên bàn phím thì chúng ta sẽ cần vector 102 chiều.

Ngoài ra, chúng ta còn có thể khởi tạo vector của mỗi ký tự có các giá trị là random, khi đó xác xuất 2 ký tự có vector biễu diễn giống nhau là gần như bằng 0. Điều quan trọng nhất cần để ý đó là: giữa các ký tự không có mối liên hệ ngữ nghĩa nào rõ ràng nên miễn sao vector biểu diễn khác nhau là được.

Đơn vị là “Token” (Word)

Tương tự như đối với ký tự, chúng ta cũng có thể áp dụng các cách biễu diễn đã được nêu ra ở trên.

  • Sử dụng 1 con số để dại diện cho Token đó: Cách này đơn giản nhưng không hiệu quả vì giữa các từ nó có mối quan hệ ngữ nghĩa (đồng nghĩa, khác nghĩa, biến thể, …), nếu chỉ dùng 1 con số nguyên thì không có biểu diễn được mối quan hệ đó. Hơn nữa các mô hình Deep Learning thường yêu cầu dạng input đầu vào dạng vector thì không dùng cách này được.
  • Sử dụng one-hot vector: Tương tự như ký tự, chúng ta có thể xem mỗi token là một phần tử trong tập hợp toàn bộ token có thể có của một ngôn ngữ, ví dụ tiếng Anh có khoảng 1 triệu words, mỗi word sẽ được biểu diễn bằng một one-hot vector có 1 triệu chiều. Nhược điểm của phương pháp này là số lượng chiều của một vector rất lớn nên ảnh hưởng đến việc xử lý cũng như lưu trữ. Ví dụ như tiếng Anh khoảng 1 triệu từ, mỗi từ là vector 1 triệu chiều. Giả sử đoạn text tiếng Anh khoảng 1000 từ thì chúng ta đã phải sử dụng tới ma trận 1000 dòng * 1 triệu cột để biễu diễn cho input. Hơn nữa, biểu diễn theo dạng one-hot vector như thế này vẫn không giải quyết được việc biễu diễn mối liên hệ giữa các từ với nhau.
  • Sử dụng các vector random: Nếu dùng vector random thì số chiều chúng ta cần dùng sẽ ít hơn nhiều so với dùng one-hot vector. Ví dụ như các bạn có 1 triệu từ thì chỉ cần trong không gian 3 chiều chúng ta cũng đã có thể biễu diễn được tất cả các từ đó, mỗi từ là một điểm trong không gian 3 chiều. Như one-hot vector, chúng ta cũng không hiểu mối liên hệ giữa các từ thông qua vector random như thế này.
  • Dùng Word Embedding: Đây được xem là một cách biểu diễn tốt nhất cho các token trong text. Kỹ thuật này này không những biểu diễn mỗi token bằng một vector với số chiều thấp mà còn cho thấy được sự liên hệ ngữ nghĩa giữa các vector đó. Bằng việc sử dụng các vector này như là input cho mô hình Deep Learning, mô hình sẽ có khả năng học tốt hơn và khả năng nhận dạng cũng tăng lên.

Word Embedding

Vậy, Word Embedding (hay Word Vector) được sinh ra như thế nào? Chúng ta sẽ quay lại lịch sử một chút (theo Wikipedia). Mọi chuyện bắt đầu vào khoảng năm 2000 khi ông Bengio viết series bài báo Neural probabilistic language models để nhằm giảm số chiều của vector biểu diễn một word theo ngữ cảnh bằng cách dùng machine learning. Sau đó thì nhiều nhà khoa học khác cũng đề xuất nhiều kỹ thuật khác nhau để tìm ra cách biểu diễn tốt nhất cho word. Tuy nhiên trong giai đoạn trước 2010 thì không có nhiều điểm bứt phá vì tốc độ để học các word vector là rất lâu trong khi performance không cải thiện nhiều. Tuy nhiên, năm 2013 thì nhóm nghiên cứu của Tomas Mikolov đã cung cấp bộ công cụ word2vec với khả năng học word vector rất nhanh cũng như performance khá tốt, khi đó thì word embedding càng được sử dụng rộng rãi hơn nhiều. Có nhiều cách học word embedding nhưng mình sẽ giới thiệu một ví dụ sử dụng mạng Neural để học word embedding của các từ.

Đối với bài toán tìm ra word vector, dữ liệu đầu vào sẽ là một văn bản, xem như là tập hợp các từ (word). Đầu tiên, tương ứng với mỗi word thì chúng ta sẽ khởi tạo một vector random với số chiều được chỉ định (giả sử 100). Sau khi đã có vector random, việc tiếp theo là thực hiện quá trình điều chỉnh vector của các từ này để sao cho chúng có thể biểu diễn được liên hệ giữa các từ có quan hệ với nhau.

Giả sử chúng ta có câu văn sau: Con mèo trèo cây cau. Tương ứng với mỗi từ trong câu này, chúng ta sẽ khởi tạo một vector random với số chiều được quy định trước (ví dụ số chiều = 50). Người ta sử dụng một mang neuron và dùng mạng neural này để điều chỉnh dần dần các vector của các từ sao cho chúng thỏa mãn một số điều kiện nào đó. Câu hỏi đặt ra ở đây: Điều kiện đó là gì?

Để trả lời câu hỏi này thì trước hết chúng ta cần quan tâm tới một đặc điểm của ngôn ngữ, đó là những từ có mối liên hệ với nhau thường sẽ xuất hiện trong những ngữ cảnh khác nhau. Ví dụ từ “trái” và “phải” có thể xem là có mối liên quan nào đó với nhau vì nó đều dùng chỉ phương hướng và nó thường xuất hiện trong những mẫu câu giống nhau. Ví dụ mình có các câu:

“Chạy xe phía bên trái”, “Chạy ở bên phải”, “Bên trái có vẻ rộng hơn”, “Bên phải có một ngôi nhà”. 

Bạn có để ý thấy các từ nằm xung quanh của từ “trái” và “phải” đều khá là giống nhau không? Đó chính là nguyên tắc học của word2vec. Nó dựa vào những từ xung quanh của một từ nào đó để điều chỉnh vector của từ đó sao cho hợp lý.

Quay trở lại với ví dụ ban đầu: Con mèo trèo cây cau. Chúng ta sử dụng 1 mạng Neural để xem câu này có hợp lệ hay không. Giả sử thay từ “trèo” bằng từ “ngủ“, rõ ràng chúng ta sẽ có 1 câu hoàn toàn vô nghĩa và hầu như không bao giờ xuất hiện trong văn bản bình thường: “con mèo ngủ cây cau“. Bằng cách thay từ “trèo” bằng từ “ngủ” và nói cho mạng Neural biết rằng câu mới sinh ra là không hợp lệ, mạng Neural sẽ phải điều chỉnh các tham số trong mạng của nó một cách hợp lý để đưa ra được output đúng như chúng ta mong muốn (tức là “không hợp lệ”). Thông thường thì input vào mạng Neural sẽ không phải là nguyên một câu mà chỉ là 1 cụm từ của câu có độ dài dựa theo một tham số gọi là window size. Ví dụ window_size = 3 thì chúng ta sẽ có các cụm từ: “con mèo trèo“, “mèo trèo cây“, “trèo cây cau“. Với mỗi windows size thì chúng ta có thể thay 1 từ nào đó bằng 1 từ random khác để có các cụm câu vô nghĩa dùng để train mạng Neural (bởi vì khi train mạng Neural thì phải vừa cho input với nhãn “hợp lệ” và cũng phải có input với nhãn “không hợp lệ” nhằm giúp cho mạng Neural đó phân biệt cho đúng).

Nhờ việc train mạng Neural trên một số lượng text cực lớn, ví dụ như toàn bộ text trên vnexpress chẳng hạn, thì vector của mỗi từ sẽ được điều chỉnh càng chính xác và những từ có liên quan nhau cũng sẽ xuất hiện ở gần nhau hơn. Khi đó giữa các từ có mối liên hệ với nhau rất thú vị. Chẳng hạn chúng ta lấy vector của từ “king” đem cộng với vector của từ “man” rồi trừ đi vector của từ “women” thì chúng ta sẽ được một vector mà từ gần giống vector đó nhất là “queen”. Xem demo ở đây: http://deeplearner.fz-qqq.net/

countries
Minh họa vector của tên “quốc gia” và “thủ đô”. Nguồn: https://www.lucypark.kr/courses/2015-ba/text-mining.html

Mình rất khuyến khích các bạn đọc thêm về word embedding ở bài viết Deep Learning, NLP, and Representations vì trong đó có nói chi tiết hơn hoặc nói một cách chính xác hơn. Bài viết của mình chỉ với mục đích giới thiệu cho các bạn một cách dễ hiểu nhất lý do cần dùng word embedding và làm sao để có word embeddding dựa trên cách hiểu của bản thân mình, vì thế có thể có những chi tiết nào đó không chính xác về mặt khoa học. Rất hy vọng bài viết này giúp ích được phần nào những bạn đang bắt đầu nghiên cứu về NLP.

Paper tham khảo:
1. Efficient Estimation of Word Representations in Vector SpaceTomas Mikolov, Kai Chen, Greg Corrado, Jeffrey Dean

2. word2vec Parameter Learning Explained, Xin Rong

Tác giả: xuanchien

Tran Xuan Chien. Japan Advanced Institute of Science and Technology - Japan. Senior Developer - NUS Technology.

2 thoughts on “NLP – Word Embedding”

  1. Cảm ơn anh về bài viết. Em thích cách mà anh dẫn vào word embedding. Ngoài Word2Vec em còn biết có Glove được đề xuất bởi nhóm nghiên cứu đại học Stanford. Anh có so sánh nào giữa 2 phương pháp này ko anh?

    1. Hi Zero. Cám ơn bạn. Glove mình cũng có nghe nhưng lại chưa có cơ hội tìm hiểu sâu về Glove nên chưa thể đưa ra đánh giá ngay lúc này. Hy vọng một lúc nào đó sẽ có thời gian tìm hiểu và sẽ có một sự so sánh chi tiết về 2 phương pháp này.

Gửi phản hồ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 Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s