- BERT và RoBERTa như các mô hình ngôn ngữ masked cũng có thể được diễn giải theo khái niệm mô hình khuếch tán văn bản
- Khác với phương pháp tự hồi quy truyền thống (ví dụ: GPT), đã chứng minh khả năng áp dụng sinh theo khối và phục hồi dần
- Khi huấn luyện với tỷ lệ masking điều chỉnh theo từng giai đoạn, thực nghiệm xác nhận RoBERTa cũng có thể tạo văn bản tự nhiên
- Chỉ cần điều chỉnh mục tiêu huấn luyện, không cần thay đổi kiến trúc hiện có, vẫn có thể có được năng lực sinh
- So với GPT-2, mô hình khuếch tán dựa trên RoBERTa cũng cho ra kết quả tạo văn bản có độ mạch lạc nhất định
Tổng quan
Gemini Diffusion do Google DeepMind công bố là một mô hình ngôn ngữ dựa trên khuếch tán tạo văn bản theo từng khối cùng lúc, khác với họ GPT. Đây là phương pháp tạo văn bản bằng cách tinh lọc dần dần tiếng ồn ngẫu nhiên. Từ việc xem xét bài báo Large Language Diffusion Models, kết quả cho thấy khuếch tán ngôn ngữ rời rạc là một sự tổng quát hóa của Masked Language Modeling (MLM). Tức là, bài viết này thử nghiệm xem liệu có thể tận dụng ý tưởng này để tạo văn bản với các mô hình họ BERT hay không.
Lưu ý: Sau đó, bài báo DiffusionBERT kiểm chứng nghiêm ngặt hơn với ý tưởng tương tự.
Lược sử nhanh về Transformer
Transformer, được đề xuất lần đầu năm 2017, có kiến trúc encoder-decoder. Năm 2018, encoder (BERT: hai chiều, tập trung khôi phục masked) và decoder (GPT: autoregressive, tập trung dự đoán tuần tự) tách ra, hình thành các nhóm mô hình chuyên dụng.
- Chỉ encoder (họ BERT)
- Nhận toàn bộ ngữ cảnh đầu vào, che một phần bằng
<MASK>và khôi phục từ phần còn lại - Ưu thế trong biểu diễn câu, phân loại, ...
- Nhận toàn bộ ngữ cảnh đầu vào, che một phần bằng
- Chỉ decoder (họ GPT)
- Dự đoán token tiếp theo từ thứ tự đã cho
- Tỏa sáng ở tạo văn bản, tóm tắt, dịch thuật
BERT ban đầu được dùng trực tiếp cho phân loại, nhưng sau đó họ GPT giành được nhiều trường hợp sử dụng hơn nhờ năng lực sinh đã được cải thiện.
Mô hình khuếch tán ngôn ngữ rời rạc
Mô hình khuếch tán vốn đã nổi tiếng ở tạo ảnh. Trong trường hợp ảnh:
- Quy trình thuận: thêm dần dần nhiễu Gaussian vào ảnh gốc để đạt trạng thái chỉ còn nhiễu
- Quy trình nghịch: dùng mô hình deep learning để lặp lại khử nhiễu dần dần, khôi phục dữ liệu gốc
Khi áp dụng cho văn bản, cách đơn giản nhất là quy trình nhiễu dựa trên masking.
- Thuận (masking)
- Khi t=0 là văn bản gốc, khi bước tăng dần thì thay thế ngẫu nhiên một số token bằng
<MASK> - Ở bước cuối cùng, toàn bộ chuỗi được thay bằng
<MASK>
- Khi t=0 là văn bản gốc, khi bước tăng dần thì thay thế ngẫu nhiên một số token bằng
- Nghịch (de-noise)
- Transformer encoder học khôi phục token gốc trong cấu hình masking đã cho
- Masking tỷ lệ thấp dễ khôi phục hơn, còn tỷ lệ càng cao thì càng khó
- Lặp lại từ tỷ lệ masking cao đến thấp để tạo toàn bộ chuỗi
Trong khuôn khổ khuếch tán này, mô hình huấn luyện bằng cách cộng tổng loss khử nhiễu trên các mức tỷ lệ masking khác nhau. Mục tiêu khôi phục masking của BERT về bản chất là một phần của khuếch tán văn bản. Kết hợp lịch trình tỷ lệ masking và lặp lại de-noise sẽ mở rộng mục tiêu BERT thành thủ tục sinh ngôn ngữ.
Thí nghiệm RoBERTa Diffusion
RoBERTa, được công bố năm 2019, đặc trưng bởi mở rộng hyperparameter và dữ liệu so với BERT, cùng mục tiêu huấn luyện đơn giản hơn (MLM Only). Trong thí nghiệm, sử dụng trọng số RoBERTa gốc, tokenizer và Trainer từ các thư viện HuggingFace transformers, datasets. Dựa trên tập dữ liệu WikiText, tinh chỉnh tiếp theo các bước:
- Lấy mẫu ngẫu nhiên một trong 10 lịch trình khuếch tán (mask_probs: 1.0~0.1) cho mỗi batch để masking
- Với
diffusion_collatortùy chỉnh, sau khi chọn xác suất masking thì áp dụng<MASK>ngẫu nhiên theo từng token - Để giữ bối cảnh prompt, 16 token đầu luôn được giữ lại
Che dữ liệu (custom collator):
- Sau khi đệm (
padding) mỗi nhóm token mẫu, chọn xác suất masking ngẫu nhiên - Áp dụng
<MASK>theo xác suất cho tất cả token ngoài 16 token đầu - Trả về cả dữ liệu đã masking và bộ nhãn đáp án
Tạo sinh (inference):
- Nhập chuỗi đầu vào độ dài 256 token, 16 token đầu là prompt, phần còn lại là
<MASK> - Ở mỗi bước, mẫu hóa token mà mô hình dự đoán để điền vào, rồi remask lại một phần theo tỷ lệ nhất định
- Lặp lại bằng cách giảm dần tỷ lệ masking, và cuối cùng toàn bộ được khôi phục
Ví dụ kết quả tạo:
- Có thể tạo ra văn bản nối tiếp tự nhiên cùng với prompt, với tính nhất quán khá tốt
- Một số dị biệt do định dạng tiền xử lý của tập WikiText (ví dụ: dấu nối
@-@)
So sánh với GPT-2
- GPT-2 nhanh hơn một chút và nhất quán hơn, nhưng RoBERTa Diffusion vẫn cho hiệu năng tốt hơn kỳ vọng (đặc biệt có tiềm năng cải thiện dần)
- Các cách AR-Diffusion, Skip-Step Diffusion mới và tối ưu hóa có thể cải thiện chất lượng/tốc độ
Kết luận
- Các mô hình ngôn ngữ masked như RoBERTa, nếu huấn luyện với điều chỉnh tỷ lệ masking, cũng có thể trở thành engine sinh ngôn ngữ
- Chỉ cần cách học làm hỏng rồi khôi phục dần văn bản bằng token
<MASK>đã cho thấy khả năng chuyển hoàn toàn thành mô hình sinh - Không cần sửa đổi kiến trúc, chỉ cần thay đổi mục tiêu huấn luyện đã có thể đạt năng lực sinh
- Về bản chất, các mô hình họ BERT cũng tương ứng với một mô hình khuếch tán văn bản
1 bình luận
Ý kiến trên Hacker News
Khi BERT mới xuất hiện, mọi người đều thử dùng nó để sinh văn bản, nhưng nhìn chung không thành công lắm; bài báo tham khảo về việc này là ở đây. Savinov và cộng sự tại DeepMind cho thấy rằng nếu chỉ áp dụng hai bước trong quá trình huấn luyện và ngẫu nhiên hóa xác suất masking thì nó có thể hoạt động khá ổn
Tuần trước tôi đã thử đủ cách để làm cho BERT có thể trò chuyện, rồi nhờ bài viết này mới biết thêm những điều đó. Tôi vẫn còn vài ý tưởng muốn thử thêm nên vẫn đang tiếp tục thực nghiệm rất thú vị blog liên quan
Tôi thuộc nhóm rất đông những người cho rằng BERT chỉ dùng được như một encoder thuần túy, chẳng hạn để đo độ tương đồng ngữ nghĩa và phân loại, chứ không phải để sinh văn bản
Theo tôi biết, mối liên hệ này lần đầu được chỉ ra trong bài báo này năm 2021 (trang 5). Họ đã thử cách trong text diffusion là làm nhiễu từ bằng những từ khác có nghĩa tương tự, nhưng thấy rằng để mô hình tìm lại từ đã bị mask thì dễ hơn. Lịch sử của hướng tiếp cận này còn quay ngược xa hơn đến bài báo này, nơi họ đã tạo ra một MLM sinh sinh mà không diễn giải nó bằng toán học diffusion
Còn cũ hơn thế nữa. Năm 2014, Li Yao và cộng sự trong bài báo này đã chỉ ra sự tương đương giữa mô hình autoregressive (dự đoán token tiếp theo) và generative stochastic networks (denoising autoencoder, tiền thân của diffusion model). Họ lập luận rằng lấy mẫu song song xấp xỉ tốt lấy mẫu tuần tự, và trong nghiên cứu năm 2016 của tôi, Counterpoint by Convolution, liên kết, tôi cũng áp dụng cách này và cho thấy còn đạt hiệu năng tốt hơn. Đáng tiếc vì đó là một bài báo ứng dụng nên không nhận được nhiều trích dẫn từ phía diffusion. Tôi nghĩ còn có những gốc rễ thậm chí lâu đời hơn nữa
Tôi cũng nhớ đó là tài liệu tham chiếu đầu tiên chính thức bàn về chuyện này (sau khi thấy BERT, có vẻ tự nhiên là các nhà nghiên cứu NLP sẽ nghĩ đến khái niệm diffusion). Bộ sưu tập các tài liệu tham chiếu ban đầu về text diffusion mà tôi gom từ 3 năm trước ở đây
Nhân tiện, bài báo liên quan cũng có thể xem tại đây
Cách tiếp cận dựa trên diffusion cho cảm giác giống hơn với những gì diễn ra trong não động vật. Khi tôi nói, tôi không tạo ra từng từ một chỉ dựa trên từ trước đó; thay vào đó, tôi cảm thấy phần lớn hơn là có một ý tưởng tổng thể mơ hồ trong đầu trước rồi mới sắp xếp nó thành ngôn ngữ
LLM autoregressive trên thực tế cũng không đơn giản chỉ dự đoán từ tiếp theo như vậy. Dù mỗi lần forward pass cho ra từng token một, trong không gian tiềm ẩn vẫn xuất hiện rõ ràng việc lập kế hoạch dài hạn và suy luận. Khi chúng ta thực sự nói, ta cũng vạch ra bức tranh tổng thể trong đầu rồi mới nói tuần tự, nên không thể kết luận rằng cách diffusion giống chúng ta hơn
Cá nhân tôi rất thích bài blog mô tả diffusion như một dạng "autoregression phổ". Diffusion có xu hướng dự đoán các đặc trưng tần số thấp trước rồi mới đến các đặc trưng tần số cao
Mỗi lần chỉnh sửa tin nhắn trên Slack khoảng 5 lần, tôi thường cảm thấy mình đúng là một diffusion model
Khi nói hoặc viết, đúng là ta phát ra từ theo thứ tự tuần tự. Nhưng trước khi bắt đầu câu, ta thường đã nghĩ đại khái ý chính trong đầu. Điều này tương tự với việc LLM lập kế hoạch hướng đi tổng thể trong không gian tiềm ẩn trước khi xuất token ra ngoài
Nghiên cứu interpretability cũng cho thấy LLM autoregressive có lập kế hoạch nội bộ trước về việc sẽ nói gì
Cá nhân tôi thấy việc hỗ trợ chỉnh sửa kiểu chèn/xóa theo phong cách Levenshtein tự nhiên hơn là chỉ cho phép masking và điền vào chỗ trống. Ví dụ, nếu ở bước cuối muốn thay một từ bằng một từ đồng nghĩa dài hơn thì không thể dịch sang phải, nên điều đó không dễ trong kiểu kiến trúc diffusion này
Những thí nghiệm đơn giản kiểu này rất thú vị vì có thể nhanh chóng nắm được nguyên lý. Điểm đáng tiếc ở mô hình text diffuser là phải xử lý token như giá trị rời rạc chứ không phải liên tục. Với ảnh, pixel là liên tục nên có thể thêm nhiễu một cách tự nhiên, còn token văn bản thì không. Phần lớn đành xử lý bằng thay thế toàn bộ; dù cũng có nhiều hướng như thêm nhiễu trong không gian embedding hoặc học trực tiếp embedding, tất cả đều phức tạp hơn diffusion cho ảnh
Tôi kỳ vọng hơn vào những cách tiếp cận như bài báo này. Nó kết hợp latent diffusion liên tục với sinh văn bản dựa trên autoregressive transformer. Có thể huấn luyện autoencoder và transformer đồng thời (hoặc độc lập)
Lúc mới tiếp xúc với mô hình text diffusion, tôi đã nghĩ: “Cái này chẳng phải chỉ là MLM sao?” Điều tôi chú ý là MaskGIT. Cách này chỉ thực sự đáng gọi là diffusion nếu mô hình được huấn luyện để thay token sai bằng token đúng, vì điểm mạnh của continuous diffusion là khả năng chống nhiễu. Nhưng trên thực tế, ý tưởng tạo ra token sai không dễ triển khai, nên có vẻ đến nay vẫn chưa được thử nhiều
Tôi đã thử nghiệm MLM ở mức byte UTF8 để làm một mô hình dịch phi chuẩn. Dùng curriculum learning và cách làm nhiễu ngẫu nhiên tăng dần. Nếu mục tiêu chỉ là thêm noise thì chỉ cần thay các chỉ số ngẫu nhiên bằng các giá trị byte ngẫu nhiên là đủ. Ví dụ cho mô hình đầu vào theo mẫu dưới đây
Đánh giá lặp lại toàn bộ chuỗi đích để khi mức độ khó tăng lên, miền huấn luyện không bị biến đổi rời rạc. Kết quả là tôi không còn quá bận tâm đến thuật ngữ hay phân loại nữa; điều quan trọng không phải là ‘có phải diffusion hay không’ mà là ‘nó có thực sự hoạt động không’
Tôi cũng tò mò không biết so với electra thì sẽ như thế nào
Tôi từng muốn thử fine-tune một mô hình hoàn thành mã inline để xem có đạt hiệu năng tương tự cursor không (thực tế chắc khó, nhưng sẽ rất vui). Nhưng hiện vẫn chưa có một open diffusion model nào đủ ổn để dùng làm nền, nên tôi đang chờ đợi
Điểm hấp dẫn của mô hình diffusion cho ảnh là nó tạo ảnh từ nhiễu ngẫu nhiên. Nhưng tôi thắc mắc vì sao mô hình text diffusion lại bắt đầu từ các token rỗng đã bị mask toàn bộ, thay vì từ token ngẫu nhiên
Tùy vào tác vụ mong muốn. Nếu chỉ là hoàn thành văn bản đơn giản thì đưa câu đầu vào không mask và để mô hình điền các token mask tiếp theo. Nếu muốn chỉnh sửa mã chẳng hạn, có thể chỉ mask phần cần sửa rồi để nó điền dần theo thứ tự. Điểm mạnh của mô hình text diffusion là khả năng thực hiện chỉnh sửa thực dụng như chỉnh sửa code (LLM autoregressive cần một hệ thống riêng để chỉnh sửa thông qua chỉ thị). Nếu huấn luyện mô hình với một head chỉnh sửa code thật phù hợp, có thể tăng tốc độ và hiệu quả của nhiều công việc lập trình. Có lẽ sau này những nơi như GPT Codex sẽ tích hợp kiểu tính năng này một cách tự nhiên
Không phải ai cũng chỉ dùng cách bắt đầu từ token rỗng. Có nhiều thử nghiệm khác nhau: có mô hình bắt đầu từ token ngẫu nhiên, có mô hình từ mask, và có mô hình từ vector embedding