本文将介绍Transformer模型在处理长文本数据时所采用的关键技术,特别是旋转位置编码(RoPE)和Flash Attention机制。
此外,本文介绍GLM系列模型,特别是最新发布的GLM-4-Plus模型。我们将通过实际的评测方法和结果,展示GLM-4-Plus模型在处理长文本任务时的卓越性能。
unsetunsetTransformer模型unsetunset
Transformer模型的核心是自注意力机制(Self-Attention),它允许模型在处理序列数据时,能够同时考虑序列中的所有位置,这一点与传统的循环神经网络(RNN)或卷积神经网络(CNN)不同,后者通常需要逐步处理序列数据。
位置编码
Transformer模型由编码器(Encoder)和解码器(Decoder)组成,每个部分都包含多个相同的层,这些层由自注意力机制和全连接网络组成。此外,Transformer 还引入了位置编码来保留序列中的顺序信息,因为自注意力机制本身并不包含序列的顺序信息。
位置编码通常是通过正弦和余弦函数的固定函数形式来生成的,每个位置的编码是唯一的,并且编码的维度与模型的维度相匹配。
对于位置 pos 和维度 i,位置编码的第 i 维度的值由下面的公式给出:
对于偶数维度(2i):
对于奇数维度(2i+1):
其中 pos 是单词在句子中的位置,i 是维度索引, 是模型的维度。
并行能力
由于自注意力机制不依赖于序列中前一个状态的输出,这使得模型的所有层可以并行处理,从而大大提高了训练效率。Transformer还采用了残差连接和层归一化技术,这些技术有助于改善深层网络的训练稳定性,并减少梯度消失或爆炸的问题。
残差连接(Residual Connection)
对于Transformer中的每个子层(自注意力层或前馈全连接层)的输出,残差连接可以表示为:
自注意力机制
自注意力机制(Self-Attention)的核心思想是计算序列中每个元素(如单词或字)与其他所有元素的关系,以便捕捉序列内的长距离依赖关系。
计算查询(Query)、键(Key)和值(Value):对于输入序列中的每个元素,我们分别计算其查询、键和值的表示。这通常是通过与权重矩阵的矩阵乘法来实现的:
计算注意力得分:使用查询和键的点积来计算注意力得分,然后通常通过一个缩放因子(通常是键向量维度的平方根)来防止点积结果过大,接着应用softmax函数来获取注意力权重:
unsetunset大模型长文本处理技术unsetunset
如果把 LLM 比作新时代的操作系统,上下文窗口便是它的「内存」。一个优秀的 LLM 也需要足够长的上下文长度来完成各种复杂的任务。
RoPE
Transformer模型依赖于位置编码来理解单词顺序,但标准的编码方式通常只适用于固定长度的上下文。为了处理超出训练时见过的长度,旋转位置编码(RoPE)允许模型处理比训练时更长的输入,但这样可能会以性能损失。
RoPE的核心思想是对词嵌入向量应用旋转变换,以注入位置信息。对于序列中的每个位置,RoPE通过旋转矩阵来调整词向量,旋转的角度与位置索引相关。这种旋转操作不仅保留了向量的模长(即词向量的大小不变),而且还能够引入相对位置信息。
在二维情况下,RoPE可以通过以下公式表达:
https://huggingface.co/THUDM/glm-4-9b/blob/main/modeling_chatglm.py
@torch.jit.script
def apply_rotary_pos_emb(x: torch.Tensor, rope_cache: torch.Tensor) -> torch.Tensor:
# 获取输入张量 x 的各个维度大小
b, np, sq, hn = x.size(0), x.size(1), x.size(2), x.size(3)
# 计算旋转维度 rot_dim,它是 rope_cache 的倒数第二个维度的两倍
rot_dim = rope_cache.shape[-2] * 2
# 将 x 分为两部分:需要应用 RoPE 的维度和不需要变化的维度
x, x_pass = x[..., :rot_dim], x[..., rot_dim:]
# 根据序列长度 sq 截断 rope_cache,以确保它与当前处理的序列长度相匹配
rope_cache = rope_cache[:, :sq]
# 重塑 x 为 xshaped,以便将其与 rope_cache 进行运算
xshaped = x.reshape(b, np, sq, rot_dim // 2, 2)
# 重塑 rope_cache 以匹配 xshaped 的维度,并准备进行旋转运算
rope_cache = rope_cache.view(-1, 1, sq, xshaped.size(3), 2)
# 对 xshaped 中的每个元素应用旋转,使用复数的旋转公式
x_out2 = torch.stack(
[
xshaped[..., 0] * rope_cache[..., 0] - xshaped[..., 1] * rope_cache[..., 1], # 实部旋转
xshaped[..., 1] * rope_cache[..., 0] + xshaped[..., 0] * rope_cache[..., 1], # 虚部旋转
],
-1,
)
# 将旋转后的张量 x_out2 重塑回原来的维度
x_out2 = x_out2.flatten(3)
# 将旋转后的张量 x_out2 与不需要变化的维度 x_pass 拼接起来,形成最终的输出
return torch.cat((x_out2, x_pass), dim=-1)
FlashAttention
与传统的自注意力机制相比,Flash Attention将内存复杂度从O(N²)降低到O(N),这对于处理大规模数据集和大型模型尤为重要。
Flash Attention的算法包括两个主要思想:平铺和重新计算。在平铺过程中,注意力矩阵被划分为更小的块,以优化内存使用和计算效率。在重新计算过程中,利用存储的输出和softmax归一化统计数据来重新计算注意力矩阵,而无需存储大型中间矩阵。
https://huggingface.co/THUDM/glm-4-9b/blob/main/modeling_chatglm.py
unset
为了全面评估GLM系列模型在处理新闻文本分类任务上的能力,我们的评测方法采用了THUCNews数据集。
在评测过程中,我们将特别关注模型在处理不同长度文本时的表现。文本长度是影响模型性能的一个重要因素,因为它直接关系到模型处理信息的能力和复杂度。
unsetGLM 模型性能评测unset unset模型介绍
模型 | 描述 | 上下文 |
---|---|---|
GLM-4-Plus | 高智能旗舰 | 128K |
GLM-4-0520 | 高智能模型 | 128K |
GLM-4-Long Beta | 超长输入 | 1M |
GLM-4-AirX | 极速推理 | 8K |
GLM-4-Air | 高性价比 | 128K |
GLM-4-Flash | 免费调用 | 128K |
评测方法
通过THUCNews数据集,设置不同的文本长度,并通过大模型完成新闻分类:
def news_classify(news_path, texlen, model):
text = ''.join(open(news_path).readlines())[:texlen]
data = {
"model": model,
"messages": [{"role": "user", "content": f'''请对下面的新闻进行分类,待选类别有: {class_names}\n {text}''' }]
}
try:
response = requests.post(url, headers=headers, json=data, timeout=200)
if news_path.split('/')[-2] in response.json()['choices'][0]['message']['content']:
return True
else:
return False
except:
return None
评测结果
GLM-4-Plus整体表现非常稳定,精度始终保持在0.88以上,是所有模型中最高的。模型如GLM-4-Plus和GLM-4-Long在处理长文本时表现较好。
unsetunsetGLM-4-Plus介绍unsetunset
在 KDD 国际数据挖掘与知识发现大会上,智谱 GLM 团队发布了新一代基座大模型——GLM-4-Plus。作为智谱全自研 GLM 大模型的最新版本,GLM-4-Plus 标志着智谱AI在通用人工智能领域的持续深耕,推进大模型技术的独立自主创新。
GLM-4-Plus 在长文本处理能力上比肩国际先进水平。通过更精准的长短文本数据混合策略,显著增强了长文本的推理效果。
模型 | LongBench-Chat | InfiniteBench/EN.MC | Ruler |
---|---|---|---|
Mistral-123B | 8.2 | 38.9 | 80.5 |
Llama 405B | 8.6 | 83.4 | 91.5 |
Claude Sonnet 3.5 | 8.6 | 79.5 | - |
Gemini 1.5 Pro | 8.6 | 80.9 | 95.8 |
GPT-4o | 9 | 82.5 | - |
GLM-4-Plus | 8.8 | 85.1 | 93 |
GLM-4-Plus/GPT-4o | 98% | 103% | - |
GLM-4-Plus/Claude 3.5 Sonnet | 102% | 107% | - |
调用示例
同步调用方法
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 填写您自己的APIKey
response = client.chat.completions.create(
model="glm-4-plus", # 填写需要调用的模型编码
messages=[
{"role": "user", "content": "作为一名营销专家,请为智谱开放平台创作一个吸引人的slogan"},
{"role": "assistant", "content": "当然,为了创作一个吸引人的slogan,请告诉我一些关于您产品的信息"},
{"role": "user", "content": "智谱AI开放平台"},
{"role": "assistant", "content": "智启未来,谱绘无限一智谱AI,让创新触手可及!"},
{"role": "user", "content": "创造一个更精准、吸引人的slogan"}
],
)
print(response.choices[0].message)
流式调用方法
from zhipuai import ZhipuAI
client = ZhipuAI(api_key="") # 请填写您自己的APIKey
response = client.chat.completions.create(
model="glm-4-plus", # 填写需要调用的模型编码
messages=[
{"role": "system", "content": "你是一个乐于解答各种问题的助手,你的任务是为用户提供专业、准确、有见地的建议。"},
{"role": "user", "content": "我对太阳系的行星非常感兴趣,特别是土星。请提供关于土星的基本信息,包括其大小、组成、环系统和任何独特的天文现象。"},
],
stream=True,
)
for chunk in response:
print(chunk.choices[0].delta)
System Message 格式
参数名称 | 参数说明 |
---|---|
role | 消息的角色信息,此时应为system |
content | 消息内容 |
User Message 格式
参数名称 | 参数说明 |
---|---|
role | 消息的角色信息,此时应为user |
content | 消息内容 |
GLM-4-Plus 能力介绍
语言理解能力:GLM-4-Plus 使用了大量模型辅助构造高质量合成数据以提升模型性能;有效提升了模型推理(数学、代码算法题等)表现,更好反映人类偏好。
长文本推理能力:GLM-4-Plus通过精准的长短文本数据混合策略、先进的预训练与微调技术,以及创新性的技术手段,成功地在长文本推理能力上达到了国际先进水平。
往期精彩回顾
适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
交流群
欢迎加入机器学习爱好者微信群一起和同行交流,目前有机器学习交流群、博士群、博士申报交流、CV、NLP等微信群,请扫描下面的微信号加群,备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~(也可以加入机器学习交流qq群772479961)