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

讨论一下实时微调的技术实现可能性? #21

Closed
zhaodice opened this issue Mar 27, 2023 · 11 comments
Closed

讨论一下实时微调的技术实现可能性? #21

zhaodice opened this issue Mar 27, 2023 · 11 comments

Comments

@zhaodice
Copy link

有没有可能,实现可以通过和AI对话(不管是webui还是命令行),得到一系列聊天记录。
对ai某些回答不满意,可以强制修改聊天记录,最终使得对话符合预期。
再一键将该对话喂给AI,并入微调层
微调层足够多后,再并入大模型中

@zhaodice
Copy link
Author

而且随着训练…参数似乎在增加?能在不改变参数量的情况下微调模型吗#(通过逐步覆盖一些用不到的参数,通过牺牲模型的其他功能,实现总参数不变的微调)

@zhaodice
Copy link
Author

zhaodice commented Apr 3, 2023

我自己验证好了,可以实现,写了个webui可以实时修改对话,并把对话写入训练集,现在还差最后一个技术难题

@safehumeng
Copy link

而且随着训练…参数似乎在增加?能在不改变参数量的情况下微调模型吗#(通过逐步覆盖一些用不到的参数,通过牺牲模型的其他功能,实现总参数不变的微调)

为什么参数会增加呢,每次训练都用一个新的lora层么

@zhaodice
Copy link
Author

zhaodice commented Apr 9, 2023

而且随着训练…参数似乎在增加?能在不改变参数量的情况下微调模型吗#(通过逐步覆盖一些用不到的参数,通过牺牲模型的其他功能,实现总参数不变的微调)

为什么参数会增加呢,每次训练都用一个新的lora层么

难道不是,训练集越大,参数越多吗…

@yuanzhoulvpi2017
Copy link
Owner

  1. 因为你训练后的模型,已经是被peft包裹后的模型了。peft(base_model)

  2. 然后你又训练了一次,这一次是peft(peft(base_model))

  3. 然后你又训练了一次,这一次是peft(peft(peft(base_model)))

  4. 这样下去,肯定参数越来越大。

  5. 因为peft本质上就是对:原始的模型参数全部固定(require_grad=False),然后对每一个layerquery_key_valueloraa*lorab做旁路了;在模型结构上,又包裹了新的一层。

  6. 直接用,肯定是不行的,要能够把结构拆解开,才能做实事微调。

@zhaodice
Copy link
Author

zhaodice commented Apr 10, 2023

  1. 因为你训练后的模型,已经是被peft包裹后的模型了。peft(base_model)

    1. 然后你又训练了一次,这一次是peft(peft(base_model))

    2. 然后你又训练了一次,这一次是peft(peft(peft(base_model)))

    3. 这样下去,肯定参数越来越大。

    4. 因为peft本质上就是对:原始的模型参数全部固定(require_grad=False),然后对每一个layerquery_key_valueloraa*lorab做旁路了;在模型结构上,又包裹了新的一层。

    5. 直接用,肯定是不行的,要能够把结构拆解开,才能做实事微调。

事实上我已经跑通了,hcgf这项目,多次继续微调,微调文件.pt永远是16MB,似乎没有出现嵌套情况(不过每次微调都要加上以前的老数据,否则会出现灾难性遗忘)

@huangxd-
Copy link

huangxd- commented Apr 15, 2023

  1. 因为你训练后的模型,已经是被peft包裹后的模型了。peft(base_model)

    1. 然后你又训练了一次,这一次是peft(peft(base_model))
    2. 然后你又训练了一次,这一次是peft(peft(peft(base_model)))
    3. 这样下去,肯定参数越来越大。
    4. 因为peft本质上就是对:原始的模型参数全部固定(require_grad=False),然后对每一个layerquery_key_valueloraa*lorab做旁路了;在模型结构上,又包裹了新的一层。
    5. 直接用,肯定是不行的,要能够把结构拆解开,才能做实事微调。

事实上我已经跑通了,hcgf这项目,多次继续微调,微调文件.pt永远是16MB,似乎没有出现嵌套情况(不过每次微调都要加上以前的老数据,否则会出现灾难性遗忘)

如果不加老数据会遗忘,必须加上的话,跟从预训练模型重新训练有什么区别?

@zhaodice
Copy link
Author

  1. 因为你训练后的模型,已经是被peft包裹后的模型了。peft(base_model)

    1. 然后你又训练了一次,这一次是peft(peft(base_model))
    2. 然后你又训练了一次,这一次是peft(peft(peft(base_model)))
    3. 这样下去,肯定参数越来越大。
    4. 因为peft本质上就是对:原始的模型参数全部固定(require_grad=False),然后对每一个layerquery_key_valueloraa*lorab做旁路了;在模型结构上,又包裹了新的一层。
    5. 直接用,肯定是不行的,要能够把结构拆解开,才能做实事微调。

事实上我已经跑通了,hcgf这项目,多次继续微调,微调文件.pt永远是16MB,似乎没有出现嵌套情况(不过每次微调都要加上以前的老数据,否则会出现灾难性遗忘)

如果不加老数据会遗忘,必须加上的话,跟从预训练模型重新训练有什么区别?

有区别啊,因为我一开始【并没有】这么多数据集,我先喂一点数据,得到微调1.0,和微调1.0交互得到新数据,人工修改后加入数据集。

重新微调得到微调2.0,继续交互得到新数据再并入以前的旧数据集。
就这样,数据良品率越来越高,随着并入数据越来越多,自然训练效果越来越好。

如果你一次性就有这么多数据,一次训练成本是最低的,但没这么多数据怎么办呀,就需要一步一步一边训练一边引导AI自己产生训练集了。

@zhaodice
Copy link
Author

而且,在现有的微调基础上,用(新训练集+旧训练集)继续训练,与重新开始微调相比,loss下降的会很快,相当于loss就是从数据变化的那部分开始下降了~如果你重头微调,loss会从头下降,慢。

@huangxd-
Copy link

huangxd- commented Apr 15, 2023

而且,在现有的微调基础上,用(新训练集+旧训练集)继续训练,与重新开始微调相比,loss下降的会很快,相当于loss就是从数据变化的那部分开始下降了~如果你重头微调,loss会从头下降,慢。

求教继续训练的示例代码有吗?我按这个代码 mymusise/ChatGLM-Tuning#14 (comment) 貌似没有在上次的checkpoint继续,貌似loss还是重头开始的,没有下降的很快

@zhaodice
Copy link
Author

而且,在现有的微调基础上,用(新训练集+旧训练集)继续训练,与重新开始微调相比,loss下降的会很快,相当于loss就是从数据变化的那部分开始下降了~如果你重头微调,loss会从头下降,慢。

求教继续训练的示例代码有吗?我按这个代码 mymusise/ChatGLM-Tuning#14 (comment) 貌似没有在上次的checkpoint继续,貌似loss还是重头开始的,没有下降的很快

去找 hcgf 这个项目

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

4 participants