Discusión sobre el proceso básico de entrenamiento de modelos grandes.

Discusión de tres pasos de ajuste

Paso 1: supervisar el ajuste

De hecho, el ajuste fino supervisado (SFT) ha logrado avances significativos en el campo de los modelos de lenguajes grandes (LLM). Sin embargo, aún pueden ocurrir comportamientos inesperados, como generación de contenido duplicado e inconsistencias entre las puntuaciones del nivel de perplejidad (PPL) y las funciones de generación.

Según nuestras pruebas, existen varios términos que afectan el comportamiento de la construcción:

  • weight decay: El modelo OPT está preentrenado mediante disminución de peso. Posteriormente, los hilanderos suelen heredar esta configuración. Sin embargo, es posible que no produzca el modelo deseado. En particular, para nuestro ejemplo OPT-1.3B, desactivamos la atenuación de peso.
  • dropout: De manera similar a lo anterior, la deserción se utiliza para el entrenamiento previo de OPT. Sin embargo, es posible que la SFT no lo requiera. En particular, para nuestro ejemplo OPT-1.3B, habilitamos la deserción.
  • dataset: El uso de más datos generalmente proporciona una mejor calidad del modelo. Sin embargo, si las fuentes del conjunto de datos varían demasiado, el rendimiento puede verse afectado. Para nuestro ejemplo OPT-1.3B, utilizamos los siguientes cuatro conjuntos de datos: .Dahoas/rm-static Dahoas/full-hh-rlhf Dahoas/synthetic-instruct-gptj-pairwise yitingxie/rlhf-reward-datasets
  • training epochsNormalmente, para evitar el sobreajuste, elegimos épocas de entrenamiento más pequeñas en lugar de épocas más largas si se puede lograr una calidad de modelo similar con épocas más pequeñas (en este caso usamos PPL como métrica). Sin embargo, de manera similar a lo que señaló InstructGPT, encontramos que incluso si se produce un sobreajuste debido a tiempos de entrenamiento más prolongados, aún se recomiendan épocas de entrenamiento más largas para una mejor calidad de generación. En particular, para nuestro ejemplo OPT-1.3B, utilizamos 16 épocas, aunque descubrimos que entrenar para 1 o 2 épocas puede lograr la misma puntuación PPL.

Paso 2: ajuste del modelo de recompensa

El ajuste del modelo de recompensa (RM) es de hecho similar al SFT, las principales diferencias son: (1) el conjunto de datos de entrenamiento es diferente: RM requiere respuestas buenas y malas a la misma consulta; (2) la pérdida de entrenamiento es diferente: RM requiere pérdida de clasificación como objetivo de optimización.

Proporcionamos dos métricas para el modelo de recompensa: (1) puntuaciones de recompensa por las respuestas aceptadas (y malas respuestas) y (2) precisión, es decir, cuando las respuestas aceptadas pueden obtener puntuaciones más altas que las respuestas rechazadas. A veces observamos una precisión muy alta, pero la puntuación de recompensa promedio de la respuesta aceptada es negativa, o la puntuación de la respuesta rechazada es similar a la respuesta aceptada. ¿Afectará esto la calidad del modelo del paso 3? Puede que esto no sea un problema si utilizamos la métrica del paso 3 para recompensar las ganancias de puntuación. Sin embargo, esta métrica de aprendizaje automático (aumento/aumento de la puntuación de recompensa) no puede reflejar verdaderamente la calidad de la generación del modelo del paso 3. Así que todavía no tenemos una respuesta definitiva.

Aquí compartimos más sobre lo que observamos durante nuestra exploración:

  • weight decay: Para nuestro ejemplo OPT-350m, habilitamos una caída de peso de 0,1.
  • dropout: Para nuestro ejemplo OPT-350m, desactivamos la deserción.
  • dataset: Para nuestro ejemplo OPT-350m, utilizamos los siguientes cuatro conjuntos de datos: .Dahoas/rm-static Dahoas/full-hh-rlhf Dahoas/synthetic-instruct-gptj-pairwise yitingxie/rlhf-reward-datasets
  • training epochsInstructGPT recomienda usar 1 época para ajustar el modelo porque el sobreajuste puede afectar el rendimiento del paso 3. Durante nuestra exploración, no vimos un comportamiento de sobreajuste cuando aumentamos las épocas de entrenamiento. Sin embargo, siga las instrucciones del autor. Establecemos el período de entrenamiento en 1.

Además, tenemos más exploraciones disponibles aquí, incluso si aún no las hemos configurado como opciones ni las hemos incluido en la cartera actual.

  • multiple answers for one promptEn InstructGPT, el autor menciona específicamente que el uso de respuestas emparejadas de rechazo y aceptación a un mensaje no favorece el entrenamiento del modelo de recompensa. Por lo tanto, InstructGPT interpreta el conjunto de datos con entre 4 y 9 respuestas para cada mensaje. Sin embargo, no encontramos un buen conjunto de datos con esta característica.
  • initialize RM with SFT or Pretrained checkpointProbamos esto internamente y no vimos mucha diferencia en la precisión o las puntuaciones de recompensa. Además, en InstructGPT, el autor también encontró lo mismo. Sin embargo, se anima a los usuarios a que lo prueben para su propio uso.
  • Reward score calculationUsamos la ficha final (o la primera ficha completa) para obtener puntos de bonificación. Sin embargo, puede que no sea la mejor opción. Por ejemplo, los usuarios pueden probar la puntuación promedio de la respuesta completa, etc.
  • Reward loss objectiveSimplemente utilizamos la pérdida de rango como objetivo. Sin embargo, otros, como MSE, también pueden ser una opción.

Paso 3: ajuste fino de RLHF

El ajuste fino de RLHF es el paso más complejo del entrenamiento de tres pasos. Al igual que SFT, las puntuaciones de recompensa no reflejan realmente la calidad de generación del modelo. Además, observamos que la puntuación de recompensa cae a la etapa inicial en un momento determinado y luego se recupera rápidamente. Para empeorar las cosas, también vemos con qué facilidad la formación puede divergir. Compartimos nuestra configuración y observaciones aquí.

  • weight decay: Para nuestro ejemplo OPT-1.3B/350m (Actor/Crítico), desactivamos la caída de peso para ambos modelos.
  • dropout: Desactivamos la salida para OPT-1.3B y la habilitamos para OPT-350m.
  • dataset: Utilizamos el siguiente conjunto de datos único: .Dahoas/rm-static
  • training epochsLos puntos de bonificación se convierten rápidamente en platou. Por lo tanto, configuramos las épocas de entrenamiento para el ejemplo OPT-1.1B/3m (Actor/Crítico) en 350. Sin embargo, al igual que las SFT, una formación más prolongada puede conducir a una mejor calidad del modelo.
  • ema checkpointObservamos que los puntos de control de ema a menudo conducen a una mejor calidad de generación del modelo, como se describe en InstructGPT.
  • PPO related hyperparametersHay muchos hiperparámetros para la capacitación de PPO, consulte aquí . Actualmente, los codificamos para el usuario, pero es posible que desee modificarlos para su caso de uso.
  • mix unsupervised trainingInstructGPT recomienda una combinación de PPO y capacitación no supervisada para evitar la pérdida de la calidad inicial del modelo. Sin embargo, cuando aplicamos directamente los hiperparámetros en Instruct, el modelo no logra converger. Entonces dejamos de explorar esto. Sin embargo, se anima a los usuarios a probarlo y ajustar los hiperparámetros para su propio uso.
  • diverging issueDescubrimos que usar diferentes Generation_batch_size () y PPO_train_batch_size (), usar múltiples épocas de entrenamiento PPO () o múltiples Generation_batch_size () es muy inestable. Todos apuntan al mismo problema: no podemos actualizar el modelo de actor varias veces después de generar datos experimentales. Por lo tanto, en todas nuestras ejecuciones exitosas, configuramos y Esto es inesperado para los canales de capacitación de RL estándar, y hemos intentado y fallado de diferentes maneras para superar esto. Una de las razones más probables de esta inestabilidad es que descubrimos que y utilizado en la función divergió rápidamente incluso dentro de dos iteraciones consecutivas, lo que resultó en una correspondencia enorme. Establecer un límite superior estricto puede aliviar este problema, pero no resuelve completamente el problema de convergencia.--per_device_train_batch_size--per_device_mini_batch_size--ppo_epochs--generation_batch_numbersper_device_train_batch_size=per_device_mini_batch_sizeppo_epochs=generation_batch_numbers=1log_probsold_log_probsactor_loss_fnratio

Parte de la formación también se puede dividir en cuatro pasos:

1. Modelo Pretain: en la mayoría de los casos en esta etapa, está diseñado para aprendizaje no supervisado o débilmente supervisado, lo que permite que el modelo se convierta en un generalista bien leído y bien informado.

2. Ajuste del modelo: esta parte agrega principalmente algunas etiquetas o conocimientos al modelo previo al entrenamiento, lo que permite a los generalistas ordenar su estructura de conocimiento en un sistema.

3. Aprendizaje de tareas ascendentes: esta parte de la tarea entrena las habilidades profesionales del modelo, lo que hace que el modelo sea más poderoso cuando tiene conocimientos generales y también remodelará el sistema de conocimientos generales.

4. Aprendizaje de alineación: conocedor y capaz, pero debe poder comprender mejor el lenguaje humano y comunicarse con él más fácilmente, por lo que se necesita alineación. La corriente principal actual en esta parte es RLHF

Los procesos anteriores no sólo se realizan en una ronda, sino que a menudo requieren muchas rondas de iteraciones para lograr un mejor rendimiento del modelo. El proceso anterior de división del trabajo se lleva a cabo de forma secuencial en las primeras rondas, con límites relativamente claros. Sin embargo, los límites de la iteración se vuelven borrosos a medida que avanzamos hacia iteraciones posteriores y, a menudo, se utilizan varios métodos al mismo tiempo. Entonces todo el mundo sabe que existen estos procesos y métodos, y no hay necesidad de preocuparse por sus límites claros.


Ajuste fino del método de entrenamiento de modelos grandes

La idea central de Fine-tune es utilizar modelos previamente entrenados en grandes conjuntos de datos (como ImageNet, COCO, etc.) y luego ajustarlos utilizando conjuntos de datos más pequeños (menos que la cantidad de parámetros) [ 3]. La ventaja de esto es que, en comparación con entrenar el modelo desde cero, Fine-tune puede ahorrar muchos recursos informáticos y costos de tiempo, mejorar la eficiencia informática e incluso mejorar la precisión [1] [2].

Finetune se refiere al ajuste fino de tareas específicas basadas en el modelo previamente entrenado para mejorar el rendimiento del modelo. Existen muchos métodos específicos de ajuste fino, pero en términos generales, el ajuste fino se puede realizar ajustando el número de capas del modelo, ajustando la tasa de aprendizaje, ajustando el tamaño del lote, etc.

La ventaja de Finetune es que no necesita volver a entrenar completamente el modelo, lo que mejora la eficiencia, porque generalmente la precisión de un nuevo modelo de entrenamiento aumentará lentamente desde un valor muy bajo, pero el ajuste fino nos permite obtener un mejor efecto después de un tiempo relativamente largo. pequeño número de iteraciones.

Aunque Fine-tune tiene muchas ventajas, también tiene algunas desventajas. Por ejemplo, Fine-tune requiere un gran conjunto de datos para mejorar el rendimiento del modelo, lo que puede dificultar la realización de algunas tareas. Además, el rendimiento de Fine-tune depende en gran medida de la calidad y aplicabilidad del modelo previamente entrenado, y si hay una discrepancia entre el modelo previamente entrenado y el conjunto de datos ajustado, Fine-tune puede no mejorar el rendimiento del modelo [1].

En el futuro, la tecnología Fine-tune seguirá utilizándose ampliamente. Por un lado, con el desarrollo y la mejora continuos del modelo de aprendizaje profundo, la calidad y aplicabilidad del modelo previamente entrenado continuará mejorando, haciéndolo más adecuado para la tecnología Fine-tune. Por otro lado, la tecnología Fine-tune también ayudará a resolver algunos problemas en aplicaciones prácticas, como conjuntos de datos pequeños y dificultades en la anotación de conjuntos de datos [1][3].

aprendizaje rápido

El concepto básico de Prompt Learning: Prompt Learning es una tecnología de procesamiento del lenguaje natural que guía al modelo para completar diferentes tareas agregando un texto breve antes de la entrada del modelo previamente entrenado [1]. Estos textos de indicaciones suelen tener la forma de preguntas o instrucciones que le dicen al modelo cómo comprender la entrada y generar resultados. La ventaja de Prompt Learning es que puede completar múltiples tareas con una pequeña cantidad de datos [2].

Aprendizaje de múltiples indicaciones: el aprendizaje de múltiples indicaciones es una forma extendida de aprendizaje rápido, que puede aplicar múltiples indicaciones a un problema para lograr la mejora de los datos o la descomposición del problema [1]. Los métodos comunes de aprendizaje de múltiples indicaciones incluyen métodos paralelos, métodos de mejora y métodos combinados [2]. El método paralelo realiza múltiples indicaciones en paralelo y agrega los resultados de múltiples indicaciones individuales mediante ponderación o votación; el método mejorado ingresa un caso similar al problema actual junto con la entrada actual, para que el modelo pueda hacer predicciones con mayor precisión; El El método de combinación combina múltiples indicaciones para entrenar el modelo para realizar tareas más complejas [2].

Cómo elegir un modelo de preentrenamiento adecuado: elegir un modelo de preentrenamiento adecuado es uno de los pasos clave del Prompt Learning. Al seleccionar un modelo, se deben considerar los siguientes factores: tipo de tarea, conjunto de datos, tamaño del modelo y tiempo de entrenamiento, etc. [1]. Por lo general, cuanto mayor sea el tamaño del modelo previamente entrenado, mejor será su rendimiento en diversas tareas, pero al mismo tiempo requiere más recursos informáticos [1].

Cómo ajustar la estrategia de capacitación de Prompt: Otro paso clave en Prompt Learning es cómo ajustar la estrategia de capacitación de Prompt. Puede usar el método de simplemente mejorar el efecto del modelo con datos completos, o usar Prompt como método auxiliar con pocos disparos/cero disparos, o arreglar el modelo de entrenamiento previo y entrenar solo Prompt [[1].

Como se muestra en la figura anterior, el método de preentrenamiento de Finetune utiliza PLM como codificador básico, agrega una capa neuronal adicional para tareas específicas en las tareas posteriores de Finetune y ajusta todos los parámetros. Existe una brecha entre las tareas de preformación y de ajuste.

Como se muestra en el mensaje anterior, la misma tarea de MLM se utiliza durante el entrenamiento previo y el ajuste de las tareas posteriores. Cerrar la brecha entre el ajuste del modelo y el entrenamiento previo para mejorar las capacidades de aprendizaje en pocas oportunidades. Usar PLM como codificador base, agregar contexto adicional (plantilla) y posiciones [MASCARA], proyectar etiquetas para etiquetar palabras (verbalizador), cerrar la brecha entre el entrenamiento previo y el ajuste.

Lo anterior es un diagrama esquemático del proceso de convertir las preguntas de los comentarios de los usuarios en mensajes, incluida la selección de plantillas, el empaquetado de plantillas, la selección de palabras de salida de MLM y el mapeo de palabras para comentar con positividad.

Selección de plantilla

El diseño de plantillas artificiales incluye que los expertos diseñen un conjunto de plantillas basadas en su comprensión del problema para convertir la solución a un problema específico en un método de expresión adecuado para la generación de lenguaje natural. La siguiente es una plantilla estructurada creada por personas para problemas de control de calidad, que convierte los problemas de control de calidad en problemas en los que el modelo generativo genera resultados.

La búsqueda automática genera plantillas de mensajes, selecciona una metaplantilla y luego genera la plantilla de mensajes óptima basada en la búsqueda de gradiente de palabras existentes.

Utilice T5 para generar automáticamente plantillas para múltiples oraciones de entrada. La operación es como se muestra en la figura siguiente, los pasos generales: 1. Utilice la plantilla existente para entrenar un modelo T5, deje que el modelo aprenda cómo pasar el corpus (nivele todas las entradas de la tarea como entradas vectoriales, y la salida es la plantilla final) 2. Utilice la entrada de la tarea como entrada, utilice el modelo de entrenamiento para la generación de plantillas

Deje que el modelo previo genere plantillas automáticamente, la idea es la siguiente: arregle el modelo principal de entrenamiento previo, deje que el modelo entrene las tareas marcadas y modifique la oración de entrada incrustada después de aprender el modelo. Por supuesto, la oración original es no se cambia, simplemente deje que el modelo se cambie a la parte de la oración sin entrada y, finalmente, la plantilla más rápida se puede aprender automáticamente. Por supuesto, es posible que las personas no puedan entender este modelo.

P-tuning v1: use sugerencias para las capas de entrada (usando reparametrización)

P-tuning v2: use sugerencias para cada capa (como ajuste de prefijo)

Complete la selección de palabras

Es adecuado para el diseño rápido de tareas, y las tareas se convierten al modo de generación, por lo que habrá un proceso de conversión de cómo asignar las cosas generadas a los resultados deseados. El diseño y la selección del vocabulario intermedio tienen un gran impacto. depende del resultado final, por lo que necesitamos diseñar la salida de palabras profundas.

Positivo: genial, maravilloso, bueno. Negativo: terrible, malo, horrible…

Generación manual

Brainburst genera una ola de palabras clave o frases y luego utiliza la base de conocimientos existente para recordar más palabras, conceptos u oraciones relacionadas, y luego clasifica y selecciona las palabras y frases recordadas.

Generación automatizada

Es muy similar a la generación automática de plantillas. El modelo se fija y se entrena utilizando datos anotados. Durante la retropropagación del gradiente, las palabras incrustadas de entrada se cambian.

aprendizaje delta

La idea general es hacer que los modelos expresivos grandes sean controlables para aprender y usar agregando algunos parámetros de control. Use un ejemplo como metáfora: en cibernética, una matriz de control lineal simple se usa para controlar un sistema grande y complejo; esta metáfora puede no ser completamente precisa, porque el aprendizaje detallado en realidad se puede fusionar con el modelo original, que en realidad es un vínculo con el conocimiento aprendido ha sido reorganizado.

Lo real es utilizar un ajuste incremental para simular un modelo con miles de millones de parámetros y optimizar un pequeño conjunto de parámetros.

Esta imagen significa que sigo siendo yo, pero después de simples cambios y aprendizaje, puedo convertirme en una variedad de yo diferente, pero el modelo previo al entrenamiento no se mueve, solo los parámetros involucrados, ojos, una pieza, decoración. Expresa muy vívidamente el proceso de entrenamiento, pero siento que no es lo suficientemente expresivo. Pero esta imagen ha circulado ampliamente, así que, por cierto, la publiqué aquí.

Además: el método introduce módulos o parámetros neuronales entrenables adicionales que no existen en el modelo original;

Especificación: el método especifica que algunos parámetros del modelo o proceso original se vuelven entrenables, mientras que otros parámetros se congelan;

El método Reparametrización: reparametriza los parámetros existentes en una forma eficiente en parámetros transformándolos.

Detaleran tiene tres factores importantes:

1. Cuál insertar: inserción en serie con la red original o inserción en puente

2. Cómo insertar: inserte solo ciertas capas o inserte cada capa de toda la red

3. ¿Qué tamaño tiene el control de matriz? ¿Qué tamaño tiene el parámetro que se agrega a la capa de control? Un bit sigue siendo el 0,5% del parámetro original.

Diferentes métodos de inserción y diferentes parámetros tienen una diferencia relativamente grande en el efecto del modelo. Puede experimentar esto cuando realmente ajuste el modelo. La tabla anterior es una representación matemática abstracta de diferentes métodos. Cuando todos descubran que no tienen ideas durante la operación práctica, vendrán y mirarán esta tabla, será útil pensar en ella en combinación con el problema.

Parte practica

Esta parte se basa en el modelo experimental chatglm 6B. El código específico está en este enlace: GitHub - liangwq/Chatglm_lora_multi-gpu: chatglm multi-gpu with deepspeed and

El modelo no tiene que ser chatglm, llama o cualquier otro modelo. El peft de Huggingface se utiliza para el aprendizaje delta y la velocidad profunda se utiliza para el entrenamiento distribuido con varias tarjetas.

Probado: 2 tarjetas A100 80G, 8 tarjetas A100 80G, los datos de configuración de hardware y la velocidad son los siguientes:
500,000 datos de instrucción, 2 tarjetas, CPU de 32 núcleos, memoria de 128G

Lote 2, gd 4 significa cada tamaño de lote = 16; 2 épocas lora_rank = 8, la cantidad de parámetros insertados es de aproximadamente 7 millones y se necesitan 20 horas para entrenar.

8 tarjetas tardan aproximadamente 5 horas

Ajuste fino, la convergencia del modelo es muy estable y el efecto es bueno

Explicación del código:

Lógica de procesamiento de datos

def data_collator(features: list) -> dict:
    len_ids = [len(feature["input_ids"]) for feature in features]
    longest = max(len_ids) + 1
    input_ids = []
    attention_mask_list = []
    position_ids_list = []
    labels_list = []
    for ids_l, feature in sorted(zip(len_ids, features), key=lambda x: -x[0]):
        ids = feature["input_ids"]
        seq_len = feature["seq_len"]
        labels = (
            [-100] * (seq_len - 1)
            + ids[(seq_len - 1) :]
            + [tokenizer.eos_token_id]
            + [-100] * (longest - ids_l - 1)
        )
        ids = ids + [tokenizer.eos_token_id] * (longest - ids_l)
        _ids = torch.LongTensor(ids)
        attention_mask, position_ids = get_masks_and_position_ids(
            ids, seq_len, longest, _ids.device, gmask=False
        )
        labels_list.append(torch.LongTensor(labels))
        input_ids.append(_ids)
        attention_mask_list.append(attention_mask)
        position_ids_list.append(position_ids)
    input_ids = torch.stack(input_ids)
    labels = torch.stack(labels_list)
    attention_mask = torch.stack(attention_mask_list)
    position_ids = torch.stack(position_ids_list)
    return {
        "input_ids": input_ids,
        "labels": labels,
        "attention_mask": attention_mask,
        "position_ids": position_ids,
    }

Insertar lora permite agregar entrenamiento a lora entrenado con otros datos, lo que significa que parte de los datos se pueden usar para entrenar a lora por separado, y es necesario integrar el lora entrenado para el entrenamiento conjunto, lo cual es muy conveniente. Definitivamente es algo bueno para los amigos que no tienen suficiente configuración de máquina.

# setup peft
peft_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    inference_mode=False,
    r=finetune_args.lora_rank,
    lora_alpha=32,
    lora_dropout=0.1,
)
model = get_peft_model(model, peft_config)
 
if finetune_args.is_resume and finetune_args.resume_path:
    print("=====>load lora pt from =====》:", finetune_args.is_resume, finetune_args.resume_path)
    model.load_state_dict(torch.load(finetune_args.resume_path), strict=False)


La parte de aceleración de integración, porque no mantendrá puntos de control, así que escribí el código duro para mantener un punto de control cada 2000 pasos. Esta parte aún no ha llegado y solo mantiene los dos últimos códigos de puntos de control, por lo que se generarán muchas carpetas de puntos de control hermanos. no necesitas el bloque, puedes comentarlo o escribir tu propio código para conservar dos bloques. Por supuesto que lo actualizaré más tarde.

                if i%2000 ==0 and accelerator.is_main_process:
                    #accelerator.wait_for_everyone()
                    path = training_args.output_dir+'/checkpoint_{}'.format(i)
                    os.makedirs(path) 
                    accelerator.save(lora.lora_state_dict(accelerator.unwrap_model(model)), os.path.join(path, "chatglm-lora.pt"))
                    #save_tunable_parameters(model, os.path.join(path, "chatglm-lora.pt"))
                i +=1

Supongo que te gusta

Origin blog.csdn.net/chaishen10000/article/details/131307332
Recomendado
Clasificación