¡Hola a todos!
En una de las publicaciones anteriores, hablamos sobre el ajuste y por qué es importante. En esta publicación veremos un tipo específico de ajuste fino llamado Ajuste Fino de Instrucción.
Los modelos base previamente entrenados, como gpt-3, se entrenan con una gran cantidad de datos. En el caso de gpt-3, todos los datos están en Internet. Bueno, no lo sabemos con seguridad, pero la mayoría de estos modelos se entrenan con datos a escala de Internet después de una considerable limpieza y formateo manual. A medida que se entrenan, los modelos basados aprenden a predecir el siguiente token y se vuelven realmente buenos en la predicción de tokens. Pero la predicción puramente simbólica no es tan útil como podría pensarse. Si le preguntas a un modelo base previamente entrenado “ ¿Cuál es la capital de México? "No responderá con una respuesta, pero podría completar la oración de entrada con" ¿ Cuál es la capital de Colombia ? Entonces, aunque un modelo como gpt-3 es poderoso en la predicción de tokens, no funcionará como chatbot o copiloto. Entonces, ¿cómo convertimos un modelo previamente entrenado en un chatbot útil como chat-gpt? La respuesta es el ajuste, principalmente un tipo específico de ajuste llamado " Ajuste de instrucción ".
El ajuste de instrucciones, también conocido como "seguimiento de instrucciones", es un proceso para enseñar a un modelo base previamente entrenado a comportarse como un robot de chat.
El ajuste de la instrucción necesita conjuntos de datos en forma de preguntas y respuestas. Puede utilizar conjuntos de datos públicos o el conjunto de datos de su empresa en forma de preguntas y respuestas. Si su conjunto de datos no está en forma de preguntas y respuestas, puede convertir los datos en preguntas y respuestas utilizando diferentes técnicas como Alpaca o utilizando indicaciones personalizadas en otros LLM. Tenga en cuenta que el ajuste de instrucciones le da al modelo un nuevo comportamiento de responder preguntas no solo sobre los datos que utiliza en el ajuste, sino que este nuevo comportamiento es aplicable al conocimiento existente que el modelo ya tiene, lo que hace que el ajuste sea una técnica poderosa.
Lamini es una empresa de inteligencia artificial que permite a los desarrolladores lidiar con modelos de lenguaje de una manera sencilla, abstrayendo la complejidad del alojamiento, la capacitación y otros aspectos complicados. Consulte todas sus capacidades aquí . Usaremos Lamini para entrenar un modelo de lenguaje pequeño llamado pythia , que es un modelo de código abierto creado por Eleuther AI y ajustaremos las instrucciones utilizando un conjunto de datos de la empresa llamado Alpaca.
En este paso, inicialicemos el módulo requerido y también observemos el conjunto de datos de entrenamiento de alpaca. Aquí está el código.
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)
Así es como se ve el conjunto de datos de ajuste de instrucciones. Contiene datos en forma de preguntas y respuestas.
En este paso tomamos los datos del conjunto de alpaca y los colocamos en las indicaciones que se muestran a continuación.
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"]})
Después de hacer esto, el conjunto de datos tendrá el siguiente aspecto.
Básicamente, tomamos los datos sin procesar de preguntas y respuestas y los convertimos a un formato que tenga sentido para el LLM y que, cuando se le haga una pregunta, cómo debería verse la respuesta a esa pregunta. Hacemos esto de forma iterativa y lo almacenamos en un archivo jsonl .
with jsonlines.open(f'alpaca_processed.jsonl', 'w') as writer: writer.write_all(processed_data)
En los pasos 1 y 2 cargamos datos sin procesar, los hidratamos y almacenamos en formato jsonl . Pero Lamini tiene estos datos hidratados listos para funcionar, por lo que técnicamente los pasos 1 y 2 no son necesarios. Pero era necesario demostrar que se entendía cómo funciona el ajuste de las instrucciones. Veamos primero cómo respondería una versión no ajustada del modelo Pythia a una pregunta simple.
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))
Este es el resultado que obtuve. Notará que el resultado no es útil y que el modelo está intentando completar el token y no proporciona una respuesta real.
Una vez que usemos los datos de preguntas y respuestas vistos en el paso anterior para ajustar las instrucciones, el mismo modelo comenzará a comportarse como un robot de chat y proporcionará respuestas más precisas a sus preguntas tanto sobre los datos detallados como sobre los datos que el modelo ya tiene. consiste en. Es casi como cuando un niño aprende un idioma por primera vez, ahora podrá expresar los sentimientos que ya tiene junto con las cosas nuevas que aprendió gracias al aprendizaje del idioma. Al igual que la versión previamente entrenada del modelo, el modelo ajustado con instrucciones también está alojado en Lamini y se puede inferir con un comando como se muestra a continuación. (¡Sí, Lamini es genial!)
## finetuned output instruction_model = AutoModelForCausalLM.from_pretrained("lamini/lamini_docs_finetuned") print("instruction finetuned output") print(inference(test_sample["question"], instruction_model, tokenizer))
Así es como se verá el resultado. Notarás que en lugar del galimatías que hemos visto en el paso anterior, tenemos un resultado más preciso.
El objetivo de esta publicación es brindar una introducción al ajuste de instrucciones y cómo se utiliza para convertir modelos base en versiones más utilizables. En publicaciones futuras profundizaré en el proceso real de ajuste de instrucciones.
Eso es todo por el día 13 de 100 días de IA.
Escribo un boletín llamado Above Average donde hablo sobre los conocimientos de segundo orden detrás de todo lo que está sucediendo en la gran tecnología. Si estás en tecnología y no quieres ser promedio, suscríbete .
Sígueme en Twitter y LinkedIn para obtener las últimas actualizaciones sobre 100 días de IA. Si está en tecnología, es posible que le interese unirse a mi comunidad de profesionales de la tecnología aquí .
También aparece aquí .