建筑企业资质查询官方网站制作相册软件

张小明 2026/1/19 20:43:54
建筑企业资质查询官方网站,制作相册软件,wordpress 注册邮箱验证失败,营销网站建设多钱原文#xff1a;towardsdatascience.com/how-to-prune-llama-3-2-and-similar-large-language-models-cf18e9a2afb6 免责声明#xff1a;本文最初是用西班牙语撰写的#xff0c;并使用 AI 工具进行翻译以确保准确性和一致性。您可以在这里找到原始的西班牙语版本。 随着大型…原文towardsdatascience.com/how-to-prune-llama-3-2-and-similar-large-language-models-cf18e9a2afb6免责声明本文最初是用西班牙语撰写的并使用 AI 工具进行翻译以确保准确性和一致性。您可以在这里找到原始的西班牙语版本。随着大型语言模型为了实现更大的能力而不断增长对更高效、更小版本的需求比以往任何时候都更加迫切。然而在不失去核心功能的前提下减小模型大小是一项微妙的平衡行为。量化剪枝等技术通常用于减小模型大小而知识蒸馏或迁移学习等方法有助于保留或恢复在缩减过程中丢失的能力。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f8a7ac7adf2a6f0e5bbd097f779fd57f.png由作者使用 GPT 4 生成的图像。在这些方法中剪枝是减少模型大小最有效的策略之一。与简化数值表示的量化不同剪枝涉及移除模型的具体部分如神经元或整个层。但这种有效性是有代价的剪枝正确应用起来具有挑战性。您不仅需要确定要剪枝的模型部分还必须仔细选择要移除的元素以最大限度地减少对模型能力的影响。本文重点介绍了结构宽度剪枝其中选定的神经元被移除并展示了如何在具有门控线性单元GLU结构的 MLP 层上有效地应用它。通过遵循概述的步骤您将看到剪枝如何显著减少模型大小同时保留其生成连贯输出和在关键基准测试中表现良好的能力。什么是剪枝以及它如何影响模型如我之前所解释的剪枝涉及移除被认为对最终输出贡献最小的模型部分。通过仔细选择这些不太关键的组件剪枝旨在创建一个具有更少参数和降低计算需求的更高效模型同时不牺牲其核心能力。在剪枝的主要挑战在于决定要移除模型中的哪些部分。模型的不同部分对性能的影响并不相同每个部分都服务于不同的目的。为了说明这一点让我们来分析本文中使用的模型结构LLaMA 3.2–1B。LlamaForCausalLM((model):LlamaModel((embed_tokens):Embedding(128256,2048)(layers):ModuleList((0-15):16x LlamaDecoderLayer((self_attn):LlamaSdpaAttention((q_proj):Linear(in_features2048,out_features2048,biasFalse)(k_proj):Linear(in_features2048,out_features512,biasFalse)(v_proj):Linear(in_features2048,out_features512,biasFalse)(o_proj):Linear(in_features2048,out_features2048,biasFalse)(rotary_emb):LlamaRotaryEmbedding())(mlp):LlamaMLP((gate_proj):Linear(in_features2048,out_features8192,biasFalse)(up_proj):Linear(in_features2048,out_features8192,biasFalse)(down_proj):Linear(in_features8192,out_features2048,biasFalse)(act_fn):SiLU())(input_layernorm):LlamaRMSNorm((2048,),eps1e-05)(post_attention_layernorm):LlamaRMSNorm((2048,),eps1e-05)))(norm):LlamaRMSNorm((2048,),eps1e-05)(rotary_emb):LlamaRotaryEmbedding())(lm_head):Linear(in_features2048,out_features128256,biasFalse))在检查结构时我们可以识别出三个主要块它们可以是剪枝的目标嵌入、自注意力机制和 MLP 层。为了决定这些中哪一个应该是剪枝过程的焦点理解其潜在的好处和可能对模型的影响是至关重要的。第一步是评估这些部分中的每一个在模型中占用的空间这给我们一个关于潜在尺寸减少的想法。参数分布分析。嵌入和输出层 (embed_tokens, lm_head):每层 128256 × 2048 ≈ 262M 个参数两层总计 524M 个参数自注意力机制 (self_attn):16 层每层包含四个投影子层每层2048 × (2048 512 512 2048) ≈ 10.5M 个参数总计10.5 × 16 ≈ 168M 个参数MLP 层 (mlp):16 层具有 GLU 结构 (_gateproj, _upproj, 和 _downproj)每层2048 × 8192 2048 × 8192 8192 × 2048 ≈ 50M 个参数总计50 × 16 ≈ 805M 个参数如我们所见MLP 层代表了模型大小的超过 50%使它们成为剪枝的明显候选者。然而在做出这个决定之前了解每个部分对模型行为的贡献是至关重要的。影响分析。嵌入层负责将输入转换为模型可以有效地处理的密集向量表示。剪枝嵌入层可能会导致模型理解某些单词的能力下降或者至少会减少创建正确捕捉输入语义意义的向量的能力。如果你想要创建一个高度特定的模型该模型只使用其输入词汇表的一个非常特定的部分例如用于金融或医学分析的模型剪枝这一层可能是一个选择。注意力机制允许模型在处理每个标记时关注输入序列中最相关的部分。它计算输入序列中每对标记之间的加权重要性分数使模型能够捕捉上下文并关注相关信息。剪枝这一部分可能会降低模型执行需要广泛理解输入上下文的任务的能力例如文本摘要或翻译。它还会影响生成文本的连贯性。MLP 层伴随着注意力机制通过一系列数据扩展和收缩来增强模型理解复杂模式的能力。剪枝这一部分可能会限制模型对未见过数据或训练期间未覆盖的任务的反应。换句话说它降低了模型的一般化能力和对不熟悉输入提供连贯响应的能力。一旦你决定了要针对模型的哪个部分下一步就是确定是执行宽度剪枝移除单个神经元还是深度剪枝移除整个层。正如你所见剪枝模型是一个相当复杂的过程涉及到许多决策。你不仅要评估最终模型的性能还要评估其训练能力。这些模型的设计目的是为了进行微调通常是为了特定的任务因此它们在执行其创建的任务时可以比基础模型更有效率和高效。门控线性单元的特性门控线性单元GLU架构在现代神经网络中很常见包括 LLaMA、Gemma、Mistral、Qwen 和类似的大型语言模型。GLU 引入了一个逐元素的门控机制允许模型选择性地过滤和控制信息的流动。这个架构由成对的层组成通常是gate_proj、up_proj 和 down_proj如上模型结构所示它们共同工作以扩展和收缩数据。这个机制使得模型能够在保持效率的同时处理更复杂的模式。然而这也意味着 GLU 结构内部的层紧密耦合剪枝这些层需要仔细考虑。对某一层进行的任何操作例如移除神经元必须在相应的成对层中进行镜像。例如如果从 _gateproj中移除了一个神经元那么相同的神经元也必须从 up_proj 中移除并且 _downproj层的大小必须相应调整。最重要的是在计算神经元的相对重要性以决定保留哪些神经元时你需要评估成对神经元。打破这些层的平衡可能导致性能下降甚至模型完全失效即使只移除了少量神经元。剪枝 Llama 3.2 模型。示例将使用 Llama 模型进行演示但代码也已在 Gemma 和 QWen 模型上成功测试。你可以在我的 GitHub 仓库上的笔记本中访问完整的代码。GitHub – peremartra/Large-Language-Model-Notebooks-Course: 实践课程关于大型语言模型…我在内存中的原始模型上采取的第一步是执行一个小的提示并保存结果。这使得我能够轻松、直观、快速地检查通过剪枝过程生成的模型是否连贯或者相反是否失去了生成可理解文本的能力。让我向你保证在第一次尝试中由于没有尊重模型的 GLU 结构生成的文本毫无疑问地表明剪枝过程存在根本性的缺陷。原始提示是“巴黎是…的首都。”让我们看看原始模型的响应并将其与我的第一次、失败的剪枝尝试返回的响应进行比较。基础模型“巴黎是法国的首都也是世界上最受游客欢迎的城市之一。这座城市以艺术、文化、时尚和美食而闻名。这座城市拥有丰富的历史并拥有许多著名的地标包括埃菲尔铁塔等。”仅剪枝 20% 的错误模型“巴黎是法国的首都。这是主要区域。这是法国的城市。这是法国的主要区域。这是法国的城市。这是法国的主要区域。这是法国的城市。这是法国的主要区域。这是法国的城市。这是法国的主要区域。这是法国的城市。这是法国的主要区域。这是法国的城市。这是法国的主要区域。这是法国的城市。”很明显第一次尝试中有些东西没有工作。这可能看起来微不足道但这样的经验检查可以为你节省几个小时。实现细节让我们先看看负责计算神经元重要性的函数它最终将决定哪些神经元保留在模型中哪些神经元被移除。defcompute_neuron_pair_importance(gate_weight,up_weight): compute neuron pair importance scores (Maximum Absolute Weight) Args: - gate_weight: Weight matrix from the gate_proj layer. - up_weight: Weight matrix from the up_weight layer. Returns: - importance_scores: Importance scores for each neuron pair. gate_max_abstorch.max(gate_weight,dim1).valuestorch.abs(torch.min(gate_weight,dim1).values)up_max_abstorch.max(up_weight,dim1).valuestorch.abs(torch.min(up_weight,dim1).values)importance_scoresgate_max_absup_max_absreturnimportance_scores该函数接收一个 _gateproj层和一个 _upproj层的权重正如我之前解释的它们是成对工作的。因此必须联合计算神经元的相对重要性。计算非常简单它计算每个神经元的权重的绝对值。考虑正负值因为在理论上具有最极端值的神经元通过显著改变通过它们的值对模型输出的影响而具有更大的影响。在这里我必须感谢 MariusZ Kurman 对将最小值纳入计算的贡献。虽然没有它们方法也能正确工作但它们的加入提高了结果。对于每个层重要性是单独计算的但函数返回的是综合值。defprune_neuron_pairs(mlp,prune_percent): Reduces the dimensions of the **gate_proj**,**up_proj**, **down_proj** layers removing the least important neurons. Args: - mlp: Layers to prune. - prune_percent: Percentage of neurons to prune. Returns: - new_gate_proj, new_up_proj, new_down_proj: New pruned layers. - k: New intermediate size. # Extract weights from MLP layersgate_weightmlp.gate_proj.weight.data.float()up_weightmlp.up_proj.weight.data.float()# Compute importance scoresimportance_scorescompute_neuron_pair_importance(gate_weight,up_weight)original_intermediate_sizegate_weight.size(0)# Calculate neurons to keepnum_neuron_pairs_to_prunemin(int(prune_percent*original_intermediate_size),original_intermediate_size-1)koriginal_intermediate_size-num_neuron_pairs_to_prune# Validation checkifk0:raiseValueError(fInvalid number of neuron pairs to keep:{k})# Select neurons to keep_,indices_to_keeptorch.topk(importance_scores,k,largestTrue,sortedTrue)indices_to_keepindices_to_keep.sort().values# Create and populate new layersnew_gate_projnn.Linear(mlp.gate_proj.in_features,k,biasFalse).to(device)new_up_projnn.Linear(mlp.up_proj.in_features,k,biasFalse).to(device)new_down_projnn.Linear(k,mlp.down_proj.out_features,biasFalse).to(device)# Copy selected weightsnew_gate_proj.weight.datamlp.gate_proj.weight.data[indices_to_keep,:]new_up_proj.weight.datamlp.up_proj.weight.data[indices_to_keep,:]new_down_proj.weight.datamlp.down_proj.weight.data[:,indices_to_keep]returnnew_gate_proj,new_up_proj,new_down_proj,k这个函数在保留最重要的神经元的同时创建新的、更小的层。这个过程包括提取当前权重# Extract weights from MLP layersgate_weightmlp.gate_proj.weight.data.float()up_weightmlp.up_proj.weight.data.float()计算神经元对的重要性分数# Compute importance scoresimportance_scorescompute_neuron_pair_importance(gate_weight,up_weight)original_intermediate_sizegate_weight.size(0)获得一个张量其中包含为每个神经元计算的重要性分数。这些分数反映了每个神经元对最终输出的贡献指示哪些应该被保留。确定要保留多少神经元# Calculate neurons to keepnum_neuron_pairs_to_prunemin(int(prune_percent*original_intermediate_size),original_intermediate_size-1)koriginal_intermediate_size-num_neuron_pairs_to_prune要保留的神经元总数是通过提供的剪枝百分比参数和原始层的大小来计算的。选择最重要的神经元# Select neurons to keep_,indices_to_keeptorch.topk(importance_scores,k,largestTrue,sortedTrue)indices_to_keepindices_to_keep.sort().values使用 Torch 获取具有最高重要性分数的神经元同时将它们从最重要到最不重要进行排序。由于 torch 返回的数据是降序的因此使用排序方法将它们重新排列为升序这是我们需要的。创建新的、更小的层# Create and populate new layersnew_gate_projnn.Linear(mlp.gate_proj.in_features,k,biasFalse).to(device)new_up_projnn.Linear(mlp.up_proj.in_features,k,biasFalse).to(device)new_down_projnn.Linear(k,mlp.down_proj.out_features,biasFalse).to(device)创建了三个新层其尺寸根据所选索引进行调整。在 _new_gateproj和 _new_upproj中保留了输入维度而输出维度被减小。相反在 _new_downproj中调整了输入维度而输出维度保持不变。将选定的权重复制到新层#copy weights to the new layers.new_gate_proj.weight.datamlp.gate_proj.weight.data[indices_to_keep,:]new_up_proj.weight.datamlp.up_proj.weight.data[indices_to_keep,:]new_down_proj.weight.datamlp.down_proj.weight.data[:,indices_to_keep]相关权重从原始层转移到新层确保只保留对应于所选神经元的权重。现在让我们看看负责遍历所有层并构建修改后模型的函数。defupdate_model(model,prune_percent): Modifies each MLP layer in the model to retain only the most important neurons. Args: - model: Model to prune. - prune_percent: Percentage of neurons to prune. Returns: - model: New pruned model. new_intermediate_sizeNoneforidx,layerinenumerate(model.model.layers):mlplayer.mlp new_gate_proj,new_up_proj,new_down_proj,new_sizeprune_neuron_pairs(mlp,prune_percent)mlp.gate_projnew_gate_proj mlp.up_projnew_up_proj mlp.down_projnew_down_projifnew_intermediate_sizeisNone:new_intermediate_sizenew_size model.config.intermediate_sizenew_intermediate_sizereturnmodel此函数遍历模型的每一层应用剪枝过程并更新模型的配置以反映新的架构。如果配置文件没有更新那么在保存后无论是在 Hugging Face 还是本地模型都无法使用。许多库如 Hugging Face 的 Transformers依赖于model.config来解释模型的架构。如果配置与实际结构不匹配那么通过这些库进行的微调或推理操作可能会失败。结果分析。通过这段代码我创建了几个模型这些模型可在 Hugging Face Hub 上找到。这些包括从 Llama-3.2–1b 衍生出的三个模型分别剪除了 MLP 层中 20%、40% 和 60% 的神经元。一个基于 Gemma-2–2B 的模型通过 40% 剪枝。您可以下载这些模型除了使用它们之外还可以研究它们的架构以及与它们所基于的原模型相比发生了哪些变化。让我们分析在 Llama3.2–1b 模型上应用 20% 剪枝后架构的变化。LlamaForCausalLM((model):LlamaModel((embed_tokens):Embedding(128256,2048)(layers):ModuleList((0-15):16x LlamaDecoderLayer((self_attn):LlamaSdpaAttention((q_proj):Linear(in_features2048,out_features2048,biasFalse)(k_proj):Linear(in_features2048,out_features512,biasFalse)(v_proj):Linear(in_features2048,out_features512,biasFalse)(o_proj):Linear(in_features2048,out_features2048,biasFalse)(rotary_emb):LlamaRotaryEmbedding())(mlp):LlamaMLP((gate_proj):Linear(in_features2048,out_features6554,biasFalse)(up_proj):Linear(in_features2048,out_features6554,biasFalse)(down_proj):Linear(in_features6554,out_features2048,biasFalse)(act_fn):SiLU())(input_layernorm):LlamaRMSNorm((2048,),eps1e-05)(post_attention_layernorm):LlamaRMSNorm((2048,),eps1e-05)))(norm):LlamaRMSNorm((2048,),eps1e-05)(rotary_emb):LlamaRotaryEmbedding())(lm_head):Linear(in_features2048,out_features128256,biasFalse))模型的结构保持不变除了 MLP 块中中间层的大小。正如您所看到的_gateproj和 _upproj层的特征数已从 8192 减少到 6554而 _downproj层也经历了相同的变化但是在其输入特征上。这个变化与代码所做的一致修改这些层的同时保留对模型性能最关键的神经元。如果我们从 8192 中移除 20%我们得到 6553.6这证实了剪枝的神经元百分比是正确的。经验性提示测试。现在让我们看看剪枝模型在测试提示下的表现巴黎是法国的首都。它也是世界上最美丽的城市之一。在巴黎有太多可看可做的事情一天之内不可能全部看完。然而有一些事情你响应与原始模型的响应不完全相同但保持了连贯性。这表明模型保留了其大部分能力更重要的是它有可能通过知识蒸馏或微调恢复任何损失。EleutherAI / lm-evaluation。除了这个经验性检查之外我还使用一些最常用的基准对模型进行了评估。让我们分析不同程度的剪枝如何影响模型的表现。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9ab8a5873c83b58fe4e3daba6483c4ec.png图片由作者提供。不同指标上的模型性能如我们所见剪枝的影响在一定程度上是不对称的。BoolQ 测试评估的任务没有经历显著的退化对于一个失去了 MLP 层 40% 神经元的模型下降幅度仅为约 2%。相比之下对 Lambada 测试的影响是显著的准确率下降了超过 50%。这表明模型保留了大部分的理解能力但在需要更多开放式生成的测试中表现不佳。BoolQ 简单地向模型展示一段文本和一个需要用 Yes/No 回答的问题。这是一个专注于测量模型理解输入文本中关系的能力的测试。另一方面Lambada 要求模型猜测段落中的最后一个单词这是一个复杂的任务最后一个单词测试了模型在复杂语言建模方面的能力。Hugging Face Open LLM 领先板。在 Hugging Face Open LLM 领先板上剪枝到 20% 的模型结果可能更加令人惊讶因为它优于其基础模型以及广泛使用的 TinyLlama-1.1B-v1.1。在这张图中我们可以看到两个模型的测试结果。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b767432db04b618d6e2c7c1e9dddc5af.png图片由作者使用 GPT 生成。从这张图中我们可以得出以下结论剪枝模型在平均性能上优于基础模型4.86 vs. 4.03。这表明剪枝过程在关键领域有效地保留了或增强了性能同时减少了冗余。通过研究这些结果我们可以识别出剪枝模型的优缺点。优势IFEval显著的改进19.94 vs. 14.78表明剪枝要么减少了过拟合要么提高了模型高效提取信息的能力。MUSR更好的性能4.39 vs. 2.56表明剪枝模型在处理需要长上下文推理或叙事理解的任务上表现更好这可能是由于聚焦的权重。劣势BBH在不确定性下的推理能力下降3.19 vs. 4.37可能表明剪枝减少了模型处理模糊或多解释场景的能力。MMLU-PRO专业领域特定任务下降1.36 vs. 2.26可能是由于移除了保留特定领域详细知识所需的关键权重。能源效率剪枝模型在能源效率上略高0.4 kg vs. 0.42 kg CO₂这与减少计算开销同时保持竞争性能的目标相一致。对模型在不同排名上的性能进行更全面的研究是必要的但这些结果表明我们有一个有希望的模型通过适当的知识蒸馏或微调可以显著改进。最重要的是这些结果与对 MLP 层进行的剪枝过程相一致。结论。模型的剪枝过程是成功的。这种处理 GLU 层的方法允许我们在保留模型大部分能力的同时进行剪枝从而显著减小其大小和资源消耗。需要注意的是测试结果是在剪枝模型在进行任何能力恢复过程如知识蒸馏或微调之前获得的这些过程通常是针对经过剪枝的模型进行的。未来工作。有许多剪枝技术值得探索。可能最直接的是深度剪枝这涉及到移除对模型性能贡献最小的层。另一个重要的研究领域是将这些剪枝模型提交给知识蒸馏过程并评估它们是否保留了学习新任务的能力。这可能会使它们的性能更接近基线模型特别是在剪枝模型显示出最大损失的基准测试中。开发更轻量、更高效的模型仍然是一个有吸引力的领域尤其是对于寻求在不需大量基础设施的情况下部署 LLM 能力的公司。这项工作为将这些强大的模型变得更加可访问和可部署提供了基础。**本文是关于大型语言模型的完整课程的一部分可在 GitHub 上找到。为了了解新文章的更新请考虑关注该存储库或给它加星。**这样您将在新内容添加时收到通知。我是 Apress 出版社出版的书籍《大型语言模型项目应用和实现大型语言模型的策略》的作者。我经常撰写关于生成式 AI、深度学习和 TensorFlow 的文章。**请考虑在 Medium 上关注我以获取新文章的更新。**当然您也可以在LinkedIn上与我建立联系。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

网站开发需求调研新冠疫苗接种率

还在为Bilibili主页杂乱无章的视频推荐而烦恼吗?BewlyCat这个开源项目专门针对B站主页进行深度优化,通过智能视频卡片、个性化设置和流畅操作体验,让你的Bilibili使用体验焕然一新。 【免费下载链接】BewlyCat BewlyCat——基于BewlyBewly开发…

张小明 2026/1/17 22:58:40 网站建设

网站开发工作室营业执照上海自助模板建站

重庆门头设计安装哪个公司好在重庆,选择一家专业的门头设计安装公司对于提升品牌形象和吸引顾客至关重要。随着市场竞争的日益激烈,企业需要通过高质量的门头设计来展示其专业性和独特性。本文将为您推荐一家在重庆享有良好口碑的广告设计公司——重庆鑫…

张小明 2026/1/17 22:58:40 网站建设

如何把网站做成appvs2012网站开发环境

告别API测试协作困境:Bruno请求链实现CI/CD无缝集成 【免费下载链接】bruno 开源的API探索与测试集成开发环境(作为Postman/Insomnia的轻量级替代方案) 项目地址: https://gitcode.com/GitHub_Trending/br/bruno 在团队自动化测试实践…

张小明 2026/1/17 22:58:41 网站建设

wordpress注册按钮seo网站建设

Sigma-delta DAC 插值滤波器,Sigma-delta调制 插值倍数可调 插值方式可调(采样保持/插零)Sigma-delta调制技术在DAC(数模转换器)中的应用堪称数字信号处理的艺术。它巧妙地将低位分辨率和高频采样相结合,通…

张小明 2026/1/17 22:58:42 网站建设

陕西交通建设集团蓝商分公司网站如何生成网页

🎯 数据展示的痛点与挑战 【免费下载链接】vue-echarts 项目地址: https://gitcode.com/gh_mirrors/vue/vue-echarts 在当今数据驱动的时代,前端开发者经常面临一个共同的难题:如何在Vue应用中优雅地展示复杂的数据图表?传…

张小明 2026/1/17 22:58:42 网站建设

做特卖的网站有哪些做网站框架搭建的人

系统简介 当今中国经济发迅速,城市化进程加快,汽车越来越快的走进工薪阶层家庭,而十地越来越紧缺,城市空地和巷道越来越少,但是城市里的汽车数量却越来越多。在城区的车辆密集区,由于受到原有占地面积的限制…

张小明 2026/1/17 22:58:41 网站建设