我的目标是微调 Mistral 7b 以编写短意识流(文本完成,而不是遵循指令)。
我有一个大型数据库(100 万行),其中包含从互联网上抓取的短文本。我手动将 15k 行标记为
good
(1k)和 bad
(其余 14k)示例。我的计划是在这些示例上训练 AutoModelForSequenceClassification
来标记其他 985k 行。
通过这种方式,我希望收集大约 2 万个意识流的好例子来微调 Mistral 7b。
但仅对
good
示例进行微调并没有使用 bad
示例中的信息,这些示例的数量要多得多。因此,我正在考虑使用 Mistral 7b 作为 AutoModelForSequenceClassification
的基础模型(在 this Medium post 之后),然后重新训练生成的 AutoModelForSequenceClassification
以完成文本。这需要移除分类头并添加新的/重新训练的 LoRA 组件。
您认为这可行吗?这是否会削弱模型(例如,需要重新学习语法),或者这是否是将
bad
反例的信息合并到文本生成中的有效方法?或者至少为 LoRA 文本生成微调提供一个良好的初始化点?
我建议使用 PEFT-LORA 方法来防止法学硕士的灾难性遗忘(以避免模型瘫痪)。您可以使用
SFTtrainer
或中等帖子中的 CustomTrainer
来训练执行您任务的适配器。并使用 adapter.load_adapter(checkpointpath)
代表您的 PeftModel
来完成特定任务。您现在也可以训练多个适配器并在多个适配器之间切换以进行推理,以便您可以针对多个特定于域的任务训练它。
使用
AutoModelForSequenceClassification
+ Lora
训练模型。选择表现良好的型号。
您可以从保存的检查点重新加载适配器。设置
is_trainable=True
并使用 AutoModelForSequenceClassification
进行文本完成任务的重新训练以完成文本。
你所拥有的是数据集中的类不平衡。~20k 好的和坏的数据应该足以执行 IMO 的微调。但我对你的任务的背景太少了,所以我对数据大小没有信心。
使用 Peft 适配器将帮助您使用 s-LORA 之类的工具在基本模型和 Peft 适配器之间切换,这样您就可以使用基本 Mistral 模型将基本模型用于其他形式的文本完成,并切换到 Peft 模型来执行特定于域的任务.
希望有帮助。如果您可以分享更多详细信息,我愿意提供进一步帮助。