ChatGLM系列模型

ChatGLM系列模型

ChatGLM系列算法是清华大学研发的一个开源的、支持中英双语的对话语言模型,基于General Language Model(GLM)架构。采用了和ChatGPT相似的技术,针对中文问答和对话进行了优化。因此在了解对应算法之前需要对GLM架构进行相应的了解。

GLM是一个基于自回归的空白填充目标的通用预训练框架。将NLU任务转化为包含任务描述的完形填空问题,可以通过自回归生成的方式来进行回答。所谓自回归空白填充是指在输入文本中随机挖去一些连续的文本片段,然后在模型训练的时候按照任意顺序来重构这些片段。

自回归空白填充

GLM通过优化一个自回归空白填充目标来进行模型的训练,给定一个输入文本 x = [ x 1 , . . . , x n ] x=[x_1,...,x_n] x=[x1,...,xn],从中采样多个文本片段 { s 1 , . . . , s m } \{s_1,...,s_m\} {s1,...,sm},其中每个片段 s i si si对应于 x x x中的一系列连续的词 [ s i , 1 , . . . , s i , l i ] [si,1,...,si,li] [si,1,...,si,li] 。每个片段都用一个单独的 [MASK] 符号替换,形成一个损坏的文本 x c o r r u p t x_{corrupt} xcorrupt。模型以自回归的方式从损坏的文本中预测缺失的词,这意味着在预测一个片段中的缺失词时,模型可以访问损坏的文本和之前预测的片段。为了充分捕捉不同片段之间的相互依赖关系,我们随机打乱片段的顺序,类似于排列语言模型。令 Z m Z_m Zm 为长度为 m m m的索引序列 [ 1 , 2 , . . . , m ] [1,2,...,m] [1,2,...,m] 的所有可能排列的集合,令 s z < i ∈ [ s z 1 , . . . , s z i − 1 ] s_{z<i}∈[s_{z_1},...,s_{z_{i−1}}] sz<i[sz1,...,szi1],于是 pretrain 目标函数可以表示为:
max ⁡ θ E z − Z m [ ∑ i = 1 m l o g p θ ( s z i ∣ x c o r r u p t , s z < i ) ] \max_\theta{E_{z-Z_m}}[\sum_{i=1}^{m}log p_\theta (s_{z_i}|x_{corrupt,}s_{z_{<i}})] θmaxEzZm[i=1mlogpθ(szixcorrupt,sz<i)]
按照从左到右的顺序生成每个空白中的词,即生成片段 S i S_i Si的概率可以分解为:
p θ ( s i ∣ x c o r r u p t , S z < i ) = ∏ j = 1 l i p ( s i , j ∣ x c o r r u p t , s z < i , s i , < j ) p_\theta(s_i|x_{corrupt}, S_{z_{<i}}) =\prod_{j=1}^{l_i} p(s_{i,j}|x_{corrupt}, s_{z_{<i}}, s_{i, <j}) pθ(sixcorrupt,Sz<i)=j=1lip(si,jxcorrupt,sz<i,si,<j)

在实现自回归空白填充目标时,采用的是如下的方法:

输入 x x x被分为两部分: Part A是损坏的文本 x c o r r u p t x_{corrupt} xcorrupt ,Part B是被遮盖的片段。Part A中的词可以相互看到,但不能看到Part B中的任何词。Part B可以看到Part A和Part B中的前置词,但不能看到Part B中的后续词。为了实现自回归生成,每个片段都用特殊的符号[START]和[END]进行填充,分别用于输入和输出。这样,模型就自动地在一个统一的模型中学习了一个双向编码器(用于 Part A)和一个单向的解码器(用于 Part B)。

GLM的执行过程如下图所示:
在这里插入图片描述

  1. 原始文本 x = [ x 1 , x 2 , x 3 , x 4 , x 5 , x 6 ] x=[x_1, x_2, x_3, x_4, x_5, x_6] x=[x1,x2,x3,x4,x5,x6]随机进行连续mask,这里假设mask掉 [ x 3 ] [x_3] [x3] [ x 5 , x 6 ] [x_5,x_6] [x5,x6],跨度的长度服从泊松分布( λ = 3 \lambda = 3 λ=3)。
  2. [ x 3 ] [x_3] [x3] [ x 5 , x 6 ] [x_5, x_6] [x5,x6]替换为[M]标志,并打乱B的顺序。为了捕捉跨度之间的内在联系,随机交换跨度的顺序。
  3. GLM自回归地生成Part B。每个片段在输入前面加上[S],在输出后面加上[E]。二维位置编码表示不同片段之间和片段内部的位置关系。
  4. 自注意力编码。灰色区域被掩盖。Part A的词语可以自我看到(蓝色框),但不能看到Part B。Part B的词语可以看到Part A和Part B中前面的词语(黄色和绿色框对应两个片段)。[M] := [MASK],[S] := [START],[E] := [END]

Position1和Position2是输入的二维编码,第一个维度表示片段在原始文本中的相对位置,第二个维度表示片段内部的相对位置。具体而言,每个令牌都用两个位置 id 进行编码。第一个位置 id 表示在损坏的文本中的位置 x c o r r u p t x_{corrupt} xcorrupt,对于被替换的片段,它是相应[MASK]令牌的位置。第二个位置 id 表示片段内部的位置。对于 Part A 中的令牌,它们的第二个位置 id 为0;对于 Part B 中的令牌,它们的第二个位置 id 在1到片段长度之间。这两个位置 id 通过可学习的嵌入表投影为两个向量,然后与输入令牌嵌入相加。

模型结构

GLM的模型结构总体架构采用的是Transformer的Decoder部分,但是在原来模型的基础上进行了如下的修改:

  1. 重新排列了归一化层和残差链接的顺序(采用了Deep Norm的post layrt Norm),可以有效的避免数值的错误
  2. 使用了单一的线性层对输出token进行预测
  3. 使用GeLUs激活函数替换了ReLU

在对相应内容进行处理时还需要关注到对应的数据在原始文本当中的位置信息,在不同的模型当中采用了不同的位置编码方式,常见的位置编码可以参照博客Transformer中的位置编码。在GLM中使用的是二维位置编码,即每个token都是用两个位置id来进行编码,第一个是在被遮蔽的原始文本中的位置,对于掩码的文本而言就是相应的[MASK]的位置;第二个是在文本内部的位置。对于Part A而言,它们第二个位置id是0,对于Part B中的token,它们的范围是从1到文本的长度。两个位置的id都可以通过可学习的嵌入表被投影到对应的向量当中。

ChatGLM2

主要创新

  1. 更强大的性能:基于ChatGLM初代模型的开发经验,全面升级了ChatGLM2-6B的基座模型。使用了GLM的的混合目标函数,经过了1.4T中英标识符的预训练和人类偏好对其训练。评测结果表示,ChatGLM2-6B在MMLU(+23%)、CEval(+33%)、GSM8K(+571%)、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开原模型中具有较强的竞争力。
  2. 更长的上下文:基于FlashAttention技术,将基座模型的上下文长度由ChatGLM-6B的2K扩展到了32K,并在对话阶段使用8K的上下文长度训练。对于更长的上下文,发布了ChatGLM2-6B-32K模型。测评结果中表明,在等量级的开原模型中,ChatGLM2-6B-32K有着较为明显的竞争优势。
  3. 更有效的推理:基于Multi-Quert Attention技术,ChatGLM2-6B有更高效的推理速度和耕地的显存占用:在官方的模型实现下,推理速度相比初代提升了42%,INT4量化下,6G显存支持的对话长度由1K提升到了8K。
  4. 更开放的协议:ChatGLM2-6B权重对学术研究完全开放,在填写问卷进行登记后亦运行免费商业使用。

ChatGLM3

与ChatGLM2的变化

ChatGLM3在模型架构上与ChatGLM2完全一致,但在其他方面还是进行了对应的改进

  1. 更大的基础模型:ChatGLM3-6B的基础模型ChatGLM3-6B-Base采用了更多样的训练数据、更充分的训练步数和更合理的训练那策略。在语义、数学、推理、代码、只是等不同角度的数据集上测评显示,ChatGLM3-6B-Base具有在10B以下的基础模型中最强的性能。
  2. 更完整的功能支持:ChatGLM3-6B采用了个全新设计的Prompt格式,除正常的多轮对话外。同时原生支持工具调用(Function Call)、代码执行(Code Interpreter)和Agent任务等复杂场景。
  3. 更全面的开源序列:除了对话模型ChatGLM3-6B外,还开源了基础模型ChatGLM3-6B-Base、长文本对话模型ChatGLM3-6B-32K。以上所有权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用。

与ChatGLM的变化

相对于ChatGLM2,ChatGLM3和ChatGLM有了如下的一些变化

  1. 词表的大小从ChatGLM的150528缩小为65024(一个直观的体验是ChatGLM2和ChatGLM3加载速度比ChatGLM快不少)
  2. 位置编码从每个GLMBlock一份提升为全局一份
  3. Self Attention之后的前馈网络不同。ChatGLM用GELU(Gaussian Error Linear Unit)做激活;ChatGLM用Swish-1做激活。而且ChatGLM2、3应该是修正了之前的一个bug,因为GLU(Gated Linear Unit)本质上一半的入参是用来做门控制的,不需要输出到下层,所以ChatGLM2、3看起来前后维度不一致(27392->13696)反而是正确的。

ChatGLM4

GLM-4-9B是GLM-4系列中最新一代的开源版本预训练模型,在语义、数学、推理、代码和知识等多方面的数据测评中,GLM-4-9B及其人类偏好对齐的版本GLM-4-9B-Chat均表现出超越Llama-3-8B的卓越性能。除了能进行多轮对话,GLM-4-9B-Chat还具备网页浏览、代码执行、自定义工具调用(Function Call)和长文本推理(支持最大长度128K上下文)等高级功能。同时还增加了多语言支持,支持包括日语、汉语、德语在内的26种语言。同时还推出了支持1M上下文长度(约200万中文字符)的GLM-4-9B-Chat-1M模型和基于GLM-4-9B的多模态模型GLM-4V-9B。GLM-4V-9B具有1120*1120高分辨率下的中英双语多轮对话能力,在中英文综合能力、感知推理、文字识别、图表理解等多方面多模态评测中,GLM-4V-9B表现出超越GPT-4-turbo-2024-04-09、Gemini 1.0 Pro、Qwen-VL-Max和Claude3 Opus的卓越性能。

chatglm模型保存是将已经训练好的chatglm模型保存到硬盘上,以便在以后的使用中加载模型并进行预测。模型保存对于使用者来说是非常重要的,它可以避免重复训练模型,节省时间和计算资源。 chatglm模型的保存可以通过多种方式实现。一种常用的方法是使用Python的pickle库,它可以将对象序列化为字节流并保存在文件中。在保存chatglm模型时,可以将其包装成一个对象,然后使用pickle将这个对象保存到文件中。需要注意的是,保存的文件应该选择一个合适的地方,以便在以后的使用中能够方便地找到。 另一种常见的保存模型的方法是使用机器学习框架提供的保存函数。例如,在使用TensorFlow框架时,可以使用tf.train.Saver类来保存chatglm模型,该类提供了保存和加载模型的功能。保存后的模型将包含模型的架构和训练好的参数,以便在加载模型时可以直接使用。 无论使用哪种方法保存chatglm模型,都应该记住及时更新保存的模型。因为模型在训练过程中会发生变化,重新训练后得到的模型可能性能更好。因此,定期保存模型是一个好的习惯,以确保使用最新的模型。 总之,chatglm模型的保存是将已经训练好的模型保存到硬盘上,以便在以后的使用中加载模型并进行预测。这个过程可以使用Python的pickle库或者机器学习框架的保存函数来实现。及时更新保存的模型可以确保使用最新的模型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nlp_xiaogui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值