0 3dfdpaxoglalyb4c 1024x545 3
27Th2

Tìm mối liên hệ giữa các tag với nhau bằng Word Embedding

Việc sử dụng Word Embedding với trường hợp của mình không đến từ xử lý ngôn ngữ tự nhiên (Nature language processing) như các bạn thường ứng dụng mà đến từ việc nhóm mình phối hợp để tạo ra mô hình (model) gợi ý tag (Tag Annotation).

 

Hẳn các bạn đã biết rằng Word Embedding được ứng dụng rất nhiều trong việc Nature Language Processing task hoặc một các chung quy nhất là ứng dụng cho việc Text Processing. Đơn cử các ứng dụng của Word Embedding trong việc phân tích cảm xúc (Sentiment analysis), phân loại từ ngữ (Clustering Similar Word), phân loại tài liệu (Document Classification), hoặc đánh trong problem mà mình đã nêu trên chính là đánh tag (Tagging).

Qua qua về lịch sử của Word Embedding

 

Một chút có lẽ hơi nhàm chán với một số bạn về lịch sử của Word Embedding nhưng mình nghĩ là các bạn nên biết (vì một số bạn cứ nghĩ là Word Embedding nó mới xuất hiện gần đây, nhưng thực ra nó mới nổi tiếng gần đây nhờ một số cải tiến mà thôi).

 

Cái tên Word Embedding bắt nguồn từ năm 2003 trong paper được viết bởi Bengio —  A Neural Probabilistic Language Model, người đầu tiên sử dụng neural language model để train và tìm các parameter tối ưu cho text. Năm năm sau đó, Collobert và Weston đưa ra pretrained Word Embedding trong paper của họ —A Unified Architecture for Natural Language Processing mà trong đó họ đã chứng minh được rằng Word Embedding thực sự là một tool cực kỳ hiệu quả cho các tác vụ khác nhau, kèm với đó họ cũng đưa ra được kết trúc neural network mà hiện tại chúng ta đang sử dụng rất nhiều trong các bài toán khác nhau. Đến năm 2013, mọi người mới thực ra biết đến sức mạnh của Word Embedding rộng rãi nhờ Mikolov — một nhà nghiên cứu tại Google thông qua việc tạo ra word2vec. Nhờ vào tool này mà các bạn có thể train hay sử dụng lại pretrained model word embedding rất đơn giản. Sau này còn có thêm GloVe của Jeffrey Pennington từ Standford với một loại các pretrained Word Embedding mà các bạn có thể tham khảo thêm chi tiết tại đây.

 

Chung quy lại, Word Embedding được biết đến là một trong số ít các model ứng dụng học tập không giám sát (unsupervised learning) hiệu quả cho đến thời điểm hiện tại. Sơ qua một vài ý như vậy để mọi người hiểu vậy thôi chứ mình cũng sẽ đi vào chủ đề chính luôn đây.

 

Các bạn biết không, ngày trước các cụ chúng ta muốn xử lý ngôn ngữ tự nhiên (natual language processing) thì thường coi các từ là các ký hiệu rời rạc không liên quan tới nhau (discrete atomic symbols), ví dụ như coi ‘con mèo’ là `text12` hay ‘con chó’ là `text 21` chẳng hạn. Mà chẳng nói đâu xa, cách đây vài năm mình cũng làm y hệt như thế :D. Cái kiểu encode tuỳ tiện đó nó không cung cấp được các thông tin gì hữu ích nếu như tồn tại các mối liên quan giữa các từ với nhau. Ví dụ, làm sao mình biết được `text12` với `text21` có mối liên quan rằng chúng đều là vật nuôi trong nhà, hay đơn cử là nếu người ta nhắc đến từ ‘thú cưng’ với id là `text103` thì các động vật gần nhất với từ này là `text21``text12`. Quá khó đúng không?

 

Word Embedding đơn giản biểu diễn một text dưới dạng một tập hợp những con số hay còn gọi là vector

Word Embedding hoạt động như thế nào?

 

Word Embedding như mình giới hiệu ở phía trên giúp biểu diễn các từ hay text dưới dạng vector mà qua đó chúng ta có thể khai thác được mối quan hệ giữa các text với nhau.

 

Word Embedding hiện tại có 2 cách tiếp cận khác nhau:

  1. Frequency-based — Dựa trên tần số xuất hiện của text trong document
  2. Prediction-based — Mô hình được train để biển diễn các text.

 

Ở phương án tiếp cận Frequency-based, có 3 phương pháp là: count vector, TF-IDF vectorization, Co-occur Matrix. Nhược điểm lớn nhất của Frequency-based là việc sử dụng nhiều RAM để lưu ma trận các vector mà trong đó số chiều của các vector rất lớn. Trong bài viết này mình xin phép không đi sâu vào việc giải thích kỹ hoạt động của 3 phương pháp trên. Thay vào đó mình sẽ sâu về Prediction-based và mối liên quan của Word Embedding với bài toán Tag Annotation của bọn mình đã từng làm.

 

Prediction-based có 2 phương pháp tiếp cận phổ biến: Continuos Bag of Words (CBOW)Skip-gram.

Continuous Bag of Words (CBOW)

 

Không giống như các mô hình language model thông thường chỉ có thể dự đoán từ tiếp theo dựa trên thông tin của các từ xuất hiện trước nó, mô hình Word Embedding không bị giới hạn như vậy. Với một mô hình lý tưởng, các bạn có thể hình dung Word Embedding không chỉ có khả năng dự đoán tốt các từ tiếp theo trong một đoạn văn mà thậm chí có thể hiểu được nghĩa của từ, các từ đồng nghĩa hay trái nghĩa với nhau, hay thậm chí là nội dung tổng thể của cả đoạn văn nếu chúng ta biết cách kết hợp ý nghĩa của các từ cấu thành đoạn văn.

 

Trong paper của Milolov public năm 2013, ông đã sử dụng các từ nằm ở phía trước và các từ ở phía sau của từ cần đoán (target word) để đào tạo mô hình Word Embedding. Nó được gọi với cái tên là Continuous Bag of Words đơn giản vì ông cho rằng, các từ có thể biển diễn một cách liên tục mà thứ tự của các từ trong một đoạn văn không phải là vấn đề.

 

Mình đưa một ví dụ cho các bạn dễ hình dung:

 

  1. Tôi cảm thấy ngưỡng mộ anh ta.
  2. Tôi cảm thấy khâm phục anh ta.

 

Hai câu nên về mặt ý nghĩa chúng ta thấy không có quá nhiều sự khác biết. Cùng cắt nhỏ hai câu trên thành các từ có nghĩa trong từ điển Tiếng Việt. Bước này các bạn có thể dùng các smart tokenizer để làm (thực sự là mình cũng chưa làm nhiều với Tiếng Việt, đây chỉ là một ví dụ thông nhưng đối với các ngôn ngữ như Tiếng Nhật hay Tiếng Hàn chẳng hạn thì mình sẽ cố tìm ra các thư viện tokenizer để tách câu thành các từ có nghĩa). Kết quả có thể như sau:

 

  1. “Tôi”, “cảm thấy”, “ngưỡng mộ”, “anh ta”
  2. “Tôi”, “cảm thấy”, “khâm phục”, “anh ta”

 

Trong ví dụ đầu tiên, giả sử mình dùng từ đầu vào (input word) trong mô hình là “cảm thấy” để dự đoán từ tiếp theo là “ngưỡng mộ”. Ở đây mình xin nhấn mạnh lại là chúng ta đang cố dự đoán target word là “ngưỡng mộ” dựa vào một context input word duy nhất là “cảm thấy”.

 

Vậy các tiền bối của chúng ta đã làm cụ thể như thế nào?

 

Đầu tiên, chúng ta sẽ chuyển toàn bộ các từ xuất hiện trong 2 ví dụ của chúng ta thành dạng one-hot vector có kiểu như sau. Vì tổng số các từ có trong 2 ví dụ của chúng ta là 5 (tạm gọi là V), vì thế nên one-hot vector của chúng ta có số chiều (dimensions) là 5. Chúng sẽ có dạng như sau:

 

# V = 5
vectors = {
    "Tôi"       :[1, 0, 0, 0, 0]
    "cảm thấy"  :[0, 1, 0, 0, 0]
    "ngưỡng mộ" :[0, 0, 1, 0, 0]
    "khâm phục" :[0, 0, 0, 1, 0]
    "anh ta"    :[0, 0, 0, 0, 1]
}

One-hot vector là nguyên liệu cần để chúng ta áp dụng CBOW. Cùng xem sâu hơn tới kiến trúc của CBOW.

 

0 3dfdpaxoglalyb4c

CBOW Model

 

Input hay còn gọi là context word của chúng ta là một one-hot vector của size là V. Hidden layer trong kiến trúc CBOW chứa neutrals và output lại quay trở lại là một vector có kích thước bằng V.

 

Diễn giải theo ví dụ ở phía trên của chúng ta theo một cách đơn giản như sau:

 

  • input layer: đưa vào vector [0, 1, 0, 0, 0] — đại diện cho từ “cảm thấy”
  • hidden layer: từ mà được truyền vào ở input layer sẽ được embed vào một không gian N chiều bằng cách nhân input vector x với ma trận trọng số Wvn.
  • output layer: kết quả của hidden layer sẽ được map với đầu ra chính là trọng số của từng từ có trong vocab của chúng ta, trọng số càng cao thì có nghĩa là xác suất từ đó là từ tiếp theo (positive prediction) càng cao. Lưu ý: do trọng số ở output layer có biên độ không cố định nên thường thì người ta dùng softmax ở đoạn này nhằm convert trọng số của output layer thành xác suất probability.

 

Nếu chúng ta chỉ quan tâm đến input và output thôi thì có thể hiểu đơn giản rằng, chúng ta xây dựng một mô hình sao cho khi input vào một từ (word) thì mô hình sẽ đưa ra tập hợp xác suất cho tất cả các từ có trong từ điển (vocab). Chúng ta kỳ vọng từ mà có xác suất cao thì tỉ lệ cao là từ đó sẽ là từ tiếp theo (target word) của từ mà mình đã input (context word). Để máy tính biết được mục tiêu để optimize mô hình của mình theo đúng như kỳ vọng trên, theo như paper của Mikolov, hypothesis của CBOW như sau:

 

0 Nba92rb5ryggjetp

 

Trên thực tế, CBOW không chỉ input 1 context word như chúng ta đang ví dụ ở trên mà CBOW họ sử dụng một window gồm n từ xung quanh target word cho mỗi một vòng lặp.

 

0 Ccsrtajn80mqswxg

CBOW model với nhiều input context words

 

Giả sử trong trường hợp window_size của chúng là set là 1. Trong vòng lặp đầu tiên chúng ta có thể chọn target word là “cảm thấy”, context words sẽ là “Tôi” và “ngưỡng mộ”.

1 1rt0bs Omlwbp Dhessuaa
Thật thú vị là nếu các bạn lật ngược hình ảnh minh hoạ kiến trúc của CBOW, nó sẽ cho ra kiến trúc của Skip-gram :D.

Skip-Gram

1 8rcoxhl18grttsq7jbzgng

Mô hình Skip gram

 

Thật thú vị đúng không. Đến đây nếu các bạn nhanh nhạy thì có thể hiểu luôn rằng, không như CBOW — sử dụng các từ xung quanh trong một window size nhất định để đoán từ ở giữa, Skip-gram thì ngược lại, sử dụng từ ở giữa để đoán các từ xung quanh.

 

Chúng ta đơn giản input vào từ ở giữa và mô hình sẽ có nhiệm vụ đưa ra output với C probability distributions.

 

Hypothesis

1 Ftiym9b0645floti6zyv9w

Ứng dụng Word Embedding vào Tag Annotation

 

Tag Annotation là một bài toán khá thú vị trong lĩnh vực Computer Vision. Đơn giản là bọn mình muốn chú thích các hình ảnh được uploads bởi người dùng bằng các tags nhằm tối ưu hoá cho việc tìm kiếm ảnh. Bọn mình nhận thấy rằng bản thân các tag có các mối quan hệ mật thiết với các tag khác và thậm chí là ảnh.

 

Thử tưởng tượng nếu chúng ta biểu diễn được ảnh và tag trên một quả cầu 3D, nơi mà các ảnh giống nhau sẽ nằm kề nhau, các tag có nghĩa giống nhau hoặc thường hay đi kèm với nhau cũng sẽ nằm ở gần nhau, hay thậm chí các tag và ảnh mô tả chung một nội dung cũng vậy. Mình và cộng sự hiện thực hoá nó bằng Joint Embedding.

 

Để train được mô hình Computer Vision thể hiện đầy đủ mối quan hệ tag-tag, tag-hình và hình-hình, bọn mình cần rất nhiều training data và tài nguyên máy tính đủ lớn. Đó giường như là một rào cản rất lớn. Và bọn mình đã cố gắng tìm cách để tiết kiệm thời gian, giảm bớt số lượng training data cần thiết bằng cách sử dụng ý tưởng từ Word Embedding để tìm ra mối quan hệ giữa tag với nhau (tag-tag) trước mà không cần phải sử dụng tới Joint Embedding. Chúng mình gọi mô hình này là Tag Embedding.

Tag Embedding khác gì so với Word Embedding

 

Một ví dụ về cách đánh tag của người dùng như sau.

1 U Gdczscwgz7mvkimshesw

 

Điểm khác biệt của CBOW hay Skip-gram và Tag Embedding mà bọn mình dùng là window size. Bọn mình cho rằng, mọi tag trong ảnh đều liên quan tới nhau chứ chúng không bị ràng buộc bởi window size giống như 2 mô hình kia. Trong các câu thông thường, các từ thường được bổ nghĩa cho nhau thông qua từ đứng trước hoặc từ đứng sau đó. Tuỳ vào từng ngôn ngữ mà window size trong 2 mô hình CBOW hay Skip-gram có thể khác nhau.

 

Tuy nhiên đối với trường hợp của bọn mình, window size không hề tồn tại. Tất các các tag đều có liên quan tới nhau thông qua hình ảnh mà chúng đang cố mô tả. Hiểu một cách rõ ràng hơn, bọn mình muốn thông qua Tag Embedding để dự đoán được các tag nào thường đi kèm với nhau để diễn tả nội dung một bức ảnh

 

Ví dụ như ở bức ảnh đầu tiên:

 

  • Thảo luận” về “chiến lược” mà có sự xuất hiện của “laptop” thì khả năng cao là được thực hiện bởi “doanh nhân
  • Doanh nhân” khi họ “thảo luận” về “chiến lược” công ty thì khả năng cao là họ sử dụng “laptop

Biểu diễn nhiều ngôn ngữ khác nhau

 

Bọn mình không chỉ support cho một ngôn ngữ, Tag Embedding mà bọn mình muốn xây dựng support cho nhiều ngôn ngữ khác nhau (ví dụ Tiếng Anh và Tiếng Nhật). Bằng việc liên kết các tag tiếng Anh và tiếng Nhật với nhau thông qua một bộ từ điển, bọn mình cũng có thể nối các từ có nghĩa giống nhau trong 2 ngôn ngữ vào gần nhau trong Embedding space.

 

Đây là một ví dụ mình đã query ra top-n từ gần nhất với input là một từ đầu vào tuỳ ý

 

Nearest to ‘yellow’: 黄色, 黄, イエロー, 黄色い, orange, オレンジ, red, オレンジ色,
Nearest to ‘communication’: コミュニケーション, 通信, 交流, online, computer, オンライン, コンピューター
Nearest to ‘flower’: 花, blossom, petal, 花びら, 桃色, bloom, pink, フラワー
Nearest to ‘laptop’: ノートパソコン, pc, パソコン, computer, タブレット, communication, デスク, コンピューター
Nearest to ‘travel’: 旅行, 旅, 観光, tourism, tourist, トラベル, destination, 旅先
Nearest to ‘laundry’: 家事, household, housework, 洗う, 洗濯, 住まい, room, home
Nearest to ‘fly’: flight, 飛行, flying, wing, air, 飛ぶ, 空気, 空中

Thú vị quá đúng không? Hi vọng bài viết của mình sẽ giúp các bạn phần nào về Word Embedding cũng như ứng dụng của Word Embedding trong việc biểu diễn các từ trong Word Embedding Space sao cho vẫn giữ được ý nghĩa của chúng nhằm ứng dụng cho các vấn đề xử lý ngôn ngữ hay tag.

 

Xin chào và hi vọng sẽ được gặp lại các bạn trong các bài việc tiếp theo!

 

Tác giả: Vũ Tuấn Anh – LAB Team