最近在做一个文本生成项目,想用PyTorch对预训练模型做Prompt tuning。看了几篇论文,有的说只训练prompt embedding,有的说要把MLP层也解冻,还有人说LoRA更稳。我试了只调prompt embedding,loss下降很慢,生成结果跟瞎猜差不多。是不是我初始化方式不对?还是说BERT类模型和GPT类模型的prompt tuning策略本来就不一样?有没有大佬分享一下实际调参经验,比如学习率、epoch数,或者什么情况下该解冻更多层?求指点,卡这儿好几天了。
用PyTorch写Prompt调优,到底该冻结哪些层?
全部回复
共 67 条试试把学习率调到5e-4以上,prompt长度加到20个token,loss立马就动了。
BERT类模型确实比GPT难调,试试把embedding初始化为 vocab 前几个token的均值,lr调5e-4左右。
先检查下prompt初始化,别用随机向量,拿词表里高频词的embedding均值试试,loss会明显不一样。
BERT和GPT的prompt tuning差别挺大的,你试试只解冻最后两三层,学习率调到5e-4看看。
初始化试过用词向量均值没?BERT系和GPT系确实不一样,前者冻结前几层效果反而好。
我之前也卡在过这儿,prompt embedding初始化挺关键的,别用随机初始化,试试用预训练模型词表里某些token的embedding均值或者直接拿个现成词向量垫底,loss会掉得快很多。BERT和GPT确实不一样,BERT类模型对prompt敏感度低一些,解冻最后两层MLP效果立竿见影,GPT类则更适合纯软提示加小学习率。我一般用1e-3到3e-3调prompt,解冻层的话就1e-5,epoch别贪多,5-8个就够看趋势了。另外你如果觉得LoRA更稳,不如直接上LoRA,省得纠结冻结问题,显存够的话效果也更可控。
你这情况太典型了,BERT和GPT的prompt tuning逻辑确实差挺多,前者靠MLM理解任务,后者才适合纯embedding硬怼。建议先试试把learning rate调到5e-4以上,用AdamW配合warmup,只训prompt embedding时初始化用词汇表里高频词的embedding均值比随机强太多。要是还不行就解冻最后两层LayerNorm,那玩意儿影响分布特别大,比解冻MLP性价比高,LoRA其实是最稳的但得先确认你的显存够不够塞下额外参数。