Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于ptuing #78

Open
init-neok opened this issue Aug 7, 2023 · 4 comments
Open

关于ptuing #78

init-neok opened this issue Aug 7, 2023 · 4 comments

Comments

@init-neok
Copy link

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

@init-neok
Copy link
Author

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

@HarderThenHarder
Copy link
Owner

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
Copy link
Author

非常感谢您的回复!我赞同您的说法,是的 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
Copy link

jinec commented Dec 15, 2023

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants