微调
微调是修改大型语言模型的权重,以帮助其在特定任务或任务集上表现更好的过程。
在本节中,我们将介绍 Ludwig 提供的微调选项,并根据您的任务提供何时使用哪种技术的指导。
生成式微调与预测式微调¶
Ludwig 提供了针对生成式和预测式任务的微调能力。生成式任务通过 llm
模型类型支持,而预测式任务在使用大型语言模型作为预训练文本编码器时,通过 ecd
模型类型支持。
对于聊天机器人和代码生成等生成式任务,微调语言模型的编码器(生成嵌入)和解码器(生成下一个 token 概率)是直接且首选的方法。Ludwig 通过前面所示的示例配置简洁地支持这一点。
对于预测式任务,通常倾向于采用现有的文本生成模型,并微调它以生成与多类别分类问题中的特定类别匹配的文本,或与回归问题中的特定数值匹配的文本。然而,结果得到的模型会带来一些缺点:
- 文本生成模型的预测速度较慢。特别是自回归模型(Llama 和大多数流行 LLM 都属于此类)需要一次生成一个 token,这比生成单个输出慢很多倍。
- 文本生成模型可能会产生幻觉。这可以通过使用条件解码策略来缓解,但如果您只需要一个能够输出 N 个不同输出之一的模型,那么拥有一个可以输出任何内容的模型就有些过度了。
对于此类预测式任务(分类、回归),解决方案是移除 LLM 末尾的语言模型头/解码器,并用任务特定的头/解码器替换(通常是一个简单的多层感知器)。末尾的任务特定头可以在任务特定的数据集上快速训练,而预训练的 LLM 编码器要么进行微调(使用参数高效微调),要么保持不变。当 LLM 权重保持不变时(也称为“线性探测”),训练过程可以进一步受益于 Ludwig 的优化,例如缓存编码器嵌入,从而实现高达 50 倍的速度提升。
您可以在这里找到生成式微调的示例。
您可以在这里找到预测式微调的示例。
有关配置 LLM 微调的完整详细信息,请参阅配置文档。
上传到 HuggingFace Hub¶
微调 LLM 后,输出将是更新后的模型权重,可以直接上传到 HuggingFace 并部署到端点或与 Ludwig 之外的其他用户共享。
ludwig upload hf_hub -r <your_org>/<model_name> -m <path/to/model>
from ludwig.api import LudwigModel
LudwigModel.upload_to_hf_hub("your_org/model_name", "path/to/model")