如何提升预训练LLMs:从零打造到微调优化的全攻略

文摘   2024-12-27 07:40   新加坡  

近年来,随着大语言模型(LLMs)的爆发式发展,越来越多的开发者和中小型公司希望利用这些强大的工具。然而,从零开始构建一个拥有数十亿参数的模型并不现实,算力、资源和技术壁垒让这一目标望尘莫及。

幸运的是,我们可以借助大公司推出的预训练模型,如 Meta LlamaMicrosoft OrcaCohere AyaGoogle Gemma 和 Mistral AI 等,直接在其基础上进行优化,以满足具体应用需求。

当现成的预训练模型无法完全满足使用场景时,有三种常见解决方案可供选择:Prompt Engineering(提示工程)、Retrieval-Augmented Generation(检索增强生成)以及 Fine-tuning(微调)。

今天,我们将着重探讨微调方法,帮助你快速掌握这一领域的核心技巧。

为什么选择 Fine-tuning?

相比简单的提示工程或检索增强生成,微调可以让模型真正掌握领域知识,适应特定任务需求。通过调整超参数、优化损失函数或结合领域数据,微调能从根本上提升模型的生成质量和实用性。

无论你选择哪种微调方法,关键在于找到适合自己场景的工具和技术。比如 SFT 适合初学者,RLHF 在偏好明确的任务中表现优越,而 ORPO 则是最新潮的选择,为复杂应用提供了新的可能性。

常见的 Fine-tuning 方法

1. 监督式微调(Supervised Fine-Tuning, SFT)

这是最常见且易于上手的微调方法。

  • 核心思路:通过提供一对描述(如问题+回答或段落+总结),用交叉熵损失(CrossEntropyLoss)训练模型预测完整文本。
  • 过程:SFT 的训练方式本质上是让自回归模型(Autoregressive Model)不断预测下一个 token,逐步提高生成文本的质量。
  • 适用场景:需要模型掌握某一特定领域的知识或生成特定风格的内容。

2. 偏好对齐方法(Preference Alignment)

(1) 基于人类反馈的强化学习(Reinforcement Learning with Human Feedback, RLHF)
  • 三步流程:
  1. 收集偏好数据集:针对同一个问题,提供两个答案并标注优劣。
  2. 训练奖励模型(Reward Model):基于偏好数据集,构建一个评分机制。
  3. 强化学习优化:结合奖励模型与强化学习算法(如 PPO),教导 LLM 提供更优质的回答。
  • 典型训练流程:预训练 → SFT → 偏好对齐
  • 优缺点:虽然效果显著,但训练过程复杂且需要大量人力标注。
  • (2) 直接偏好优化(Direct Preference Optimization, DPO)
    • 特点:
      • 直接使用损失函数对偏好进行优化,无需训练奖励模型。
      • 训练过程更简单,且更稳定。
    • 适用场景:大部分应用中,DPO 是更易于实施的选择,尤其在小型数据集上更具优势。
    • 研究发现:在部分数据集中,RLHF 仍表现更佳,但成本较高。
    (3) 单体偏好优化(Monolithic Preference Optimization, ORPO)
    • 创新点:ORPO 是 2024 年提出的全新方法,旨在融合 SFT 和偏好对齐的步骤。
    • 原理:
      • 解决了 SFT 过程中负对样本(不偏好的答案)缺乏惩罚的问题。
      • 在优化过程中,不仅提升了理想答案的预测概率,还有效减少了不理想答案的可能性。
    • 优势:结合领域知识学习和偏好对齐,同时保证收敛稳定性,适合更复杂的微调任务。

    原文:https://arxiv.org/abs/2403.07691

    ORPO Fine-tuning:https://huggingface.co/blog/mlabonne/orpo-llama-3

    微调LLM常用的工具库与框架

    在微调大语言模型(LLMs)的过程中,选择合适的工具库和框架可以极大地简化开发流程,提高效率。以下是常用的工具和集成框架汇总,让你快速入门并灵活应用。

    常用工具库

    1. bitsandbytes

    • 提供多种 LLM 量化(quantization)相关的工具,包括层(layer)、函数(function)和优化器(optimizer)。
    • 适用于需要优化存储和算力的任务,尤其是大规模模型的微调。
  • Parameter-Efficient Fine-Tuning (PEFT)

    • 专注于参数高效微调,提供多种方法,其中最知名的是 LoRA(Low-Rank Adaptation)及其衍生算法。
    • 隶属于 HuggingFace 生态系统,支持无缝集成 HuggingFace 的模型,非常适合快速开发和实验。
  • Transformer Reinforcement Learning (TRL)

    • SFT(监督式微调)。
    • RLHF所需的奖励建模(Reward Modeling, RM)和近端策略优化(PPO)。
    • DPO(直接偏好优化)。
    • 同样属于 HuggingFace 生态系统,支持多种微调方法:
    • 适合需要实现复杂训练流程的开发者。
  • wandb

    • 用于跟踪和记录模型训练过程中的数据,包括超参数设置、训练进度等信息。
    • 是许多训练框架的配套工具,让实验更加可视化和规范化。

    常用微调框架

    1. LLaMA-Factory

    • 微调框架,尽管以 "LLaMA" 命名,但实际上支持超过 100 种语言模型(LM)。
    • 提供微调所需的各种工具,并集成了友好的 WebUI 界面,大幅简化了训练流程,非常适合初学者快速上手。
  • Alpaca-Lora

    • 早期开源项目,提供简单的微调脚本,支持基础的 LoRA 微调功能。
    • 注意:项目已停止更新,但仍可作为入门参考(曾有人提议整合 QLoRA,但未被采纳)。
  • torchtune

    • 由 PyTorch 团队推出的微调框架,整体架构设计简洁易懂,适合学习和实践。
    • 推荐:框架上手简单,本文后续会提供独立教程,进一步介绍其使用方法与案例。
    instruct / chat (conversation) 格式。
    ## instruct{  "instruction": "You are an AI assistant. Provide a detailed and long answer to the given task.",  "input""Explain the benefits of regular exercise.",  "output""Regular exercise improves physical health, boosts mental well-being, increases energy levels, enhances sleep quality, and helps maintain a healthy weight."}## chat{  "conversations": [    {      "from": "system",      "value""You are an AI assistant. You will be given a task. You must generate a detailed and long answer."    },    {      "from": "human",      "value""Explain the importance of the internet in modern life."    },    {      "from": "gpt",      "value""The internet is crucial in modern life as it facilitates communication, access to information, online education, e-commerce, and social connectivity, revolutionizing how people work, learn, and interact."    }  ]}
    import openaifrom openai import OpenAIfrom yogahub.cfg import settingsclient = OpenAI(    # Not necessary if you already export OPENAI_API_KEY    api_key=settings.OPENAI_API_KEY,)def generate_chat_completion(prompt: str, model: str = "gpt-4o"):    try:        chat_completion = client.chat.completions.create(            messages=[                {                    "role""user",                    "content": prompt,                }            ],            model=model,        )        return chat_completion.choices[0].message.content    except Exception as e:        return f"An error occurred: {e}"if __name__ == "__main__":    prompt = "Say Hello World!"    response_content = generate_chat_completion(prompt)    print(response_content)
    完整代码:

    Github REAME : https://github.com/jeff52415/yoga-model-hub/blob/main/docs/fine_tune_llm.md

    Jupyter Notebook Tutorial:https://github.com/jeff52415/yoga-model-hub/blob/main/notebooks/fine_tune_llm.ipynb


    https://medium.com/@jeff52415/yoga-assistant-part-2-%E5%BE%AE%E8%AA%BF-llms-%E4%BB%A5meta-llama-3-%E7%82%BA%E4%BE%8B-7384c73fcced

    AI技术研习社
    专注分享人工智能、大模型、算法、大数据开发、数据分析领域的技术干货和落地实践!
     最新文章