Word embedding

word2vectors.gif
NLP là một trong những bài toán khó và phức tạp trong ngành Khoa học máy tính và Trí tuệ nhân tạo. Do đòi hỏi phải dạy cho máy tính không chỉ hiểu được cú pháp của một ngôn ngữ mà còn ngữ nghĩa của các câu sử dụng trong từng ngữ cảnh đặc biệt mà không mắc phải nhập nhằng (ambiguity).

Để đi đến đích, đó là xây dựng được một hệ thống AI hoàn thiện, ta còn cách tương lai quá xa. Trong khi đó, word vector (hay còn gọi là distributed representations) là một công cụ khá thú vị có thể xoá bỏ một vài khoảng cách tri thức về ngôn ngữ giữa máy tính và con người. Trong bài viết này, tôi sẽ tóm tắt lại khái niệm và ý nghĩa của việc sử dụng word vector trong NLP.

Ví dụ kinh điển khi nói đến word vector là “king – man + woman =?”, bạn có nghĩ rằng máy tính sẽ trả lời là “queen” không? Thật vậy, Google đã làm được điều này trong dự án nghiên cứu word2vec của mình (biến đổi một từ thành một vector). Bạn có thể tham khảo thêmword2vec implementation Google Code.

Word vector là gì?

Về cơ bản, đây chỉ là một vector trọng số. Ví dụ, 1-of-N (one-hot vector) sẽ mã hoá (encoding) các từ trong từ điển thành một vector có chiều dài N (tổng số lượng các từ trong từ điển). Trong đó, có một phần tử mang giá trị 1 tương ứng với thứ tự của từ đó trong từ điển (ta có thể sắp từ điển tăng dần a-z, A-Z, 0-9) và các phần tử khác đều mang giá trị 0. Giả sử từ điển của chúng ta chỉ có 5 từ: King, Queen, Man, Woman, và Child. Ta có thể biểu diễn từ “Queen” như bên dưới:
word2vec-one-hot.png
Với cách mã hoá đơn giản như vậy, ta không thu được nhiều ý nghĩa trong việc so sánh các từ với nhau ngoại trừ so sánh bằng.

Ngược lại, word2vec biểu diễn các từ dưới dạng một phân bố quan hệ với các từ còn lại (distributed representation).Giả sử ta có một vector có số chiều 1000. Khi đó, mỗi từ được biểu diễn bằng một vector có các phần tử mang giá trị là phân bố quan hệ của từ này đối với các từ khác trong từ điển.
word2vec-distributed-representation

Suy luận từ word vectors

Thật ngạc nhiên, với cách biểu diễn như vậy, các vector mang lại cho ta cả cú pháp và ngữ nghĩa ở một mức độ nào đó để máy tính hiểu. Ví dụ, ta đặt vector của từ ix_i, ta có thể quan sát thấy quan hệ số ít/số nhiều (singular/plural) khá đúng như sau x_{apple} - x_{apples} \approx x_{car} - x_{cars}, x_{family} - x_{families} \approx x_{car} - x_{cars}. Hơn nữa, điều này lại đúng trong nhiều quan hệ ngữ nghĩa khác nhau được SemEval 2012 khảo sát về độ đo giữa các quan hệ ngữ nghĩa. Ví dụ, man thường xuất hiện cùng woman thì uncle cũng thường xuất hiện với aunt, đơn giản bằng cách lấy độ dị biệt (offset) giữa hai vector bằng khoảng cách cosine (cosine distance).

Ví dụ bên dưới minh hoạ mối quan hệ giới tính
word2vec-gender-relation.png
Bạn có thể đoán được King – Man + Woman = gì không? Câu trả lời sẽ là “Queen”. Thật thú vị phải không nào!
word2vec-king-queen-vectors
word2vec-king-queen-composition
Và còn nhiều ví dụ tương tự như vậy được khảo sát trong các bảng bên dưới
word2vec-ee-table-8.png
word2vec-dr-fig-2.png
word2vec-dr-table-2.png
Word vectors với các mối quan hệ ngữ nghĩa như vậy có thể được dùng để cải tiến các ứng dụng NLP hiện tại như dịch máy (machine translation), truy vấn thông tin (information retrieval) và các hệ thống hỏi đáp tự động (question answering systems).
word2vec-efficient-estimation-table-3.png

Huấn luyện word vectors

Trong nghiên cứu của Mikolov et al. 2013, tác giả đề xuất hai kiến trúc để xây dựng word vector đó là Continuous Bag-of-Words model, và Continuous Skip-gram model. Bài báo sử dụng Google News corpus để huấn luyện word vectors. Corpus này có khoảng 6 tỉ tokens (từ) nhưng được giới hạn lại khoảng 1 triệu các từ thông dụng nhất.

Continuous Bag-of-Words

Quan sát đoạn văn sau: “The recently introduced continuous Skip-gram model is an efficient method for learning high-quality distributed vector representations that capture a large number of precises syntatic and semantic word relationships.” Hãy tưởng tượng, ta có một sliding window di chuyển qua đoạn văn này, ta sẽ có từ nằm giữa đang được focus, cùng với 4 từ nằm trước và 4 từ nằm sau nó (context words) như hình minh hoạ bên dưới:
word2vec-context-words
Ta đưa vào input layer của mạng nơ-ron gồm các context words được biểu diễn ở dạng one-hot vector (v là số chiều của vector của từ điển V). Như hình minh hoạ bên dưới, ta sẽ có single hidden layer và một output layer.
word2vec-cbow.png
Mục tiêu khi training đó là cố gắng tối đại hoá xác suất có điều kiện để quan sát được focus word khi cho trước các context words, đi kèm với trọng số. Trong ví dụ của chúng ta, nếu đầu vào là (“an”, “efficient”, “method”, “for”, “high”, “quality”, “distributed”, “vector”) thì ta mong muốn xác suất thu được từ “learning” là cao nhất.

Như vậy, với đầu vào là các one-hot vector, ta nhân với ma trận trọng số W_1 để thu được hidden layer h. Phép toán này tương đương với việc chọn ra một dòng trong ma trận W_1.
word2vec-linear-activitation.png
Cho C word vectors đầu vào, hidden layer h chính là trung bình cộng của các dòng trong ma trận W_1 bằng cách cộng các dòng này lại chia cho C.

Từ hidden layer ra được output layer, ma trận trọng số W_2 được sử dụng để bỏ phiếu (scoring) cho các từ trong từ điển. Softmax function được sử dụng để thu về phân bố tiền nghiệm (posterior distribution) cho các từ này.

Continuous Skip-gram 

skip-gram model ngược lại với CBOW model. Mô hình này sử dụng focus word làm single input vector, và target context words bây giờ lại là output layer:
word2vec-skip-gram.png
Activation function cho hidden layer lúc này chính là chọn ra một dòng trong ma trận trọng số W_1 làm hidden layer. Output layer lúc này sẽ là C các vector multinomial distributions thay vì chỉ có một vector như mô hình trước.

Mục tiêu huấn luyện lúc này sẽ là tối tiểu hoá độ lỗi của output layer so với training data (summed prediction error). Ví dụ, nếu input là “learning”, ta hy vọng nhìn thấy (“an”, “efficient”, “method”, “for”, “high”, “quality”, “distributed”, “vector”) ở output layer.

Code minh hoạ

Ta sử dụng gensim để tìm danh sách các từ tương đương với từ “vacation” bằng cách sử dụngfreebase skipgram data:

from gensim.models import Word2Vec
fn = "freebase-vectors-skipgram1000-en.bin.gz"
model = Word2Vec.load_word2vec_format(fn)
model.most_similar('vacation')

# [('trip', 0.7234684228897095),
#  ('honeymoon', 0.6447688341140747),
#  ('beach', 0.6249285936355591),
#  ('vacations', 0.5868890285491943),
#  ('wedding', 0.5541957020759583),
#  ('resort', 0.5231006145477295),
#  ('traveling', 0.5194448232650757),
#  ('vacation.', 0.5068142414093018),
#  ('vacationing', 0.5013546943664551)]

Một vài điểm lưu ý

  1. Word vectorization cần rất nhiều văn bản để huấn luyện bạn có thể download pretrained word vectors ở đây, nhưng nếu bạn có ngữ liệu để phục vụ cho bài toán riêng của mình, bạn cần phải train lại word vectors và đòi hỏi ở bạn rất nhiều data. Thông thường bạn cần khoảng hàng trăm triệu từ, tương đương với khoảng 1000 đầu sách, 500,000 comments, hay 4,000,000 tweets.
  2. Tiền xử lý văn bản. Bạn cần dọn dẹp và chuẩn hoá dữ liệu thành Unicode characters, điều này đòi hỏi rất nhiều nỗ lực. Trong trường hợp này, bạn có thể sử dụng các công cụ sau để xử lý FTFY, SpaCy, NLTK, và Stanford Core NLP.
  3. Memory và performance. để huấn luyện word vectors bạn cần nhiều RAM và máy tính đa nhân có hiệu suất cao. Thời gian huấn luyện có thể từ vài giờ cho đến vài ngày. Nếu bạn sử dụng luôn pretrained vectors, ta không cần lo lắng đến vấn đề này.
  4. Databases. các hệ thống SQL hiện này không phù hợp để thực thi các phép toán trên vector như cộng, trừ, nhân, tìm kiếm trên không gian vector. Một vài tool có thể giúp bạn trong tác vụ này: annoy, ball trees, locality-sensitive hashing (LSH) hay FLANN.
  5. False-positives và tính chính xác. Mặc dù word2vec cho ta các kết quả khá ấn tượng, nhưng không có kĩ thuật NLP nào là hoàn hảo. Ta nên kiểm chứng lại chương trình và hệ thống của mình.

Nguồn tham khảo:

Advertisements

8 thoughts on “Word embedding

  1. Em cảm ơn anh về bài giảng tuyệt vời này, em đang làm về image captioning, dường như đều phải bắt đầu từ đầu. Sau khi xem một số bài giảng của anh em đã hiểu ra rất nhiều vấn đề, rất mong nhận được sự giúp đỡ của anh về vấn đề này, hiện tại em cũng đang hoang mang khi không biết đọc cái nào là tốt hơn (như word2vec em đã đọc nhiều bài báo mà không bài nào phân tích kỹ như anh), mong anh tư vấn giúp em nên đọc gì tiếp theo.

    Liked by 1 person

  2. chào anh, bài viết của anh rất hay tuy nhiên nhiều thuật toán và code e ko hiểu lắm vì e mới học python và nltk còn toán thì đã quên hết.

    em đang làm 1 con chatbot bằng python nhưng gần như chỉ handcraft bằng regular expression, không có tí machine learning nào nên nó hoạt động vẫn chưa tốt, em muốn hỏi bây giờ em muốn học sâu vào NLP và machine learning để phân tích dữ liệu tiếng việt và tiếng anh chuyên sâu thì em nên học những kiến thức nào (toán và lập trình) nếu anh có thể recommend được sách hay tutorial nữa thì tốt quá, em cảm ơn.

    Số lượt thích

    • hi em, về chatbot anh không chuyên sâu lắm. Nhưng về cơ bản thì hệ thống như vậy thường áp dụng kĩ thuật truy vấn văn bản sau đó phát sinh mẫu câu có ý nghĩa gần với con người.
      Học về ML thì em có thể tham khảo các thuật toán cơ bản trong blog này. NLP là lĩnh vực có khá nhiều nhánh từ phân tích ngữ pháp đơn giản đến dịch văn bản… nên đòi hỏi thời gian nghiên cứu dài.
      Kĩ năng review paper là cần thiết khi xây dựng các hệ thống dạng này. Em sẽ thu hẹp domain mình lại để tập trung nghiên cứu sâu như vậy sẽ khả thi hơn, nhưng trước hết vẫn cần nền tảng kiến thức cơ bản. Em có thể theo một khoá học tại trường ĐH của em hoặc Coursera để nắm bắt được lĩnh vực này. Sách và tutorial em đều có thể search trên internet miễn phục vụ được nhu cầu của em.

      Liked by 1 person

  3. Cám ơn anh đã giới thiệu về word embedding. Em đang thử so sánh các mô hình biểu diễn từ khác nhau, đang băn khoăn vấn đề tập dữ liệu để kiểm thử. Ví dụ mô hình 1 nói từ A và B tương đồng 0.7. Mô hình 2 nói A và B tương đồng 0.8. Nếu mình không có tập dư liệu kiểm thử thì đâu có thể biết đc mô hình 1 hay 2 chính xác hơn đúng không anh nhỉ?

    Số lượt thích

    • Đúng rồi em, nếu ta có tập dữ liệu huấn luyện đã cho biết trước A và B tương đồng bao nhiêu thì khi training, mô hình nào càng gần với điểm tương đồng cho trước này nhất thì mô hình ấy càng chính xác.
      Word embedding chỉ là công cụ pre-processing làm input cho các bài toán khác, nên tập kiểm thử sẽ nằm trong bài toán khác như dịch máy, phân loại văn bản, phân tích cú pháp, …

      Số lượt thích

  4. Anh ơi, a giải thích cho em chỗ cuối mô hình skip-gram với ạ. Như đầu vào a hướng dẫn : biểu diễn word bằng vector one-hot V. Đầu ra em thấy nó cũng là 1 vector V. Theo em hiểu thì lúc này nó không phải là one-hot nữa, vậy từ các vector V đầu ra ta làm sao tìm được đó là từ nào trong từ điển V

    Số lượt thích

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 )

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 )

Google+ photo

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

Connecting to %s