返回

微调Transformer模型时如何正确保存冻结参数

python

如何无损地保存冻结参数:微调 Transformer 模型的正确方法

导言

微调大型语言模型 (LLM) 是自然语言处理 (NLP) 领域的热门技术。然而,在保持 LLM 性能的同时保存和加载微调后的模型可能会带来挑战,尤其是当只重新训练一部分参数时。本文将深入探讨在微调のカジュアル LM 模型(例如,GPT-2、GPT-NeoX、BLOOM)时如何正确存储和重新加载模型,以避免丢失冻结的参数。

问题:冻结参数的丢失

在微调 LLM 时,通常需要冻结部分参数(例如,编码器层)以保持 LLM 的整体性能。当使用 Hugging Face Transformers 库的 save_pretrained() 函数保存微调后的模型时,冻结的参数会被自动忽略,这可能会导致模型性能下降。

解决方案:手动保存冻结的参数

为了解决这个问题,需要手动保存冻结的参数和更新的参数。以下步骤介绍了如何实现:

  1. 识别冻结参数: 使用 requires_grad 属性识别冻结的参数,这些参数的值为 False
  2. 识别更新参数: 识别更新的参数,这些参数通常属于附加的层(例如,解码器层或 LM 头)。
  3. 手动保存冻结参数: 使用 PyTorch 的 save() 函数手动将冻结参数保存到文件中。
  4. 使用 save_pretrained() 函数保存更新参数: 使用 Hugging Face 的 save_pretrained() 函数保存更新的参数。

验证解决方案

在保存微调后的模型后,可以通过重新加载模型并检查参数是否正确加载来验证解决方案:

  1. 重新加载模型: 使用 from_pretrained() 函数重新加载模型。
  2. 检查冻结参数: 检查冻结参数的值是否与保存的文件中的值相同。
  3. 检查更新参数: 检查更新参数的值是否与 save_pretrained() 函数保存的值相同。

结论

通过手动保存冻结的参数并使用 Hugging Face 的 save_pretrained() 函数保存更新的参数,可以正确地存储和重新加载微调后的 Transformer 模型,从而保持模型的性能。

常见问题解答

  • 问:为什么不能直接使用 save_pretrained() 函数保存微调后的模型?
    • 答:save_pretrained() 函数会自动忽略冻结的参数,从而导致模型性能下降。
  • 问:如何识别冻结参数?
    • 答:通过检查参数的 requires_grad 属性,如果该属性为 False,则该参数已冻结。
  • 问:应该使用哪些文件扩展名来保存冻结参数?
    • 答:建议使用 .pt 扩展名,因为 PyTorch 可以识别该扩展名。
  • 问:如何确保重新加载时冻结参数不会被覆盖?
    • 答:在重新加载模型时,可以设置 ignore_mismatched_sizes=True 参数来忽略与保存文件不匹配的任何参数。
  • 问:这种方法是否适用于所有 Transformer 架构?
    • 答:该方法适用于所有 Transformer 架构,无论其大小或复杂性如何。