THUDM / ChatGLM2-6B

ChatGLM2-6B: An Open Bilingual Chat LLM | 开源双语对话语言模型
Other
15.74k stars 1.85k forks source link

[Help] 关于GLM训练是否还使用ACL2022原始论文中的那个Self-attention mask #16

Closed WuNein closed 1 year ago

WuNein commented 1 year ago

Is there an existing issue for this?

Current Behavior

image https://arxiv.org/pdf/2103.10360.pdf ACL2022 GLM的特殊预训练任务设计

Expected Behavior

No response

Steps To Reproduce

非常好的工作!问一下chatglm现在的训练工作还用到ACL2022那篇文章中GLM的特殊的self-attention mask预训练任务设计吗?

Environment

- OS:
- Python:
- Transformers:
- PyTorch:
- CUDA Support (`python -c "import torch; print(torch.cuda.is_available())"`) :

Anything else?

No response

Sengxian commented 1 year ago

预训练阶段仍然采用了 GLM 混合目标函数的设计;但主要出于效率考虑,对话阶段仅采用 CausalLM(PrefixLM 前缀为 0)的模式进行训练,此时二维位置编码退化到一维。

mx8435 commented 1 year ago

预训练阶段仍然采用了 GLM 混合目标函数的设计;但主要出于效率考虑,对话阶段仅采用 CausalLM(PrefixLM 前缀为 0)的模式进行训练,此时二维位置编码退化到一维。

@Sengxian “效率考虑”主要是指什么,GLM方式不适合对话方式训练吗?

Sengxian commented 1 year ago

预训练阶段仍然采用了 GLM 混合目标函数的设计;但主要出于效率考虑,对话阶段仅采用 CausalLM(PrefixLM 前缀为 0)的模式进行训练,此时二维位置编码退化到一维。

@Sengxian “效率考虑”主要是指什么,GLM方式不适合对话方式训练吗?

PrefixLM 对 Context 的双向注意力导致了其与对话的兼容性不佳:

  1. 训练:对于 n 轮对话 PrefixLM 需要构造 n 个(历史,prompt,response)三元组训练,而 CausalLM 仅需一条完整的对话历史即可进行 n 轮训练。
  2. 推理:CausalLM 可以复用之前对话轮次的 KV Cache,而 PrefixLM 必须重新计算,不仅增加了计算量,在超长轮次对话时重新编码 Context 会使得 FFN 等层中间计算结果显存占用很高而 OOM,无法充分利用 Multi-Query Attention 带来的省显存优势。

综合考虑,我们在对话阶段使用了 CausalLM 模式训练。然而,预训练阶段混合多种目标函数对性能是有益的,这点与 PaLM 2 的做法一致。

447428054 commented 1 year ago

@Sengxian 预训练阶段仍然采用了 GLM 混合目标函数的设计;这个指的是只采用GLM的三种预训练掩码方式吗,这部分的attention是单向还是双向,是不是和SFT的单向一样?

总结一下问题哈:预训练阶段输入的Attention是单向还是双向,位置编码是二维还是一维呢?如果不是单向一维,怎么在这个预训练模型的基础上SFT呢?

Sengxian commented 1 year ago

@Sengxian 预训练阶段仍然采用了 GLM 混合目标函数的设计;这个指的是只采用GLM的三种预训练掩码方式吗,这部分的attention是单向还是双向,是不是和SFT的单向一样?

总结一下问题哈:预训练阶段输入的Attention是单向还是双向,位置编码是二维还是一维呢?如果不是单向一维,怎么在这个预训练模型的基础上SFT呢?

2D RoPE 的实现是,将 hidden dim 分为两半,每一半分别应用对应维度的位置编码。由于单向模式中二维位置编码退化,可以直接简化为只对前一半应用一维位置编码。

447428054 commented 1 year ago

那请问一下预训练输入的部分 Attention是单向还是双向的呢,如果是双向的话,跟SFT单向有区别会有问题吗?

447428054 commented 1 year ago

@Sengxian @mougua “对于 n 轮对话 PrefixLM 需要构造 n 个(历史,prompt,response)三元组训练,而 CausalLM 仅需一条完整的对话历史即可进行 n 轮训练。”。请问这里只用一条完整的对话历史训练能加速训练吗?虽然节省了前向过程的次数,但增加了反向传播的token长度吧?而反向传播又更耗时?

xxcheng0708 commented 12 months ago

预训练阶段仍然采用了 GLM 混合目标函数的设计;但主要出于效率考虑,对话阶段仅采用 CausalLM(PrefixLM 前缀为 0)的模式进行训练,此时二维位置编码退化到一维。

@Sengxian “效率考虑”主要是指什么,GLM方式不适合对话方式训练吗?

PrefixLM 对 Context 的双向注意力导致了其与对话的兼容性不佳:

  1. 训练:对于 n 轮对话 PrefixLM 需要构造 n 个(历史,prompt,response)三元组训练,而 CausalLM 仅需一条完整的对话历史即可进行 n 轮训练。
  2. 推理:CausalLM 可以复用之前对话轮次的 KV Cache,而 PrefixLM 必须重新计算,不仅增加了计算量,在超长轮次对话时重新编码 Context 会使得 FFN 等层中间计算结果显存占用很高而 OOM,无法充分利用 Multi-Query Attention 带来的省显存优势。

综合考虑,我们在对话阶段使用了 CausalLM 模式训练。然而,预训练阶段混合多种目标函数对性能是有益的,这点与 PaLM 2 的做法一致。

关于这部分提到的Prefix-LM针对对话生成任务,必须重复计算KV,不能复用KV Cache,这一点没太理解,我理解的Prefix-LM在prefix部分用的是双向注意力,生成部分用的掩码注意力,后续生成的内容不会影响到前面已经计算的KV呀,为什么使用Prefix-LM会影响KV Cache呢?

xxcheng0708 commented 8 months ago

1轮:Q1->A1 2轮:Q1A1Q2->A2 3轮:Q1A1Q2A2Q3->A3

自问自答一下,哈哈哈,时隔几个月又看了一遍,原文里面讲的是可以提升训练阶段的效率,这一点上次没看仔细,对于对话场景的训练阶段,CasualLM(Decoder-Only)相比于PrefixLM确实可以提升训练效率,主要的效率提升在于,CasualLM采用掩码注意力,对于1轮对话数据计算的Q、K、V可以在2轮和3轮中复用,而PrefixLM采用双向注意力,在1轮对话数据计算的Q、K、V无法进行复用