从 Llama 1 到 3.1:Llama 模型架构演进详解
编者按: 面对 Llama 模型家族的持续更新,您是否想要了解它们之间的关键区别和实际性能表现?本文将探讨 Llama 系列模型的架构演变,梳理了 Llama 模型从 1.0 到 3.1 的完整演进历程,深入剖析了每个版本的技术创新,还通过实际实验对比了 Llama 2 和 Llama 3 在推理速度、答案长度和相对答案质量(RAQ)等关键指标上的表现差异。
根据本文, Llama 模型的架构演变主要经历了以下三个阶段:
- Llama 1:基于原始 Transformer 架构,引入了预归一化、RMSNorm、SwiGLU 激活函数和旋转式位置编码等改进,提升了模型的训练稳定性和性能。
- Llama 2:在 Llama 1 的基础上,将上下文长度扩展至 4096,并引入了分组查询注意力 (GQA) 机制,有效降低了推理过程中的内存需求,提升了推理速度。
- Llama 3:进一步将 GQA 应用于小型模型,并采用更高效的分词器 TikToken,扩大了词汇表的数量,同时将上下文长度翻倍,并大幅增加了训练数据量。
作者 | Luís Roque
编译 | 岳扬
01 Introduction
Meta 公司推出了其大语言模型 Llama 的三个主要版本。Llama 在 2023 年初的首度亮相,为开源自然语言处理(NLP)社区带来了重大突破。Meta 一直通过分享最新的模型版本,为这一社区贡献力量。
在这里,我们需要区分“开放型(open) LLM”与“开源(open-source) LLM”。 传统上,开源软件会在特定的公共许可证下公开源代码,允许用户使用和修改。在 LLM 领域,开放型 LLM 会公开模型权重和初始代码,而开源 LLM 则会更进一步,在宽松的许可下共享整个训练过程,包括训练数据。目前,包括 Meta 的 Llama 在内的多数模型,都属于开放型 LLM,因为它们并未公开用于训练的数据集。
Llama 经历了三次重要的架构更新。 版本 1 对原始的 Transformer 架构进行了多项改进。版本 2 在大模型中引入了分组查询注意力(GQA)机制。版本 3 将这一机制扩展到了小模型,同时引入了更高效的分词器,还扩大了词汇量。版本 3.1 并未对核心架构做出调整,主要的变化在于训练数据的清洗、上下文长度的增加以及对更多语言的支持。
本文探讨了 Llama 的架构演变,着重介绍其主要进步及其对 LLM 未来发展的影响。文章最后通过一个实验对 Llama 2 和 Llama 3 进行了比较,使用了推理速度、答案长度和相对答案质量(RAQ,Relative Answer Quality)框架[1]等指标进行评估。RAQ 框架提供了一个客观的评分系统,用于检验 LLM 的回答准确度,对于评估特定应用场景尤为有用。
Figure 1: Llama family (image by author with DALL-E)
02 Llama: A Family of Open LLMs
2.1 Llama 1:该系列首个模型问世
Llama 系列的第一个模型,Llama 1 [2],是建立在 Vaswani 等人在 2017 年提出的编码器-解码器 Transformer 架构之上的[3]。该架构曾是 NLP 领域的重大创新,并且至今仍是 LLM 模型的基础架构。
Llama 1 在其核心设计中采纳了这一架构,并在此基础上进行了多项优化,包括:
预归一化技术
借鉴了 GPT3 [4]架构中提高训练稳定性的方法,Llama 1 也采用了对每个 Transformer 子层的输入进行归一化的策略,而不仅仅是对输出进行归一化处理,具体细节如图 2 所示。
图 2:原始 Transformer 架构与 Llama 1 架构的不同之处,特别是在 Transformer 子层中,对每个输入都进行了归一化处理(图片由作者提供)
此外,Llama 1 还采用了 RMSNorm [5] 来替代传统的 LayerNorm 函数,这一改变在保持训练稳定性和提升模型收敛速度的同时,大幅提高了计算效率。
RMSNorm 之所以能更高效,是因为其创造者发现 LayerNorm 的优势在于 rescaling invariance(译者注:指的是归一化过程能够适应输入数据的缩放,使得网络对这种缩放不敏感。),而非 recentering invariance(译者注:如果输入数据的均值发生了变化,但数据的分布形状和范围保持不变,那么具有 recentering invariance 的算法或函数的输出应该不受影响。)。基于这一发现,他们省略了归一化过程中的均值计算,使得算法更加简洁,而效果不减,且运算效率显著提升。
图 3:层归一化(LayerNorm)与均方根归一化(RMSNorm)之间的方程差异(图片由作者提供)
SwiGLU 激活函数
在激活函数的选择上,研究者们采用了 SwiGLU [6] 函数来替代传统的 ReLU 函数,这一改变旨在提升模型的性能。两者的核心差异在于:
- ReLU 函数会将所有负数输入直接归零,而正数输入则保持不变。
- 相比之下,SwiGLU 函数含有一个可学习的参数 β,能够调节函数的插值程度。 随着 β 值的增大,SwiGLU 的行为将逐渐接近 ReLU,这一点如图 4 所示。
图 4:ReLU 与 SwiGLU 在不同 β 值下的行为对比,可以看到当 β 达到 100 时,两者的曲线趋于一致。
旋转式位置编码(Rotary Positional Embeddings)
在大语言模型(LLMs)中,位置编码起到了至关重要的作用,这是因为 Transformer 架构本身不区分单词的顺序。也就是说,如果没有位置编码的辅助,Transformer 会将单词顺序不同但单词相同的两个句子视为相同的句子。 例如,如果没有位置编码,下面两个句子的含义 Transformer 将无法区分:
Sentence 1: Llama 2 is better than Llama 1 Sentence 2: Llama 1 is better than Llama 2
句子1:Llama 2的性能优于Llama 1。句子2:Llama 1的性能优于Llama 2。
在论文[3]中,提出了一种通过正弦和余弦函数实现的绝对位置编码(Absolute Positional Embeddings)。序列中的每个位置都有其独特的编码(positional embedding),它们与词向量相加,从而确保即使单词相同,不同顺序的句子也能表达不同的意思。
简单来说,我们可以假设句子中的单词是用一维向量而不是多维向量来编码的。如图 5 所示,在词向量中,“1”和“2”的表示值是相同的。但是,在加入了位置编码之后,它们的表示值就变得不同了(分别从0.88变为1.04,以及从0.26变为0.1)。
图 5:绝对位置编码(Absolute Positional Embeddings)(图片由作者提供)
尽管绝对位置编码已经解决了 Transformer 不区分顺序的问题,但它生成的位置编码是相互独立的,没有考虑到序列中单词之间的相对位置关系。 这意味着在模型看来,位置 1 和位置 2 之间的相关性与位置 1 和位置 500 之间的相关性并无差异。然而,我们知道实际情况并非如此,因为在位置上更接近的单词,其相关性理论上应该更高。
旋转式位置编码[7](RoPE)能够解决上述问题,它通过将序列中的每个位置转换成词嵌入的旋转变量来模拟单词间的相对位置关系。 以前文的 “Llama 2 is better than Llama 1” 为例,假设词嵌入现在是二维的。那么,“better ”一词将由基于其位置 m (4) 和常数 θ 的原始二维向量的二维旋转向量来表示。
图 6:展示了如何通过旋转式位置编码(Rotary Positional Embedding)将原始向量转换为新的向量。这一转换是基于向量在序列中的位置(例如,m=4)和常数θ来进行的(图片由作者提供)
采用这种方式,即便在原句中增加更多词汇,单词之间的相对距离也能得到保持。比如,在句子 “The LLM Llama 2 is better than Llama 1” 中添加两个单词,尽管“better”和“than”的位置从(4和5)变为(6和7),但由于旋转量保持一致,两个向量之间的相似性(即左图中向量的点积与右图中的点积相同)依旧不变。
图 7:旋转式位置编码维持 tokens 间相对距离的能力(图片由作者提供)
2.2 Llama 2:Llama 1 的升级版
Llama 2 [8] 保留了 Llama 1 对原始 Transformer 架构所做的所有改动。在此基础上,还将处理上下文的长度扩展至 4096,相较于之前的 2048,翻了一番。同时,对于 34B 和 70B 这样的大型模型,Llama 2 使用 Grouped-Query Attention (GQA) [10] 取代了传统的 Multi-Head Attention (MHA) [9]。
由于需要大量内存来加载所有的注意力头的 queries、keys 和 values ,MHA 成为了 Transformer 的性能瓶颈。针对这一问题,有两种解决方案:
- Multi-Query Attention [9](MQA)通过在注意力层使用单一的键和值头(key and value),配合多个查询头(query heads)来大幅降低内存需求。但这种做法可能会降低模型的质量,并导致训练过程不稳定,因此像 T5 这样的其他开源大语言模型并未采用此方法。
- GQA 则采用了一种折中方案,它将查询值(query values)分为 G 组(GQA-G),每组共享一个键和值头(key and value head)。如果 GQA 的组数为 1(GQA-1),则相当于 MQA,所有查询(queries)都集中在一组;而如果组数等于头数(GQA-H),则与 MHA 相当,每个查询(query)自成一组。这种方法减少了每个查询(query)组中的键和值头(keys and values)数量,从而缩小了键值缓存的大小,减少了需要加载的数据量。与 MQA 相比,这种更为温和的缩减方式在提升推理速度的同时,也降低了解码过程中的内存需求,且模型质量更接近 MHA,速度几乎与 MQA 持平。
图 8:MHA、GQA 和 MQA 方法概览(图片由作者提供)
2.3 Llama 3: Size and Tokenization
Llama 3 [11] 将处理上下文的长度从 4096 扩展至 8192,并将 GQA 使用到了较小规模的模型(8B)。同时,研究者们还将分词工具从 Sentence Piece [12] 更换为 OpenAI 模型所采用的 TikToken [13]。因为新的词汇表容量增加到了 128k 个 tokens,较之前的 32k 有了大幅提升,这一变更显著提升了模型的性能。
这两种分词工具的主要差异在于,在输入的 tokens 已经存在于词汇表中时,TikToken 会跳过字节对编码(BPE) [14] 的合并规则。 例如,如果“generating”这个词已经在词汇表中了,那么它将作为一个完整的 token 返回,而不是将其拆分为“generating”和“ing”这两个最小单元的 tokens 。
2.4 Llama 3.1
在 2024 年 7 月发布的 Llama 3.1,实现了上下文长度(128K tokens)的显著提升,并新增了对 8 种语言的支持。此次发布版本的一个重要亮点是更大的 Llama 3.1 405B 模型。在此之前,开放式的 LLMs(大语言模型)通常模型规模都低于 100 B。
最后,我们可以从下表中总结一下 Llama 模型的演变情况:
表 1:比较 Llama 模型在上下文长度、词汇表大小、训练数据集大小以及支持语言数量方面的演变。
03 Llama 2 与 Llama 3:模型比较
在本节中,我们将 Llama2 和 Llama 3 模型在 SQuAD 数据集上进行测试。SQuAD 是一个采用 CC BY-SA 4.0 许可协议的问答数据集(https://huggingface.co/datasets/rajpurkar/squad)。该阅读理解数据集(reading comprehension dataset)由一系列维基百科文章的问题组成。模型需要根据上下文,检索出问题的正确答案。对于本次模型比较,数据集中有三个较为重要的字段:
- 问题(question)——模型需要回答的问题。
- 上下文(context)——模型需要从中提取答案的背景信息。
- 答案(answers)——问题的文本答案。
评估过程将包括三个量化指标:第一个是评估推理速度,第二个是确定答案长度,第三个是评估准确性。 对于准确性的评估,我们使用 RAQ [1]。RAQ 通过一个独立的 LLM 对 Llama 2 和 Llama 3 的答案进行排序,排序的依据是它们与真实答案的接近程度。
我们首先下载这两个模型的 .gguf 格式文件,以便能够在 CPU 上运行它们,并将它们放置在 model/ 文件夹下。
我们使用了每个模型的 instruct 版本,并进行了 4-bit 量化:
- nous-hermes-Llama-2-7b.Q4_K_M.gguf,来自 https://huggingface.co/TheBloke/Nous-Hermes-Llama-2-7B-GGUF
- Meta-Llama-3-8B-Instruct-Q4_K_M.gguf,来自 https://huggingface.co/NousResearch/Meta-Llama-3-8B-Instruct-GGUF
在完成上述操作之后,接下来我们会导入所有需要的库,以及我们自定义的一个生成器。这个生成器是一个函数或者类,它能够接受我们想要使用的模型作为输入参数。
这个类的作用是从 config.yaml 配置文件中载入模型参数,这些参数的具体设置包括:设定上下文长度为 1024,调节模型运行的“temperature ”为 0.7,以及限制输出的最大 tokens 数为2000。
此外,系统还构建了一个基于 LangChain 的提示词模板。这个模板的作用是在将问题和相关上下文提交给大语言模型之前,对它们进行格式化处理,以便获得更准确的响应。
函数 get_llm_response 负责接收已加载的大语言模型、相关上下文以及问题,并输出模型的回答以及一系列量化评估指标。
评估结束后,我们将各项指标进行了可视化展示,并发现 Llama 3 的速度比 Llama 2 快,其平均生成速度达到每秒 1.1 个单词,而 Llama 2 的生成速度仅为每秒 0.25 个单词。在答案长度方面,Llama 3 输出的答案较长,平均为 70 个单词,相比之下,Llama 2 7B 的答案平均长度只有 15 个单词。根据相对答案质量(RAQ,Relative Answer Quality)评估框架,Llama 3 在平均排名上拔得头筹,约为 1.25,而 Llama 2 的表现则稍逊一筹,其平均排名大约为 1.8。
图 9:Llama 2 7B vs Llama 3 8B(图片由作者提供)
表 2 展示了不同语言模型性能的 Dunn 事后检验(Dunn post-hoc test)结果。每个单元格显示了两种模型之间的性能差异是否在 5 %的显著性水平(significance level)上具有统计意义。“Significant” 意味着存在统计上的显著差异(p值不超过0.05),而 “Not Significant” 则意味着模型之间的性能差异不具备统计显著性(p值超过0.05)。根据检验结果,Llama 3 与 Llama 2 在性能上的差异是显著的。
表 2:不同 LLM 模型性能排名差异的显著性分析
最后,从定性角度,我们分析了两种模型对某一特定问题的回答:“What percentage of improvement over energy code requirements will be the goal of all new construction and renovations?”。这一问题基于以下上下文信息得出答案,两者均正确地回答了问题。
然后,如下所示,Llama 2 在回答过程中先是表示答案不在给定上下文中,但最终却又引用了上下文中的内容来给出答案,显得前后矛盾。而 Llama 3 则能够准确地从上下文中找到答案,并简洁明了地作出了正确回应。
04 Conclusions
Llama 模型在发展过程中不断进行改进,使模型在处理语言任务时更加高效、表现更佳,并且能够适应更广泛的应用场景。从最初的 Llama 1 开始,引入了如 RMSNorm 输入归一化和更平滑的激活函数等基础性改变,后续的每个模型版本都是在此基础上进一步改进。
Llama 2 通过采用 GQA 提高推理效率,对这一方法进行了优化,为 Llama 3 的进一步提升铺平道路。Llama 3 在此基础上,将 GQA 应用于更小型的模型,采用了词汇表数量更大的高效分词器,将上下文长度翻倍,并大幅增加了训练数据量。
Llama 3.1 版本开启了新的篇章。它将上下文长度进一步扩展至 128K 个 token,增加了对更多语言的支持,并推出了迄今为止最大的开放式模型 —— 405B 模型。
Llama 模型的连续升级,使得它们在各种应用场景中都具有卓越的适应性。至今,Llama 模型已累计下载超过 3 亿次,而将其集成到利用私有 LLM 技术的数千种产品中,仅仅是一个开始。颇具讽刺意味的是,Llama 现在在推动开放式 AI 的发展道路上走在了前列,取代了曾经更为开放的 OpenAI 所占据的位置。
References
[1] Luís Roque, Rafael Guedes. “Research to Production: Relative Answer Quality (RAQ) and NVIDIA NIM.” Towards Data Science. Medium, 2024.
[2] Hugo Touvron, Thibaut Lavril, Gautier Izacard, Xavier Martinet, Marie-Anne Lachaux, Timothée Lacroix, Baptiste Rozière, Naman Goyal, Eric Hambro, Faisal Azhar, Aurelien Rodriguez, Armand Joulin, Edouard Grave, Guillaume Lample. “Llama: Open and Efficient Foundation Language Models.” arXiv preprint arXiv:2302.13971, 2023.
[3] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin. “Attention Is All You Need.” arXiv preprint arXiv:1706.03762, 2017.
[4] Tom B. Brown, Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared Kaplan, Prafulla Dhariwal, Arvind Neelakantan, Pranav Shyam, Girish Sastry, Amanda Askell, Sandhini Agarwal, Ariel Herbert-Voss, Gretchen Krueger, Tom Henighan, Rewon Child, Aditya Ramesh, Daniel M. Ziegler, Jeffrey Wu, Clemens Winter, Christopher Hesse, Mark Chen, Eric Sigler, Mateusz Litwin, Scott Gray, Benjamin Chess, Jack Clark, Christopher Berner, Sam McCandlish, Alec Radford, Ilya Sutskever, Dario Amodei. “Language Models are Few-Shot Learners.” arXiv preprint arXiv:2005.14165, 2020.
[5] Biao Zhang, Rico Sennrich. “Root Mean Square Layer Normalization.” arXiv preprint arXiv:1910.07467, 2019.
[6] Noam Shazeer. “GLU Variants Improve Transformer.” arXiv preprint arXiv:2002.05202, 2020.
[7] Jianlin Su, Yu Lu, Shengfeng Pan, Ahmed Murtadha, Bo Wen, Yunfeng Liu. “RoFormer: Enhanced Transformer with Rotary Position Embedding.” arXiv preprint arXiv:2104.09864, 2021.
[8] Hugo Touvron, Louis Martin, Kevin Stone, Peter Albert, Amjad Almahairi, Yasmine Babaei, Nikolay Bashlykov, Soumya Batra, Prajjwal Bhargava, Shruti Bhosale, Dan Bikel, Lukas Blecher, Cristian Canton Ferrer, Moya Chen, Guillem Cucurull, David Esiobu, Jude Fernandes, Jeremy Fu, Wenyin Fu, Brian Fuller, Cynthia Gao, Vedanuj Goswami, Naman Goyal, Anthony Hartshorn, Saghar Hosseini, Rui Hou, Hakan Inan, Marcin Kardas, Viktor Kerkez, Madian Khabsa, Isabel Kloumann, Artem Korenev, Punit Singh Koura, Marie-Anne Lachaux, Thibaut Lavril, Jenya Lee, Diana Liskovich, Yinghai Lu, Yuning Mao, Xavier Martinet, Todor Mihaylov, Pushkar Mishra, Igor Molybog, Yixin Nie, Andrew Poulton, Jeremy Reizenstein, Rashi Rungta, Kalyan Saladi, Alan Schelten, Ruan Silva, Eric Michael Smith, Ranjan Subramanian, Xiaoqing Ellen Tan, Binh Tang, Ross Taylor, Adina Williams, Jian Xiang Kuan, Puxin Xu, Zheng Yan, Iliyan Zarov, Yuchen Zhang, Angela Fan, Melanie Kambadur, Sharan Narang, Aurelien Rodriguez, Robert Stojnic, Sergey Edunov, Thomas Scialom. “Llama 2: Open Foundation and Fine-Tuned Chat Models.” arXiv preprint arXiv:2307.09288, 2023.
[9] Noam Shazeer. “Fast Transformer Decoding: One Write-Head is All You Need.” arXiv preprint arXiv:1911.02150, 2019.
[10] Joshua Ainslie, James Lee-Thorp, Michiel de Jong, Yury Zemlyanskiy, Federico Lebrón, Sumit Sanghai. “GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints.” arXiv preprint arXiv:2305.13245, 2023.
[11] Meta AI. “Introducing Llama 3.” Meta AI Blog, 2024.
[12] Taku Kudo, John Richardson. “SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing.” arXiv preprint arXiv:1808.06226, 2018.
[13] OpenAI. “TikToken.” GitHub.
[14] Rico Sennrich, Barry Haddow, Alexandra Birch. “Neural Machine Translation of Rare Words with Subword Units.” arXiv preprint arXiv:1508.07909, 2015.
Thanks for reading!
Hope you have enjoyed and learned new things from this blog!
About the authors
Luís Roque
Serial entrepreneur and leader in the AI space. I develop AI products for businesses and invest in AI-focused startups.
https://www.linkedin.com/in/luisbrasroque/
END
本期互动内容 🍻
❓文章提到 Llama 模型采用了多项技术优化,如 GQA 和高效分词器等。你认为在这些优化中,哪一项对模型性能提升最关键?为什么?
原文链接:
https://towardsdatascience.com/the-evolution-of-llama-from-llama-1-to-llama-3-1-13c4ebe96258
相关文章:
从 Llama 1 到 3.1:Llama 模型架构演进详解
编者按: 面对 Llama 模型家族的持续更新,您是否想要了解它们之间的关键区别和实际性能表现?本文将探讨 Llama 系列模型的架构演变,梳理了 Llama 模型从 1.0 到 3.1 的完整演进历程,深入剖析了每个版本的技术创新&#…...
电话机器人的最佳应用
电话机器人的最佳应用 作者:开源呼叫中心系统 FreeIPCC,Github地址:https://github.com/lihaiya/freeipcc 电话机器人在多个领域中都展现出了其独特的优势和广泛的应用前景。以下是对电话机器人最佳应用的详细归纳: 一、销售与营…...
[面试]-golang基础面试题总结
文章目录 panic 和 recover**注意事项**使用 pprof、trace 和 race 进行性能调试。**Go Module**:Go中new和make的区别 Channel什么是 Channel 的方向性?如何对 Channel 进行方向限制?Channel 的缓冲区大小对于 Channel 和 Goroutine 的通信有…...
Fakelocation Server服务器/专业版 ubuntu
前言:需要Ubuntu系统 Fakelocation开源文件系统需求 Ubuntu | Fakelocation | 任务一 任务一 更新Ubuntu(安装下载不再赘述) sudo -i # 提权 sudo apt update # 更新软件包列表 sudo apt upgrade # 升级已安装的软…...
Node.js的http模块:创建HTTP服务器、客户端示例
新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战(第2版)(Web前端技术丛书)》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 要使用http模块,只需要在文件中通过require(http)引入即可。…...
Jackson 对象与json数据互转工具类JacksonUtil
下面是一个基于 Jackson 的工具类 JacksonUtil,用于在 Java 项目中实现对象与 JSON 数据之间的互相转换。该工具类具有简洁、易用、通用的特点。 package com.fy.common.util;import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core…...
【ArcGISPro】根据yaml构建原始Pro的conda环境
使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…...
对撞双指针(七)三数之和
15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组…...
反向代理服务器的用途
代理服务器在网络中扮演着重要的角色,它们可以优化流量、保护服务器以及提高安全性。在代理服务器中,反向代理服务器是一种特殊类型,常用于Web服务器前,它具备多种功能,能够确保网络流量的顺畅传输。那么,让…...
一些好的AI技术学习平台和资料(动态更新)
1. 大模型 1.1 提示词(Prompt) 目前,大模型技术已经深入到工作生活的方方面面,各技术大厂的大模型也层出不穷,从开始的OpenAI一家独大,到当今世界的“百模大战”。从一些日常使用的角度来说,模…...
wireshark抓包分析HTTP协议,HTTP协议执行流程,
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 使用WireShark工具抓取「HTTP协议」的数据包&#…...
路由缓存后跳转到新路由时,上一路由中的tip信息框不销毁问题解决
上一路由tip信息框不销毁问题解决 路由缓存篇问题描述及截图解决思路关键代码 路由缓存篇 传送门 问题描述及截图 路由缓存后跳转新路由时,上一个路由的tip信息框没销毁。 解决思路 在全局路由守卫中获取DOM元素,通过css去控制 关键代码 修改文…...
【Angular】async详解
在 Angular 中,async 关键字用于定义异步函数,通常与 await 一起使用来处理 Promise。这使得异步代码看起来更像同步代码,从而更容易理解和维护。 基本用法 定义异步函数:使用 async 关键字。等待 Promise 解析:使用…...
springboot/ssm综合小区管理系统Java社区物业停车缴费系统web物业源码
springboot/ssm综合小区管理系统Java社区物业停车缴费系统web物业源码 基于springboot(可改ssm)htmlvue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库&…...
【51单片机】程序实验56.独立按键-矩阵按键
主要参考学习资料:B站【普中官方】51单片机手把手教学视频 前置知识:C语言 单片机套装:普中STC51单片机开发板A4标准版套餐7 码字不易,求点赞收藏加关注(•ω•̥) 有问题欢迎评论区讨论~ 目录 独立按键按键介绍实验5 独立按键 矩…...
SAP 零售方案 CAR 系统的介绍与研究
前言 当今时代,零售业务是充满活力和活力的业务领域之一。每天,由于销售运营和客户行为,它都会生成大量数据。因此,公司迫切需要管理数据并从中检索见解。它将帮助公司朝着正确的方向发展他们的业务。 这就是为什么公司用来处理…...
2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略 完整参考论文(2)
5.2 问题一模型的建立与求解 5.2.1 分析发展情况 为了更好地理解数据的变化趋势,利用matlab通过六个子图对宠物行业中的关键变量进行了可视化展示。 图 1. 宠物数量变化展示了 猫数量、狗数量 和 总宠物数量 在 2019-2023 年间的变化趋势。结果显示:猫的数量呈逐年上升的趋…...
嵌入式的C/C++:深入理解 static、const 与 volatile 的用法与特点
目录 一、static 1、static 修饰局部变量 2、 static 修饰全局变量 3、static 修饰函数 4、static 修饰类成员 5、小结 二、const 1、const 修饰普通变量 2、const 修饰指针 3、const 修饰函数参数 4. const 修饰函数返回值 5. const 修饰类成员 6. const 与 #defi…...
【数据库设计】软件系统需要同时设计注册日志表和登录日志表吗
是的,通常情况下,注册日志表和登录日志表是分别设计的,分别记录不同类型的事件信息。 注册日志表 记录用户的注册信息、注册方式以及是否成功等内容。登录日志表 记录用户每次登录的时间、IP 地址、设备信息、登录状态等内容。 尽管这两者看…...
vim 一次注释多行 的几种方法
在 Vim 中一次注释多行是一个常见操作。可以使用以下方法根据你的具体需求选择合适的方式: 方法 1:手动插入注释符 进入正常模式: 按 Esc 确保进入正常模式。 选择需要注释的多行: 移动到第一行,按下 Ctrlv 进入可视块…...
手机无法连接服务器1302什么意思?
你有没有遇到过手机无法连接服务器,屏幕上显示“1302”这样的错误代码?尤其是在急需使用手机进行工作或联系朋友时,突然出现的连接问题无疑会带来不少麻烦。那么,什么是1302错误,它又意味着什么呢? 1302错…...
Git(一)基本使用
目录 一、使用git -v 查看安装git版本 二、使用mkdir 创建一个文件,并使用 git init 在该目录下创建一个本地仓库, 三、通过git clone命令接入线上仓库 四、使用git status查看仓库状态信息 五、利用echo写入一个文件 并使用cat进行查看 【Linux】e…...
sklearn中常用数据集简介
scikit-learn库中提供了包括分类、回归、聚类、降维等多种机器学习任务所需的常用数据集,方便进行实验和研究,它们主要被封装在sklearn.datasets中,本文对其中一些常用的数据集进行简单的介绍。 1.Iris(鸢尾花)数据集…...
LRU缓存
什么是LRU缓存? LRU(Least Recently Used)是最近最少使用算法,是操作系统中用于分页置换的算法,如果要向内存中添加分页,并且内存分页已满的情况下,就选出最近一段时间最不常用的分页进行置换(…...
.net6 使用 FreeSpire.XLS 实现 excel 转 pdf - docker 部署
FreeSpire.XLS && Aspose.Cells包都可以实现。实现过程中发现如下问题: 本地测试通过, docker部署服务器后报错: The type initializer for Spire.Xls.Core.Spreadsheet.XlsPageSetupBase threw an exception. 由于缺少依赖…...
HttpServletRequest req和前端的关系,req.getParameter详细解释,req.getParameter和前端的关系
HttpServletRequest 对象在后端和前端之间起到了桥梁的作用,它包含了来自客户端的所有请求信息。通过 HttpServletRequest 对象,后端可以获取前端发送的请求参数、请求头、请求方法等信息,并根据这些信息进行相应的处理。以下是对 HttpServle…...
[Python3] Sanic 框架构建高并发的 Web 服务
在 Python3 中使用 Sanic 框架来构建高并发的 Web 服务时,Sanic 因其异步和基于事件驱动的架构能够很好地处理高并发请求。下面是如何使用 Sanic 的一些要点和示例代码。 1. 安装 Sanic 首先确保你安装了 Sanic,可以通过以下命令安装: pip…...
5.5 W5500 TCP服务端与客户端
文章目录 1、TCP介绍2、W5500简介2.1 关键函数socketlistensendgetSn_RX_RSRrecv自动心跳包检测getSn_SR 1、TCP介绍 TCP 服务端: 创建套接字[socket]:服务器首先创建一个套接字,这是网络通信的端点。绑定套接字[bind]:服务器将…...
【Flutter】搭建Flutter开发环境,安卓开发
Flutter是谷歌开源的一个跨平台开发的框架,方便好用,这里以Windows 上构建 Flutter Android 应用为例,记录下我搭建环境时碰到的一些问题以及解决。 第一步:参考官网:开发 Android 应用 | Flutter 中文文档 - Flutter …...
【机器学习】——朴素贝叶斯模型
💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux…...
k8s rainbond centos7/win10 -20241124
参考 https://www.rainbond.com/ 国内一站式云原生平台 对centos7环境支持不太行 [lighthouseVM-16-5-centos ~]$ curl -o install.sh https://get.rainbond.com && bash ./install.sh 2024-11-24 09:56:57 ERROR: Ops! Docker daemon is not running. Start docke…...
ctfshow单身杯2024wp
文章目录 ctfshow单身杯2024wp签到好玩的PHPezzz_sstiez_inject ctfshow单身杯2024wp 签到好玩的PHP 考点:序列化反序列化 <?phperror_reporting(0);highlight_file(__FILE__);class ctfshow {private $d ;private $s ;private $b ;private $ctf ;public …...
深入解密 K 均值聚类:从理论基础到 Python 实践
1. 引言 在机器学习领域,聚类是一种无监督学习的技术,用于将数据集分组成若干个类别,使得同组数据之间具有更高的相似性。这种技术在各个领域都有广泛的应用,比如客户细分、图像压缩和市场分析等。聚类的目标是使得同类样本之间的…...
【代码pycharm】动手学深度学习v2-08 线性回归 + 基础优化算法
课程链接 线性回归的从零开始实现 import random import torch from d2l import torch as d2l# 人造数据集 def synthetic_data(w,b,num_examples):Xtorch.normal(0,1,(num_examples,len(w)))ytorch.matmul(X,w)bytorch.normal(0,0.01,y.shape) # 加入噪声return X,y.reshape…...
Python绘制太极八卦
文章目录 系列目录写在前面技术需求1. 图形绘制库的支持2. 图形绘制功能3. 参数化设计4. 绘制控制5. 数据处理6. 用户界面 完整代码代码分析1. rset() 函数2. offset() 函数3. taiji() 函数4. bagua() 函数5. 绘制过程6. 技术亮点 写在后面 系列目录 序号直达链接爱心系列1Pyth…...
sklearn学习
介绍:scaler:换算的意思 1. 归一化MinMaxScaler() 归一化的意思是将一堆数,如果比较离散,为了让数据更适合模型训练,将离散的数据压缩到0到1之间,以方便模型更高效优质的学习,而对数据的预处理…...
# [Unity] 【游戏开发】Unity开发基础2-Unity脚本编程基础详解
Unity脚本编程是创建互动式游戏体验的核心技能之一。本文将详细讲解Unity脚本编程的基础知识,包括变量和数据类型、程序逻辑、方法等方面,并通过实例展示如何使用这些基本知识完成简单功能的实现。 1. 新建Unity脚本的基本结构 当在Unity中创建一个脚本时,Unity会生成如下基…...
【强化学习的数学原理】第02课-贝尔曼公式-笔记
学习资料:bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接:强化学习的数学原理 西湖大学 赵世钰 文章目录 一、为什么return重要?如何计算return?二、state value的定义三、Bellman公式的详细推导四、公式向量形式…...
C语言-数学基础问题
一.奇数、偶数问题 1.从键盘上输入一个整数,判断并输出它是奇数还是偶数。 //从键盘上输入一个整数,判断并输出它是奇数还是偶数。 main() {int i;printf("输入一个整数:\n");scanf("%d",&i);if(i%20)printf("它是偶数\n…...
2024算法基础公选课练习四(综合2)
一、前言 最后几个题确实有难度,这次有两题没整出来 二、题目总览 三、具体题目 3.1 问题 A: 水题系列1-B(班级排位) 思路 最暴力的思路是写线段树,然后暴力枚举两个端点,总体时间复杂度为O(n^2*logn)最坏会到1e9的数量级,可能…...
小程序-使用 iconfont 图标库报错:Failed to load font
官方默认可以忽略此错误,在清除缓存后首次刷新会显示此错误,重新渲染错误消失 解决方法: 在 iconfont 图标库选择项目设置 选中 Base64 保存,重新点击链接 -> 复制代码到项目中 操作步骤:...
鲸鱼机器人和乐高机器人的比较
鲸鱼机器人和乐高机器人各有其独特的优势和特点,家长在选择时可以根据孩子的年龄、兴趣、经济能力等因素进行综合考虑,选择最适合孩子的教育机器人产品。 优势 鲸鱼机器人 1)价格亲民:鲸鱼机器人的产品价格相对乐高更为亲民&…...
解决单元测试时找不到类名
场景: springboot单元测试mockito对mapper进行mock时: tk.mybatis.mapper.mapperexception: 无法获取实体类 XX.xx 对应的表名 分析: 使用了一个方法:Example examplenew Example(User.class); 进入源码后发现Entityhelper没…...
簡單易懂:如何在Windows系統中修改IP地址?
無論是為了連接到一個新的網路,還是為了解決網路連接問題,修改IP地址都是一個常見的操作。本文將詳細介紹如何在Windows系統中修改IP地址,包括靜態IP地址的設置和動態IP地址的獲取。 IP地址是什麼? IP地址是互聯網協議地址的簡稱…...
(详细文档!)java swing学生信息管理系统 +mysql
第一章:系统功能分析 1.1、系统简介与开发背景 学生信息管理系统是在信息化时代,特别是在教育领域中产生的。随着学校规模的不断扩大和信息化技术的不断发展,传统的纸质档案管理方式已经无法满足学校对学生信息管理的需求,因此需…...
OSG开发笔记(三十三):同时观察物体不同角度的多视图从相机技术
若该文为原创文章,未经允许不得转载 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/143932273 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 长沙红胖子Qt…...
[极客大挑战 2019]BabySQL--详细解析
信息搜集 进入界面: 输入用户名为admin,密码随便输一个: 发现是GET传参,有username和password两个传参点。 我们测试一下password点位能不能注入: 单引号闭合报错,根据报错信息,我们可以判断…...
Java的字符串操作(二)(代码示例)
1. 字符串的定义 // 直接赋值方式定义字符串 String str1 "Hello World";// 使用new关键字定义字符串 String str2 new String("Hello World");// 可以通过打印对象的哈希码来查看是否是同一个对象(在一定程度上反映引用情况) Sy…...
2024-2025 ICPC, NERC, Southern and Volga Russian Regional Contest(ABCGJLN)
文章目录 N. Fixing the Expression思路code J. Waiting for...思路code C. DIY思路code L. Bridge Renovation思路code A. Bonus Project思路code G. Guess One Character思路code B. Make It Equal思路code N. Fixing the Expression 思路 签到题,只改变中间的字…...
SpringBoot(9)-Dubbo+Zookeeper
目录 一、了解分布式系统 二、RPC 三、Dubbo 四、SpringBootDubboZookeeper 4.1 框架搭建 4.2 实现RPC 一、了解分布式系统 分布式系统:由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统 二、RPC RPC:远程…...