Qwen2

215次阅读
没有评论

共计 6461 个字符,预计需要花费 17 分钟才能阅读完成。

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
  1. 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 码位,然后单独指定它们的频率大于其所构成词的频率之和
  2. “只猫”成为新 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 端验证

    Qwen2
    Qwen2
    Qwen2

    最后这一段仍然有 120+ 的字数

    资料查询

    ChatGPT

    ChatGPT 自己解释的表层原因:

    Qwen2

    ChatGPT 无法精确控制英文输出长度的底层原因:

    分词器是 ChatGPT 架构中的关键元素,它明显影响生成输出中的单词数量。

    分词器架构

    分词器是文本生成过程的第一步。它负责将我们输入到 ChatGPT 的文本片段分解为单独的元素(标记),然后由语言模型处理以生成新文本。

    当分词器将一段文本分解为标记时,它会根据一组旨在识别目标语言的有意义单元的规则来完成此操作。然而,这些规则并不总是完美的,并且在某些情况下,分词器会以影响文本总字数的方式拆分或合并标记。

    例如,考虑以下句子:“我想吃花生酱三明治”。如果分词器配置为根据空格和标点符号分割标记,则它可能会将此句子分解为以下标记,总字数为 8,等于标记计数。

    Qwen2

    然而,如果分词器配置为将“花生酱”视为复合词,则它可能会将句子分解为以下标记,总字数为 8,但标记数为 7。

    Qwen2

    因此,分词器的配置方式可能会影响文本的总体字数,这可能会影响大语言模型遵循有关精确字数计数的说明的能力。虽然一些分词器提供了自定义文本分词方式的选项,但这并不总是足以确保精确遵守字数统计要求。对于本例中的 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

Qwen2

3 Qwen2 开源项目

https://github.com/QwenLM/Qwen2

PR 提交:主要涉及一些字符和链接的错误,已向通义千问官方提交Pull requests,暂未回复

Qwen2

2024.8.30 补充:pr 已被 close

4 langchain 接入

https://github.com/datawhalechina/self-llm/blob/master/Qwen2/02-Qwen2-7B-Instruct%20Langchain%20%E6%8E%A5%E5%85%A5.md

5 webdemo 部署

https://github.com/datawhalechina/self-llm/blob/master/Qwen2/03-Qwen2-7B-Instruct%20WebDemo%E9%83%A8%E7%BD%B2.md

6 vllm 部署

https://github.com/datawhalechina/self-llm/blob/master/Qwen2/04-Qwen2-7B-Instruct%20vLLM%20%E9%83%A8%E7%BD%B2%E8%B0%83%E7%94%A8.md

7 lora 微调

该连接已失效 https://github.com/datawhalechina/self-llm/blob/master/Qwen2/05-Qwen2-7B-Instruct%20Lora%20%E5%BE%AE%E8%B0%83.md

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

9 fastapi 部署调用

https://github.com/datawhalechina/self-llm/blob/master/Qwen2/01-Qwen2-7B-Instruct%20FastApi%20%E9%83%A8%E7%BD%B2%E8%B0%83%E7%94%A8.md

正文完
 2
icvuln
版权声明:本站原创文章,由 icvuln 于2024-08-30发表,共计6461字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)