Giới thiệu ý tưởng mô hình nhúng từ mới

Tram Ho

Giới thiệu ý tưởng mô hình nhúng từ mới

Máy tính không hiểu những mặt chữ tự nhiên thông thường như cách con người hiểu, nó chỉ hiểu những dãy số và các từ dù ở trong bất cứ ngôn ngữ giao tiếp nào trên thế giới đều tồn tại một dãy số đặc trưng riêng. Dãy số ấy là vector đặc trưng của từ, việc tạo ra vector cho từ gọi là word to vec (chuyển đổi từ ngữ sang vector).

Hiện tại có các mô hình nhúng từ như Skip-gram; CBOW; Glove;…Nhưng chúng tồn tại một vấn đề là sử dụng các phép toán khá phức tạp, khiến một học sinh THPT có trình độ về toán hạn chế như mình khó có thể hiểu được tường tận khi tự học về NLU, NLP, Machine Learning tại gia và đặc biệt hơn khi mình muốn triển khai thuật toán word to vec trên Javascript để phục vụ dự án đi thi khoa học kỹ thuật cấp quốc gia (Visef 2020 – đã hoãn tới 2021) (Đa số các mô hình word to vec trên npm đều trục trặc khi cài đặt trên máy mình, còn việc dùng python để triển khai là điều khó nhọc khi dự án được triển khai trên server miễn phí với cấu hình yếu). Vậy nên mô hình NK-VEC được ra đời nhằm đáp ứng một mục tiêu là sử dụng các phép toán đơn giản để xây dựng mô hình chuyển đổi từ ngữ sang vector, viết được trên javasript, server yếu vẫn chạy được.

Tổng quát mô hình

Sơ đồ tổng quát

Sơ đồ tổng quát

 

Các bước tiến hành

    • Các bước như sau:
      Tạo one-hot vector cho các từ:
    • Số chiều one-hot của một từ được quyết định bởi số lượng từ (kể cả lặp lại) có trong văn bản (Gọi là D)
    • Khởi tạo zero vector có D chiều
    • Tại các vị trí từ xuất hiện trong văn bản sẽ được thay đổi thành 1 tại vị trí tương ứng trong zero vector (VD: Theo mô tả trong hình)
      Tạo dữ liệu đào tạo:
      Nhìn chung mô hình NK-VEC giống với CBOW ở ý tưởng đó là sử dụng các từ ngữ cảnh xung quanh (context words) để tạo ra vector cho từ mục tiêu (target word), thế nên NK-VEC cũng sử dụng cửa sổ trượt (sliding windows) giống với CBOW để tạo dữ liệu đào tạo.
    • Đầu vào có các vector của x (context words) và y (target word)
    • Lấy các vector của x làm dữ liệu đào tạo (Training data = ContextwordsTContextwords^TContextwordsT) còn vector y là mục tiêu của mô hình
      Tiến hành đào tạo:
    • Khởi tạo ma trận W có chiều ứng với số cột của x (VD: Theo mô tả trong hình)
    • Lan truyền tới sẽ dùng W∗TrainingdataW*Training dataWTrainingdata và tạo ra một y_pred (đầu ra dự đoán) thông qua sigmoid
    • Lỗi là một vector (Error) được tính bằng cách y – y_pred
    • Lan truyền ngược (Backpropagation) bằng cách lấy Error∗TrainingdataTError*Trainingdata^TErrorTrainingdataT
    • Cập nhật W bằng W(old)−W(Backpropagation)W_(old) – W_(Backpropagation)W(old)W(Backpropagation)

Kết quả

    • Với cấu hình máy của mình là CPU i7-4610m @3.00GHz, Ram 8Gb, win 10 64-bit lúc chạy mô hình đào tạo 3K từ thì CPU đạt 40 – 50%, Ram 4-5Gb. Vẫn dư dả để chơi game lúc chờ đợi mô hình chạy
      Ưu điểm của mô hình:
    • Đơn giản đến mức học sinh cấp 3 yếu toán như mình vẫn làm được và triển khai được trên Javascript
    • Thời gian đạo tạo cho 3K từ rời vào khoảng 5h trên máy mình
      Nhược điểm của mô hình:
    • Chiều vector lớn theo lượng từ vựng trong văn bản đưa vào (Nhưng mình nghĩ với các thuật toán giảm chiều vector như SVD, TSNE, PCA, product quantization…sẽ giải quyết được điều này, chỉ có khó ở chỗ khó sử dụng các thuật toán giảm chiều vector này trên Javascript)
      Một số hình ảnh truy vấn từ tương tự sau khi đào tạo:

Note

Bài viết này nhằm giới thiệu ý tưởng và là bài viết đầu tiên của mình về mô hình mạng nên khó tránh sai sót hay nhầm tưởng thế nên mong mọi người góp ý chỉnh sửa. Mình xin cảm ơn mọi người rất nhiều ?
Truy cập demo sản phảm mình đi thi tại đây
Link Facebook liên hệ mình tại đây

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo