Word Embedding

Biểu diễn văn bản

 

Về bản chất, văn bản là một đoạn dữ liệu dạng string và có thể thực hiện một số thao tác xử lý dựa trên dạng dữ liệu này (chẳng hạn tìm chuỗi con hay thay thế chuỗi). Các thao tác tiền xử lý dữ liệu có thể thực hiện trực tiếp trên dạng chuỗi của văn bản. Tuy nhiên để thực hiện các giải thuật phức tạp hơn, ta cần một cấu trúc dữ liệu có thể biểu diễn nhiều thông tin ngữ nghĩa hơn.

 

 

Văn bản có thể biểu diễn như một bag of words (tức là một tập hợp từ), hoặc một tập hợp luận lý, với từ nào có xuất hiện trong văn bản thì phần tử tương ứng sẽ mang giá trị là true và ngược lại. Để có nhiều thông tin  hơn, chúng ta có thể thay giá trị luận lý bằng số lần xuất hiện của từ trong văn bản.

Tuy nhiên dạng biểu diễn này chưa biểu diễn được mối quan hệ giữa các từ trong văn bản. Ở những hướng tiếp cận phức tạp hơn, văn bản có thể biểu diễn dưới dạng graph, với mỗi từ là một đỉnh và liên hệ giữa các từ được biểu diễn qua các cạnh nối các đỉnh tương ứng. Trong các hướng nghiên cứu về computational linguistics, một hướng biểu diễn phổ biến là xây dựng các cây phân tích câu/đoạn dựa trên các văn phạm đặc thù và kết hợp các cây đó thành một dạng biểu diễn dạng đồ thị. Hướng biểu diễn này có thể capture được nhiều thông tin ngữ nghĩa nhưng chi phí tính toán là rất cao, dẫn đến nhiều khó khăn khi xử lý dữ liệu thực tế.

Dạng biểu diễn văn bản bằng vector được sử dụng rộng rãi nhất hiện nay vì:

  • Có tốc độ tính toán nhanh, đặc biệt với các thư viện tính toán được hỗ trợ từ các ngôn ngữ cấp cao và các card chuyên dụng phần cứng.
  • Có thể encode được nhiều thông tin ngữ nghĩa hơn dạng bag of words.

 

Biểu diễn văn bản dựa trên vector

 

Biểu diễn bằng vector tf.idf

 

Vector tf.idf là dạng biểu diễn văn bản thông dụng trong các hướng tiếp cận xử lý NLP cổ điển. Như hình minh hoạ bên dưới, một văn bản sẽ được biểu diễn bằng một vector có n chiều trong đó n là số từ có thể có trên tất cả văn bản. Như vậy với một tập corpus có m văn bản chúng ta sẽ có một ma trận document x term có size là m x n. Phần tử M(i,j) sẽ biểu diễn trọng số của từ thứ j trong văn bản thứ i. Trọng số này sẽ được tính bằng giá trị tf(i,j) x idf(j), trong đó

  • tf(i,j): được gọi là term frequency, được đo bằng  số lần xuất hiện của từ thứ j trong văn bản thứ i. Nếu từ thứ j không xuất hiện trong văn bản thứ i thì giá trị này bằng 0. Trọng số này có thể normalized thành một giá trị nằm giữa 0 và 1 bằng cách chia cho số lần xuất hiện của từ xuất hiện nhiều nhất trong  văn bản.
  • idf(j): được gọi là inverse document frequency của từ thứ j, được tính bằng log2(N/df(j)), trong đó N là tổng số tài liệu trong corpus và df(j) là tổng số tài liệu có chứa từ thứ j. Nếu j xuất hiện trong tất cả các văn bản của corpus thì df(j) = N và khi đó idf(j) =0.

 

Trọng số tf.idf tính theo cách trên sẽ cho biết độ quan trọng của một từ trong văn bản. Ví dụ trong một văn bản thể thao, hai từ “Ronaldo” và “” xuất hiện nhiều thì sẽ có điểm tf cao. Tuy nhiên nếu xét trên tập tất cả các bài báo điện tử, từ “” hầu như xuất hiện ở tất cả các tài liệu và vì vậy sẽ có điểm idf rất thấp (gần như bằng 0). Ngược lại từ “Ronaldo” hầu như chỉ xuất hiện trong các tài liệu về thể thao (cụ thể là bóng đá) nên sẽ có điểm idf khá cao. Vì vậy trọng số tf.idf của từ “Ronaldo” sẽ cao, biểu hiện rằng đây là từ quan trọng trong văn bản, còn trọng số tương ứng của từ “” rất thấp, cho thấy đây là một từ kém quan trọng.

Hầu hết các hệ thống truy hồi thông tin (Information Retrieval) đều sử dụng trọng số tf.idf để tính độ quan trọng của các từ trong văn bản, tuy nhiên khi biểu diễn văn bản thành một vector tf.idf, chúng ta không biểu diễn được thứ tự xuất hiện của các từ trong văn bản (một ví dụ dễ thấy là khi đảo thứ tự từ khoá query trên Google, chúng ta vẫn cùng thu được một kết quả tìm kiếm). Đồng thời biểu diễn văn bản ở mức vector như vậy cũng gây khó khăn để biểu diễn các mối quan hệ ngữ nghĩa khác giữa các từ.

 

Word Embedding

 

 

Cùng với sự xuất hiện của các kiến trúc deep learning, việc biểu diễn và tính toán trên văn bản cũng được xử lý ở mức cao hơn. Thay vì biểu diễn toàn bộ văn bản thành một vector, chúng ta có thể biểu diễn mỗi từ thành một vector. Như vậy một văn bản có m từ sẽ được biểu diễn thành một ma trận m x n với n là số chiều của vector. Khi đưa vào mô hình tính toán deep learning, chúng ta nói rằng văn bản được xử lý qua một tầng embedding trong đó các từ sẽ được đổi thành các vector tương ứng. Việc xử lý này gọi là word embedding, vì các thông tin ngữ nghĩa (dựa trên thống kê) của các từ sẽ được embed vào các vector.

Khi biểu diễn từ thành vector, chúng ta cần thoả mãn các yêu cầu sau:

  • Mỗi từ khác nhau sẽ được biểu diễn thành một vector khác nhau
  • Những từ có ngữ nghĩa gần nhau sẽ được biểu diễn thành các vector có khoảng cách gần nhau trên không gian vector.

 

One-hot vector

 

Một trong những dạng biểu diễn từ thành vector đầu tiên là one-hot vector. Với dạng biểu diễn này, một từ sẽ được biểu diễn thành một vector n chiều với n là số từ trong toàn bộ tài liệu (tương tự như số chiều trong vector tf.idf). Vector biểu diễn cho từ thứ i sẽ có giá trị của tất cả các chiều là 0, riêng giá trị của chiều thứ i sẽ có giá trị là 1.

 

 

Cách biểu diễn one-hot vector như vậy sẽ giúp chúng ta đạt được yêu cầu là mỗi từ khác nhau sẽ được biểu diễn bằng một vector khác nhau, tuy nhiên cách này có 2 yếu điểm như sau:

  • Số chiều của vector quá lớn, sẽ ảnh hưởng đến tốc độ tính toán với lượng dữ liệu lớn.
  • Khoảng cách Euclidean giữa 2 vectors bất kỳ luôn là sqrt(2), nên không biểu diễn được mối quan hệ tương tự giữa các từ tương ứng.

 

Các nghiên cứu để giải quyết hai vấn đề trên, đặc biệt là để embed thông tin ngữ nghĩa vào các vector, dẫn đến hai hướng tiếp cận chính: Word2vec (của Google) và Glove (của Stanford).

 

Hướng tiếp cận Word2vec

 

Thu giảm số chiều bằng AutoEncoder

 

Khi giải quyết bài toán thu giảm số chiều của một vectors, tức là ánh xạ một điểm từ không gian nhiều chiều sang không gian ít chiều hơn, một trong những hướng giải quyết phổ biến dựa trên neural network hiện nay là sử dụng AutoEncoder.

Hiểu theo định nghĩa toán học, AutoEncoder sẽ bao gồm 2 phần: encoder F và decoder T. Với một input là một vector xm chiều, encoder F sẽ tạo ra một vector encoded z = F(x). Vector zk chiều, với k khá nhỏ so với m. Sau đó decoder T sẽ tạo ra một giá trị ảnh x = T(z) với x là một vector có cùng số chiều với x. Hàm mục tiêu của AutoEncoder sẽ tối thiểu khoảng cách ||xx||, tức là cố gắng tạo ra một ảnh x càng giống x càng tốt. Vì vậy, đây là một quá trình học unsupervised, không cần con người gán nhãn.

Chúng ta xem xét một mạng AutoEncoder đơn giản như sau:

 

 

Mạng này có input là một vector 6 chiều, sau khi encode sẽ tạo ra một vector 3 chiều, khi decode sẽ tạo ra một vector 6 chiều như ban đầu. Nếu xem các trọng số từ tầng input đến tầng hidden là một ma trận, chúng ta có ma trận W có kích thước là 6×3. Tương tự như vậy chúng ta có ma trận W biểu diễn cho các trọng số từ tầng hidden đến tầng output, có kích thước là 3×6.

Với một vector x có kích thước là  [1×6], vector x sẽ được tạo ra bằng phép tính x = x.W.W. Mạng neural network sẽ dùng cơ chế backpropagation và gradient descent như thường lệ để học các giá trị của W và W.

Như vậy với một tập hợp m vectors 6 chiều X = {x1,…,xm}, sau khi huấn luyện bằng mạng AutoEncoder bên trên, chúng ta có thể tạo ra m vector 3 chiều Z = {z1,…,zm} sao cho zi =xi.W. Mỗi vector zi này có thể decode thành một vector xi~xi bằng cách xi = zi.W.

 

Như vậy chúng ta đã có thể biến đổi các vector 6 chiều thành các vector 3 chiều bằng cách dùng ma trận W (hoặc ma trận WT, khi đó vector encode của x sẽ được tạo ra bằng x.WT). Bằng cách thay đổi số node ở tầng input (và output) và tầng hidden, chúng ta có thể biến đổi các vector ở các không gian có số chiều tuỳ ý.

Do các vector x dùng chung ma trận W khi biến đổi, dễ thấy:

  • Hai vector xi,xj khác nhau sẽ được encoded thành 2 vector zi,zj khác nhau.
  • Hai vector xi,xj tương tự nhau sẽ được encoded thành 2 vector zi,zj tương tự nhau.

 

Như vậy AutoEncoder có thể giúp chúng ta giải quyết bài toán thu giảm số chiều đối với các one-hot vector. Tuy nhiên do khoảng cách của các one-hot vector là như nhau đối với một cặp one-hot vector bất kỳ (tức là sẽ không tồn tại một cặp xi,xj “tương tự nhau” nhiều hơn so với các cặp khác), chúng ta vẫn chưa giải quyết được bài toán encode các từ tương tự nhau thành các vector tương tự nhau.

 

Mô hình CBOW (Continuous Bag of Words)

 

Chúng ta có thể hiểu CBOW như một dạng mở rộng của AutoEncoder, tuy nhiên một từ w sẽ được encode không phải từ input là chính nó, mà là các từ chung quanh nó trong một ngữ cảnh (context). Một ngữ cảnh sẽ được xác định bằng một window size, tức là số từ đứng trước hoặc đứng sau từ cần xét.

Ví dụ, với câu: “The cat sat on floor”, và từ đang xét là sat, với window size là 2 ta sẽ được context gồm các từ {the,cat,on,floor}.

 

Khi đó để encode từ sat trong context này, mạng CBOW sẽ giống mạng Auto Encoder ở phần decoder, nhưng phần encoder sẽ là các từ trong context như sau:

 

 

Sử dụng các one-hot vector biểu diễn cho các từ trên làm input và output, chúng ta sẽ có được một mạng neural tương tự như sau:

 

 

Với một corpus thật lớn, chúng ta sẽ cho mạng CBOW học lần lượt từng từ trong corpus với context tương ứng như minh họa trên. Khi hiện thực, 4 vector one-hot của bốn từ trong context sẽ được cộng lại thành một vector input duy nhất (có 4 giá trị 1) và đưa vào hệ thống như một input duy nhất.  Sau khi học xong, tương tự mạng AutoEncoder, chúng ta sẽ thu được 1 ma trận encoder W và một ma trận decoder W. Ma trận W sau khi được huấn luyện xong sẽ được dùng để tạo ra embedding vector của một từ. Gọi v là one-hot vector của một từ x, embedding vector tương ứng w sẽ được tạo ra bằng cách w = x.W.

 

Như vậy embedding vector của một từ sẽ có các tính chất:

  • Số chiều của w sẽ nhỏ hơn nhiều so với số chiều gốc của one-hot vector x.
  • Một one-hot vector sẽ được encode không phải dựa vào chính nó như AutoEncoder mà dựa vào các từ thường hay xuất hiện quanh nó trong các văn bản. Như vậy các từ thường hay xuất hiện cạnh nhau trong các văn bản sẽ được encode thành các vector tương tự nhau. Ví dụ bên dưới là 10 vectors tương tự nhất so với vector instagram khi tiến hành huấn luyện trên tập dữ liệu Social Media của Việt Nam. Dễ thấy các vector này đều ứng các kênh social media.

 

 

Như vậy các embedding vector được tạo ra bằng phương pháp CBOW đã đáp ứng được yêu cầu của chúng ta. Các vectors này sẽ được tiếp tục sử dụng cho các bài toán NLP bằng deep learning khác.

 

Mô hình Skipgram

 

Mô hình Skipgram gần giống như mô hình CBOW, chỉ thay đổi vai trò: context được dùng làm output và từ trung tâm sẽ dùng làm input. Sau khi huấn luyện, chúng ta sẽ có được 1 ma trận encoder W và 4 ma trận decoder W. Ma trận W sẽ được dùng để tạo ra các embedding vector từ một one-hot vectors.

 

 

CBOW và Skipgram là hai hướng tiếp cận của phương pháp Word2vec. Khi áp dụng trong thực tế, phương pháp Skipgram thường được cho là có kết quả thực nghiệm tốt hơn.

 

Hướng tiếp cận Glove

 

Matrix Factorization

 

Matrix factorization là một phương pháp phổ biến khác để giải quyết bài toán thu giảm số chiều. Ý tưởng chính của phương pháp này là tách ma trận gốc ra thành tích của hai ma trận nhân tử con. Cụ thể hơn, một ma trận có kích thước n x m sẽ được tách thành tích của 2 ma trận có kích thước n x rr x m, trong đó r thường là khá nhỏ so với n và/hoặc m.  

 

Có nhiều phương pháp để tách ma trận ban đầu thành 2 ma trận con như trên. Phương pháp phổ biến là dựa trên kỹ thuật Singular Value Decomposition (SVD). Trong các hệ thống recommendation system, kỹ thuật Nonnegative Matrix Factorization thường được hay sử dụng khi ma trận ban đầu là một ma trận thưa (sparse). Sau khi tách thành 2 ma trận con, tích của chúng sẽ tạo thành một ma trận mới, trong đó các giá trị cũ trên ma trận ban đầu vẫn được giữ, nhưng các giá trị 0 sẽ được thay bằng các giá trị số dương, được sử dụng để gợi ý cho người dùng.

 

Trên góc nhìn của bài toán thu giảm số chiều, nếu chúng ta coi ma trận ban đầu là một danh sách các vector có kích thường 1 x m, thì trên ma trận n x r thu được, chúng ta thu được một danh sách các vector tương ứng có kích thước 1x r với r khá nhỏ so với m.

 

Việc xây dựng các ma trận con sẽ tuỳ thuộc vào hàm mục tiêu đặt ra cho bài toán cần giải quyết. Sau đó kỹ thuật gradient descent, tương tự neural network, sẽ được sử dụng để tối ưu dần hai ma trận con theo hàm mục tiêu.

 

Glove: Global Matrix Factorization

 

Ý tưởng của phương pháp Glove là xây dựng embedding vector dựa trên ma trận co-occurrence của các từ dựa trên một corpus ban đầu. Số hàng và số cột của ma trận co-occurrence này là các từ xuất hiện trong toàn corpus. Giá trị (i,j) của ma trận này cho biết từ thứ i và thứ j xuất hiện trong cùng một văn bản bao nhiêu lần trong tất cả các văn bản của corpus.  

 

 

Như vậy, chúng ta cũng có thể coi như một hàng của ma trận này là vector biểu diễn ban đầu của một từ. Vector này cũng có kích thước 1 x n với n là số từ của toàn corpus. Tuy nhiên vector này không phải là một one-hot vector.

 

Glove sử dụng matrix factorization để thu giảm vector 1 x n này thành một vector 1 x r như đã mô tả trên. Tuy nhiên, hàm mục tiêu của Glove dựa trên một hàm xác suất xác định độ tương tự của các cặp từ. Hàm xác suất này được tính của các từ đồng xuất hiện đối với một cặp từ. Ví dụ, độ tương tự của hai từ icesteam được tính như sau:

 

Hàm mục tiêu của Glove được xây dựng sao cho 2 từ có độ tương tự càng cao thì vector embedding của chúng càng gần nhau. Đây là một hàm xác suất phức tạp và được tinh chỉnh dần qua gradient descent.

 

Khi áp dụng trên một corpus, kích thước của ma trận co-occurrence rất lớn nhưng đây là một ma trận thưa (có nhiều giá trị 0 do có nhiều cặp từ không cùng xuất hiện trên bất kỳ văn bản nào, ví dụ như “Ronaldo” và “Kim Jong-un“), vì vậy Glove áp dụng chiến thuật “cập nhật cục bộ”. Ban đầu toàn bộ văn bản cần được quét qua để tính ma trận co-occcurence toàn cục, tuy nhiên sau đó chỉ có các “local context window”, tức là các vùng giá trị khác 0 trên ma trận, được sử dụng để cập nhật dần các trọng số theo hàm mục tiêu.

 

So sánh Word2vec và Glove

 

Cả Word2vec và Glove đều dựa trên sự đồng xuất hiện của các từ để tạo thành các vector word embedding. Các thông tin về sự đồng xuất hiện này sẽ được “embed” thành các giá trị trọng số trên các chiều của các vectors, từ đó các từ thường xuất hiện bên nhau sẽ được embed thành các vector tương tự nhau. Số chiều của vector embedding này có thể control được trong thực tế và được coi là các latent feature (thuộc tính ẩn) của các từ. Word2vec dựa vào local context của các từ còn Glove dựa vào global distribution của các từ trong toàn văn bản.

 

Khi áp dụng vào thực tế, mỗi phương pháp có một số ưu điểm riêng như sau:

  • Word2vec hữu dụng khi áp dụng để capture các thông tin từ các n-gram gồm các từ bắt buộc phải xuất hiện liên tiếp nhau. Ngoài ra, với phương pháp tương tự, chúng ta có thể encode thông tin ở mức character để có nhiều thông tin hơn. Char-embedding rất hữu hiệu khi xử lý thông tin văn bản ở dạng informal, khi khả năng xuất hiện dạng viết tắt  hoặc sai chính tả là khá cao (ví dụ trên social media). Ngoài ra, do kiến trúc của Word2vec được extend từ mô hình AutoEncoder, nên có thể đưa vào các kiến trúc end-to-end deep learning một cách tự nhiên.
  • Ngược lại, do Glove encode từ dựa trên sự đồng xuất hiện trên toàn văn bản, phương pháp này hữu dụng để phát hiện các topic, bao gồm các từ thường hay xuất hiện cùng nhau trong một đoạn văn bản, nhưng không bắt buộc phải đi cùng nhau theo một thứ tự nhất định (ví dụ “Ronaldo” và “Messi“). Theo nghiên cứu thực nghiệm của chúng tôi, Glove có hiệu suất cao hơn hẳn khi áp dụng vào các bài toán topic modeling.

 

Thư viện lập trình

 

Hai phương pháp Word2vec và Glove đều được cung cấp dưới dạng mã nguồn mở đi kèm với các pre-trained models để sử dụng tiếp trong các ứng dụng. Dưới đây là một tutorial mẫu sử dụng Gensim để hiện thực Word2vec và Glove.

https://github.com/nvquang/nlp-tutorial?fbclid=IwAR0-XZ7Qmv9y_LqYxqfsqrrYlJEV_pYxrRSrt8RI5ac219goEX3nIptAN6o