Tunable parameter calculation
Closed this issue · 4 comments
First, great work! A new approad towards the prompt study. Your's study make me confirmed my experiments on P-Tuning v2.
I have some problem about parameter calculation.
self.proj_down = nn.Linear(config.hidden_size, config.proj_down_size)
self.intermediate_act_fn = nn.ReLU()
self.proj_up = nn.Linear(config.proj_down_size, config.num_prompt_tokens * config.hidden_size)
self.prompt_generator = PromptGeneratorWithNaivePromptGenerator(self.config)
PromptGeneratorWithNaivePromptGenerator(
(proj_down): Linear(in_features=768, out_features=128, bias=True)
(intermediate_act_fn): ReLU()
(proj_up): Linear(in_features=128, out_features=3840, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
)
On your code, you use the same weight for all prompt generation, regardless of layers. Such should be much less.
On your paper, the tunable parameter is 792K vs 985K, compared with P-Tuning v2. In this case, the weight shall be different for each layer.
简单用中文说,从代码上看NPG可调的参数量,可能比论文中少,不知道是不是我看漏了或者算错了。按照论文中计算,在添加Prompt的每一层,Prompt都由不同的weight生成。(对比P-Tuning v2毕竟每层都加)
以RoBERTa-Large为例,提示长度设置为5,则NPG的可调参数量为(1024 * 128 + 128) + (128 * 5 * 1024 + 5 * 124) = 791680. 加号前面是W_1的参数量,后面是W_2的参数量。论文中我们描述的也是只在模型的某一个中间层添加prompt,而不是在多个层都添加。
我本来一直以为是加在attention head上面,看了代码才确定你真的是在hidden state上。
了解了,P Tuning v2 的 embedding影响了参数量,。目前我迁移到了BERT-base上用于分类任务,效果没有那么P Tuning v2好,1e-3的学习率偏大了。
full-data场景下,p-tuning v2优化步数充足时可能会好点,论文里我们对所有方法设置了10个epoch,不过可能也看任务。
了解!不过速度真的很快,感觉比我P Tuning v2@pre_seq_len 50快了1倍,用的4090。
实际上P Tuning v2 的调参量远不止这个值,我这边接近Bert-base 5%,而且由于P Tuning v2 难收敛,我还使用了一些Tricks。
以后再试试您这边Prompt用在其他地方!谢谢您的工作!