1 điểm bởi GN⁺ 2023-12-08 | 1 bình luận | Chia sẻ qua WhatsApp
  • Lấy lựa chọn lá bài trong draft của Magic: The Gathering làm bài toán, thử nghiệm xem fine-tuning có thể nâng hiệu năng suy luận đến mức nào trong môi trường thẻ bài mới nhất, vốn có thể chưa có trong kho ngữ liệu huấn luyện của LLM
  • Chuyển đổi lịch sử draft của 17lands thành prompt, dùng lựa chọn của những người chơi có tỷ lệ thắng cao làm tín hiệu đáp án đúng, để mô hình chọn bài dựa trên pack hiện tại và pool bài đã có
  • Mô hình 7B tham số sau fine-tuning vượt GPT-4 rõ rệt trong bài toán này, đạt hiệu năng gần mức con người hoặc người thử nghiệm; fine-tuned GPT-3.5 có thể tốt hơn nhưng chi phí cao hơn rất nhiều
  • Định dạng dữ liệu và prompt khó kiểm chứng nhanh vì vòng lặp huấn luyện dài; ngay cả sau khoảng 40 giờ thử nghiệm, vẫn chưa chắc đâu là định dạng prompt tối ưu
  • Về thực tế triển khai, nên tạo bộ đánh giá trước, dùng công cụ như axolotl thay vì tự viết script huấn luyện, và ngay cả các OSS LLM nhỏ cũng không hề nhẹ về bộ nhớ GPU và dung lượng lưu trữ

Bài toán thử nghiệm: draft Magic

  • Thử nghiệm dùng draft của Magic: The Gathering để xem LLM có thể suy luận đến đâu trên dữ liệu ngoài phân phối
  • Magic: The Gathering là game thẻ bài sưu tầm chiến thuật, nơi người chơi dùng các lá sinh vật và phép thuật để đấu với đối thủ; draft là cách chơi trong đó người chơi lần lượt chọn bài từ các gói bài ngẫu nhiên để tạo bộ bài
  • Draft phù hợp với thử nghiệm ở hai điểm
    • Suy luận: cần hiểu đồng thời các lá đã chọn đến hiện tại và các lá trong pack hiện tại để có lựa chọn tốt
    • Dữ liệu ngoài phân phối: thẻ bài Magic mới được phát hành 4–6 lần mỗi năm, và các lá mới nhất có thể chưa có trong kho ngữ liệu huấn luyện của LLM
  • Dữ liệu sử dụng lịch sử theo dõi draft từ 17lands
    • 17lands là dịch vụ theo dõi dữ liệu draft của client Magic bản kỹ thuật số
    • Có thể tạo tín hiệu gần với “đáp án đúng” bằng cách xem lựa chọn của những người chơi nhóm đầu theo tỷ lệ thắng
    • Ngay cả trong cộng đồng người chơi Magic cũng có nhiều tranh luận về lựa chọn đúng, nên tín hiệu này không hoàn toàn rõ ràng, nhưng đủ để kiểm tra việc học một bài toán mới

Cấu trúc dataset và định dạng prompt

  • Dữ liệu draft của 17lands là các file CSV lớn chứa đại khái những thông tin sau
    • Các lá có thể chọn trong pack hiện tại
    • Các lá mà drafter đã chọn đến thời điểm đó
    • Lá thực tế được chọn trong pack đó
  • Để phù hợp với fine-tuning mô hình ngôn ngữ, dữ liệu này được chuyển thành định dạng hội thoại văn bản
    • Tin nhắn system thiết lập mô hình là “DraftGPT” và hướng dẫn rằng khi được yêu cầu draft pick, hãy trả lời tên lá bài trước
    • Tin nhắn user bao gồm số pack và số pick hiện tại, pool bài đến hiện tại, số lá theo từng màu đã thấy trong 5 pack gần nhất, và mô tả các lá trong pack hiện tại
    • Tin nhắn assistant chỉ xuất tên lá bài được chọn
  • Ví dụ chuyển đổi dữ liệu được cung cấp tại ví dụ chuyển dữ liệu 17lands thành prompt cho LLMprompt draft đầy đủ ở dạng ChatML
  • Phần khó nhất là định dạng dữ liệu sao cho tạo ra kết quả mong muốn
    • Với fine-tuning, để thử một thay đổi prompt thường phải chạy một job huấn luyện kéo dài nhiều giờ
    • Vì vậy, vòng lặp thử nghiệm có cảm giác chậm hơn prompt engineering thông thường đến mức 100 lần
  • Các mục đã thử nghiệm gồm khoảng 5 định dạng prompt, lượng thông tin chi tiết theo từng lá bài, bổ sung ngữ cảnh của vài pick gần nhất, và thêm các dòng huấn luyện “kiến thức thẻ bài” để mô hình ghi nhớ thông tin về lá mới
  • Sau khoảng 40 giờ thử nghiệm, vẫn chưa xác định chắc chắn định dạng prompt nào tốt nhất cho bài toán này

Môi trường chạy fine-tuning

  • GPU được thuê theo giờ trên Runpod
    • GPU sử dụng là RTX 4090, phiên bản VRAM 24GB
    • Chi phí khoảng $0.7/giờ
  • Ban đầu tác giả định tự viết script huấn luyện bằng HuggingFace transformers và PEFT; do giới hạn GPU nên chọn QLoRA
  • Cách tự viết script có nhiều thử-sai
    • Có nhiều lựa chọn, từ các tối ưu hóa đơn giản nếu đã biết như FlashAttention, đến những thứ khó hiểu nếu chưa đọc paper như tham số LoRA
    • Có thể giải quyết từng vấn đề, nhưng tự tìm hiểu tốn rất nhiều thời gian
  • Cuối cùng tác giả dùng axolotl
    • Công cụ này triển khai sẵn nhiều tối ưu hóa, nên chạy dễ hơn
    • Tài liệu cũng ổn, và được đánh giá là điểm khởi đầu phù hợp cho hầu hết những người bắt đầu fine-tune LLM

Kích thước mô hình và chi phí

  • Ngay cả OSS LLM “nhỏ” cũng rất lớn theo chuẩn trước đây
    • BERT thường được huấn luyện vào khoảng năm 2019 có khoảng 110 triệu tham số
    • Mô hình 7B lớn hơn khoảng 70 lần
  • Mô hình 7B cũng là gánh nặng lớn về vận hành thực tế
    • Trọng số khoảng 16GB, nên dung lượng lưu trữ trở thành vấn đề
    • Ngay cả khi dùng phương pháp như QLoRA, bộ nhớ GPU vẫn khó xử lý
  • Fine-tuning GPT-3.5 có vẻ có khả năng cho kết quả tốt hơn, nhưng chi phí lớn
    • Đắt hơn khoảng 100 lần so với fine-tune Mistral trên bare metal
    • Suy luận cũng bị tính giá premium
    • Một lần fine-tune GPT-3.5 tương tự lần huấn luyện lớn nhất của Mistral-7B được tính là sẽ tốn khoảng $500

Cách đánh giá và kết quả

  • Trước khi thử nghiệm, việc tạo trước một bộ đánh giá tốt là rất quan trọng
    • Trong bài toán này, một số draft hoàn chỉnh được hold out khỏi dữ liệu huấn luyện, rồi kiểm tra xem mô hình có chọn cùng lá bài như con người hay không
    • Có bộ đánh giá giúp dễ phán đoán kết quả fine-tuning hơn
  • Độ chính xác chọn bài tương đối dễ định nghĩa, nhưng các tiêu chí sau mơ hồ hơn
    • Khi mô hình chọn khác, lựa chọn đó cần có thể được biện minh
    • Sẽ tốt nếu mô hình có thể giải thích hợp lý vì sao chọn lá đó
  • Các tiêu chí mơ hồ được kiểm tra bằng đánh giá cảm quan qua việc xem trực tiếp nhiều ví dụ, và quá trình này chậm
  • GPT-4 ít đưa ra lựa chọn kỳ quặc hơn mô hình nhỏ đã fine-tune, và có khả năng biện minh lựa chọn tốt hơn
  • Mô hình 7B đã fine-tune dễ dàng vượt GPT-4 và in-context learning trong bài toán chọn bài này, xét về cả độ chính xác lẫn chi phí
  • Trong một thử nghiệm, tác giả fine-tune mô hình trên một bộ thẻ bài rồi đánh giá trên bộ thẻ chưa từng thấy
    • Mô hình dường như không chỉ ghi nhớ các lá tốt, mà đã khái quát hóa khái niệm draft ở một mức độ nào đó

Magic Copilot và bot draft

  • Tác giả kết nối mô hình draft pick đã fine-tune với log của Magic Arena, tạo nhanh một ứng dụng Electron “Magic Copilot” và dùng trong vài lượt draft
  • Lựa chọn bài do mô hình fine-tuned tạo ra, còn phần bình luận do GPT-4 đảm nhiệm
    • Phần lớn hoạt động tốt, nhưng đôi khi GPT-4 không đồng ý với lựa chọn của mô hình fine-tuned và lập tức phản biện
  • Tác giả cũng kết nối 8 AI draft để chạy draft mô phỏng giữa các bot
    • Khi chỉ các bot chuyền bài cho nhau, chúng có xu hướng mạnh chọn bộ bài đơn sắc
    • Khi có con người trộn vào các lựa chọn khác, chúng có xu hướng hội tụ về những bộ bài có dạng bình thường hơn nhiều
  • Nhìn chung, AI draft này có vẻ gần với một trong những AI draft mạnh hơn và giống con người hơn hiện có
  • So với bot quick draft của Magic Arena, nó đưa ra lựa chọn gần với drafter con người chất lượng cao hơn là bot dựa trên heuristic

1 bình luận

 
GN⁺ 2023-12-08
Ý kiến trên Hacker News
  • Tôi thích bài này vì nó cho thấy rõ ngay cả một ý tưởng nhìn qua có vẻ đơn giản về mặt khái niệm cũng khó triển khai bằng fine-tuning LLM đến mức nào
    Có vẻ đây vẫn là một bài toán không dễ, dù đã có một bộ dữ liệu ban đầu khá tốt và một mô hình xuất phát. Kiểu mô hình này có vẻ phù hợp với những việc tự nhiên, không có đáp án đúng mang tính xác định. Ví dụ, chọn lá bài hoàn hảo từ một danh sách lựa chọn cho trước sẽ khó giải theo kiểu tổ hợp, nhưng chọn một lá bài tốt thì có thể, và LLM cũng có thể tiệm cận hiệu năng ở mức con người. Có vẻ nhóm bài toán mà LLM hiện nay có thể giải bằng fine-tuning được thể hiện rõ ở đây

    • Điều này cũng khớp với trải nghiệm của tôi. Với các quyết định rủi ro cao, chúng hầu như không đưa ra được câu trả lời xuất sắc, nhưng với các quyết định rủi ro thấp thì thường cho câu trả lời đủ ổn
      Ví dụ, tháng này tôi đang nhờ nó giúp tìm quà cho bạn bè và con cái. Để giải bài toán này không cần lựa chọn tốt nhất, chỉ cần một lựa chọn tốt là đủ
    • Đúng, nhưng cũng không nên bỏ qua việc đây là công trình do một người làm được
    • Tôi tò mò liệu có thể định nghĩa những bài toán LLM làm tốt theo một lớp độ phức tạp cụ thể nào không
  • Có lẽ đây không phải thay đổi mang tính cách mạng nhất trong đời sống hằng ngày, nhưng tôi thật sự mong chờ đấu với bot có lối chơi thú vị trong các game như Magic: The Gathering
    Đây có vẻ là một trường hợp rõ ràng có thể cải thiện đáng kể khả năng của đội R&D trong việc tạo và thử nghiệm cơ chế mới ở nhiều trình độ chơi khác nhau

    • Thử nghiệm Dota 2 của OpenAI đã tạo ra rất nhiều hành vi thú vị, và cả các tuyển thủ chuyên nghiệp cũng thấy ấn tượng
  • Ở đoạn “trích xuất đáp án đúng bằng cách xem các lượt pick draft của những người chơi giỏi nhất trong dịch vụ từ dữ liệu đó”, có phải ý là họ xem các lượt pick draft trên https://www.17lands.com/leaderboard rồi sắp xếp theo tỷ lệ thắng không?
    Tôi nghĩ lẽ ra nên chọn Match Wins hoặc Trophies. Nếu không, thứ học được không phải là cách đo những người chơi giỏi nhất trong dịch vụ, mà là các lựa chọn draft trong đó phần lớn lựa chọn đều rất tốt, tức là những người chơi gặp may. Ảnh hưởng đó cũng sẽ xuất hiện nguyên vẹn trong validation hoặc test.
    Thay vì baseline LLM, có lẽ nên so sánh với một baseline tính điểm kiểu “Elo” cho từng lá bài so với các lá khác từ dữ liệu 17lands. Trước khi xác định hai màu thì đề xuất lá có điểm cao nhất; sau khi đã xác định màu thì đề xuất lá có điểm cao nhất trong các màu đó hoặc trong số land, kiểu như vậy.
    LLM có thể có một mức hiểu biết nhất định về luật, nhưng với các lá bài chưa từng thấy, có vẻ nó bám nhiều hơn vào các tín hiệu như độ hiếm, chi phí, “to”. “Độ chính xác” của draft cũng có vẻ thấp, và tôi không chắc đó có phải ý nghĩa được nghĩ đến không. Nếu trong bối cảnh mọi lựa chọn đều nhìn chung là tốt, giống như các lựa chọn có tỷ lệ thắng cao, mà nó chỉ có nghĩa là mô hình chọn khác người chơi trong dữ liệu gốc, thì việc chọn giữa các lựa chọn tốt thậm chí còn có vẻ khó hơn

    • Chỉ là bài viết chưa nói rõ thôi; họ đang lọc các người chơi trên 17lands có tỷ lệ thắng trận trên 62% và draft ở rank cao
      Tiêu chí là Diamond trở lên. Tuy nhiên, họ xem toàn bộ các draft của những người chơi đó, kể cả những draft có kết quả kém.
      Ở đây, độ chính xác nghĩa là trong một pack cho trước, mô hình có chọn giống một trong những người chơi giỏi hay không. Dĩ nhiên đây là chỉ số mang tính chủ quan nên không hoàn hảo, nhưng dùng để kiểm tra khả năng bắt chước drafter trình độ cao thì cũng ổn
  • Tôi tò mò liệu họ đã thử weighted loss trong Axolotl thay vì đặt loss của prompt về 0 chưa
    Có một thời tài liệu GPT-3 của Microsoft dường như nói cách này có lợi khi phản hồi ngắn, như trường hợp “Cut in.” ở đây. Việc thích nghi miền trước khi fine-tuning bằng subreddit hoặc diễn đàn cũng có thể hữu ích

    • Đây là một ý rất hay và tôi đã không nghĩ tới. Tôi sẽ thêm vào danh sách những thứ sẽ thử
      Tôi cũng đang nghĩ đến thích nghi miền, và cũng đang cân nhắc chuyển lời các video YouTube về draft thành văn bản. Tôi khá tò mò nó sẽ giúp được đến mức nào
  • Nếu tôi đọc đúng bài của tác giả, thì ở mỗi thời điểm lựa chọn, prompt đưa cho agent chỉ chứa tên lá bài trong card pool từ trước đến nay, còn chỉ các lá trong pack được đưa tới mới có toàn bộ văn bản
    Có lẽ vì kích thước cửa sổ ngữ cảnh nên ngữ cảnh giữa các lựa chọn không được duy trì.
    Nếu đúng như vậy, và giả định rằng các set này nằm sau cutoff huấn luyện của bot là đúng, thì việc trở thành một drafter giỏi chẳng phải hoàn toàn là ngẫu nhiên sao? Bot theo nghĩa đen không có cách nào biết các pick trước hợp với lá nào, nó đã gửi và nhận tín hiệu gì cho đến lúc đó, v.v. Ngay cả người chơi giỏi nhất cũng không thể chỉ nhìn “Gadwick's First Duel -- {1}{U} (uncommon)” trong prompt ví dụ mà biết nó hợp với gì, nếu chưa từng thấy lá đó.
    Rốt cuộc nó sẽ chọn các lá draft nhìn chung tốt và trùng màu với các pick trước, mà đó vốn là việc các heuristic dựa trên thứ tự pick hiện có vẫn luôn làm

    • Không hẳn chính xác như vậy. Có vài con đường để mô hình học được toàn bộ văn bản lá bài
      Mô hình cũng được huấn luyện bằng dữ liệu hoàn thành quiz về lá bài, trong đó nó phải hoàn thành toàn bộ văn bản, loại, CMC và các thông tin tương tự của lá bài. Ngoài ra, với các lá trong pack, nó cũng phải học hoàn thành token tiếp theo, nên trong quá trình tạo draft pick, nó cũng học cách dự đoán toàn bộ văn bản của lá bài. Tổng hợp lại, bot học được văn bản của các lá mới khá toàn diện
  • Nếu chưa xem, https://news.ycombinator.com/item?id=38525978 cũng có thể thú vị với nhóm độc giả này
    Đó là bài “I hacked Magic the Gathering: Arena for a 100% win rate”, và chỉ riêng việc người điều tra phát hiện AI giả lập của MTGA là Sparky có vẻ không ngu ngốc phức tạp như người ngoài vẫn nghi ngờ cũng đã đáng xem

    • Sparky là AI của Arena, nhưng chưa từng được xem là một AI Arena giỏi
      Nó giống phiên bản máy tính của trải nghiệm cho người chơi mới lần đầu tiếp xúc với game và còn chưa biết luật chơi thử với một máy tính ngớ ngẩn, hoặc “chơi với cá vàng” để kiểm tra bộ bài mình tạo rút bài và combo ra sao. Nó không phải kiểu CPU cờ vua
  • Việc có thể biểu diễn draft bằng LLM là điều rất thú vị
    Những AI draft có hiệu năng tốt nhất mà tôi từng thấy đều tận dụng representation learning dưới một hình thức nào đó. Tham khảo: https://arxiv.org/pdf/2107.04438.pdf

    • Nếu tôi không đọc nhầm, bài báo được liên kết có vẻ dùng one-hot encoding chứ không phải embedding đã học để biểu diễn từng lá bài
      Nếu “representation learning” ở đây mang nghĩa khác thì có thể tôi đã hiểu nhầm
    • Cái này tôi chưa xem, nhưng thật sự rất hay. Xét đến lượng dữ liệu, tôi cũng nghĩ cách này có thể làm tốt hơn LLM, nhưng kết quả rất thú vị
      Dù vậy biểu diễn bằng LLM vẫn có điểm thú vị. Ví dụ, có thể dùng system prompt để gán sở thích hoặc tính cách cho bot, nên khá vui
    • Lĩnh vực này tiến quá nhanh nên thật sự rất khó theo kịp
  • Tôi tự hỏi nếu coi mỗi lá bài là một token, đưa trạng thái draft làm đầu vào và để token dự đoán chính là lá bài cần chọn, thì liệu có thể dùng mô hình nhỏ hơn hoặc đạt kết quả tốt hơn không
    Có lẽ sẽ phải huấn luyện từ đầu với tokenizer tùy chỉnh

    • Trước đây tôi từng thử thêm token đặc biệt vào một dataset kiểu Reddit. Định dạng là <|post_author|>username<|post_title|>title here...
      Mô hình thu được tệ hơn nhiều so với khi định dạng toàn bộ bằng văn bản thường. Điều kiện là MPT-30B, 15 token đặc biệt, 300 triệu token huấn luyện, fine-tune toàn bộ.
      Có thể tôi đã làm sai, nhưng tôi cũng chưa thấy nhiều trường hợp thêm thành công số lượng lớn token trong fine-tuning mã nguồn mở
    • Tôi cũng từng nghĩ khá giống vậy. Với cách này, có lẽ chỉ cần cấu trúc mạng nơ-ron cơ bản cũng làm khá tốt, và có thể không cần LLM
      Nó sẽ không hoạt động với “lá bài chưa từng thấy”, và khi sai thì có khả năng chọn những thứ vô lý, nhưng tôi nghĩ có thể đạt tới độ chính xác 90%
  • Sẽ thú vị nếu so sánh với việc huấn luyện một mạng nơ-ron dành cho draft mà không dùng điểm khởi đầu Mistral. Tôi muốn xem cả theo số epoch lẫn theo chi phí
    Chưa rõ vì sao yếu tố LLM lại liên quan. Có thể trên Internet có đủ nhiều danh sách deck hoặc draft mô phỏng nên đã tạo ảnh hưởng, hoặc đơn giản là hạ tầng cho “fine-tuning LLM” được chuẩn bị tốt hơn so với “tạo mạng nơ-ron”. Có lẽ cần một thứ như nnfiddle để làm việc này dễ hơn

    • Lợi thế của LLM là checkpoint về cơ bản đã “hiểu” sẵn rất nhiều thứ
      Fine-tuning tương đối rẻ, và chỉ cần nhồi dữ liệu vào là có thể khiến nó làm khá ổn những tác vụ kiểu này. Tạo checkpoint nền tảng tốn rất nhiều tính toán, nhưng phần lớn “tri thức” nằm trong đó.
      Nếu tạo mạng nơ-ron từ đầu, trước hết phải giải quyết cách ánh xạ lá bài thành đầu vào. Tôi không biết nhiều về MTG, nhưng hầu hết các game thẻ bài sưu tầm đều có mô tả văn bản và hiệu ứng phức tạp. Ánh xạ văn bản thành logic là việc LLM làm rất tốt; nếu không thì phải bắt đầu từ đầu và cũng cần tương đối nhiều tính toán trước khi hành vi hợp lý xuất hiện.
      Với phần lớn lập trình viên phần mềm, hướng này cũng dễ hơn. Fine-tuning chủ yếu là thu thập văn bản rồi đưa vào script fine-tuning. Không cần biết đại số tuyến tính hay “tích chập” là gì cũng làm được
    • Nếu không có Mistral thì mô hình khái quát hóa thế nào với những lá bài lần đầu thấy?
      Tôi giả định “huấn luyện một mạng nơ-ron dành cho draft mà không dùng Mistral” nghĩa là dùng vector bitmap của các lá bài trong pack làm tầng đầu vào. Tính năng cốt lõi của thử nghiệm này là mô hình hoạt động chỉ dựa trên văn bản lá bài ngay cả với những set nó chưa từng thấy và có 0 dữ liệu huấn luyện. Không có LLM thì tôi nghĩ điều đó rất khó
  • Tôi rất thích bài viết này. Thật ra tuần này tôi cũng đang tìm hiểu fine-tuning LLM cho Magic: The Gathering
    Tôi đang làm một trình duyệt độ tương đồng lá bài nhỏ, dùng semantic embedding của lá bài để tìm các lá bài tương tự cả về chức năng lẫn phong cách.
    Hiện tôi chỉ dùng InstructorXL, nhưng không rõ là Instructor thiếu kiến thức bẩm sinh về game, hay tôi cần viết prompt tốt hơn. Đến giờ tôi đã thử 9 prompt nhưng hiệu năng tạo embedding có vẻ không tốt lắm: https://github.com/HanClinto/MtgMatrix/blob/main/data/create...
    Bước tiếp theo là tải xuống một dataset các lá bài tương tự, rồi xem liệu có thể dùng nó để huấn luyện kiểu triplet loss cho một mô hình embedding lớn hay không. Tôi vẫn chưa biết chính xác sẽ nối mọi thứ lại như thế nào, nhưng bài viết này thật sự truyền cảm hứng