可以,但通常不推荐只用 LoRA 做新词库预热,原因如下:
核心问题:新词库 + LoRA 的冲突
| 问题 | 解释 |
|---|---|
| LoRA 不训练嵌入层 | LoRA 只改注意力层,不碰 token embedding |
| 新 token 嵌入仍是随机值 | 模型"认识"新词,但不知道这些词什么意思 |
| 后续训练效果差 | 模型无法正确理解和生成化学分子序列 |
两种可行方案
方案 A:嵌入层预热 + LoRA 微调(推荐)
阶段1(当前): 只训练 embedding 层
↓ 用 full finetuning,但只开 embedding 和 lm_head
阶段2: LoRA 微调任务
↓ 冻结基础权重,用 LoRA 训练下游任务
修改命令(只训嵌入层):
bash
llamafactory-cli train \
--model_name_or_path /path/to/deepseek-r1-32b \
--tokenizer_name_or_path ./incremental_deepseek_druggpt_tokenizer-v2 \
--dataset zinc20_stage1 \
--template deepseek \
--finetuning_type full \
--freeze_trainable_layers all \ # 冻结所有层
--trainable_modules embed_tokens,lm_head \ # 只训练嵌入和输出头
--output_dir ./output/stage1_warmup \
...
方案 B:纯 LoRA(需特殊处理)
如果必须用 LoRA,需要手动初始化新 token 嵌入:
python
# 伪代码:在 LoRA 训练前,先用小学习率预热 embedding
# 1. 加载模型和扩展后的 tokenizer
# 2. 新 token 用类似 token 的嵌入做均值初始化
# 3. 冻结基础权重,只训 embedding 几百步
# 4. 然后正常 LoRA 训练
缺点:需要改代码,不如方案 A 干净。
对比总结
| 方案 | 显存需求 | 复杂度 | 效果 |
|---|---|---|---|
| Full FT(当前命令) | 很高(80GB+) | 低 | ⭐⭐⭐ 最好 |
| 只训 embedding + LoRA | 中等 | 低 | ⭐⭐⭐ 推荐 |
| 纯 LoRA(无预热) | 低 | 中 | ⭐⭐ 可能差 |
| 纯 LoRA + 手动预热 | 低 | 高 | ⭐⭐⭐ 可行但麻烦 |
建议
如果你的显存不够跑 Full FT:
- 阶段 1 :用
--freeze_trainable_layers all+--trainable_modules embed_tokens,lm_head只预热嵌入层(显存需求降低 60%+) - 阶段 2:加载预热后的模型,改用 LoRA 做任务微调
需要我帮你写阶段 2 的 LoRA 命令吗?