Mở đầu
Khám phá sâu hơn về LLMs, thiên hướng xây dựng LLMs riêng cho Tiếng Việt từ những cái nhỏ nhất (dataset, tokenizer, models, optimizer, ...). Cũng như cố gắng có cái nhìn chung nhất về tình hình AI hiện tại, các hướng phát triển tương lai, hiểu sâu hơn các vấn đề, về cả mặt toán học, logic, nhân quả, ... Nền tảng vững chắc được đóng góp từng chút một từ cộng đồng mạnh mẽ
https://github.com/telexyz là big project nghiên cứu sâu về NLP nhằm tạo ra các LLMs Tiếng Việt của anh Tiến Dũng, đúc kết tinh túy nghiên cứu nhiều năm của anh ấy. Ta lấy đây làm điểm khởi đầu để học hỏi
Perplexity
https://huggingface.co/docs/transformers/perplexity
Perplexity (PPL) là 1 trong những metrics chung nhất để đánh giá language models
Ta cần lưu ý rằng những metric này áp dụng cho classical language models (autoregressive hay casual LMs) chứ không được định nghĩa cho masked language models như BERT
Theo trực giác, có thể coi đay là 1 đánh giá về khả năng dự đoán thống nhất (model's ability to predict uniformly) giữa các tập token trong 1 corpus. Quan trọng gơn, điều này nghĩa là tokenizaion perplexity có tác động trực tiếp đến model's perplexity mà điều này nên được xem xét khi so sánh các mô hình khác nhauViệc này cũng tương đương với exponentiation của cross-entropy giữa data và model predictions. Đồng thời liên quan đến Bits Per Character (BPC) và Bytes Pair Encoding (BPE)
Calculating PPL with fixed-length models
Nếu không bị giới hạn bởi model's context size, ta đánh giá PPL qua autoregressively factorizing 1 sequence và conditioning trên 1 entire preceding subsequence tại mỗi bước
Tuy nhiên khi làm việc với approximate models, ta thường có hạn chế về số tokens có thể process (ví dụ GPT-2 là 1024)-> Ta cần chia nhỏ chuỗi dài thành các phần rời rạc (disjoint chunks) và cộng các decomposed log-likelihoods của mỗi phần independently
Điều này giúp ta tính toán nhanh chóng perplexity nhưng đổi lại thì do đây là phép tính gần đúng (poor approximation) cho nên kết quả PPL thường cao hơn (tệ hơn) vì ít context hơn tại các prediction steps
Thay vào đó, fixed-length models nên dùng sliding-window strategy (cửa sổ trượt)
nhưng ta có thể theo các bước lớn hơn thay vì chỉ padding 1 token 1 lần
Implement exampe: https://huggingface.co/docs/transformers/perplexity
Symato
https://docs.google.com/document/d/1VQz-4Hy7s6h0dtzbFyL3d4vcOkDd5LH0JAoMlYF807A/edit
Mấu chốt, lí do có Symato?
Ta đã biết GPTs được train chủ yếu trên tiếng anh, nhưng vẫn hoạt động khá tốt trên các ngôn ngữ khác, tuy nhiên sau quá trình Data Analysis, anh Dũng nhận ra rằng tiếng Việt có cấu trúc khác tiếng Anh, nên nếu chỉ áp dụng LLMs fine-tuning như thế sẽ khó có kết quả ổn.
Cụ thể ở đây, chữ tiếng Anh có cấu trúc rõ ràng left-to-right (cat - cats). Nhưng tiếng Việt không có rõ ràng như thế (bình yên - yên bình) nên cần thay đổi phương pháp cho phù hợp
Với LLMs trên tiếng anh, phương pháp tách từ để train phổ biến nhất hiện nay là BPE (Byte pair encoding). Mục đích là cân bằng số lượng từ (vocab size) và độ phủ (nén) thông tin của các từ trong bộ từ vựng (mỗi từ vựng là 1 đơn vị entire để đưa vào training)
Do đơn vị khởi điểm của BPE là byte (cỡ bằng 1 chữ cái mã ASCII) nên không có khái niệm về âm tiết tiếng việt (chữ cái riêng của tiếng việt được hiểu là symbol đặc biệt theo mã Unicode). Nguyên tắc hoạt động là coi các node là chữ cái rời rạc và tìm cách link các node lại sao cho thành 1 từ có nghĩa (1 từ là 1 sequence các chữ cái liền nhau ngăn cách bởi space " ")
Tuy nhiên, phân tích Tiếng Việt cho thấy dữ liệu thuần âm tiết chiếm tới 80% tổng dữ liệu. Nên nếu áp dụng BPE truyền thống (thường cho phi âm tiết) thì sẽ không được quan tâm đúng mức -> Symato tập trung vào âm tiết
Ta có 1 ví dụ so sánh:
Ta thử cả 2 cách tokenizer với 1.2B LLM, dataset vietnamese laws 6G, giống hệt archtecture, cùng số lượng tham số, cùng số lượng vocal (16k), chỉ khác cách phân tách từ. Mỗi model train 3 epochs (mỗi đơn vị được huấn luyện 3 lần)
Thông số GPU để tham khảo
Đi sâu hơn về ý tưởng
Hoc hỏi qua trao đổi với anh Tiến Dũng
A: Người nhìn và máy nhìn khác nhau ( hiểu biết/cái nhìn của con người nếu không đủ sâu sẽ gây lầm tưởng). Mặc dù ta thấy rằng số đơn vị BPE dùng là ít hơn, nhưng ta không biết mỗi đơn vị phức tạp thế nào, dài bao nhiêu :D
Ví dụ:
- BPE mỗi "Đi" là 1 từ, nhưng symato cần thêm 1 token "^^" cho viết hoa hoàn toàn và "^" cho viết hoa chữ đầu. Vậy symato cần nhiều hơn BPE 1 token
- Nhưng BPE coi "Đi", "đi", "ĐI" là khác nhau. Trong khi symato chỉ có 1 nghĩa "đi" và 1 token cho cách viết
- Hiệu quả biểu diễn không cần nhiều slots, ta cps thể ép bộ từ vựng xuống 3.2k mà vẫn hiệu quả
Tham khảo
- https://huggingface.co/datasets/tiendung/vi500
- https://github.com/telexyz/vi (vi-datasets)
- https://github.com/telexyz (big project NLP vietnam)
- https://huggingface.co/docs/transformers/perplexity
- https://docs.google.com/document/d/1VQz-4Hy7s6h0dtzbFyL3d4vcOkDd5LH0JAoMlYF807A/edit (Symato demo test doc)
- https://huggingface.co/tiendung/symato-nvidia-vn (model Symato)
- https://github.com/telexyz/nem/blob/main/bitter-lesson.md
- https://github.com/telexyz/symato
Nhận xét
Đăng nhận xét