chatglm2是如何训练的

511 阅读3分钟

首先要知道glm是如何训练的

GLM: General Language Model Pretraining with Autoregressive Blank Infilling - 知乎 (zhihu.com)

ACL'22 | GLM: 基于空格填充的通用语言模型 - 知乎 (zhihu.com)

官方网站

参考下面的博文,总之 glm就是用自回归空白填充作为训练目标 。通过完整的上下文预测masked的内容,masked内部的预测采用完整的上下文信息+masked中已经预测的字符预测下一个字符,和gpt2是一样的。因此整体和gpt2也是很像的,glmgpt2区别在于

1.仅对mask的内容做自回归预测

2.自回归预测的时候其实已经看过上下文了,是一个双向的过程。 在论文的图中可以看出,为了方便的实现,其实是把上下文作为已有信息的。

为了可以很好的完成生成任务,masked是很长的句子。论文中分为document-levelsentence-level

其他细节:有两层的位置编码,一层是mask外部的,一层是mask内部的。

为了防止面试问,记下

与BERT的区别:

bert无法捕捉masked tokens内部的依赖关系;glm更好做生成,可以把masked内部看成一个gpt生成,而bert很难做生成,bert其实可以做生成,比如在最后加若干个mask,就生成若干个字符,但是并不知道应该加多少个mask,所以生成很困难。

与T5的区别:

T5有编码器和解码器,他们的位置编码相互独立

与UniLM的区别:

在我看来他俩训练方式不一样,UniLMbidirection,left-to-right,seq2seq三个任务分别做一遍,通过采用不同的mask方式。

论文中:UniLM在自编码框架下通过改变双向、单向和交叉注意力中的注意力掩膜,将不同的预训练目标结合起来。然而,UniLM总是用mask标记来代替掩蔽跨度,这限制了其对掩蔽跨度与其上下文之间依赖关系的建模能力。GLM输入前一个令牌并自回归生成下一个令牌。

简而言之就是mask内没依赖。

chatglm2是如何训练的

input_ids先进入encoder(GLMTransformer),这部分会参照glm的提供所需的attention_mask。 然后和gpt2类训练一样,接线性层,在label部分偏移一位算预测字的交叉熵。

注意: 有的代码用AutoModel直接加载是无法正确训练的,因为chatglm2是在配置文件里指定了正确的模型:

"auto_map": {
    "AutoConfig": "configuration_chatglm.ChatGLMConfig",
    "AutoModel": "modeling_chatglm.ChatGLMForConditionalGeneration",
    "AutoModelForSeq2SeqLM": "modeling_chatglm.ChatGLMForConditionalGeneration"
  }

所以在 AutoModel.from_pretrained(model_name_or_path, config=config, trust_remote_code=True)时需要指定config

Chatglm2 ptuning是如何训练的

如果不用prefix_projection,那么ptuning-v2添加的新的参数就是一个向量表,向量个数pre_seq_len,向量维度 num_layers * kv_channels * multi_query_group_num * 2

它对每一个位置生成一个向量,一共有pre_seq_len个位置,所以生成pre_seq_len个向量,它被用于GLMTransformer中,作为kv_caches,每层一个kv_cache,每层都是GLMBlock,在其中的self-attention中,计算时把kv与每层本身的kv进行cat