CHƯƠNG 3: Xây dựng hệ thống trình bày
3.4. Lựa chọn mô hình ngôn ngữ lớn
3.4.2. Huấn luyện mô hình
50
Ta sẽ tiến hành training mô hình thông qua một Adapter bằng phương pháp LoRA, điều này có nghĩa là gì?
Nói về Adapter trước thì mô hình sẽ không thực hiện huấn luyện và cập nhật trọng số trực tiếp trên nó mà lúc này mô hình gốc sẽ đóng băng, các chỉnh sửa thay đổi sẽ được lưu vào một file riêng gọi là Adapter, file này chỉ chứa những sửa đổi trên mô hình gốc do đó nó
sẽ nhẹ hơn rất nhiều, chỉ khoảng vài đến vài chục MB. Khi cần sử dụng ta chỉ cần load mô hình gốc và kèm theo file adapter này ta sẽ có được mô hình mà ta đã huấn luyện trước đó. Apdapter sẽ giúp nhanh chóng và tối ưu trong việc lưu trữ nhiều phiên bản của mô hình, nhất là khi tải về một phiên bản mô hình tinh chỉnh từ GPU hoạt động trên cloud.
Hình 3.21: Phương pháp LoRA
Còn về phía LoRA, đây là một phương pháp huấn luyện mô hình đi kèm Adapter thông qua việc phân rã ma trận trọng số của nó. Thay vì thực hiện training trên ma trận trọng số
𝑾𝒅×𝒌 thì ta sẽ thực hiện phân rã ma trận này thành 2 ma trận con nhỏ hơn của nó rồi cập nhật trọng số trên 2 ma trận con 𝑨𝒅×𝒓 và 𝑩𝒓×𝒌 này với 𝒓 < 𝐦𝐢𝐧 (𝒅, 𝒌) là hạng mà ta có thể cài đặt. Chi tiết về phương pháp và công thức toán có thể tìm thấy tại [20]. Ta sẽ thực hiện huấn luyện trên phần cứng là NVIDIA A6000 (48 GB VRAM). Các siêu tham số
(hyper-parameter) cài đặt cho huấn luyện được mô tả như sau:
Hyper-parameter Value
epochs 1
51
batch-size 24
gradient-accumulation-
steps
2
learning_rate 2e-4 (= 0.0002)
lora_r 8
lora_alpha 16
lora_dropout 0.05
Bảng 3.3: Siêu tham số cài đặt cho training
Giải thích: Với thông số epochs ta sẽ chỉ lặp qua 10.000 điểm dữ liệu một lần duy nhất,
batch-size là số lượng điểm dữ liệu được học trong một lần cặp nhật, việc học các đặc trưng của một tập các lô (batch) cập nhật gradient sẽ giúp mô hình tăng tốc độ huấn luyện và tận dụng được hết khả năng xử GPU, với NVIDIA A6000 thì 24 là lựa chọn hợp lý giúp chạy tối đa công suất thiết bị. Gradient-accumulation-steps giúp khi huấn luyện sẽ cập nhật gradient mỗi 2 batch một lần thay vì cập nhật ở mỗi batch giúp hạn chế khả năng bị quá tải
bộ nhớ và giảm chi phí tính toán khi cập nhật gradient. Ta có learning_rate là tốc độ học
để tham số thông dụng là 2e-4. Giá trị lora_r là hạng phân rã ma trận như đã đề cập ở trên, lora_alpha là hằng số của lora_r dùng để tinh chỉnh learning_rate thông thường phải lớn hơn hạng lora_r và thường đặt từ 16 đến 48 tại đây ta set số nhỏ nhất là 16. Drop-out sẽ là
tỉ lệ ngẫu nhiên xoá mất các trọng số để tránh hiện tượng quá khớp (overfitting) khi huấn luyện mô hình, 5% trên toàn bộ mô hình là một con số hợp lý.
Hình 3.22: Giá trị loss trên tập test trước khi huấn luyện
Quá trình huấn luyện: Mô hình đã giảm loss từ 1.4 xuống còn 0.92 sau khi training qua
1 epoch với thời gian là 2 tiếng 22 phút, ta có tham số loss ở các steps như sau:
52 Hình 3.23: Tham số loss tại các steps khi training
Hình 3.24: Biểu đồ về sự suy giảm loss của mô hình khi huấn luyện
Ta thấy rằng không có hiện tượng quá khớp diễn ra khi cả loss trên tập train và tập test luôn giảm đều theo thời gian, như vậy việc huấn luyện mô hình có hiệu quả. Thử hỏi một câu đơn giản để xem khả năng trả lời của mô hình, có được kết quả như sau:
53 Hình 3.25: Test một câu hỏi nhỏ
Dựa trên kết quả ta thấy rằng, gần như ta đã thành công trong việc huấn luyện một mô hình tiếng Anh sang tiếng Việt, tuy nhiên để chắc chắn mô hình có hiệu quả ta sẽ cần một bước đánh giá, ta sẽ tiếp tục phần đánh giá kết quả này tại chương 4. Ta cũng sẽ lưu mô hình này lại trên Huggingface với tên phatjk/vietzephyr-7b-lora-8bit để sử dụng về sau.