HarderThenHarder / transformers_tasks

⭐️ NLP Algorithms with transformers lib. Supporting Text-Classification, Text-Generation, Information-Extraction, Text-Matching, RLHF, SFT etc.
https://www.zhihu.com/column/c_1451236880973426688
2.11k stars 376 forks source link

关于ptuing #78

Open init-neok opened 1 year ago

init-neok commented 1 year ago

佬你的p-tuing代码真的正确吗?似乎只是在cls后面加了一堆固定的字符,那些字符不能学习的呀,,,和p-tuing论文写的不是一回事呀,p-tuing原作者的论文太难理解了,有人能解答一下我的问题吗?

init-neok commented 1 year ago

作者您好,您的代码是我见过写的最规范整洁可读性最好的代码,但是关于ptuing我真觉得存在一些问题,下面这行是您在ptuing里写的注释关于将原始数据转化为喂给模型的数据那部分 插入 prompt -> [unused1][unused2]...[CLS][MASK]...[SEP] 发现只是做了模版的映射,并没有让这些unused1变成trainable的可以自动更新的参数,想问问您是不是我看漏了,还是您的代码存在问题,已经纠结好多天了,希望能得到您回复

HarderThenHarder commented 1 year ago

Hi,因为距离这个代码写的有点久了,所以我按照我的记忆回答一下您这个问题。

我理解您的问题可能是:我们只是把 unused token 喂给了模型, 而 label 却只有每个句子的 label token,也没有这些 unused token 的 label,那这些 prompt tokens 怎么学习?

在这个例子里,由于我们只需要学习每一个 prompt (unused) token 对应的 token embedding 就可以了(因为最后不需要知道这些 prompt tokens 的实际对应的文本是什么),因此我们只用通过在更新 MASK Label 的时候来附带的更新这些前缀 token 的 embedding 即可。

因为我们对每一个样本前面都拼接了同样 prompt tokens,所以这些前缀 token 的 embedding 就能够随着模型训练而慢慢得到更新,最终被训练成一串能完成指定任务的 embedding 序列。

下图来自这篇论文image

通常的方法会 freeze 掉整个 LM,只训练 prompt token 的 embedding,不过我当时在 demo 里还是采用参数全调的实现方式。

现在提出了一些微调更多参数的 PTuning 的方式(如:PTuning v2),不只是在 input embedding,而是在每一层都插入 prefix embedding 来训练模型,如 这篇论文,你可以在 这里 找到相关的代码实现:

image

希望这些是您想知道的内容。

init-neok commented 1 year ago

非常感谢您的回复!我赞同您的说法,是的 ptuing ptuing-v2我都了解过,刘潇大佬的文章我也有很仔细的读过,作者论文里甚至是用了一个lstm来初始化前缀token的 embedding(他们的代码是在PET原作者的工作上写的,我觉得好难读(我太菜了呜呜))。 但是您提到的“前缀 token 的 embedding 就能够随着模型训练而慢慢得到更新”我好像没在您代码里看到,因为我把您的代码都仔细读过了,从PET那份都看了,然后您的做法是直接将他们convert_example成了模型的输入,在这个过程中,在模型计算mask_label的过程中,我认可您所说的随着模型的训练前缀token的embedding在更新,但是反应在我们的训练数据上,训练数据的模版上的token的embedding并没有随之更新诶,我觉得您的说法是正确的,要做的话是否应该是在每个批次训练完后,将模型输出的结果作为label 来对Template做一次反向传播更新Template呢?就是应该convert example这个过程不是一次完成的而是反复随着训练进行呢?哦也不对,迭代后前缀token肯定就不是词表里的词了,我再想想吧。。。 谢谢您百忙之中抽空回答我的问题! 您的代码真的很规范,是我学习的很好的榜样!

jinec commented 8 months ago

@init-neok 我和你的感受一样,一脸懵