Hệ thống sinh mã máy tự động dựa trên phương pháp tinh chỉnh tham số

MỤC LỤC

Danh sách bảng

Điểm pass@1 của mô hình kiến thức tổng quát TypeScript Public Model 13B cho ngôn ngữ lập trình TypeScript.

Giới thiệu đề tài

    Bên cạnh đó là vô vàn nghiên cứu mới về cách tối ưu tham số để tiếp tục huấn luyện những mô hình mới với hàng trăm tỉ tham số, sử dụng Deepspeed ZeRO-3 để huấn luyện song song trên nhiều GPU [9], quản lý bộ nhớ với mô hình PagedAttention giúp tốc đố suy đoán của mô hình đã tinh chỉnh (inference time) trở nên nhanh gấp 24 lần [10]. – Chương 3, CƠ SỞ LÝ THUYẾT tổng hợp những vấn đề học thuật liên quan nhất sẽ áp dụng để giải quyết bài toán, tập trung chủ yếu vào việc làm rừ sự đột phỏ cũng như ưu điểm và hạn chế của cỏc mụ hình ngôn ngữ lớn (Large Language Models), kiến trúc Transformer, đồng thời học viên cũng đề cập sự nổi lên của những phương pháp tối ưu tham số hiện đại (Parameter-Efficient Fine-Tuning).

    Hình 1.2: Kết quả sinh mã cho bài toán sinh logo với mô hình kiến thức tổng quát [5.4]
    Hình 1.2: Kết quả sinh mã cho bài toán sinh logo với mô hình kiến thức tổng quát [5.4]

    Các công trình nghiên cứu liên quan

    Các cách tiếp cận cổ điển

    Vào đầu những năm 2000, một số hướng nghiên cứu cải thiện tiếp tục được triển khai với mục tiêu giúp hệ thống linh hoạt hơn và cố gắng sinh mã dựa trên truy vấn, song kết quả vẫn không quá tích cực [20]. Nhiều nghiên cứu trong những năm 2010 tiếp tục tập trung giải quyết hai vấn đề trên, có thể kể đến các phương pháp tìm kiếm mã nguồnnhư phương pháp tìm kiếm có tính xác suất (stochastic search) [23] hay phương pháp tìm kiếm suy diễn từ trên xuống (deductive top-down search) [24] [25] dựa trên truy vấn của người dùng.

    Hình 2.1: Các thành phần của mô hình sinh mã dựa trên khuôn mẫu [19]
    Hình 2.1: Các thành phần của mô hình sinh mã dựa trên khuôn mẫu [19]

    Các cách tiếp cận hiện đại

    Tuy nhiên, có một điểm mấu chốt quan trọng với những mô hình này, đó là chúng là những mô hình mã nguồn đóng và chỉ có thể truy cập thông qua các API cụ thể, hay thâm chí một số còn giới hạn truy cập ở từng khu vực cụ thể trên thế giới. – Các mô hình ngôn ngữ lớn cho mã nguồn: Các nhà nghiên cứu gần đây đã giới thiệu đến cộng đồng một số lượng đáng kể các mô hình ngôn ngữ lớn cho các tác vụ liên quan đến mã nguồn, để giải quyết những thách thức trong việc hiểu và tạo ra mã nguồn.

    Thảo luận

    Trong khi đó, những mô hình ngôn ngữ lớn với khả năng học thông qua lượng lớn dữ liệu lại có khả năng hiểu ngôn ngữ lập trình một cách rất tổng quát, mang lại tính linh hoạt và khả năng tạo ra mã nguồn chính xác và phù hợp với từng ngữ cảnh. Chỉ trong nửa cuối năm 2023, HuggingFace đã cho ra mắt mô hình ngôn ngữ lớn BigCode [2], Meta công bố Llama 2, tập đoàn Google công bố mô hình PaLM-2 cải tiến và Gemini tích hợp vào ứng dụng Bard cạnh tranh trực tiếp với ChatGPT, Tất cả đều đánh dấu những bước tiến đáng kinh ngạc với kết quả vượt trội trong những tác vụ phổ thông và cả lĩnh vực sinh mã nguồn. Vì vậy để thực hiện đề tài luận văn này, học viên sẽ sử dụng cách tiếp cận hiện đại với việc kết hợp các phương pháp tinh chỉnh tối ưu tham số mới nhất cho mô hình ngôn ngữ lớn mã nguồn mở trên hai tập dữ liệu chính: tập dữ liệu 20,000 cặp hướng dẫn cho ngôn ngữ TypeScript mà học viên tự xây dựng, và tập dữ liệu 40 cặp hướng dẫn đặc thù trích xuất từ dự án cá nhân của học viên.

    Cơ sở lý thuyết

      Mặc dù thiết kế cụ thể của các mô hình Transformer có thể khác nhau theo quá trình phát triển, ví dụ như kết hợp một lớp cross-attention trong mạng seq2seq hoặc sử dụng LayerNorm trước các lớp sublayers (Pre-LN), về bản chất chúng đều chỉ phụ thuộc vào cấu trúc cơ bản MHA + FFN và có thể dễ dàng thích nghi với các biến thể kiến trúc khác. Vì vậy ý tưởng của phương pháp tái tham số hóa được phát triển bằng cách đóng băng ma trận trọng số của mô hình gốc và sử dụng các phép biến đổi thấp chiều (low-rank transformation) lên ma trận trọng số, để cho ra một ma trận mới δW tối giản hơn nhiều so với ma trận ban đầu, nhưng vẫn giữ lại các tham số đã được huấn luyện trước của mạng. Vì vậy, nếu chúng ta sử dụng phương pháp này thì mô hình hệ thống sinh mã [1.5] đã đều cập ban đầu không còn phân chia thành hai bước: sinh mã và tóm tắt mã nữa, giờ đây chúng có thể được gộp chung trong đầu ra, chúng ta chỉ việc định nghĩa bộ dữ liệu hướng dẫn sao cho phù hợp, đó chính là điểm mạnh của phương pháp này.

      Hình 3.1: Một khối cơ bản của mô hình Transformer
      Hình 3.1: Một khối cơ bản của mô hình Transformer

      Tập dữ liệu

      Tập dữ liệu TypeScript-Instruct 20K

      Bộ dữ liệu The Stack [11] chứa hơn 6TB các đoạn mã nguồn là một phần của Dự án BigCode được HuggingFace công bố công khai, bao gồm 358 ngôn ngữ lập trình. Với mục tiêu xây dựng bộ dữ liệu hướng dẫn (Instruction Dataset) cho các bước tinh chỉnh có hướng dẫn (Instruction Tuning) sau này, học viên cần xây dựng bộ các cặp câu hướng dẫn (instruction) và đoạn mã sinh ra tương ứng từ hướng dẫn ấy (output). Ý tưởng là đưa các đoạn mã này qua một hệ thống sinh câu hỏi (luận văn sử dụng GPT-3.5-turbo API của OpenAI) để ra một bộ hướng dẫn mẫu ban đầu, và tiếp tục cải thiện dựa trên bộ hướng dẫn ấy.

      Hình 4.1: Luồng xử lý xây dựng tập dữ liệu TypeScript-Instruct 20K
      Hình 4.1: Luồng xử lý xây dựng tập dữ liệu TypeScript-Instruct 20K

      Tập dữ liệu cá nhân

      In this case, the ‘foo‘ property is extracted from the store object and rendered inside a ‘<div>‘ element. Instruction: Create a collection that store affliate of shopee feature, that need an endpoint and expiration limit.

      Hình 4.2: Luồng xử lý xây dựng tập dữ liệu đặc thù cá nhân
      Hình 4.2: Luồng xử lý xây dựng tập dữ liệu đặc thù cá nhân

      Mô hình sinh mã

      Mô hình nền tảng

      Code Llama – Python được tinh chỉnh trên 100 tỷ tokens trích xuất từ mã nguồn Python, biến nó thành một mô hình chuyên cho việc sinh mã với ngôn ngữ này. Sau đó sử dụng phương pháp tinh chỉnh có hướng dẫn như học viên đã đề cập ở mục [3.5] để tiếp tục huấn luyện mô hình và cho ra các kết quả phù hợp nhất với mong đợi của người dùng. Có thể thấy mô hìnhCode Llmama - Instruct cho kết quả tốt nhất cho ngôn ngữ TypeScript, đồng thời cũng là một trong những mô hình đạt kết quả tốt nhất (SoTA) trong việc sinh mã hiện nay [1].

      Hình 5.2: Luồng huấn luyện các mô hình Code Llama [1]
      Hình 5.2: Luồng huấn luyện các mô hình Code Llama [1]

      Mô hình sinh mã máy tự động

        Bước 2: Áp dụng các phương pháp tinh chỉnh tối ưu tham số có hướng dẫn (Instruction Tuning) trên tập dữ liệu TypeScript-Instruct 20K [4.1] tự xây dựng từ tập dữ liệu lớn The Stack. Học viên tiếp tục đánh giá mô hình này trên tập Multi-Lingual Human Eval dành cho mã nguồn với ngôn ngữ TypeScript [41], đồng thời thử nghiệm sinh mã cho những yêu cầu tổng quát. Bước 5: Tiếp tục tinh chỉnh cho tập dữ liệu cá nhân với các phương pháp tương tự ở bước 3, tuy nhiên học viên sử dụng trực tiếp mô hìnhTypeScript Public Model 13Bvừa xây dựng được với mong muốn hệ thống sinh mã tập trung vào ngôn ngữ TypeScript, cũng như có những đánh giá trực quan về mô hình tổng quan học viên vừa xây dựng.

        Hình 5.4: Tổng quan luồng xử lý của mô hình sinh mã kiến thức tổng quát
        Hình 5.4: Tổng quan luồng xử lý của mô hình sinh mã kiến thức tổng quát

        Hiện thực và kết quả thử nghiệm

          Trong phần này, học viên sẽ thực hiện đánh giáPass@1 scores, zero-shot [27] của mô hình sinh mã đề xuất kiến thức tổng quát TypeScript Public Model 13Bso sánh với mô hình nền tảng CodeLlama - Instruct 13B và một số mô hình ngôn ngữ lớn cho mã nguồn công khai khác, trên tập Multi- Lingual Human Eval dành cho mã nguồn [41] mà chính bài báo gốc của. Về tổng thể, xét khía cạnh logic sinh mã, mô hình đề xuất với kiến thức tổng quan cho kết quả tốt hơn mô hình gốc ban đầu; xét về khía cạnh ứng dụng thực tế, mô hình đề xuất thường xuyên sinh mã với ngôn ngữ Type- Script hơn nhiều so với mô hình ban đầu, đồng thời cũng đưa ra nhiều giải thớch với kiến thức bao quỏt và rừ ràng hơn; xột về khớa cạnh xõy dựng mụ hình, mô hình đề xuất có thể giữ nguyên số lượng tham số nhưng đạt được một số hiệu quả hơn cả mô hình nền tảng 34B trên phương diện sinh mã TypeScript, điều đó học viên đánh giá là kết quả thành công nhất. Như đã trình bày ở bước hai, mô hình này được học viên xây dựng áp dụng các phương pháp tinh chỉnh tối ưu tham số có hướng dẫn (Instruction Tuning) trêntập dữ liệu 40 Instruction TypeScriptđược tự thủ công xây dựng từ dự án đặc thù cá nhân [4.2].

          Bảng 5.1: Multi-Lingual HE điểm pass@1. Điểm pass@1 của mô hình kiến thức tổng quát TypeScript Public Model 13B cho ngôn ngữ lập trình TypeScript
          Bảng 5.1: Multi-Lingual HE điểm pass@1. Điểm pass@1 của mô hình kiến thức tổng quát TypeScript Public Model 13B cho ngôn ngữ lập trình TypeScript

          Nhận xét

          – Thành công trong việc giữ nguyên số lượng tham số của mô hình gốc, với thời gian huấn luyện chỉ khoảng một tiếng, nhờ áp dụng phương pháp tinh chỉnh tham số Low-Rank Adaptation (LoRA). – Đóng góp tập dữ liệuTypeScript-Instruct 20Kđược học viên xây dựng để góp phần hoàn thiện các mô hình sinh mã cho ngôn ngữ TypeScript sau này của luận văn. Nhìn chung, học viên nhận xét hai mô hình đề xuất đã giải quyết được hai mục tiêu học viên đã đặt ra ban đầu [1.3], đó là "chén thánh" bài toán sinh mã cùng những tham vọng xây dựng một mô hình sinh mã hiểu được dự án cá nhân đặc thù.

          Các đoạn mã sinh được từ mô hình đề xuất

          Sinh mã cho các tác vụ luận lý cơ bản

          It first checks if the number is less than 2, indicating that it is not prime. Explanation: The ‘max‘ function takes an array of numbers as input and returns the maximum value in that array. The function takes an integer ‘n‘ as input and returns the nth number in the Fibonacci sequence.

          Sinh mã cho các thành phần giao diện đơn giản

          It has a boolean property called ‘isOpen‘ which determines whether the modal is currently open or not. Mã nguồn A.6: Phụ lục: Sinh mã để tạo ra một modal có thể mở lên và đóng xuống.