QWen1.5: 卓越模型之路
AI魔法学院
2024-04-22
分享海报

引言

QWen升级之路一文中,我们深入探究了千问模型的优化过程,新版千问1.5模型较原先又取得的提升,本文将继续分析新版千问1.5模型取得不俗表现的原因。

文章结构如下:

QWen1.5

QWen1.5性能

首先,我们跟随千问1.5技术报告了解其具体的性能表现。

在此次Qwen1.5版本中,开源了包括0.5B、1.8B、4B、7B、14B和72B在内的6个不同规模的Base和Chat模型,并一如既往地放出了各规模对应的量化模型。

Qwen Base 和 Chat 模型在一系列基础及扩展能力上进行了详尽评估,包括如语言理解、代码、推理等在内的基础能力,多语言能力,人类偏好对齐能力,智能体能力,检索增强生成能力(RAG)等,对比对象也增加了热门的Mixtral MoE模型

1IXxvg

在不同模型尺寸下,Qwen1.5 都在评估基准中表现出强劲的性能。特别是,Qwen1.5-72B 在所有基准测试中都远远超越了Llama2-70B,展示了其在语言理解、推理和数学方面的卓越能力。

小型模型的构建也成为了热点之一,将模型参数小于 70 亿的 Qwen1.5 模型与社区中最杰出的小型模型进行了比较。结果如下:

o3Exer

人类偏好对齐

在对齐最新的 Qwen1.5 系列时有效地采用了直接策略优化(DPO)和近端策略优化(PPO)等技术。评估结果如下:

尽管落后于 GPT-4-Turbo,但最大的 Qwen1.5 模型 Qwen1.5-72B-Chat 在 MT-Bench 和 Alpaca-Eval v2 上都表现出不俗的效果,超过了 Claude-2.1、GPT-3.5-Turbo-0613、Mixtral-8x7b-instruct 和 TULU 2 DPO 70B,与 Mistral Medium 不相上下。

多语言能力

评测数据:挑选了来自欧洲、东亚和东南亚的12种不同语言,全面评估Base模型的多语言能力。从开源社区的公开数据集中,我们构建了如下表所示的评测集合,共涵盖四个不同的维度:考试、理解、翻译、数学。下表提供了每个测试集的详细信息,包括其评测配置、评价指标以及所涉及的具体语言种类。

m5MXDh

base模型表现如下:

aOPGrX

Qwen1.5 Base模型在12种不同语言的多语言能力方面表现出色,在考试、理解、翻译和数学等各个维度的评估中,均展现优异结果。不论阿拉伯语、西班牙语、法语、日语,还是韩语、泰语,Qwen1.5均展示了在不同语言环境中理解和生成高质量内容的能力。、

Chat模型表现如下:

上述结果展示了Qwen1.5 Chat模型强大的多语言能力,可用于翻译、语言理解和多语言聊天等下游应用。我们相信多语言能力的提升,对于其整体通用能力也具有正向的作用。

长序列

这次推出的 Qwen1.5 模型全系列支持 32K tokens 的上下文。在L-Eval 基准上评估了 Qwen1.5 模型的性能,该基准衡量了模型根据长输入生成答案的能力。结果如下:

3ZHRWb

从结果来看,即使像 Qwen1.5-7B-Chat 这样的小规模模型,在上面大5个任务中的4个表现出与 GPT3.5-turbo-16k 类似的性能。而最好的模型 Qwen1.5-72B-Chat,仅略微落后于 GPT4-32k。

此外,可以在 config.json 中,将 max_position_embedding 和 sliding_window 尝试修改为更大的值,支持更大的上下文长度。

工具使用效果

RAG

Qwen1.5 系列 Chat 模型,在 RAG 任务上的端到端效果进行了评估。评测基于 RGB 测试集,是一个用于中英文 RAG 评估的集合:

Ht9ajt

GR3qwb

Agent

T-Eval 基准测试中评估了 Qwen1.5 作为通用代理运行的能力。所有 Qwen1.5 模型都没有经过专门针对该基准的优化:

6fyRDyIyqfk4

Tool use

为了测试工具调用能力,使用开源的 评估基准 ,测试模型正确选择、调用工具的能力,结果如下:

GYq7Ri

Code Interpreter

由于 Python 代码解释器已成为高级 LLM 越来越强大的工具,还在之前qwen开源的 评估基准 上评估了qwen模型利用这一工具的能力:

SWQhlv

较大的 Qwen1.5-Chat 模型通常优于较小的模型,接近 GPT-4 的工具使用性能。不过,在数学解题和可视化等代码解释器任务中,即使是最大的 Qwen1.5-72B-Chat 模型,也会因编码能力而明显落后于 GPT-4。Qwen的目标是在未来的版本中,在预训练和对齐过程中提高所有 Qwen 模型的编码能力。

Qwen1.5结构对比

在了解QWen1.5性能表现后,我们来跟随代码查看下QWen1.5模型的结构:

huggingface的文件中没有给出qwen1.5的modeling文件,但是可以通过安装transformers>=4.37.0版本,查看模型具体结构:

具体路径为:

/xxxenv/lib/python3.10/site-packages/transformers/models/qwen1.5/

T6h81D

输出层与输入层参数共享

MSrcG2

参数共享的模型加载方式

参考内容:https://zhuanlan.zhihu.com/p/642255416

PreTrainedModel.from_pretrained调用tie_weights方法,是的,就是tie_weights方法将embedding层和lm_head层绑定的。

# from https://github.com/huggingface/transformers/blob/ee339bad01bf09266eba665c5f063f0ab7474dad/src/transformers/modeling_utils.py#L2927

        model.is_loaded_in_4bit = load_in_4bit
        model.is_loaded_in_8bit = load_in_8bit
        model.is_quantized = load_in_8bit or load_in_4bit

        # make sure token embedding weights are still tied if needed
        model.tie_weights()

        # Set model in evaluation mode to deactivate DropOut modules by default
        model.eval()

· tie_weights方法是如何将embedding层和lm_head层绑定的?接下来解读其代码。

# from https://github.com/huggingface/transformers/blob/ee339bad01bf09266eba665c5f063f0ab7474dad/src/transformers/modeling_utils.py#L1264
    def tie_weights(self):
        """
        Tie the weights between the input embeddings and the output embeddings.

        If the `torchscript` flag is set in the configuration, can't handle parameter sharing so we are cloning the
        weights instead.
        """
        if getattr(self.config, "tie_word_embeddings", True):
            output_embeddings = self.get_output_embeddings()
            if output_embeddings is not None:
                self._tie_or_clone_weights(output_embeddings, self.get_input_embeddings())

        if getattr(self.config, "is_encoder_decoder", False) and getattr(self.config, "tie_encoder_decoder", False):
            if hasattr(self, self.base_model_prefix):
                self = getattr(self, self.base_model_prefix)
            self._tie_encoder_decoder_weights(self.encoder, self.decoder, self.base_model_prefix)

        for module in self.modules():
            if hasattr(module, "_tie_weights"):
                module._tie_weights()

· 他会检查你模型的config里面有没有tie_word_embeddings属性,只有在你明确表明tie_word_embeddings=False的时候,才不会进行权重绑定。

· 取模型的embedding层,然后调用_tie_or_clone_weights方法,将模型权重从embedding层复制给lm_head层。

· _tie_or_clone_weights方法到底是怎么复制的,下面是他的代码。

· 使用了nn.Parameter来做包裹,然后复制。

· 检测你是否用了偏置(bias),如果用到了,也要复制。

· 其实这里就是最核心的部分:虽然在我们眼里,在训练的过程中,是不同网络层进行梯度更新,实际上是网络层绑定的权重进行梯度更新。

· 虽然权重从一个网络层复制给另外一个网络层,但是这个权重并不是重新在内存上复制一份,而只是把参数更新的权利给到另外一个网络。类似于python对象的浅拷贝:只是网络层A和网络层B都指向了权重,却不能独享和内存复制。

# from https://github.com/huggingface/transformers/blob/ee339bad01bf09266eba665c5f063f0ab7474dad/src/transformers/modeling_utils.py#L1360
    def _tie_or_clone_weights(self, output_embeddings, input_embeddings):
        """Tie or clone module weights depending of whether we are using TorchScript or not"""
        if self.config.torchscript:
            output_embeddings.weight = nn.Parameter(input_embeddings.weight.clone())
        else:
            output_embeddings.weight = input_embeddings.weight

        if getattr(output_embeddings, "bias", None) is not None:
            output_embeddings.bias.data = nn.functional.pad(
                output_embeddings.bias.data,
                (
                    0,
                    output_embeddings.weight.shape[0] - output_embeddings.bias.shape[0],
                ),
                "constant",
                0,
            )
        if hasattr(output_embeddings, "out_features") and hasattr(input_embeddings, "num_embeddings"):
            output_embeddings.out_features = input_embeddings.num_embeddings

Attention QKV-Bias

线性层中只有Attention QKV的bias为True

ak4Zrt

SDPA Attention

Attention的实现在于使用SDPAAPI

Qwen2 attention module using torch.nn.functional.scaled_dot_product_attention. This module inherits from
Qwen2Attention as the weights of the module stays untouched. The only changes are on the forward pass to adapt to
SDPA API.

A9SdSF

总结

本文详细介绍了新版本QWen1.5模型的性能表现以及模型结构。从整体来看QWen1.5模型较第一代模型从结构上未进行明显升级,但模型在下游任务关注的部分实现了优化和增强。QWen1.5全系列模型支持32K的上下文长度,多语言能力得到加强,此外,QWen1.5结合了DPO/PPO等策略,进一步优化了偏好对齐功能。在之前的分析中,我们指出QWen系列模型在训练过程中使用的Token数量超过了同级别模型,这可能是该模型卓越性能背后的关键因素。随着QWen1.5版本的推出,我们推测其训练Token数量可能已经得到了扩充,为模型带来进一步的性能提升。

 

 

 

 

 

出自:https://mp.weixin.qq.com/s/fz4H2AgS5jIEM7x1vGDObA

© THE END

转载请联系本网站获得授权

投稿或版权问题请加微信:skillupvip