共计 6461 个字符,预计需要花费 17 分钟才能阅读完成。
- proj:https://github.com/QwenLM/Qwen2
- hugging face:https://huggingface.co/Qwen
- blog:https://qwenlm.github.io/blog/qwen2
- doc:https://qwen.readthedocs.io
paper:qwen2 的 paper 尚未发表(可参考 qwen 的 paper:https://arxiv.org/abs/2407.10671)- paper:qwen2 的 paper(Qwen2 Technical Report)在 2024.7.18 最后一次提交 https://arxiv.org/abs/2407.10671
1 技术报告(paper)分析
PS:之前一直以为 Qwen2 Technical Report
还要很久才能发表(官方 blog 只说敬请期待),后来想起来去看一眼,发现居然有了
https://arxiv.org/abs/2407.10671
1.1 概览
- 多语言能力,精通约 30 种语言
- 基于 Transformer 架构的一系列 LLMs,使用下一个词预测进行训练
- 四个稠密模型,参数计数分别为 0.5b、1.5b、7b 和 72b,以及一个具有57b 参数的专家混合(MoE)模型
1.1.1 结合实际
- 线上调用 api 服务:结合多个项目以及多种模型的测试结果,qwen2-72b 模型的生成质量是最好的,使用体验是最省心的,生成所需时间是可被接受的,而且不是最贵的(大多都是个人经验之谈)
- 本地部署开源模型:结合实际机器的算力情况,qwen2-7b 模型应该是最为合适的
1.2 分词器
沿用 Qwen UTF- 8 编码的分词器
1.2.1 特殊 token
可以理解为编程语言中的保留词,不应该出现在正常的输入文本中
1.2.2 词表扩展
- BPE:迭代合并出现频率高的字符对
- UTF- 8 编码
我是一只猫 20
你是一只猫 10
他是一只猫 5
一只 200
一只猫 100
夸张的 比喻手法 20
WARNING - 夸张的 比喻手法 would be pre-tokenized to [' 夸张的 ', ' 比喻手法 '], and thus cannot be added to vocabulary
WARNING - word 一只 is already a token b'\xe4\xb8\x80\xe5\x8f\xaa', skipping
INFO - number of existing merges: 151643
INFO - number of words for expanding: 4
DEBUG - (b'\xe4\xb8\x80\xe5\x8f\xaa', b'\xe7\x8c\xab') (一只猫) is selected as the next merge with freq 100
DEBUG - (b'\xe5\x8f\xaa', b'\xe7\x8c\xab') (只猫) is selected as the next merge with freq 35
DEBUG - (b'\xe6\x98\xaf\xe4\xb8\x80', b'\xe5\x8f\xaa\xe7\x8c\xab') (是一只猫) is selected as the next merge with freq 35
DEBUG - (b'\xe6\x88\x91', b'\xe6\x98\xaf\xe4\xb8\x80\xe5\x8f\xaa\xe7\x8c\xab') (我是一只猫) is selected as the next merge with freq 20
DEBUG - (b'\xe4\xbd\xa0', b'\xe6\x98\xaf\xe4\xb8\x80\xe5\x8f\xaa\xe7\x8c\xab') (你是一只猫) is selected as the next merge with freq 10
DEBUG - (b'\xe4\xbb\x96', b'\xe6\x98\xaf\xe4\xb8\x80\xe5\x8f\xaa\xe7\x8c\xab') (他是一只猫) is selected as the next merge with freq 5
INFO - number of newly learned merges: 6
- UTF- 8 编码的合并问题
- 对于
一只
的 UTF- 8 字节序列b'\xe4\xb8\x80\xe5\x8f\xaa'
,中间两个字节b'\x80\xe5'
可能会先合并为一个 token,跨越了一
(b'\xe4\xb8\x80'
)和只
(b'\xe5\x8f\xaa'
)的码位边界。这对于已登录 token 不会有什么影响(最后总会合并为一只
),但对于未登录的,可能会产生一些不同寻常的合并 token - 解决方案:收集待添加词中的所有 Unicode 码位,然后单独指定它们的频率大于其所构成词的频率之和
- 对于
- “只猫”成为新 token 的问题
一只
已经是登录过的 token 了,但只猫
还是学习成为了一个新 token,出现了“交叉”- 在 Qwen 中
是一
也是一个已知 token,且其频率 / 优先级比一只
要高,因而对于是 | 一 | 只 | 猫
这个片段,合并的次序是是一 | 只 | 猫 -> 是一 | 只猫 -> 是一只猫
(省略 UTF- 8 字节级别的合并)
1.2.3 结合实际
-
目前新闻稿的一个重要问题:无法控制字数
-
根本原因:根本原因其实不是模型不够优秀,或者参数不够多,或者提示词没写好。真正的底层原因就是来自于“预测下一词”的模式和其必要的分词器。
下文引自开发文档[qwen-news1.0.2024.4.25]
正文生成 25 秒简讯
qwen-turbo
规定输出 100 字,实际输出 200 字
4 月 24 日,2024 年拱墅区第二届“大运河杯”商务社区运动会盛大开启,纪念五四运动 105 周年的主题活动旨在展现商务社区青年的活力与风采。比赛在上塘街道党群服务中心举行,区委组织部、团区委等领导出席,16 支社区球队和 112 名足球爱好者参与。活动不仅有热血沸腾的足球比赛,还融入了公益元素,如“1010”计划倡议,挖掘体育与公益达人,推动“健身 + 公益”等多元活动,打造“全域青年生态”。上塘街道以“三青”行动为核心,致力于构建青年友好环境,助力青年创业成长。
规定输出 50 字,实际输出 150 字
4 月 24 日,2024 年拱墅区第二届“大运河杯”商务社区运动会盛大开启,纪念五四运动 105 周年的主题活动旨在展现商务社区青年的活力与风采。比赛在上塘街道党群服务中心举行,区委组织部、团区委等领导出席,16 支社区球队和 112 名足球爱好者参与。活动不仅有热血沸腾的足球比赛,还融入了公益元素,如“1010”计划倡议,挖掘体育与公益达人,推动“健身 + 公益”等多元活动,打造“全域青年生态”。上塘街道以“三青”行动为核心,致力于构建青年友好环境,助力青年创业成长。
规定输出 30 字,实际输出 110 字
4 月 24 日,2024 年拱墅区“大运河杯”商务社区运动会开幕,上塘街道党群服务中心球场热血沸腾。活动纪念五四运动,展示商务青年活力,足球邀请赛点燃激情,同时发布“1010”公益行动计划,融合运动与公益,挖掘青年潜能,助力“全域青年生态”建设。
通义千问 web 端验证
最后这一段仍然有 120+ 的字数
资料查询
ChatGPT
ChatGPT 自己解释的表层原因:
ChatGPT 无法精确控制英文输出长度的底层原因:
分词器是 ChatGPT 架构中的关键元素,它明显影响生成输出中的单词数量。
分词器架构
分词器是文本生成过程的第一步。它负责将我们输入到 ChatGPT 的文本片段分解为单独的元素(标记),然后由语言模型处理以生成新文本。
当分词器将一段文本分解为标记时,它会根据一组旨在识别目标语言的有意义单元的规则来完成此操作。然而,这些规则并不总是完美的,并且在某些情况下,分词器会以影响文本总字数的方式拆分或合并标记。
例如,考虑以下句子:“我想吃花生酱三明治”。如果分词器配置为根据空格和标点符号分割标记,则它可能会将此句子分解为以下标记,总字数为 8,等于标记计数。
然而,如果分词器配置为将“花生酱”视为复合词,则它可能会将句子分解为以下标记,总字数为 8,但标记数为 7。
因此,分词器的配置方式可能会影响文本的总体字数,这可能会影响大语言模型遵循有关精确字数计数的说明的能力。虽然一些分词器提供了自定义文本分词方式的选项,但这并不总是足以确保精确遵守字数统计要求。对于本例中的 ChatGPT,我们无法控制其架构的这一部分。
-
可能的解决方案:由于新闻稿的内容或有特有的词频的 tokens,那么是不是可以通过扩展词表的方式,提升该词频,那么最终 tokens 和字数的比例会趋向于稳定的比例,这样就可以利用这个比例来控制字数。
1.3 稠密模型
Qwen2 密集模型的架构包括多个 Transformer 层,每层都配备了因果注意力机制和前馈神经网络(FFN)。
1.3.1 与 Qwen 不同:
适应于更多更高的指令要求,适应于更长的文本
-
分组查询注意力:采用了分组查询注意力而不是传统的多头注意力。GQA 在推理期间优化了 KV 缓存的使用,显著提高了吞吐量。
-
双块注意力与 YARN:为了扩大 Qwen2 的上下文窗口,我们实现了双块注意力,它将长序列分割成可管理的长度块。如果输入可以在一个块中处理,DCA 产生与原始注意力相同的结果。否则,DCA 有助于在块内和跨块之间有效地捕获相对位置信息,从而提高长上下文性能。此外,还采用了 YARN 来重新调整注意力权重,以实现更好的长度外推。
1.3.1.1 结合实际
生成新闻稿时,输入文本的特点:
- 提示词要求多且杂
- 新闻素材有时候会是多篇很长的文本
- 有些情况需要多轮信息汇入
所以 Qwen2 变得更加适合新闻稿的生成
1.3.2 与 Qwen 相同:
沿用 Qwen 的一些做法
- SwiGLU 作为激活函数
- 旋转位置嵌入作为位置嵌入
- QKV 偏置用于注意力
- RMSNorm 和预归一化用于训练稳定性
专家混合模型(MoE)
Qwen2 MoE 模型的架构与 Qwen1.5-MoE-A2.7B 非常相似。作为原始 FFN 的替代,MoE FFN 由 n 个单独的 FFN 组成,每个 FFN 作为一个专家。
$$
p=softmax(G(x))
$$
$$
y= i∈top k(p)∑E i(x)
$$
1.4 预训练
不就是大规模高质量的训练数据 + 庞大算力?我上我也行(bushi
略
1.4.1 结合实际
最不结合实际的一集
1.5 后训练
这个过程对于提高模型在包括编码、数学、逻辑推理、指令跟随和多语言理解在内的广泛领域的熟练度至关重要。此外,它确保了模型生成的内容与人类价值观一致,使其有帮助、诚实且无害。与依赖大量人类监督的传统方法不同,我们的方法侧重于可扩展的对齐,最小化人类注释的需求。具体来说,我们研究了获取高质量的演示和偏好数据的方法,用于有监督的微调(Supervised Fine-Tuning, SFT)和从人类反馈中学习的强化学习(Reinforcement Learning from Human Feedback, RLHF),目的是在最大限度地提高数据质量和可靠性的同时,最小化人类标记的需求。
1.5.1 后训练数据
后训练数据主要由两部分组成:
对齐数据
$$
D = {( x_i , y_i) }
$$
和偏好数据
$$
P = {( x_i , y_i^+ , y_i^−) }
$$
其中 xi 代表指令,yi 代表满意的响应,yi+ 和 yi− 是对 xi 的两种响应,yi+ 是比 yi− 更受偏好的选择。集合 D 用于 SFT,而 P 用于 RLHF。
1.5.2 有监督微调(SFT)
Qwen2 项目构建了一个包含超过 50 万个示例的广泛指令数据集,这些示例涵盖了指令跟随、编码、数学、逻辑推理、角色扮演、多语言能力和安全性等技能。模型在序列长度为 32,768 个 token 的情况下进行了 2 epoch 的微调。为了优化学习,学习率从 7 × 10 − 6 逐渐降低到 7 × 10 − 7。为解决过拟合问题,我们应用了 0.1 的权重衰减(weight decay),并将梯度限制在最大值为 1.0
1.5.2.1 结合实际
详见本文第 7 节:[7 lora 微调](#7 lora 微调)
1.5.3 人类反馈的强化学习(RLHF)
RLHF 训练机制包括两个连续的阶段:离线和在线训练。
在离线训练阶段,使用预先编译的偏好数据集 P,通过直接偏好优化(Direct Preference Optimization, DPO)最大化两种偏好之间可能性的差异。
在在线训练阶段,模型利用即时反馈的奖励模型不断改进其性能。具体来说,我们从当前策略模型中采样多个响应,奖励模型选择最受欢迎和最不受欢迎的响应,形成用于每个情节中 DPO 的偏好对。此外采用在线合并优化器(Online Merging Optimizer)来减轻对齐副作用,即与人类偏好对齐时模型性能下降的问题。
1.5.3.1 结合实际
详见本文第 8 节:[8 DPO 微调](#8 DPO 微调)
1.6 评估
有些遥远
略
1.6.1 结合实际
需请教专业的新闻编辑
2 源码
2.1 transformers-4.42.4
https://github.com/huggingface/transformers/tree/v4.42.4
源码真好看,使我着迷(bushi
3 Qwen2 开源项目
https://github.com/QwenLM/Qwen2
PR 提交:主要涉及一些字符和链接的错误,已向通义千问官方提交Pull requests
,暂未回复
2024.8.30 补充:pr 已被 close
4 langchain 接入
5 webdemo 部署
6 vllm 部署
7 lora 微调
qwen2-7b lora 微调示例:https://kwmr5xppxa3.feishu.cn/file/ApRAbyCl1okV7cxQeY1cYwPxnbc?from=from_copylink
什么是 lora:https://zhuanlan.zhihu.com/p/650197598
8 DPO 微调
详见 https://github.com/mst272/LLM-Dojo/tree/main/train_args/dpo
另有 qwen2 魔改版本 https://blog.csdn.net/weixin_43013480/article/details/139242421