Nè mọi người!
Trong một trong những bài viết trước, chúng ta đã nói về việc tinh chỉnh và tại sao nó lại quan trọng. Trong bài đăng này, chúng ta sẽ xem xét một loại tinh chỉnh cụ thể được gọi là Tinh chỉnh hướng dẫn.
Các mô hình cơ sở được huấn luyện trước như gpt-3 được huấn luyện trên một lượng lớn dữ liệu. Trong trường hợp gpt-3, tất cả dữ liệu trên internet. Chà, chúng tôi không biết chắc chắn về điều đó nhưng hầu hết các mô hình này đều được đào tạo về dữ liệu quy mô internet sau khi dọn dẹp và định dạng thủ công đáng kể. Khi được đào tạo, các mô hình dựa trên sẽ học cách dự đoán mã thông báo tiếp theo và thực sự giỏi trong việc dự đoán mã thông báo. Nhưng dự đoán mã thông báo thuần túy không hữu ích như bạn nghĩ. Nếu bạn hỏi một mô hình cơ sở được đào tạo trước “ Thủ đô của Mexico là gì? ” nó sẽ không trả lời bằng câu trả lời nhưng có thể hoàn thành câu đầu vào bằng “ Thủ đô của Columbia là gì “. Vì vậy, mặc dù một mô hình như gpt-3 có khả năng dự đoán mã thông báo mạnh mẽ nhưng nó sẽ không hoạt động như một chatbot hoặc một phi công phụ. Vậy làm cách nào để chuyển đổi mô hình được đào tạo trước thành một chatbot hữu ích như chat-gpt? Câu trả lời là tinh chỉnh, chủ yếu là một loại tinh chỉnh cụ thể được gọi là “ Hướng dẫn tinh chỉnh “.
Tinh chỉnh hướng dẫn còn được gọi là “làm theo hướng dẫn” là một quá trình hướng dẫn mô hình cơ sở được đào tạo trước hoạt động giống như một bot trò chuyện.
Tinh chỉnh lệnh cần các tập dữ liệu ở dạng câu hỏi và câu trả lời. Bạn có thể sử dụng tập dữ liệu công khai hoặc tập dữ liệu công ty của bạn ở dạng Hỏi & Đáp. Nếu tập dữ liệu của bạn không ở dạng Hỏi & Đáp, bạn có thể chuyển đổi dữ liệu thành Hỏi & Đáp bằng các kỹ thuật khác nhau như Alpaca hoặc sử dụng lời nhắc tùy chỉnh trên các LLM khác. Lưu ý rằng việc tinh chỉnh hướng dẫn cung cấp cho mô hình một hành vi mới để trả lời các câu hỏi không chỉ trên dữ liệu bạn sử dụng trong quá trình tinh chỉnh mà hành vi mới này có thể áp dụng cho kiến thức hiện có mà mô hình đã có, khiến việc tinh chỉnh trở thành một kỹ thuật mạnh mẽ.
Lamini là một công ty AI cho phép các nhà phát triển xử lý các mô hình ngôn ngữ một cách dễ dàng, loại bỏ sự phức tạp của việc lưu trữ, đào tạo và các khía cạnh phức tạp khác. Kiểm tra khả năng đầy đủ của nó ở đây . Chúng tôi sẽ sử dụng Lamini để đào tạo mô hình ngôn ngữ nhỏ có tên pythia , đây là một mô hình mã nguồn mở do Eleuther AI tạo ra và thực hiện hướng dẫn tinh chỉnh nó bằng cách sử dụng tập dữ liệu của công ty có tên là Alpaca.
Trong bước này, hãy khởi tạo mô-đun cần thiết và xem tập dữ liệu huấn luyện alpaca. Đây là mã.
import itertools import jsonlines from datasets import load_dataset from pprint import pprint from llama import BasicModelRunner from transformers import AutoTokenizer, AutoModelForCausalLM from transformers import AutoModelForSeq2SeqLM, AutoTokenizer ## we are using alpaca data set, which is an open source fine tuning data set instruction_tuned_dataset = load_dataset("tatsu-lab/alpaca", split="train", streaming=True) m = 5 print("Instruction-tuned dataset:") top_m = list(itertools.islice(instruction_tuned_dataset, m)) for j in top_m: print(j)
Tập dữ liệu điều chỉnh lệnh trông như thế này. Nó chứa dữ liệu dưới dạng câu hỏi và câu trả lời.
Trong bước này, chúng tôi lấy dữ liệu từ nhóm alpaca và đưa chúng vào lời nhắc hiển thị bên dưới.
prompt_template_with_input = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. ### Instruction: {instruction} ### Input: {input} ### Response:""" prompt_template_without_input = """Below is an instruction that describes a task. Write a response that appropriately completes the request. ### Instruction: {instruction} ### Response:""" ## hydrate prompts - meaning add data to the above prompts processed_data = [] for j in top_m: if not j["input"]: processed_prompt = prompt_template_without_input.format(instruction=j["instruction"]) else: processed_prompt = prompt_template_with_input.format(instruction=j["instruction"], input=j["input"]) processed_data.append({"input": processed_prompt, "output": j["output"]})
Sau khi thực hiện việc này, tập dữ liệu sẽ trông như sau.
Về cơ bản, chúng tôi đang lấy dữ liệu Hỏi & Đáp thô và chuyển đổi sang định dạng phù hợp với LLM để khi được hỏi một câu hỏi, câu trả lời cho câu hỏi đó sẽ như thế nào. Chúng tôi thực hiện việc này nhiều lần và lưu trữ trong tệp jsonl .
with jsonlines.open(f'alpaca_processed.jsonl', 'w') as writer: writer.write_all(processed_data)
Ở bước 1 & 2, chúng tôi đã tải dữ liệu thô và hydrat hóa nó rồi lưu trữ ở định dạng jsonl . Nhưng Lamini đã có sẵn dữ liệu ngậm nước này nên về mặt kỹ thuật, bước 1 & 2 là không cần thiết. Nhưng cần phải chứng minh để hiểu cách hoạt động của việc tinh chỉnh hướng dẫn. Trước tiên chúng ta hãy xem phiên bản chưa được tinh chỉnh của mô hình Pythia sẽ phản hồi như thế nào đối với một câu hỏi đơn giản.
tokenizer = AutoTokenizer.from_pretrained("EleutherAI/pythia-70m") #70M parameter model that is not instruction tuned. model = AutoModelForCausalLM.from_pretrained("EleutherAI/pythia-70m") def inference(text, model, tokenizer, max_input_tokens=1000, max_output_tokens=100): # Tokenize input_ids = tokenizer.encode( text, return_tensors="pt", truncation=True, max_length=max_input_tokens ) # Generate device = model.device generated_tokens_with_prompt = model.generate( input_ids=input_ids.to(device), max_length=max_output_tokens ) # Decode generated_text_with_prompt = tokenizer.batch_decode(generated_tokens_with_prompt, skip_special_tokens=True) # Strip the prompt generated_text_answer = generated_text_with_prompt[0][len(text):] return generated_text_answer ## the 70M model doesnt have any company specific data, we will use the alpace data set from hosted on lamini and fine tune this model # load alpaca dataset finetuning_dataset_path = "lamini/lamini_docs" finetuning_dataset = load_dataset(finetuning_dataset_path) #print(finetuning_dataset) test_sample = finetuning_dataset["test"][0] print(test_sample) print("untrained output sample") print(inference(test_sample["question"], model, tokenizer))
Đây là đầu ra tôi nhận được. Bạn sẽ nhận thấy rằng kết quả đầu ra không hữu ích và mô hình đang cố gắng hoàn thành mã thông báo và không đưa ra câu trả lời thực tế.
Sau khi chúng tôi sử dụng dữ liệu hỏi đáp ở bước trước để hướng dẫn tinh chỉnh, mô hình tương tự sẽ bắt đầu hoạt động giống như một bot trò chuyện và sẽ cung cấp câu trả lời chính xác hơn cho các câu hỏi của bạn cả trên dữ liệu đã được tinh chỉnh cũng như dữ liệu mà mô hình đã có bao gồm tắt. Nó gần giống như khi một đứa trẻ học một ngôn ngữ lần đầu tiên, giờ đây nó sẽ có thể bày tỏ những cảm xúc vốn có cùng với những điều mới mà chúng học được trong quá trình đào tạo ngôn ngữ. Giống như phiên bản đã được đào tạo trước của mô hình, mô hình đã tinh chỉnh hướng dẫn cũng được lưu trữ trên Lamini và có thể được suy ra bằng lệnh như hiển thị bên dưới. (Vâng, Lamini thật tuyệt!)
## finetuned output instruction_model = AutoModelForCausalLM.from_pretrained("lamini/lamini_docs_finetuned") print("instruction finetuned output") print(inference(test_sample["question"], instruction_model, tokenizer))
Đây là kết quả đầu ra sẽ như thế nào. Bạn sẽ lưu ý rằng thay vì những từ vô nghĩa mà chúng ta đã thấy ở bước trước, chúng ta có kết quả đầu ra chính xác hơn.
Mục tiêu của bài đăng này là giới thiệu cách tinh chỉnh hướng dẫn và cách nó được sử dụng để biến các mô hình cơ sở thành các phiên bản dễ sử dụng hơn. Trong các bài đăng sau, tôi sẽ đi sâu vào quá trình thực tế thực hiện việc tinh chỉnh hướng dẫn.
Thế là xong Ngày thứ 13 trong 100 Ngày của AI.
Tôi viết một bản tin có tên Trên mức trung bình, nơi tôi nói về những hiểu biết sâu sắc thứ hai đằng sau mọi thứ đang diễn ra trong ngành công nghệ lớn. Nếu bạn làm trong lĩnh vực công nghệ và không muốn ở mức trung bình, hãy đăng ký theo dõi .
Theo dõi tôi trên Twitter , LinkedIn để biết thông tin cập nhật mới nhất về 100 ngày của AI. Nếu bạn làm trong lĩnh vực công nghệ, bạn có thể muốn tham gia cộng đồng các chuyên gia công nghệ của tôi tại đây .
Cũng xuất hiện ở đây .