ChatGLM系列解析(一)—— ChatGLM开篇之作

        ChatGLM是清华系的第一个大语言模型,主要特点与其中文名称一样,是一个’通用‘语言模型,能够处理文本生成、语言理解以及序列到序列等任务。

        本文会描述关键技术与笔者感兴趣的东西,所以欢迎各位补充。

一、GLM 创立动机

GLM之间的3大主流模型架构:

        1. 自回归模型(AutoRegressive),是一类生成式+单向的语言模型,它将序列数据的生成/预测建模为一个逐步预测每个元素的条件概率的过程。在每个时间步,模型根据之前生成的元素预测当前元素的概率分布(单向推理和预测)。

        典型的自回归模型是 OpenAI的GPT系列,擅长‘无条件的生成式任务’。

        2. 自编码模型(AutoEncoding),是一类双向的语言模型,可以用于学习输入数据的特征表示(有限长度的张量 or 矩阵,包含丰富信息)。一般由一个编码器和一个解码器组成,通过编码器将输入数据转换为一个固定大小的向量表示,然后通过解码器从这个编码中重建原始输入数据。自编码模型的目标是尽可能减少输入数据与重建数据之间的差异,从而学习到输入数据的有效特征表示。

        典型的自回归模型是BERT系列,但需要注意的是,BERT主体仍然是使用了双向注意力机制的Transformer编码器,在某些应用场景下可以结合解码器使用。擅长‘自然语言理解类的任务’。

        3. 编码器-解码器模型(encoder-decoder),是一类用于序列到序列的语言模型,包含完整的编码器和解码器。使用该类模型实现的任务可以在不同长度的输入和输出序列之间进行转换,例如机器翻译和文本摘要。

        典型的模型是T5,采用双向注意力机制,通常用于‘条件生成任务’。

        上述3类模型各有侧重,那么构建一个通用的模型就成了论文的主要动力。

二、预训练方式/目标 Autoregressive Blank Infilling

        想要实现一个通用的大语言模型,必然需要设计一个能够支持这些功能的预训练任务,这就是Autoregressive Blank Infilling,自回归空白填充。下文中统一记做ABI。

2.1 具体步骤

1. 给定输入 X = [x1, x2, x3, x3, x5, x6],然后根据策略采样 m 个 片段。

2. 将选择掩码的片段 [x3], [x5, x6] 进行MASK,得到 Part A,表示损坏后的文本

3. 将选择掩码的片段抽取出,并且随机排序 / shuffle,得到 Part B,表示被掩盖、需要填充的文本

4. 将 PartA 与 PartB 拼接成一个sequence,Part A部分采用双向注意力,PartB部分采样自回归预测。为了能够提示模型自回归生成,输入端在每个掩码部分的头部填充标签 [start];输出端标签填充 [end]。

2.2 步骤中的具体细节补充

1. 采样方式:需要掩码的片段,采样方式遵循泊松分布,重复采样,直到原始tokens中有15%被覆盖。

2. 掩码片段shuffle的作用:捕捉不同片段之间的上下文依赖关系

3. 在Part A中,字符之间能够相互注意,但是不能注意到Part B中的字符

4. 在Part B中,字符能够注意到Part A中的字符,也能够注意到在Part B中并且在当前字符之前的字符,但是不能注意到Part B中之后的字符

三、预训练目标

        基于ABI,设置了三种预训练目标,一种针对自然语言理解任务,两种针对文本生成任务。

        针对自然语言理解任务:

        1. token level object:从一个均值为3的泊松分布中采样片段的长度,直到原始文本中15%的字符被掩盖,最后在文本中随机摆放填空片段的位置。

         针对文本生成任务(两种):

        2. document level object:主要针对无条件长文本生成任务,采样一个且仅有一个文本片段,片段长度服从原始文本长度50%到100%的均匀分布。

        3. sentence level object:主要针对有条件文本生成任务,常见输出位句子或者段落。论文限制被采样、mask的片段必须是完整的句子,采样多个句子直到覆盖原始文本的15%字符。

        注:多次出现的15%,也出现在Bert和T5中,实际上这是一个实验后的结果,15%的掩码比例效果好

        多种任务交替进行训练,实现自编码和自回归的统一。

四、二维位置编码

        第一个位置ID表示在整个损坏后的文本中的位置,对于被掩盖的段落,对应的ID是相应 [MASK] 标记的位置。

        第二个位置ID表示字符在被掩码片段中的位置(相对位置)。

        最后,通过可学习的嵌入表将两个位置加到输入token向量上。

        补充:在BERTTransformer中使用的都是‘正弦余弦位置编码’;而像RoFormer、LLama和后续的GLM使用的是‘旋转位置编码’。

五、特色与思考

        1. 相对于T5,T5总是按照固定的顺序(从左到右)来预测,而GLM会随机打乱片段的顺序来完整捕捉片段之间的依赖关系。

        2. 大语言模型数据、数据质量和模型参数是主要影响因此,在GLM中就训练了不同参数大小的模型,并做了相关实验。

附上两张从别人博客抄来的图,博客链接在最后。

资料链接: 

CC自然语言大模型 :GLM 通用语言模型的训练与微调_哔哩哔哩_bilibili

万字带你了解ChatGLM_chatglm中有使用二维位置编码和rope旋转位置编码吗-CSDN博客

### ChatGLM 架构详解 #### 1. 模型概述 ChatGLM 是由清华大学开发的系列大型语言模型,其设计融合了自回归(decoder-only)和自编码(encoder-only)的优势[^1]。该模型旨在实现高效的语言理解和生成能力。 #### 2. 模型架构 ChatGLM 的主要架构可以分为以下几个部分: - **输入处理阶段** 输入数据经过分词器(tokenizer)转换为 token 序列,并进步映射到对应的 embedding 向量空间中[^2]。此过程涉及对原始文本的预处理以及将其转化为适合神经网络计算的形式。 - **嵌入层 (Embedding Layer)** 在完成分词之后,这些 tokens 将被送入嵌入层以获取它们各自的语义表示。这步骤不仅包含了单词级别的特征提取,还可能加入位置编码等辅助信息以便更好地捕捉序列中的顺序关系[^3]。 ```python from transformers import AutoTokenizer, AutoModel tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True) model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().to("cuda:1").eval() print(model) ``` 上述代码展示了如何加载 ChatGLM 模型及其配套工具链[^4]。 - **Transformer 编码模块 (GLM Blocks)** 整个模型的核心是由多个 Transformer 层堆叠而成,每层负责逐步增强输入表征的质量。具体来说,在 ChatGLM 中采用了改进版的 Multi-head Attention 和 Feed-forward Network 结合的方式来进行特征变换操。整个过程中共有 28 层这样的 block 来逐级提升表达力。 - **输出预测阶段** 当前时刻所关注的是下个待生成词语的概率分布情况;通过对最后轮 hidden state 进行线性投影并施加 softmax 函数即可得到最终的结果——即各个候选词汇对应的可能性大小值列表。 #### 3. 工流程解析 以下是 ChatGLM 的典型运行逻辑分解: 1. 接收用户提供的自然语言查询或者对话历史为初始输入; 2. 利用内置 tokenizer 对字符串形式的数据执行必要的清理与分割动; 3. 把所得 tokens 映射至高维连续空间形成 dense vectors 表达方式; 4. 经过多重 attention mechanism 加工后的中间产物再经历若干次非线性激活函数用下的维度调整环节; 5. 输出端口依据前述概率评估体系挑选最优解返回给调用方展示出来。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值