Всем привет!
В одном из предыдущих постов мы говорили о тонкой настройке и о том, почему это важно. В этом посте мы рассмотрим особый вид тонкой настройки, который называется «Точная настройка инструкций».
Предварительно обученные базовые модели, такие как gpt-3, обучаются на огромных объемах данных. В случае gpt-3 это все данные в интернете. Ну, мы не знаем этого наверняка, но большинство этих моделей обучаются на данных интернет-масштаба после значительной ручной очистки и форматирования. По мере обучения основанные модели учатся прогнозировать следующий токен и становятся действительно хорошими в прогнозировании токенов. Но чистое предсказание токенов не так полезно, как вы думаете. Если вы спросите предварительно обученную базовую модель: « Какая столица Мексики?» » он не ответит ответом, но может завершить входное предложение словами « Какова столица Колумбии ?». Таким образом, хотя такая модель, как gpt-3, эффективна в прогнозировании токенов, она не будет работать в качестве чат-бота или второго пилота. Так как же нам преобразовать предварительно обученную модель в полезного чат-бота, такого как Chat-GPT? Ответ — точная настройка, в основном особый тип тонкой настройки, называемый « Точная настройка инструкций ».
Точная настройка инструкций, также называемая «следование инструкциям», — это процесс обучения предварительно обученной базовой модели вести себя как чат-бот.
Для точной настройки инструкций необходимы наборы данных, которые представлены в форме вопросов и ответов. Вы можете использовать общедоступные наборы данных или набор данных вашей компании в форме вопросов и ответов. Если ваш набор данных не в форме вопросов и ответов, вы можете преобразовать данные в вопросы и ответы, используя различные методы, такие как Альпака, или используя специальные подсказки в других LLM. Обратите внимание, что точная настройка инструкций дает модели новое поведение при ответе на вопросы не только по данным, которые вы используете при точной настройке, но это новое поведение применимо к существующим знаниям, которые уже есть в модели, что делает тонкую настройку мощным методом.
Lamini — компания, занимающаяся искусственным интеллектом, которая позволяет разработчикам легко работать с языковыми моделями, абстрагируясь от сложностей хостинга, обучения и других сложных аспектов. Ознакомьтесь со всеми его возможностями здесь . Мы будем использовать Lamini для обучения небольшой языковой модели под названием pythia , которая представляет собой модель с открытым исходным кодом, созданную Eleuther AI , и выполнять точную настройку ее инструкций , используя набор данных компании под названием Alpaca.
На этом этапе давайте инициализируем необходимый модуль, а также посмотрим набор данных для обучения альпаки. Вот код.
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)
Вот как выглядит набор данных для настройки инструкций. Он содержит данные в виде вопросов и ответов.
На этом этапе мы берем данные из набора альпаки и помещаем их в подсказки, показанные ниже.
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"]})
После этого набор данных будет выглядеть следующим образом.
По сути, мы берем необработанные данные вопросов и ответов и преобразуем их в формат, который имеет смысл для LLM, чтобы при задании вопроса, как должен выглядеть ответ на этот вопрос. Мы делаем это итеративно и сохраняем в файле jsonl .
with jsonlines.open(f'alpaca_processed.jsonl', 'w') as writer: writer.write_all(processed_data)
На шагах 1 и 2 мы загружали необработанные данные, гидратировали их и сохраняли в формате jsonl . Но у Lamini есть готовые к использованию гидратированные данные, поэтому технически этапы 1 и 2 не обязательны. Но нужно было показать, чтобы понять, как работает тонкая настройка инструкций. Давайте сначала посмотрим, как ненастроенная версия модели Pythia ответит на простой вопрос.
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))
Это результат, который я получил. Вы заметите, что выходные данные бесполезны, а модель пытается завершить токен и не дает фактического ответа.
Как только мы используем данные вопросов и ответов, показанные на предыдущем шаге, для точной настройки инструкций, та же модель начнет вести себя как чат-бот и будет давать более точные ответы на ваши вопросы как по уточненным данным, так и по данным, которые уже есть в модели. состоит из. Это почти как когда ребенок впервые изучает язык: теперь он или она сможет выражать чувства, которые у него уже есть, а также то новое, что он узнал благодаря языковому обучению. Как и предварительно обученная версия модели, модель с точной настройкой инструкций также размещается в Lamini и может быть получена с помощью команды, как показано ниже. (Да, Ламини великолепен!)
## finetuned output instruction_model = AutoModelForCausalLM.from_pretrained("lamini/lamini_docs_finetuned") print("instruction finetuned output") print(inference(test_sample["question"], instruction_model, tokenizer))
Вот как будет выглядеть результат. Вы заметите, что вместо тарабарщины, которую мы видели на предыдущем шаге, мы получили более точный результат.
Цель этой статьи — дать введение в тонкую настройку инструкций и то, как она используется для преобразования базовых моделей в более удобные версии. В будущих статьях я углублюсь в реальный процесс тонкой настройки инструкций.
Вот и все, что касается Дня 13 из 100 Дней ИИ.
Я пишу информационный бюллетень под названием «Выше среднего», в котором рассказываю об идеях второго порядка, стоящих за всем, что происходит в больших технологиях. Если вы разбираетесь в технологиях и не хотите быть средним, подпишитесь на него .
Следуйте за мной в Twitter и LinkedIn , чтобы получать последние новости о 100 днях ИИ. Если вы работаете в сфере технологий, возможно, вам будет интересно присоединиться к моему сообществу технических специалистов здесь .
Также появляется здесь .